@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,195 @@
1
+ import { KernError, uuidv7 } from '@kernhq/kernel';
2
+ import { and, asc, eq, inArray, isNull, or, sql } from 'drizzle-orm';
3
+ import { ViewDisplay } from '../../contract/models.js';
4
+ import { parseKql } from '../../kql/parser.js';
5
+ import { viewPins, views } from '../schema.js';
6
+ import { parseDisplay, toView } from './db.js';
7
+ /** Saved views: the KQL query plus how to draw it (list, board, calendar, timeline, spreadsheet). */
8
+ export class ViewService {
9
+ kernel;
10
+ access;
11
+ notify;
12
+ constructor(kernel, access, notify) {
13
+ this.kernel = kernel;
14
+ this.access = access;
15
+ this.notify = notify;
16
+ }
17
+ async pinnedIds(tx, workspaceId, userId) {
18
+ if (!userId)
19
+ return new Set();
20
+ const rows = await tx
21
+ .select({ viewId: viewPins.viewId })
22
+ .from(viewPins)
23
+ .where(and(eq(viewPins.workspaceId, workspaceId), eq(viewPins.userId, userId)));
24
+ return new Set(rows.map((r) => r.viewId));
25
+ }
26
+ async list(tx, principal, workspaceId, projectId) {
27
+ const visible = await this.access.visibleProjectIds(tx, principal, workspaceId);
28
+ const userId = principal.userId;
29
+ const filters = [eq(views.workspaceId, workspaceId)];
30
+ if (projectId === null)
31
+ filters.push(isNull(views.projectId));
32
+ else if (projectId)
33
+ filters.push(eq(views.projectId, projectId));
34
+ else
35
+ filters.push(or(isNull(views.projectId), inArray(views.projectId, visible.length ? visible : [''])));
36
+ const rows = await tx
37
+ .select()
38
+ .from(views)
39
+ .where(and(...filters))
40
+ .orderBy(asc(views.order), asc(views.name));
41
+ const pinned = await this.pinnedIds(tx, workspaceId, userId);
42
+ return rows.filter((r) => this.readable(r, principal, visible)).map((r) => toView(r, pinned.has(r.id)));
43
+ }
44
+ readable(row, principal, visibleProjects) {
45
+ if (principal.instanceAdmin || principal.kind === 'service')
46
+ return true;
47
+ if (row.visibility === 'private')
48
+ return !!principal.userId && row.ownerId === principal.userId;
49
+ if (row.visibility === 'project')
50
+ return !row.projectId || visibleProjects.includes(row.projectId);
51
+ return true;
52
+ }
53
+ async get(tx, principal, workspaceId, id) {
54
+ const row = await this.row(tx, workspaceId, id);
55
+ const visible = await this.access.visibleProjectIds(tx, principal, workspaceId);
56
+ if (!this.readable(row, principal, visible))
57
+ throw KernError.forbidden('tracker.project.view');
58
+ const pinned = await this.pinnedIds(tx, workspaceId, principal.userId);
59
+ return toView(row, pinned.has(id));
60
+ }
61
+ async row(tx, workspaceId, id) {
62
+ const [row] = await tx
63
+ .select()
64
+ .from(views)
65
+ .where(and(eq(views.workspaceId, workspaceId), eq(views.id, id)))
66
+ .limit(1);
67
+ if (!row)
68
+ throw KernError.notFound('View');
69
+ return row;
70
+ }
71
+ assertQueryParses(kql) {
72
+ const parsed = parseKql(kql);
73
+ if (parsed.errors.length)
74
+ throw KernError.badRequest(parsed.errors[0].message, { errors: parsed.errors });
75
+ }
76
+ async requireShareRights(tx, principal, workspaceId, visibility, projectId) {
77
+ if (visibility === 'private')
78
+ return;
79
+ if (projectId)
80
+ await this.access.require(principal, 'tracker.view.manage_shared', workspaceId, projectId);
81
+ else
82
+ await this.kernel.authz.require(principal, 'tracker.view.manage_shared', {
83
+ kind: 'workspace',
84
+ id: workspaceId,
85
+ workspaceId,
86
+ });
87
+ void tx;
88
+ }
89
+ async create(tx, principal, workspaceId, input) {
90
+ this.assertQueryParses(input.kql);
91
+ const projectId = input.projectId ?? null;
92
+ if (projectId)
93
+ await this.access.requireProject(tx, principal, workspaceId, projectId);
94
+ await this.requireShareRights(tx, principal, workspaceId, input.visibility, projectId);
95
+ const [row] = await tx
96
+ .insert(views)
97
+ .values({
98
+ id: uuidv7(),
99
+ workspaceId,
100
+ projectId,
101
+ name: input.name,
102
+ description: input.description ?? null,
103
+ icon: input.icon ?? null,
104
+ kql: input.kql,
105
+ layout: input.layout,
106
+ display: ViewDisplay.parse(input.display ?? {}),
107
+ filters: input.filters ?? {},
108
+ visibility: input.visibility,
109
+ ownerId: principal.userId ?? null,
110
+ order: input.order ?? 0,
111
+ })
112
+ .returning();
113
+ await this.notify.change(workspaceId, 'view', row.id, 'created');
114
+ return toView(row, false);
115
+ }
116
+ async update(tx, principal, workspaceId, id, patch) {
117
+ const current = await this.row(tx, workspaceId, id);
118
+ await this.requireEdit(tx, principal, workspaceId, current);
119
+ if (patch.kql !== undefined)
120
+ this.assertQueryParses(patch.kql);
121
+ if (patch.visibility && patch.visibility !== current.visibility)
122
+ await this.requireShareRights(tx, principal, workspaceId, patch.visibility, current.projectId);
123
+ const display = patch.display === undefined
124
+ ? undefined
125
+ : ViewDisplay.parse({ ...parseDisplay(current.display), ...patch.display });
126
+ const [row] = await tx
127
+ .update(views)
128
+ .set({
129
+ ...(patch.name === undefined ? {} : { name: patch.name }),
130
+ ...(patch.description === undefined ? {} : { description: patch.description }),
131
+ ...(patch.icon === undefined ? {} : { icon: patch.icon }),
132
+ ...(patch.kql === undefined ? {} : { kql: patch.kql }),
133
+ ...(patch.layout === undefined ? {} : { layout: patch.layout }),
134
+ ...(display === undefined ? {} : { display }),
135
+ ...(patch.filters === undefined ? {} : { filters: patch.filters }),
136
+ ...(patch.visibility === undefined ? {} : { visibility: patch.visibility }),
137
+ ...(patch.projectId === undefined ? {} : { projectId: patch.projectId }),
138
+ ...(patch.order === undefined ? {} : { order: patch.order }),
139
+ updatedAt: new Date(),
140
+ })
141
+ .where(and(eq(views.workspaceId, workspaceId), eq(views.id, id)))
142
+ .returning();
143
+ const pinned = await this.pinnedIds(tx, workspaceId, principal.userId);
144
+ await this.notify.change(workspaceId, 'view', id, 'updated');
145
+ return toView(row, pinned.has(id));
146
+ }
147
+ async requireEdit(tx, principal, workspaceId, row) {
148
+ if (principal.instanceAdmin || principal.kind === 'service')
149
+ return;
150
+ if (row.ownerId && row.ownerId === principal.userId)
151
+ return;
152
+ await this.requireShareRights(tx, principal, workspaceId, row.visibility, row.projectId);
153
+ }
154
+ async delete(tx, principal, workspaceId, id) {
155
+ const current = await this.row(tx, workspaceId, id);
156
+ if (current.builtin)
157
+ throw KernError.conflict('Built-in views cannot be deleted', 'tracker.view.builtin');
158
+ await this.requireEdit(tx, principal, workspaceId, current);
159
+ await tx.delete(viewPins).where(eq(viewPins.viewId, id));
160
+ await tx.delete(views).where(and(eq(views.workspaceId, workspaceId), eq(views.id, id)));
161
+ await this.notify.change(workspaceId, 'view', id, 'deleted');
162
+ }
163
+ /** Pinning is per user: it never changes the shared view row. */
164
+ async pin(tx, principal, workspaceId, id, pinned) {
165
+ const row = await this.row(tx, workspaceId, id);
166
+ const userId = this.access.userId(principal);
167
+ if (pinned)
168
+ await tx
169
+ .insert(viewPins)
170
+ .values({ viewId: id, workspaceId, userId })
171
+ .onConflictDoNothing({ target: [viewPins.viewId, viewPins.userId] });
172
+ else
173
+ await tx.delete(viewPins).where(and(eq(viewPins.viewId, id), eq(viewPins.userId, userId)));
174
+ return toView(row, pinned);
175
+ }
176
+ /** Views pinned by a user across the workspace (sidebar). */
177
+ async pinnedFor(tx, workspaceId, userId) {
178
+ const rows = await tx
179
+ .select({ view: views })
180
+ .from(viewPins)
181
+ .innerJoin(views, eq(views.id, viewPins.viewId))
182
+ .where(and(eq(viewPins.workspaceId, workspaceId), eq(viewPins.userId, userId)))
183
+ .orderBy(asc(views.order));
184
+ return rows.map((r) => toView(r.view, true));
185
+ }
186
+ /** Count of views in a workspace (used by the workspace overview). */
187
+ async count(tx, workspaceId) {
188
+ const [row] = await tx
189
+ .select({ n: sql `count(*)::int` })
190
+ .from(views)
191
+ .where(eq(views.workspaceId, workspaceId));
192
+ return row?.n ?? 0;
193
+ }
194
+ }
195
+ //# sourceMappingURL=views.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"views.js","sourceRoot":"","sources":["../../../src/server/services/views.ts"],"names":[],"mappings":"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"}