@kernhq/module-tracker 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/LICENSE +662 -0
  2. package/README.md +265 -0
  3. package/dist/contract/events.d.ts +140 -0
  4. package/dist/contract/events.d.ts.map +1 -0
  5. package/dist/contract/events.js +51 -0
  6. package/dist/contract/events.js.map +1 -0
  7. package/dist/contract/index.d.ts +6 -0
  8. package/dist/contract/index.d.ts.map +1 -0
  9. package/dist/contract/index.js +6 -0
  10. package/dist/contract/index.js.map +1 -0
  11. package/dist/contract/models.d.ts +2547 -0
  12. package/dist/contract/models.d.ts.map +1 -0
  13. package/dist/contract/models.js +1214 -0
  14. package/dist/contract/models.js.map +1 -0
  15. package/dist/contract/notifications.d.ts +4 -0
  16. package/dist/contract/notifications.d.ts.map +1 -0
  17. package/dist/contract/notifications.js +46 -0
  18. package/dist/contract/notifications.js.map +1 -0
  19. package/dist/contract/permissions.d.ts +161 -0
  20. package/dist/contract/permissions.d.ts.map +1 -0
  21. package/dist/contract/permissions.js +192 -0
  22. package/dist/contract/permissions.js.map +1 -0
  23. package/dist/contract/router.d.ts +9659 -0
  24. package/dist/contract/router.d.ts.map +1 -0
  25. package/dist/contract/router.js +732 -0
  26. package/dist/contract/router.js.map +1 -0
  27. package/dist/kql/ast.d.ts +90 -0
  28. package/dist/kql/ast.d.ts.map +1 -0
  29. package/dist/kql/ast.js +80 -0
  30. package/dist/kql/ast.js.map +1 -0
  31. package/dist/kql/dates.d.ts +16 -0
  32. package/dist/kql/dates.d.ts.map +1 -0
  33. package/dist/kql/dates.js +54 -0
  34. package/dist/kql/dates.js.map +1 -0
  35. package/dist/kql/fields.d.ts +61 -0
  36. package/dist/kql/fields.d.ts.map +1 -0
  37. package/dist/kql/fields.js +106 -0
  38. package/dist/kql/fields.js.map +1 -0
  39. package/dist/kql/index.d.ts +16 -0
  40. package/dist/kql/index.d.ts.map +1 -0
  41. package/dist/kql/index.js +16 -0
  42. package/dist/kql/index.js.map +1 -0
  43. package/dist/kql/lexer.d.ts +28 -0
  44. package/dist/kql/lexer.d.ts.map +1 -0
  45. package/dist/kql/lexer.js +127 -0
  46. package/dist/kql/lexer.js.map +1 -0
  47. package/dist/kql/parser.d.ts +14 -0
  48. package/dist/kql/parser.d.ts.map +1 -0
  49. package/dist/kql/parser.js +290 -0
  50. package/dist/kql/parser.js.map +1 -0
  51. package/dist/kql/suggest.d.ts +8 -0
  52. package/dist/kql/suggest.d.ts.map +1 -0
  53. package/dist/kql/suggest.js +96 -0
  54. package/dist/kql/suggest.js.map +1 -0
  55. package/dist/kql/validate.d.ts +10 -0
  56. package/dist/kql/validate.d.ts.map +1 -0
  57. package/dist/kql/validate.js +84 -0
  58. package/dist/kql/validate.js.map +1 -0
  59. package/dist/server/index.d.ts +17 -0
  60. package/dist/server/index.d.ts.map +1 -0
  61. package/dist/server/index.js +583 -0
  62. package/dist/server/index.js.map +1 -0
  63. package/dist/server/kql/compile.d.ts +49 -0
  64. package/dist/server/kql/compile.d.ts.map +1 -0
  65. package/dist/server/kql/compile.js +372 -0
  66. package/dist/server/kql/compile.js.map +1 -0
  67. package/dist/server/rank.d.ts +23 -0
  68. package/dist/server/rank.d.ts.map +1 -0
  69. package/dist/server/rank.js +66 -0
  70. package/dist/server/rank.js.map +1 -0
  71. package/dist/server/rich.d.ts +30 -0
  72. package/dist/server/rich.d.ts.map +1 -0
  73. package/dist/server/rich.js +97 -0
  74. package/dist/server/rich.js.map +1 -0
  75. package/dist/server/router.d.ts +10589 -0
  76. package/dist/server/router.d.ts.map +1 -0
  77. package/dist/server/router.js +431 -0
  78. package/dist/server/router.js.map +1 -0
  79. package/dist/server/schema.d.ts +6622 -0
  80. package/dist/server/schema.d.ts.map +1 -0
  81. package/dist/server/schema.js +581 -0
  82. package/dist/server/schema.js.map +1 -0
  83. package/dist/server/services/access.d.ts +53 -0
  84. package/dist/server/services/access.d.ts.map +1 -0
  85. package/dist/server/services/access.js +146 -0
  86. package/dist/server/services/access.js.map +1 -0
  87. package/dist/server/services/comments.d.ts +36 -0
  88. package/dist/server/services/comments.d.ts.map +1 -0
  89. package/dist/server/services/comments.js +231 -0
  90. package/dist/server/services/comments.js.map +1 -0
  91. package/dist/server/services/config.d.ts +130 -0
  92. package/dist/server/services/config.d.ts.map +1 -0
  93. package/dist/server/services/config.js +797 -0
  94. package/dist/server/services/config.js.map +1 -0
  95. package/dist/server/services/db.d.ts +93 -0
  96. package/dist/server/services/db.d.ts.map +1 -0
  97. package/dist/server/services/db.js +519 -0
  98. package/dist/server/services/db.js.map +1 -0
  99. package/dist/server/services/imports.d.ts +37 -0
  100. package/dist/server/services/imports.d.ts.map +1 -0
  101. package/dist/server/services/imports.js +324 -0
  102. package/dist/server/services/imports.js.map +1 -0
  103. package/dist/server/services/index.d.ts +36 -0
  104. package/dist/server/services/index.d.ts.map +1 -0
  105. package/dist/server/services/index.js +57 -0
  106. package/dist/server/services/index.js.map +1 -0
  107. package/dist/server/services/intake.d.ts +47 -0
  108. package/dist/server/services/intake.d.ts.map +1 -0
  109. package/dist/server/services/intake.js +268 -0
  110. package/dist/server/services/intake.js.map +1 -0
  111. package/dist/server/services/issues.d.ts +763 -0
  112. package/dist/server/services/issues.d.ts.map +1 -0
  113. package/dist/server/services/issues.js +1381 -0
  114. package/dist/server/services/issues.js.map +1 -0
  115. package/dist/server/services/notify.d.ts +51 -0
  116. package/dist/server/services/notify.d.ts.map +1 -0
  117. package/dist/server/services/notify.js +90 -0
  118. package/dist/server/services/notify.js.map +1 -0
  119. package/dist/server/services/planning.d.ts +62 -0
  120. package/dist/server/services/planning.d.ts.map +1 -0
  121. package/dist/server/services/planning.js +614 -0
  122. package/dist/server/services/planning.js.map +1 -0
  123. package/dist/server/services/projects.d.ts +43 -0
  124. package/dist/server/services/projects.d.ts.map +1 -0
  125. package/dist/server/services/projects.js +375 -0
  126. package/dist/server/services/projects.js.map +1 -0
  127. package/dist/server/services/query.d.ts +24 -0
  128. package/dist/server/services/query.d.ts.map +1 -0
  129. package/dist/server/services/query.js +312 -0
  130. package/dist/server/services/query.js.map +1 -0
  131. package/dist/server/services/reports.d.ts +30 -0
  132. package/dist/server/services/reports.d.ts.map +1 -0
  133. package/dist/server/services/reports.js +295 -0
  134. package/dist/server/services/reports.js.map +1 -0
  135. package/dist/server/services/time.d.ts +53 -0
  136. package/dist/server/services/time.d.ts.map +1 -0
  137. package/dist/server/services/time.js +192 -0
  138. package/dist/server/services/time.js.map +1 -0
  139. package/dist/server/services/transitions.d.ts +61 -0
  140. package/dist/server/services/transitions.d.ts.map +1 -0
  141. package/dist/server/services/transitions.js +493 -0
  142. package/dist/server/services/transitions.js.map +1 -0
  143. package/dist/server/services/views.d.ts +33 -0
  144. package/dist/server/services/views.d.ts.map +1 -0
  145. package/dist/server/services/views.js +195 -0
  146. package/dist/server/services/views.js.map +1 -0
  147. package/migrations/0000_init.sql +529 -0
  148. package/migrations/0001_rls.sql +259 -0
  149. package/migrations/meta/0000_snapshot.json +4140 -0
  150. package/migrations/meta/_journal.json +20 -0
  151. package/package.json +82 -0
  152. package/src/client/api.ts +15 -0
  153. package/src/client/format.ts +164 -0
  154. package/src/client/group.ts +150 -0
  155. package/src/client/index.ts +60 -0
  156. package/src/client/kql.ts +492 -0
  157. package/src/client/rank.ts +87 -0
  158. package/src/client/types.ts +57 -0
