@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,268 @@
1
+ import { KernError } from '@kernhq/kernel';
2
+ import { and, desc, eq, inArray, sql } from 'drizzle-orm';
3
+ import { docToText, stripQuotedReply, textToDoc } from '../rich.js';
4
+ import { intakeTokens, issues, projects } from '../schema.js';
5
+ import { parseSettings } from './db.js';
6
+ const ISSUE_KEY_RE = /\b([A-Z][A-Z0-9]{1,9}-\d+)\b/;
7
+ /** Public intake form, triage queue actions and inbound email ingest. */
8
+ export class IntakeService {
9
+ kernel;
10
+ access;
11
+ config;
12
+ issuesService;
13
+ comments;
14
+ transitions;
15
+ notify;
16
+ constructor(kernel, access, config, issuesService, comments, transitions, notify) {
17
+ this.kernel = kernel;
18
+ this.access = access;
19
+ this.config = config;
20
+ this.issuesService = issuesService;
21
+ this.comments = comments;
22
+ this.transitions = transitions;
23
+ this.notify = notify;
24
+ }
25
+ /**
26
+ * Resolve a public token to its workspace without an RLS context. `intake_tokens` exists exactly
27
+ * for this: an anonymous request carries nothing else to scope the query by.
28
+ */
29
+ async resolveToken(token) {
30
+ const [row] = await this.kernel.database.db
31
+ .select()
32
+ .from(intakeTokens)
33
+ .where(eq(intakeTokens.token, token))
34
+ .limit(1);
35
+ if (!row)
36
+ throw KernError.notFound('Intake form');
37
+ return { workspaceId: row.workspaceId, projectId: row.projectId };
38
+ }
39
+ /** Keep the lookup table in step with `projects.intake_token`. */
40
+ async syncToken(tx, workspaceId, projectId, token) {
41
+ await tx.delete(intakeTokens).where(eq(intakeTokens.projectId, projectId));
42
+ if (token)
43
+ await tx.insert(intakeTokens).values({ token, workspaceId, projectId });
44
+ }
45
+ async form(token) {
46
+ const { workspaceId, projectId } = await this.resolveToken(token);
47
+ return this.kernel.database.withWorkspace(workspaceId, async (tx) => {
48
+ const [project] = await tx
49
+ .select()
50
+ .from(projects)
51
+ .where(and(eq(projects.workspaceId, workspaceId), eq(projects.id, projectId)))
52
+ .limit(1);
53
+ if (!project || project.archivedAt)
54
+ throw KernError.notFound('Intake form');
55
+ return {
56
+ projectId: project.id,
57
+ projectName: project.name,
58
+ token,
59
+ title: `Contact ${project.name}`,
60
+ description: project.description,
61
+ fields: [
62
+ { key: 'name', label: 'Your name', type: 'text', required: false },
63
+ { key: 'email', label: 'Email', type: 'email', required: true },
64
+ { key: 'title', label: 'Summary', type: 'text', required: true },
65
+ { key: 'description', label: 'Details', type: 'textarea', required: false },
66
+ ],
67
+ allowAttachments: false,
68
+ };
69
+ });
70
+ }
71
+ async submit(input) {
72
+ // the honeypot is a field real people never see, so anything in it is a bot
73
+ if (input.website)
74
+ throw KernError.badRequest('Rejected');
75
+ const { workspaceId, projectId } = await this.resolveToken(input.token);
76
+ const body = [
77
+ input.description ?? '',
78
+ '',
79
+ ...Object.entries(input.fields ?? {}).map(([key, value]) => `${key}: ${String(value)}`),
80
+ input.email ? `Reported by: ${input.name ? `${input.name} <${input.email}>` : input.email}` : '',
81
+ ]
82
+ .filter(Boolean)
83
+ .join('\n');
84
+ const issue = await this.kernel.database.withWorkspace(workspaceId, (tx) => this.issuesService.create(tx, this.kernel.system, workspaceId, {
85
+ projectId,
86
+ title: input.title,
87
+ description: textToDoc(body),
88
+ }, { source: 'intake', system: true, triage: true }));
89
+ return { ok: true, issueKey: issue.key };
90
+ }
91
+ // ------------------------------------------------------------------ triage
92
+ async accept(tx, principal, workspaceId, issueId, statusId) {
93
+ const row = await this.issuesService.row(tx, workspaceId, issueId);
94
+ await this.access.require(principal, 'tracker.triage.manage', workspaceId, row.projectId);
95
+ const target = statusId ?? (await this.transitions.firstNonTriageStatus(tx, workspaceId, issueId));
96
+ const issue = await this.transitions.moveToStatus(tx, principal, workspaceId, issueId, target);
97
+ await tx
98
+ .update(issues)
99
+ .set({ triage: false, snoozedUntil: null, updatedAt: new Date() })
100
+ .where(and(eq(issues.workspaceId, workspaceId), eq(issues.id, issueId)));
101
+ await this.notify.history(tx, {
102
+ workspaceId,
103
+ issueId,
104
+ actorId: principal.userId ?? null,
105
+ action: 'triage_accepted',
106
+ });
107
+ return { ...issue, triage: false, snoozedUntil: null };
108
+ }
109
+ async decline(tx, principal, workspaceId, issueId, comment) {
110
+ const row = await this.issuesService.row(tx, workspaceId, issueId);
111
+ await this.access.require(principal, 'tracker.triage.manage', workspaceId, row.projectId);
112
+ const project = await this.access.loadProject(tx, workspaceId, row.projectId);
113
+ const cancelled = await this.cancelledStatus(tx, workspaceId, project.id, row.typeId);
114
+ const issue = await this.transitions.moveToStatus(tx, principal, workspaceId, issueId, cancelled, {
115
+ ...(comment ? { comment } : {}),
116
+ resolution: 'declined',
117
+ });
118
+ await tx
119
+ .update(issues)
120
+ .set({ triage: false, updatedAt: new Date() })
121
+ .where(and(eq(issues.workspaceId, workspaceId), eq(issues.id, issueId)));
122
+ await this.notify.history(tx, {
123
+ workspaceId,
124
+ issueId,
125
+ actorId: principal.userId ?? null,
126
+ action: 'triage_declined',
127
+ });
128
+ return { ...issue, triage: false };
129
+ }
130
+ async cancelledStatus(tx, workspaceId, projectId, typeId) {
131
+ const [project] = await tx
132
+ .select()
133
+ .from(projects)
134
+ .where(and(eq(projects.workspaceId, workspaceId), eq(projects.id, projectId)))
135
+ .limit(1);
136
+ if (!project)
137
+ throw KernError.notFound('Project');
138
+ const { definition } = await this.config.workflowFor(tx, project, typeId);
139
+ const status = definition.statuses.find((s) => s.category === 'cancelled') ??
140
+ definition.statuses.find((s) => s.category === 'done');
141
+ if (!status)
142
+ throw KernError.badRequest('This workflow has no cancelled status');
143
+ return status.id;
144
+ }
145
+ async snooze(tx, principal, workspaceId, issueId, until) {
146
+ const row = await this.issuesService.row(tx, workspaceId, issueId);
147
+ await this.access.require(principal, 'tracker.triage.manage', workspaceId, row.projectId);
148
+ const [updated] = await tx
149
+ .update(issues)
150
+ .set({ snoozedUntil: new Date(until), updatedAt: new Date() })
151
+ .where(and(eq(issues.workspaceId, workspaceId), eq(issues.id, issueId)))
152
+ .returning();
153
+ await this.notify.history(tx, {
154
+ workspaceId,
155
+ issueId,
156
+ actorId: principal.userId ?? null,
157
+ action: 'triage_snoozed',
158
+ data: { until },
159
+ });
160
+ return (await this.issuesService.hydrate(tx, [updated]))[0];
161
+ }
162
+ // ------------------------------------------------------------------ email ingest
163
+ /**
164
+ * Turn an inbound email into a new triage issue or a comment on the issue it replies to.
165
+ * Threading is resolved by `In-Reply-To`/`References` first, then by an issue key in the subject.
166
+ */
167
+ async ingestEmail(input) {
168
+ const location = input.projectToken
169
+ ? await this.resolveToken(input.projectToken)
170
+ : input.workspaceId && input.projectId
171
+ ? { workspaceId: input.workspaceId, projectId: input.projectId }
172
+ : null;
173
+ if (!location)
174
+ return {
175
+ action: 'ignored',
176
+ issueId: null,
177
+ issueKey: null,
178
+ commentId: null,
179
+ reason: 'no project token',
180
+ };
181
+ const { workspaceId, projectId } = location;
182
+ const text = stripQuotedReply(input.text ?? docToText(null) ?? '');
183
+ const references = [...(input.references ?? []), input.inReplyTo ?? ''].filter(Boolean);
184
+ return this.kernel.database.withWorkspace(workspaceId, async (tx) => {
185
+ const [project] = await tx
186
+ .select()
187
+ .from(projects)
188
+ .where(and(eq(projects.workspaceId, workspaceId), eq(projects.id, projectId)))
189
+ .limit(1);
190
+ if (!project || project.archivedAt)
191
+ return {
192
+ action: 'ignored',
193
+ issueId: null,
194
+ issueKey: null,
195
+ commentId: null,
196
+ reason: 'unknown project',
197
+ };
198
+ const [duplicate] = await tx
199
+ .select({ id: issues.id, key: issues.key })
200
+ .from(issues)
201
+ .where(and(eq(issues.workspaceId, workspaceId), eq(issues.externalRef, input.messageId)))
202
+ .limit(1);
203
+ if (duplicate)
204
+ return {
205
+ action: 'ignored',
206
+ issueId: duplicate.id,
207
+ issueKey: duplicate.key,
208
+ commentId: null,
209
+ reason: 'already ingested',
210
+ };
211
+ let target = null;
212
+ if (references.length) {
213
+ const [row] = await tx
214
+ .select({ id: issues.id, key: issues.key })
215
+ .from(issues)
216
+ .where(and(eq(issues.workspaceId, workspaceId), inArray(issues.externalRef, references)))
217
+ .orderBy(desc(issues.createdAt))
218
+ .limit(1);
219
+ target = row ?? null;
220
+ }
221
+ if (!target) {
222
+ const match = ISSUE_KEY_RE.exec(input.subject);
223
+ if (match) {
224
+ const [row] = await tx
225
+ .select({ id: issues.id, key: issues.key })
226
+ .from(issues)
227
+ .where(and(eq(issues.workspaceId, workspaceId), eq(issues.key, match[1])))
228
+ .limit(1);
229
+ target = row ?? null;
230
+ }
231
+ }
232
+ if (target) {
233
+ const comment = await this.comments.create(tx, this.kernel.system, workspaceId, target.id, textToDoc(text || input.subject), { source: 'email', silent: false, authorId: null });
234
+ return {
235
+ action: 'commented',
236
+ issueId: target.id,
237
+ issueKey: target.key,
238
+ commentId: comment.id,
239
+ };
240
+ }
241
+ const settings = parseSettings(project.settings);
242
+ const issue = await this.issuesService.create(tx, this.kernel.system, workspaceId, {
243
+ projectId,
244
+ title: input.subject.trim() || '(no subject)',
245
+ description: textToDoc([text, '', `From: ${input.from.name ?? ''} <${input.from.address}>`].join('\n').trim()),
246
+ ...(input.attachments?.length ? { attachmentIds: input.attachments.map((a) => a.fileId) } : {}),
247
+ }, {
248
+ source: 'email',
249
+ system: true,
250
+ externalRef: input.messageId,
251
+ triage: settings.triage.enabled,
252
+ });
253
+ return { action: 'created', issueId: issue.id, issueKey: issue.key, commentId: null };
254
+ });
255
+ }
256
+ /** Triage items whose snooze has expired become visible again. */
257
+ async wakeSnoozed(workspaceId, now = new Date()) {
258
+ return this.kernel.database.withWorkspace(workspaceId, async (tx) => {
259
+ const rows = await tx
260
+ .update(issues)
261
+ .set({ snoozedUntil: null, updatedAt: now })
262
+ .where(and(eq(issues.workspaceId, workspaceId), eq(issues.triage, true), sql `${issues.snoozedUntil} is not null and ${issues.snoozedUntil} <= ${now.toISOString()}`))
263
+ .returning({ id: issues.id });
264
+ return rows.length;
265
+ });
266
+ }
267
+ }
268
+ //# sourceMappingURL=intake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intake.js","sourceRoot":"","sources":["../../../src/server/services/intake.ts"],"names":[],"mappings":"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"}