@@ -0,0 +1,324 @@
1
+ import { KernError, uuidv7 } from '@kernhq/kernel';
2
+ import { and, desc, eq } from 'drizzle-orm';
3
+ import { CsvMapping as CsvMappingSchema, } from '../../contract/models.js';
4
+ import { textToDoc } from '../rich.js';
5
+ import { importJobs } from '../schema.js';
6
+ import { toImportJob } from './db.js';
7
+ const MODULE_JOB = 'tracker.import';
8
+ const MAX_ROWS = 20_000;
9
+ /** Minimal RFC 4180 reader: quoted fields, doubled quotes, CR/LF inside quotes. */
10
+ export function parseCsv(text, delimiter = ',') {
11
+ const rows = [];
12
+ let row = [];
13
+ let field = '';
14
+ let quoted = false;
15
+ for (let i = 0; i < text.length; i++) {
16
+ const char = text[i];
17
+ if (quoted) {
18
+ if (char === '"') {
19
+ if (text[i + 1] === '"') {
20
+ field += '"';
21
+ i++;
22
+ }
23
+ else
24
+ quoted = false;
25
+ }
26
+ else
27
+ field += char;
28
+ continue;
29
+ }
30
+ if (char === '"') {
31
+ quoted = true;
32
+ continue;
33
+ }
34
+ if (char === delimiter) {
35
+ row.push(field);
36
+ field = '';
37
+ continue;
38
+ }
39
+ if (char === '\r')
40
+ continue;
41
+ if (char === '\n') {
42
+ row.push(field);
43
+ rows.push(row);
44
+ row = [];
45
+ field = '';
46
+ continue;
47
+ }
48
+ field += char;
49
+ }
50
+ if (field.length || row.length) {
51
+ row.push(field);
52
+ rows.push(row);
53
+ }
54
+ return rows.filter((r) => r.some((cell) => cell.trim().length));
55
+ }
56
+ /** CSV, Jira and Linear imports. The work happens in a background job so the request returns at once. */
57
+ export class ImportService {
58
+ kernel;
59
+ access;
60
+ config;
61
+ issuesService;
62
+ planning;
63
+ constructor(kernel, access, config, issuesService, planning) {
64
+ this.kernel = kernel;
65
+ this.access = access;
66
+ this.config = config;
67
+ this.issuesService = issuesService;
68
+ this.planning = planning;
69
+ }
70
+ async list(tx, principal, workspaceId, projectId) {
71
+ await this.access.requireProject(tx, principal, workspaceId, projectId, 'tracker.import.run');
72
+ const rows = await tx
73
+ .select()
74
+ .from(importJobs)
75
+ .where(and(eq(importJobs.workspaceId, workspaceId), eq(importJobs.projectId, projectId)))
76
+ .orderBy(desc(importJobs.createdAt))
77
+ .limit(100);
78
+ return rows.map(toImportJob);
79
+ }
80
+ async get(tx, principal, workspaceId, id) {
81
+ const row = await this.row(tx, workspaceId, id);
82
+ await this.access.requireProject(tx, principal, workspaceId, row.projectId, 'tracker.import.run');
83
+ return toImportJob(row);
84
+ }
85
+ async row(tx, workspaceId, id) {
86
+ const [row] = await tx
87
+ .select()
88
+ .from(importJobs)
89
+ .where(and(eq(importJobs.workspaceId, workspaceId), eq(importJobs.id, id)))
90
+ .limit(1);
91
+ if (!row)
92
+ throw KernError.notFound('Import job');
93
+ return row;
94
+ }
95
+ async start(tx, principal, workspaceId, projectId, input) {
96
+ await this.access.requireProject(tx, principal, workspaceId, projectId, 'tracker.import.run');
97
+ const id = uuidv7();
98
+ const [row] = await tx
99
+ .insert(importJobs)
100
+ .values({
101
+ id,
102
+ workspaceId,
103
+ projectId,
104
+ source: input.source,
105
+ fileId: input.fileId,
106
+ mapping: input.mapping,
107
+ status: 'pending',
108
+ progress: { total: 0, processed: 0, created: 0, skipped: 0, failed: 0 },
109
+ createdBy: principal.userId ?? null,
110
+ })
111
+ .returning();
112
+ await this.kernel.jobs.send(MODULE_JOB, { workspaceId, importJobId: id }).catch((err) => {
113
+ this.kernel.log.warn({ err: String(err) }, 'tracker: could not queue import');
114
+ });
115
+ return toImportJob(row);
116
+ }
117
+ async cancel(tx, principal, workspaceId, id) {
118
+ const current = await this.row(tx, workspaceId, id);
119
+ await this.access.requireProject(tx, principal, workspaceId, current.projectId, 'tracker.import.run');
120
+ if (current.status === 'completed')
121
+ return toImportJob(current);
122
+ const [row] = await tx
123
+ .update(importJobs)
124
+ .set({ status: 'cancelled', finishedAt: new Date() })
125
+ .where(and(eq(importJobs.workspaceId, workspaceId), eq(importJobs.id, id)))
126
+ .returning();
127
+ return toImportJob(row);
128
+ }
129
+ // ------------------------------------------------------------------ runner
130
+ async fileText(workspaceId, fileId) {
131
+ const file = await this.kernel.call('core.files.get', {
132
+ id: fileId,
133
+ });
134
+ if (!file)
135
+ throw KernError.notFound('File');
136
+ if (file.workspaceId !== workspaceId)
137
+ throw KernError.forbidden();
138
+ const object = await this.kernel.storage.get(file.key);
139
+ const chunks = [];
140
+ for await (const chunk of object.body)
141
+ chunks.push(Buffer.from(chunk));
142
+ return Buffer.concat(chunks).toString('utf8');
143
+ }
144
+ /** Executed by the `tracker.import` job. */
145
+ async run(workspaceId, importJobId) {
146
+ const job = await this.kernel.database.withWorkspace(workspaceId, (tx) => this.row(tx, workspaceId, importJobId));
147
+ if (job.status !== 'pending')
148
+ return;
149
+ await this.patch(workspaceId, importJobId, { status: 'running', startedAt: new Date() });
150
+ const errors = [];
151
+ const progress = { total: 0, processed: 0, created: 0, skipped: 0, failed: 0 };
152
+ try {
153
+ const text = await this.fileText(workspaceId, job.fileId);
154
+ const records = job.source === 'csv'
155
+ ? this.csvRecords(text, CsvMappingSchema.parse(job.mapping ?? {}))
156
+ : this.jsonRecords(text, job.source);
157
+ progress.total = records.length;
158
+ await this.patch(workspaceId, importJobId, { progress });
159
+ for (const [index, record] of records.entries()) {
160
+ const current = await this.kernel.database.withWorkspace(workspaceId, (tx) => this.row(tx, workspaceId, importJobId));
161
+ if (current.status === 'cancelled')
162
+ return;
163
+ progress.processed = index + 1;
164
+ try {
165
+ if (!record.title?.trim()) {
166
+ progress.skipped++;
167
+ continue;
168
+ }
169
+ await this.kernel.database.withWorkspace(workspaceId, async (tx) => {
170
+ const labelIds = [];
171
+ for (const name of record.labels ?? [])
172
+ labelIds.push(await this.planning.ensureLabel(tx, workspaceId, job.projectId, name));
173
+ await this.issuesService.create(tx, this.kernel.system, workspaceId, {
174
+ projectId: job.projectId,
175
+ title: record.title.slice(0, 500),
176
+ ...(record.description ? { description: textToDoc(record.description) } : {}),
177
+ ...(record.priority ? { priority: record.priority } : {}),
178
+ ...(record.typeId ? { typeId: record.typeId } : {}),
179
+ ...(record.statusId ? { statusId: record.statusId } : {}),
180
+ ...(record.assigneeId ? { assigneeIds: [record.assigneeId] } : {}),
181
+ ...(record.dueDate ? { dueDate: record.dueDate } : {}),
182
+ ...(record.estimate === undefined ? {} : { estimate: record.estimate }),
183
+ ...(labelIds.length ? { labelIds } : {}),
184
+ ...(Object.keys(record.custom ?? {}).length ? { custom: record.custom } : {}),
185
+ }, { source: 'import', system: true, externalRef: record.externalRef ?? null });
186
+ });
187
+ progress.created++;
188
+ }
189
+ catch (err) {
190
+ progress.failed++;
191
+ errors.push({ row: index + 1, message: err instanceof Error ? err.message : String(err) });
192
+ }
193
+ if (progress.processed % 25 === 0)
194
+ await this.patch(workspaceId, importJobId, { progress, errors });
195
+ }
196
+ await this.patch(workspaceId, importJobId, {
197
+ status: 'completed',
198
+ progress,
199
+ errors,
200
+ finishedAt: new Date(),
201
+ });
202
+ }
203
+ catch (err) {
204
+ errors.push({ row: null, message: err instanceof Error ? err.message : String(err) });
205
+ await this.patch(workspaceId, importJobId, {
206
+ status: 'failed',
207
+ progress,
208
+ errors,
209
+ finishedAt: new Date(),
210
+ });
211
+ }
212
+ }
213
+ async patch(workspaceId, id, values) {
214
+ await this.kernel.database.withWorkspace(workspaceId, (tx) => tx
215
+ .update(importJobs)
216
+ .set(values)
217
+ .where(and(eq(importJobs.workspaceId, workspaceId), eq(importJobs.id, id))));
218
+ }
219
+ // ------------------------------------------------------------------ record extraction
220
+ csvRecords(text, mapping) {
221
+ const rows = parseCsv(text, mapping.delimiter || ',');
222
+ if (!rows.length)
223
+ return [];
224
+ const header = mapping.hasHeader ? rows[0].map((h) => h.trim()) : [];
225
+ const body = mapping.hasHeader ? rows.slice(1) : rows;
226
+ const columnFor = (field) => {
227
+ const source = Object.entries(mapping.columns).find(([, target]) => target === field)?.[0];
228
+ if (source === undefined)
229
+ return -1;
230
+ const asIndex = Number(source);
231
+ if (!Number.isNaN(asIndex) && !mapping.hasHeader)
232
+ return asIndex;
233
+ return header.indexOf(source);
234
+ };
235
+ const indices = {
236
+ title: columnFor('title'),
237
+ description: columnFor('description'),
238
+ status: columnFor('status'),
239
+ type: columnFor('type'),
240
+ priority: columnFor('priority'),
241
+ assignee: columnFor('assignee'),
242
+ labels: columnFor('labels'),
243
+ dueDate: columnFor('due'),
244
+ estimate: columnFor('estimate'),
245
+ externalRef: columnFor('key'),
246
+ };
247
+ const customColumns = Object.entries(mapping.columns).filter(([, target]) => target.startsWith('cf.'));
248
+ return body.slice(0, MAX_ROWS).map((row) => {
249
+ const cell = (index) => (index >= 0 ? (row[index]?.trim() ?? '') : '');
250
+ const custom = {};
251
+ for (const [source, target] of customColumns) {
252
+ const index = mapping.hasHeader ? header.indexOf(source) : Number(source);
253
+ const value = cell(index);
254
+ if (value)
255
+ custom[target.slice(3)] = value;
256
+ }
257
+ const labelsCell = cell(indices.labels);
258
+ const estimate = Number(cell(indices.estimate));
259
+ return {
260
+ title: cell(indices.title),
261
+ description: cell(indices.description) || null,
262
+ statusId: mapping.statusMap[cell(indices.status)] ?? null,
263
+ typeId: mapping.typeMap[cell(indices.type)] ?? null,
264
+ priority: (mapping.priorityMap[cell(indices.priority)] ?? null),
265
+ assigneeId: mapping.userMap[cell(indices.assignee)] ?? null,
266
+ labels: mapping.createMissingLabels && labelsCell
267
+ ? labelsCell
268
+ .split(/[,;]/)
269
+ .map((l) => l.trim())
270
+ .filter(Boolean)
271
+ : [],
272
+ dueDate: /^\d{4}-\d{2}-\d{2}$/.test(cell(indices.dueDate)) ? cell(indices.dueDate) : null,
273
+ estimate: Number.isFinite(estimate) && cell(indices.estimate) ? estimate : undefined,
274
+ externalRef: cell(indices.externalRef) || null,
275
+ custom,
276
+ };
277
+ });
278
+ }
279
+ /** Jira and Linear exports are both JSON arrays (or `{issues: [...]}`) of loosely-shaped objects. */
280
+ jsonRecords(text, source) {
281
+ let parsed;
282
+ try {
283
+ parsed = JSON.parse(text);
284
+ }
285
+ catch {
286
+ throw KernError.badRequest('The import file is not valid JSON');
287
+ }
288
+ const list = Array.isArray(parsed)
289
+ ? parsed
290
+ : (parsed?.issues ?? parsed?.data ?? []);
291
+ return list.slice(0, MAX_ROWS).map((raw) => {
292
+ const fields = raw.fields ?? raw;
293
+ const title = String(fields.summary ?? fields.title ?? raw.title ?? '');
294
+ const description = fields.description ?? raw.description;
295
+ const priorityName = String(fields.priority?.name ?? raw.priority ?? '').toLowerCase();
296
+ const labels = Array.isArray(fields.labels)
297
+ ? fields.labels.map(String)
298
+ : Array.isArray(raw.labels)
299
+ ? raw.labels.map((l) => typeof l === 'string' ? l : (l.name ?? ''))
300
+ : [];
301
+ return {
302
+ title,
303
+ description: typeof description === 'string' ? description : null,
304
+ statusId: null,
305
+ typeId: null,
306
+ priority: ['none', 'low', 'medium', 'high', 'urgent'].includes(priorityName)
307
+ ? priorityName
308
+ : null,
309
+ assigneeId: null,
310
+ labels: labels.filter(Boolean),
311
+ dueDate: typeof fields.duedate === 'string' ? fields.duedate : null,
312
+ estimate: typeof raw.estimate === 'number' ? raw.estimate : undefined,
313
+ externalRef: String(raw.key ?? raw.id ?? '') || null,
314
+ custom: {},
315
+ sourceKind: source,
316
+ };
317
+ });
318
+ }
319
+ /** Available so the router can validate a type id before enqueuing. */
320
+ configRef() {
321
+ return this.config;
322
+ }
323
+ }
324
+ //# sourceMappingURL=imports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imports.js","sourceRoot":"","sources":["../../../src/server/services/imports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { Kernel } from '@kernhq/kernel';
2
+ import { AccessService } from './access.js';
3
+ import { CommentService } from './comments.js';
4
+ import { ConfigService } from './config.js';
5
+ import { ImportService } from './imports.js';
6
+ import { IntakeService } from './intake.js';
7
+ import { IssueService } from './issues.js';
8
+ import { NotifyService } from './notify.js';
9
+ import { PlanningService } from './planning.js';
10
+ import { ProjectService } from './projects.js';
11
+ import { QueryService } from './query.js';
12
+ import { ReportService } from './reports.js';
13
+ import { TimeService } from './time.js';
14
+ import { TransitionService } from './transitions.js';
15
+ import { ViewService } from './views.js';
16
+ export interface TrackerServices {
17
+ access: AccessService;
18
+ notify: NotifyService;
19
+ config: ConfigService;
20
+ projects: ProjectService;
21
+ issues: IssueService;
22
+ comments: CommentService;
23
+ transitions: TransitionService;
24
+ query: QueryService;
25
+ planning: PlanningService;
26
+ views: ViewService;
27
+ time: TimeService;
28
+ reports: ReportService;
29
+ intake: IntakeService;
30
+ imports: ImportService;
31
+ }
32
+ /** One service graph per kernel instance; the router, jobs and procedures all share it. */
33
+ export declare function trackerServices(kernel: Kernel): TrackerServices;
34
+ export * from './db.js';
35
+ export { AccessService, CommentService, ConfigService, ImportService, IntakeService, IssueService, NotifyService, PlanningService, ProjectService, QueryService, ReportService, TimeService, TransitionService, ViewService, };
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,aAAa,CAAA;IACrB,MAAM,EAAE,aAAa,CAAA;IACrB,MAAM,EAAE,aAAa,CAAA;IACrB,QAAQ,EAAE,cAAc,CAAA;IACxB,MAAM,EAAE,YAAY,CAAA;IACpB,QAAQ,EAAE,cAAc,CAAA;IACxB,WAAW,EAAE,iBAAiB,CAAA;IAC9B,KAAK,EAAE,YAAY,CAAA;IACnB,QAAQ,EAAE,eAAe,CAAA;IACzB,KAAK,EAAE,WAAW,CAAA;IAClB,IAAI,EAAE,WAAW,CAAA;IACjB,OAAO,EAAE,aAAa,CAAA;IACtB,MAAM,EAAE,aAAa,CAAA;IACrB,OAAO,EAAE,aAAa,CAAA;CACvB;AAID,2FAA2F;AAC3F,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CAsC/D;AAED,cAAc,SAAS,CAAA;AACvB,OAAO,EACL,aAAa,EACb,cAAc,EACd,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,EACZ,aAAa,EACb,eAAe,EACf,cAAc,EACd,YAAY,EACZ,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,WAAW,GACZ,CAAA"}
@@ -0,0 +1,57 @@
1
+ import { AccessService } from './access.js';
2
+ import { CommentService } from './comments.js';
3
+ import { ConfigService } from './config.js';
4
+ import { ImportService } from './imports.js';
5
+ import { IntakeService } from './intake.js';
6
+ import { IssueService } from './issues.js';
7
+ import { NotifyService } from './notify.js';
8
+ import { PlanningService } from './planning.js';
9
+ import { ProjectService } from './projects.js';
10
+ import { QueryService } from './query.js';
11
+ import { ReportService } from './reports.js';
12
+ import { TimeService } from './time.js';
13
+ import { TransitionService } from './transitions.js';
14
+ import { ViewService } from './views.js';
15
+ const cache = new WeakMap();
16
+ /** One service graph per kernel instance; the router, jobs and procedures all share it. */
17
+ export function trackerServices(kernel) {
18
+ const existing = cache.get(kernel);
19
+ if (existing)
20
+ return existing;
21
+ const access = new AccessService(kernel);
22
+ const notify = new NotifyService(kernel);
23
+ const config = new ConfigService(kernel, access, notify);
24
+ const projects = new ProjectService(kernel, access, config, notify);
25
+ const issues = new IssueService(kernel, access, config, notify);
26
+ const comments = new CommentService(kernel, access, issues, notify);
27
+ const transitions = new TransitionService(kernel, access, config, issues, notify);
28
+ transitions.comments = comments;
29
+ const query = new QueryService(kernel, access, config, issues);
30
+ const planning = new PlanningService(kernel, access, notify);
31
+ const views = new ViewService(kernel, access, notify);
32
+ const time = new TimeService(kernel, access, issues, notify);
33
+ const reports = new ReportService(kernel, access, config, planning, time);
34
+ const intake = new IntakeService(kernel, access, config, issues, comments, transitions, notify);
35
+ const imports = new ImportService(kernel, access, config, issues, planning);
36
+ const services = {
37
+ access,
38
+ notify,
39
+ config,
40
+ projects,
41
+ issues,
42
+ comments,
43
+ transitions,
44
+ query,
45
+ planning,
46
+ views,
47
+ time,
48
+ reports,
49
+ intake,
50
+ imports,
51
+ };
52
+ cache.set(kernel, services);
53
+ return services;
54
+ }
55
+ export * from './db.js';
56
+ export { AccessService, CommentService, ConfigService, ImportService, IntakeService, IssueService, NotifyService, PlanningService, ProjectService, QueryService, ReportService, TimeService, TransitionService, ViewService, };
57
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/services/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { Principal } from '@kernhq/contracts';
2
+ import { type Kernel, type Tx } from '@kernhq/kernel';
3
+ import type { EmailIngestResult, InboundEmail, IntakeForm, IntakeSubmission, Issue } from '../../contract/models.js';
4
+ import type { AccessService } from './access.js';
5
+ import type { CommentService } from './comments.js';
6
+ import type { ConfigService } from './config.js';
7
+ import type { IssueService } from './issues.js';
8
+ import type { NotifyService } from './notify.js';
9
+ import type { TransitionService } from './transitions.js';
10
+ /** Public intake form, triage queue actions and inbound email ingest. */
11
+ export declare class IntakeService {
12
+ private readonly kernel;
13
+ private readonly access;
14
+ private readonly config;
15
+ private readonly issuesService;
16
+ private readonly comments;
17
+ private readonly transitions;
18
+ private readonly notify;
19
+ constructor(kernel: Kernel, access: AccessService, config: ConfigService, issuesService: IssueService, comments: CommentService, transitions: TransitionService, notify: NotifyService);
20
+ /**
21
+ * Resolve a public token to its workspace without an RLS context. `intake_tokens` exists exactly
22
+ * for this: an anonymous request carries nothing else to scope the query by.
23
+ */
24
+ resolveToken(token: string): Promise<{
25
+ workspaceId: string;
26
+ projectId: string;
27
+ }>;
28
+ /** Keep the lookup table in step with `projects.intake_token`. */
29
+ syncToken(tx: Tx, workspaceId: string, projectId: string, token: string | null): Promise<void>;
30
+ form(token: string): Promise<IntakeForm>;
31
+ submit(input: IntakeSubmission): Promise<{
32
+ ok: true;
33
+ issueKey: string;
34
+ }>;
35
+ accept(tx: Tx, principal: Principal, workspaceId: string, issueId: string, statusId?: string): Promise<Issue>;
36
+ decline(tx: Tx, principal: Principal, workspaceId: string, issueId: string, comment?: string): Promise<Issue>;
37
+ private cancelledStatus;
38
+ snooze(tx: Tx, principal: Principal, workspaceId: string, issueId: string, until: string): Promise<Issue>;
39
+ /**
40
+ * Turn an inbound email into a new triage issue or a comment on the issue it replies to.
41
+ * Threading is resolved by `In-Reply-To`/`References` first, then by an issue key in the subject.
42
+ */
43
+ ingestEmail(input: InboundEmail): Promise<EmailIngestResult>;
44
+ /** Triage items whose snooze has expired become visible again. */
45
+ wakeSnoozed(workspaceId: string, now?: Date): Promise<number>;
46
+ }
47
+ //# sourceMappingURL=intake.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intake.d.ts","sourceRoot":"","sources":["../../../src/server/services/intake.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAa,KAAK,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,gBAAgB,CAAA;AAEhE,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,KAAK,EACN,MAAM,0BAA0B,CAAA;AAGjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAIzD,yEAAyE;AACzE,qBAAa,aAAa;IAEtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM;gBANN,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,YAAY,EAC3B,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,iBAAiB,EAC9B,MAAM,EAAE,aAAa;IAGxC;;;OAGG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAUtF,kEAAkE;IAC5D,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9F,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA0BxC,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IA+BxE,MAAM,CACV,EAAE,EAAE,EAAE,EACN,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,CAAC;IAkBX,OAAO,CACX,EAAE,EAAE,EAAE,EACN,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,CAAC;YAsBH,eAAe;IAoBvB,MAAM,CACV,EAAE,EAAE,EAAE,EACN,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,KAAK,CAAC;IAoBjB;;;OAGG;IACG,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA+GlE,kEAAkE;IAC5D,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAa,GAAG,OAAO,CAAC,MAAM,CAAC;CAgB1E"}