workers-sentinel 0.1.1 → 0.2.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 (44) hide show
  1. package/README.md +23 -1
  2. package/dist/durable-objects/auth-state.d.ts +10 -0
  3. package/dist/durable-objects/auth-state.d.ts.map +1 -1
  4. package/dist/durable-objects/project-state.d.ts +40 -0
  5. package/dist/durable-objects/project-state.d.ts.map +1 -1
  6. package/dist/index.d.ts +5 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/lib/webhook.d.ts +27 -0
  9. package/dist/lib/webhook.d.ts.map +1 -0
  10. package/dist/middleware/auth.d.ts.map +1 -1
  11. package/dist/routes/admin.d.ts +11 -0
  12. package/dist/routes/admin.d.ts.map +1 -0
  13. package/dist/routes/auth.d.ts +9 -1
  14. package/dist/routes/auth.d.ts.map +1 -1
  15. package/dist/routes/filters.d.ts +11 -0
  16. package/dist/routes/filters.d.ts.map +1 -0
  17. package/dist/routes/ingestion.d.ts.map +1 -1
  18. package/dist/routes/members.d.ts +11 -0
  19. package/dist/routes/members.d.ts.map +1 -0
  20. package/dist/routes/projects.d.ts.map +1 -1
  21. package/dist/routes/releases.d.ts +11 -0
  22. package/dist/routes/releases.d.ts.map +1 -0
  23. package/dist/routes/sourcemaps.d.ts +11 -0
  24. package/dist/routes/sourcemaps.d.ts.map +1 -0
  25. package/dist/rpc.d.ts.map +1 -1
  26. package/dist/types.d.ts +66 -1
  27. package/dist/types.d.ts.map +1 -1
  28. package/package.json +61 -59
  29. package/dist/README.md +0 -1
  30. package/dist/dashboard/assets/EventDetail-DgqYLyiF.js +0 -1
  31. package/dist/dashboard/assets/IssueDetail-CjG-J6cD.js +0 -1
  32. package/dist/dashboard/assets/Issues-Cfnqb_a0.js +0 -33
  33. package/dist/dashboard/assets/Layout-Edli6x7p.js +0 -1
  34. package/dist/dashboard/assets/Login-DHYJjZXJ.js +0 -1
  35. package/dist/dashboard/assets/ProjectCreate-D5GeKxHe.js +0 -33
  36. package/dist/dashboard/assets/ProjectSettings-6OwGPcir.js +0 -1
  37. package/dist/dashboard/assets/Projects-Bth0OyBs.js +0 -1
  38. package/dist/dashboard/assets/Register-C3zVYtDV.js +0 -1
  39. package/dist/dashboard/assets/index-7dRN2NZv.js +0 -30
  40. package/dist/dashboard/assets/index-JMAa_1Q2.css +0 -1
  41. package/dist/dashboard/assets/projects-BUj8O17i.js +0 -1
  42. package/dist/dashboard/index.html +0 -14
  43. package/dist/index.js +0 -4774
  44. package/dist/index.js.map +0 -8
package/README.md CHANGED
@@ -88,6 +88,7 @@ Workers Sentinel gives you a private, self-hosted error tracking solution with a
88
88
  - **👥 User Tracking**: See how many users are affected by each issue
89
89
  - **🏷️ Tags & Context**: View tags, breadcrumbs, and contextual data
90
90
  - **✅ Issue Management**: Mark issues as resolved or ignored
91
+ - **🚀 Release Tracking**: Track errors per release with automatic regression detection
91
92
  - **🌐 Multi-Project**: Create multiple projects with isolated data storage
92
93
 
93
94
  ## Prerequisites
@@ -231,6 +232,27 @@ sentry.Init(sentry.ClientOptions{
231
232
 
232
233
  The DSN is displayed when you create a project in the dashboard, or you can find it in the project settings.
233
234
 
235
+ ## Releases
236
+
237
+ Workers Sentinel automatically tracks releases when your Sentry SDK is configured with a `release` option. Each event with a `release` field is associated with that release, giving you per-release error breakdowns.
238
+
239
+ ### How It Works
240
+
241
+ - **Automatic tracking**: When events arrive with a `release` field, Sentinel creates or updates the release record and links the issue to that release.
242
+ - **Regression detection**: If a previously resolved issue reappears in a new event, Sentinel automatically reopens it by setting its status back to `unresolved`. Issues marked as `ignored` are not affected — only `resolved` issues are reopened.
243
+ - **Dashboard views**: Browse all releases for a project, see event and issue counts per release, and drill into individual releases to see which issues appeared.
244
+
245
+ ### Configuring Releases in Sentry SDKs
246
+
247
+ ```javascript
248
+ Sentry.init({
249
+ dsn: 'https://<public_key>@<your-worker>.workers.dev/<project_id>',
250
+ release: 'my-app@1.2.0',
251
+ });
252
+ ```
253
+
254
+ Most Sentry SDKs support the `release` option — refer to your SDK's documentation for details.
255
+
234
256
  ## Architecture
235
257
 
236
258
  Workers Sentinel is built with modern web technologies:
@@ -258,7 +280,7 @@ Each project has its own isolated Durable Object with SQLite storage, ensuring d
258
280
  Planned features for future releases:
259
281
 
260
282
  - [ ] Source map support for JavaScript errors
261
- - [ ] Release tracking and deployment correlation
283
+ - [x] Release tracking and deployment correlation
262
284
  - [ ] Performance monitoring (transactions, spans)
263
285
  - [ ] Alerting integrations (webhook, email)
264
286
  - [ ] Session replay support
@@ -16,7 +16,17 @@ export declare class AuthState extends DurableObject<Env> {
16
16
  private handleGetProject;
17
17
  private handleGetProjectByKey;
18
18
  private handleDeleteProject;
19
+ private handleUpdateProject;
19
20
  private handleCheckAccess;
21
+ private handleCreateApiToken;
22
+ private handleListApiTokens;
23
+ private handleRevokeApiToken;
24
+ private handleValidateApiToken;
25
+ private handleListProjectMembers;
26
+ private handleAddProjectMember;
27
+ private handleRemoveProjectMember;
28
+ private handleUpdateProjectMember;
29
+ private handleListUsers;
20
30
  private createSession;
21
31
  private cleanExpiredSessions;
22
32
  private hashPassword;
@@ -1 +1 @@
1
- {"version":3,"file":"auth-state.d.ts","sourceRoot":"","sources":["../../src/durable-objects/auth-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,GAAG,EAA0B,MAAM,UAAU,CAAC;AA+C5D,qBAAa,SAAU,SAAQ,aAAa,CAAC,GAAG,CAAC;IAChD,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,WAAW,CAAS;gBAEhB,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG;YAK/B,YAAY;IAMpB,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;YAgDlC,cAAc;YA6Dd,WAAW;YAsDX,YAAY;YAUZ,qBAAqB;YAgDrB,WAAW;YAUX,mBAAmB;YA8DnB,kBAAkB;YAgClB,gBAAgB;YAiDhB,qBAAqB;YAiCrB,mBAAmB;YA6BnB,iBAAiB;YAsBjB,aAAa;YAqBb,oBAAoB;YAIpB,YAAY;YAQZ,cAAc;IAK5B,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,YAAY;CAMpB"}
1
+ {"version":3,"file":"auth-state.d.ts","sourceRoot":"","sources":["../../src/durable-objects/auth-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAY,GAAG,EAAyC,MAAM,UAAU,CAAC;AA6DrF,qBAAa,SAAU,SAAQ,aAAa,CAAC,GAAG,CAAC;IAChD,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,WAAW,CAAS;gBAEhB,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG;YAK/B,YAAY;IAYpB,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;YAoElC,cAAc;YA6Dd,WAAW;YAsDX,YAAY;YAUZ,qBAAqB;YAgDrB,WAAW;YAUX,mBAAmB;YA8DnB,kBAAkB;YAiClB,gBAAgB;YAkDhB,qBAAqB;YAkCrB,mBAAmB;YA6BnB,mBAAmB;YAkEnB,iBAAiB;YAsBjB,oBAAoB;YA4EpB,mBAAmB;YA2BnB,oBAAoB;YA2BpB,sBAAsB;YA4DtB,wBAAwB;YA6BxB,sBAAsB;YAoEtB,yBAAyB;YA0CzB,yBAAyB;YAwEzB,eAAe;YAwBf,aAAa;YAqBb,oBAAoB;YAIpB,YAAY;YAQZ,cAAc;IAK5B,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,YAAY;CAMpB"}
@@ -3,21 +3,61 @@ import type { Env } from '../types';
3
3
  export declare class ProjectState extends DurableObject<Env> {
4
4
  private sql;
5
5
  private initialized;
6
+ private rateLimitCount;
7
+ private rateLimitBucket;
6
8
  constructor(ctx: DurableObjectState, env: Env);
7
9
  private ensureSchema;
8
10
  fetch(request: Request): Promise<Response>;
9
11
  private handleIngest;
12
+ private static readonly ALLOWED_SORT_FIELDS;
10
13
  private handleGetIssues;
11
14
  private handleGetIssue;
12
15
  private handleUpdateIssue;
13
16
  private handleDeleteIssue;
17
+ private handleBulkUpdateIssues;
14
18
  private handleGetIssueEvents;
15
19
  private handleGetEvent;
16
20
  private handleGetLatestEvents;
17
21
  private handleGetStats;
22
+ private handleGetTags;
23
+ private handleGetTagValues;
24
+ private handleGetReleases;
25
+ private handleGetRelease;
26
+ private handleGetEnvironments;
27
+ private handleGetSummary;
28
+ private handleGetComments;
29
+ private handleAddComment;
30
+ private handleDeleteComment;
31
+ private handleGetActivity;
32
+ private scheduleNextAlarm;
33
+ private handleSnoozeIssue;
34
+ private handleUnsnoozeIssue;
35
+ private static readonly VALID_FILTER_TYPES;
36
+ private shouldFilterEvent;
37
+ private handleGetFilters;
38
+ private handleCreateFilter;
39
+ private handleUpdateFilter;
40
+ private handleDeleteFilter;
41
+ private rowToFilter;
18
42
  private getHourBucket;
19
43
  private hashUserIdentifier;
20
44
  private rowToIssue;
45
+ private warmRateLimitCounter;
46
+ private checkRateLimit;
47
+ private getConfigValue;
48
+ private setConfigValue;
49
+ private handleGetConfig;
50
+ private handleUpdateConfig;
51
+ private handleRateLimitStatus;
52
+ alarm(): Promise<void>;
53
+ private getRetentionDays;
54
+ private handleGetSettings;
55
+ private handleUpdateSettings;
56
+ private handleUploadSourceMap;
57
+ private handleListSourceMaps;
58
+ private handleGetSourceMap;
59
+ private handleDeleteSourceMap;
60
+ private handleMergeIssues;
21
61
  private jsonResponse;
22
62
  }
23
63
  //# sourceMappingURL=project-state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-state.d.ts","sourceRoot":"","sources":["../../src/durable-objects/project-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOnD,OAAO,KAAK,EAAE,GAAG,EAAsB,MAAM,UAAU,CAAC;AA6DxD,qBAAa,YAAa,SAAQ,aAAa,CAAC,GAAG,CAAC;IACnD,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,WAAW,CAAS;gBAEhB,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG;YAK/B,YAAY;IAMpB,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;YA4ClC,YAAY;YAkHZ,eAAe;YAwDf,cAAc;YA8Bd,iBAAiB;YA6BjB,iBAAiB;YAajB,oBAAoB;YAoCpB,cAAc;YAgBd,qBAAqB;YAiBrB,cAAc;IAsC5B,OAAO,CAAC,aAAa;YAMP,kBAAkB;IAgBhC,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,YAAY;CAMpB"}
1
+ {"version":3,"file":"project-state.d.ts","sourceRoot":"","sources":["../../src/durable-objects/project-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOnD,OAAO,KAAK,EAAE,GAAG,EAAkE,MAAM,UAAU,CAAC;AAqLpG,qBAAa,YAAa,SAAQ,aAAa,CAAC,GAAG,CAAC;IACnD,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,eAAe,CAAM;gBAEjB,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG;YAK/B,YAAY;IAqBpB,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;YAkGlC,YAAY;IAmR1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAOxC;YAEW,eAAe;YAsFf,cAAc;YA8Bd,iBAAiB;YAmDjB,iBAAiB;YAajB,sBAAsB;YA4CtB,oBAAoB;YAoCpB,cAAc;YAgBd,qBAAqB;YAiBrB,cAAc;YAsCd,aAAa;YA2Cb,kBAAkB;YAqClB,iBAAiB;YAoCjB,gBAAgB;IA2C9B,OAAO,CAAC,qBAAqB;YAmBf,gBAAgB;YA8DhB,iBAAiB;YAmBjB,gBAAgB;YAuDhB,mBAAmB;YA+BnB,iBAAiB;YAyCjB,iBAAiB;YA2BjB,iBAAiB;YAuBjB,mBAAmB;IAkBjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAMvC;IAEH,OAAO,CAAC,iBAAiB;IA6CzB,OAAO,CAAC,gBAAgB;YAMV,kBAAkB;YA+ClB,kBAAkB;YAuDlB,kBAAkB;IAmBhC,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,aAAa;YAMP,kBAAkB;IAgBhC,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,oBAAoB;IAkB5B,OAAO,CAAC,cAAc;IA4BtB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,eAAe;YAOT,kBAAkB;IAchC,OAAO,CAAC,qBAAqB;IAevB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiD5B,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,iBAAiB;YAKX,oBAAoB;YA4BpB,qBAAqB;YAgDrB,oBAAoB;YAyBpB,kBAAkB;YAkClB,qBAAqB;YAWrB,iBAAiB;IAoK/B,OAAO,CAAC,YAAY;CAMpB"}
package/dist/index.d.ts CHANGED
@@ -6,6 +6,11 @@ export { SentinelRpc } from './rpc';
6
6
  type Variables = {
7
7
  auth?: AuthContext;
8
8
  };
9
+ declare const app: Hono<{
10
+ Bindings: Env;
11
+ Variables: Variables;
12
+ }, import("hono/types").BlankSchema, "/">;
13
+ export default app;
9
14
  export declare function workersSentinel(): Hono<{
10
15
  Bindings: Env;
11
16
  Variables: Variables;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAQ5B,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAGhD,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAG/D,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEpC,KAAK,SAAS,GAAG;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;CACnB,CAAC;AAoCF,wBAAgB,eAAe;cAlCE,GAAG;eAAa,SAAS;0CAoCzD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAa5B,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAGhD,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAG/D,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEpC,KAAK,SAAS,GAAG;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;CACnB,CAAC;AAEF,QAAA,MAAM,GAAG;cAAwB,GAAG;eAAa,SAAS;yCAAK,CAAC;AA+ChE,eAAe,GAAG,CAAC;AAEnB,wBAAgB,eAAe;cAjDE,GAAG;eAAa,SAAS;0CAmDzD"}
@@ -0,0 +1,27 @@
1
+ export interface WebhookPayload {
2
+ text: string;
3
+ project: {
4
+ id: string;
5
+ name: string;
6
+ slug: string;
7
+ };
8
+ issue: {
9
+ id: string;
10
+ title: string;
11
+ level: string;
12
+ culprit: string | null;
13
+ };
14
+ timestamp: string;
15
+ }
16
+ export declare function buildWebhookPayload(project: {
17
+ id: string;
18
+ name: string;
19
+ slug: string;
20
+ }, issue: {
21
+ id: string;
22
+ title: string;
23
+ level: string;
24
+ culprit: string | null;
25
+ }): WebhookPayload;
26
+ export declare function sendWebhook(url: string, payload: WebhookPayload): Promise<void>;
27
+ //# sourceMappingURL=webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/lib/webhook.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE;QACR,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACb,CAAC;IACF,KAAK,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;KACvB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CAClC,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACnD,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACzE,cAAc,CA0BhB;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBrF"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEjD,KAAK,SAAS,GAAG;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,cAAc;cAChB,GAAG;eACF,SAAS;wBAkCnB,CAAC"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEjD,KAAK,SAAS,GAAG;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,cAAc;cAChB,GAAG;eACF,SAAS;wBAkDnB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Hono } from 'hono';
2
+ import type { AuthContext, Env } from '../types';
3
+ type Variables = {
4
+ auth?: AuthContext;
5
+ };
6
+ export declare const adminRoutes: Hono<{
7
+ Bindings: Env;
8
+ Variables: Variables;
9
+ }, import("hono/types").BlankSchema, "/">;
10
+ export {};
11
+ //# sourceMappingURL=admin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/routes/admin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEjD,KAAK,SAAS,GAAG;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,WAAW;cAAwB,GAAG;eAAa,SAAS;yCAAK,CAAC"}
@@ -1,6 +1,14 @@
1
1
  import { Hono } from 'hono';
2
- import type { Env } from '../types';
2
+ import type { AuthContext, Env } from '../types';
3
+ type Variables = {
4
+ auth?: AuthContext;
5
+ };
3
6
  export declare const authRoutes: Hono<{
4
7
  Bindings: Env;
5
8
  }, import("hono/types").BlankSchema, "/">;
9
+ export declare const tokenRoutes: Hono<{
10
+ Bindings: Env;
11
+ Variables: Variables;
12
+ }, import("hono/types").BlankSchema, "/">;
13
+ export {};
6
14
  //# sourceMappingURL=auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/routes/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC,eAAO,MAAM,UAAU;cAAwB,GAAG;yCAAK,CAAC"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/routes/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEjD,KAAK,SAAS,GAAG;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,UAAU;cAAwB,GAAG;yCAAK,CAAC;AACxD,eAAO,MAAM,WAAW;cAAwB,GAAG;eAAa,SAAS;yCAAK,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Hono } from 'hono';
2
+ import type { AuthContext, Env } from '../types';
3
+ type Variables = {
4
+ auth?: AuthContext;
5
+ };
6
+ export declare const filterRoutes: Hono<{
7
+ Bindings: Env;
8
+ Variables: Variables;
9
+ }, import("hono/types").BlankSchema, "/">;
10
+ export {};
11
+ //# sourceMappingURL=filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/routes/filters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,IAAI,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAW,MAAM,UAAU,CAAC;AAE1D,KAAK,SAAS,GAAG;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;CACnB,CAAC;AAIF,eAAO,MAAM,YAAY;cAAwB,GAAG;eAAa,SAAS;yCAAK,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ingestion.d.ts","sourceRoot":"","sources":["../../src/routes/ingestion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,IAAI,EAAE,MAAM,MAAM,CAAC;AAO1C,OAAO,KAAK,EAAE,GAAG,EAAW,MAAM,UAAU,CAAC;AAE7C,eAAO,MAAM,eAAe;cAAwB,GAAG;yCAAK,CAAC"}
1
+ {"version":3,"file":"ingestion.d.ts","sourceRoot":"","sources":["../../src/routes/ingestion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,IAAI,EAAE,MAAM,MAAM,CAAC;AAQ1C,OAAO,KAAK,EAAE,GAAG,EAAW,MAAM,UAAU,CAAC;AAE7C,eAAO,MAAM,eAAe;cAAwB,GAAG;yCAAK,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Hono } from 'hono';
2
+ import type { AuthContext, Env } from '../types';
3
+ type Variables = {
4
+ auth?: AuthContext;
5
+ };
6
+ export declare const memberRoutes: Hono<{
7
+ Bindings: Env;
8
+ Variables: Variables;
9
+ }, import("hono/types").BlankSchema, "/">;
10
+ export {};
11
+ //# sourceMappingURL=members.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"members.d.ts","sourceRoot":"","sources":["../../src/routes/members.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,IAAI,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEjD,KAAK,SAAS,GAAG;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;CACnB,CAAC;AAIF,eAAO,MAAM,YAAY;cAAwB,GAAG;eAAa,SAAS;yCAAK,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/routes/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEjD,KAAK,SAAS,GAAG;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,aAAa;cAAwB,GAAG;eAAa,SAAS;yCAAK,CAAC"}
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/routes/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEjD,KAAK,SAAS,GAAG;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,aAAa;cAAwB,GAAG;eAAa,SAAS;yCAAK,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Hono } from 'hono';
2
+ import type { AuthContext, Env } from '../types';
3
+ type Variables = {
4
+ auth?: AuthContext;
5
+ };
6
+ export declare const releaseRoutes: Hono<{
7
+ Bindings: Env;
8
+ Variables: Variables;
9
+ }, import("hono/types").BlankSchema, "/">;
10
+ export {};
11
+ //# sourceMappingURL=releases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"releases.d.ts","sourceRoot":"","sources":["../../src/routes/releases.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,IAAI,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAW,MAAM,UAAU,CAAC;AAE1D,KAAK,SAAS,GAAG;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;CACnB,CAAC;AAIF,eAAO,MAAM,aAAa;cAAwB,GAAG;eAAa,SAAS;yCAAK,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Hono } from 'hono';
2
+ import type { AuthContext, Env } from '../types';
3
+ type Variables = {
4
+ auth?: AuthContext;
5
+ };
6
+ export declare const sourcemapRoutes: Hono<{
7
+ Bindings: Env;
8
+ Variables: Variables;
9
+ }, import("hono/types").BlankSchema, "/">;
10
+ export {};
11
+ //# sourceMappingURL=sourcemaps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourcemaps.d.ts","sourceRoot":"","sources":["../../src/routes/sourcemaps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,IAAI,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAW,MAAM,UAAU,CAAC;AAE1D,KAAK,SAAS,GAAG;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;CACnB,CAAC;AAIF,eAAO,MAAM,eAAe;cAAwB,GAAG;eAAa,SAAS;yCAAK,CAAC"}
package/dist/rpc.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAgB,GAAG,EAAW,MAAM,SAAS,CAAC;AAG1D,KAAK,cAAc,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAE3F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,qBAAa,WAAY,SAAQ,gBAAgB,CAAC,GAAG,CAAC;IACrD;;;;;;OAMG;IACG,eAAe,CACpB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,cAAc,GACtB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAmFhD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC;CAGhC"}
1
+ {"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,GAAG,EAAyB,MAAM,SAAS,CAAC;AAG1D,KAAK,cAAc,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAE3F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,qBAAa,WAAY,SAAQ,gBAAgB,CAAC,GAAG,CAAC;IACrD;;;;;;OAMG;IACG,eAAe,CACpB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,cAAc,GACtB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAuFhD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC;CAGhC"}
package/dist/types.d.ts CHANGED
@@ -23,15 +23,26 @@ export interface Project {
23
23
  slug: string;
24
24
  platform: string;
25
25
  publicKey: string;
26
+ webhookUrl?: string | null;
26
27
  createdAt: string;
27
28
  createdBy: string;
28
29
  }
29
30
  export interface ProjectMember {
30
- projectId: string;
31
31
  userId: string;
32
+ email: string;
33
+ name: string;
32
34
  role: 'owner' | 'admin' | 'member';
33
35
  createdAt: string;
34
36
  }
37
+ export interface ApiToken {
38
+ id: string;
39
+ userId: string;
40
+ name: string;
41
+ tokenPrefix: string;
42
+ lastUsedAt: string | null;
43
+ expiresAt: string | null;
44
+ createdAt: string;
45
+ }
35
46
  export interface Issue {
36
47
  id: string;
37
48
  fingerprint: string;
@@ -44,6 +55,7 @@ export interface Issue {
44
55
  count: number;
45
56
  userCount: number;
46
57
  status: 'unresolved' | 'resolved' | 'ignored';
58
+ snoozedUntil: string | null;
47
59
  metadata: IssueMetadata;
48
60
  }
49
61
  export interface IssueMetadata {
@@ -52,6 +64,41 @@ export interface IssueMetadata {
52
64
  filename?: string;
53
65
  function?: string;
54
66
  }
67
+ export interface ProjectSettings {
68
+ retentionDays: number;
69
+ }
70
+ export interface IssueComment {
71
+ id: string;
72
+ issueId: string;
73
+ userId: string;
74
+ userName: string;
75
+ body: string;
76
+ createdAt: string;
77
+ }
78
+ export interface IssueActivity {
79
+ id: string;
80
+ issueId: string;
81
+ userId: string;
82
+ userName: string;
83
+ type: 'comment' | 'status_change';
84
+ data: Record<string, string>;
85
+ createdAt: string;
86
+ }
87
+ export interface Release {
88
+ version: string;
89
+ firstSeen: string;
90
+ lastSeen: string;
91
+ eventCount: number;
92
+ issueCount: number;
93
+ newIssueCount: number;
94
+ }
95
+ export interface SourceMap {
96
+ id: string;
97
+ release: string;
98
+ fileUrl: string;
99
+ createdAt: string;
100
+ size: number;
101
+ }
55
102
  export interface SentryEvent {
56
103
  event_id: string;
57
104
  timestamp: string;
@@ -159,6 +206,24 @@ export interface PaginatedResponse<T> {
159
206
  nextCursor?: string;
160
207
  hasMore: boolean;
161
208
  }
209
+ export type FilterType = 'message' | 'error_type' | 'ip_address' | 'release' | 'environment';
210
+ export interface InboundFilter {
211
+ id: string;
212
+ filterType: FilterType;
213
+ pattern: string;
214
+ enabled: boolean;
215
+ description: string | null;
216
+ droppedCount: number;
217
+ createdAt: string;
218
+ }
219
+ export interface MergeIssuesRequest {
220
+ primaryIssueId: string;
221
+ issueIds: string[];
222
+ }
223
+ export interface MergeIssuesResponse {
224
+ issue: Issue | null;
225
+ mergedCount: number;
226
+ }
162
227
  export interface AuthContext {
163
228
  user: User;
164
229
  session: Session;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,60 +1,62 @@
1
1
  {
2
- "name": "workers-sentinel",
3
- "version": "0.1.1",
4
- "description": "A self-hosted, Sentry-compatible error tracking system running on Cloudflare Workers",
5
- "type": "module",
6
- "main": "./dist/index.js",
7
- "types": "./dist/index.d.ts",
8
- "files": [
9
- "dist",
10
- "LICENSE"
11
- ],
12
- "scripts": {
13
- "dev": "wrangler dev",
14
- "build": "cd ../dashboard && npm run build && cp -r ../dashboard/dist dist/dashboard",
15
- "build:types": "tsc -p tsconfig.build.json",
16
- "prepublishOnly": "pnpm build:types",
17
- "deploy": "wrangler deploy",
18
- "typecheck": "tsc --noEmit",
19
- "cf-typegen": "wrangler types",
20
- "test": "vitest run",
21
- "test:watch": "vitest",
22
- "test:ui": "vitest --ui"
23
- },
24
- "keywords": [
25
- "cloudflare",
26
- "workers",
27
- "sentry",
28
- "error-tracking",
29
- "monitoring",
30
- "durable-objects",
31
- "self-hosted"
32
- ],
33
- "author": "Gabriel Massadas",
34
- "license": "MIT",
35
- "repository": {
36
- "type": "git",
37
- "url": "git+https://github.com/G4brym/workers-sentinel.git",
38
- "directory": "packages/workers-sentinel"
39
- },
40
- "bugs": {
41
- "url": "https://github.com/G4brym/workers-sentinel/issues"
42
- },
43
- "homepage": "https://github.com/G4brym/workers-sentinel#readme",
44
- "dependencies": {
45
- "hono": "^4.6.14"
46
- },
47
- "devDependencies": {
48
- "@cloudflare/vitest-pool-workers": "^0.12.4",
49
- "@cloudflare/workers-types": "^4.20260118.0",
50
- "wrangler": "^4.59.2"
51
- },
52
- "peerDependencies": {
53
- "@cloudflare/workers-types": ">=4.0.0"
54
- },
55
- "peerDependenciesMeta": {
56
- "@cloudflare/workers-types": {
57
- "optional": true
58
- }
59
- }
60
- }
2
+ "name": "workers-sentinel",
3
+ "version": "0.2.0",
4
+ "description": "A self-hosted, Sentry-compatible error tracking system running on Cloudflare Workers",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "files": [
9
+ "dashboard",
10
+ "dist",
11
+ "LICENSE"
12
+ ],
13
+ "keywords": [
14
+ "cloudflare",
15
+ "workers",
16
+ "sentry",
17
+ "error-tracking",
18
+ "monitoring",
19
+ "durable-objects",
20
+ "self-hosted"
21
+ ],
22
+ "author": "Gabriel Massadas",
23
+ "license": "MIT",
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/G4brym/workers-sentinel.git",
27
+ "directory": "packages/workers-sentinel"
28
+ },
29
+ "bugs": {
30
+ "url": "https://github.com/G4brym/workers-sentinel/issues"
31
+ },
32
+ "homepage": "https://github.com/G4brym/workers-sentinel#readme",
33
+ "dependencies": {
34
+ "hono": "^4.6.14",
35
+ "tsup": "^8.5.1"
36
+ },
37
+ "devDependencies": {
38
+ "@cloudflare/vitest-pool-workers": "^0.12.4",
39
+ "@cloudflare/workers-types": "^4.20260118.0",
40
+ "vitest": "3.0.9",
41
+ "wrangler": "^4.59.2"
42
+ },
43
+ "peerDependencies": {
44
+ "@cloudflare/workers-types": ">=4.0.0"
45
+ },
46
+ "peerDependenciesMeta": {
47
+ "@cloudflare/workers-types": {
48
+ "optional": true
49
+ }
50
+ },
51
+ "scripts": {
52
+ "dev": "wrangler dev",
53
+ "build": "rm -rf dist/ && rm -rf dashboard/ && tsup src/index.ts --format esm --external cloudflare:workers --dts && cd ../dashboard && npm run build && cp -r dist ../workers-sentinel/dashboard",
54
+ "build:types": "tsc -p tsconfig.build.json",
55
+ "deploy": "wrangler deploy",
56
+ "typecheck": "tsc --noEmit",
57
+ "cf-typegen": "wrangler types",
58
+ "test": "vitest run",
59
+ "test:watch": "vitest",
60
+ "test:ui": "vitest --ui"
61
+ }
62
+ }
package/dist/README.md DELETED
@@ -1 +0,0 @@
1
- This folder contains the built output assets for the worker "workers-sentinel" generated at 2026-01-18T21:56:03.666Z.
@@ -1 +0,0 @@
1
- import{d as b,k as x,l as w,r,x as h,c as l,h as m,a as t,t as v,e as E,n as I,w as f,f as y,R as g,y as N,b as _,o as a}from"./index-7dRN2NZv.js";const $={key:0,class:"text-center py-12"},B={key:1,class:"bg-error-50 dark:bg-error-900/20 text-error-700 dark:text-error-400 px-4 py-3 rounded-lg"},V={key:2},j={class:"mb-6"},C={class:"flex items-center space-x-2 text-sm text-gray-500 mb-2"},R={class:"text-xl font-bold text-gray-900 dark:text-white"},D={class:"card p-4"},S={class:"text-xs font-mono overflow-x-auto whitespace-pre-wrap text-gray-900 dark:text-gray-100"},L=b({__name:"EventDetail",setup(F){const c=w(),n=x(()=>c.params.slug),p=x(()=>c.params.eventId),u=r(null),d=r(null),i=r(!0),o=r(null);async function k(){i.value=!0,o.value=null;try{const s=await N.get(`/api/projects/${n.value}/events/${p.value}`);u.value=s.event,d.value=s.issueId}catch(s){o.value=s instanceof Error?s.message:"Failed to load event"}finally{i.value=!1}}return h(()=>k()),(s,e)=>(a(),l("div",null,[i.value?(a(),l("div",$,[...e[0]||(e[0]=[t("div",{class:"animate-spin rounded-full h-8 w-8 border-b-2 border-primary-600 mx-auto"},null,-1)])])):o.value?(a(),l("div",B,v(o.value),1)):u.value?(a(),l("div",V,[t("div",j,[t("div",C,[E(y(g),{to:`/projects/${n.value}/issues`,class:"hover:text-gray-700"},{default:f(()=>[...e[1]||(e[1]=[_("Issues",-1)])]),_:1},8,["to"]),e[3]||(e[3]=t("span",null,"/",-1)),d.value?(a(),I(y(g),{key:0,to:`/projects/${n.value}/issues/${d.value}`,class:"hover:text-gray-700"},{default:f(()=>[...e[2]||(e[2]=[_(" Issue ",-1)])]),_:1},8,["to"])):m("",!0),e[4]||(e[4]=t("span",null,"/",-1)),e[5]||(e[5]=t("span",null,"Event",-1))]),t("h1",R," Event "+v(p.value),1)]),t("div",D,[t("pre",S,v(JSON.stringify(u.value,null,2)),1)])])):m("",!0)]))}});export{L as default};
@@ -1 +0,0 @@
1
- import{d as T,k as E,l as B,r as v,x as N,c as a,h as l,a as t,t as n,e as V,w as M,f as P,R as q,b as c,q as F,F as x,p as y,y as $,o}from"./index-7dRN2NZv.js";const z={key:0,class:"text-center py-12"},A={key:1,class:"bg-error-50 dark:bg-error-900/20 text-error-700 dark:text-error-400 px-4 py-3 rounded-lg"},O={key:2},U={class:"mb-6"},G={class:"flex items-center space-x-2 text-sm text-gray-500 mb-2"},H={class:"text-xl font-bold text-gray-900 dark:text-white mb-2"},J={key:0,class:"text-sm text-gray-500"},K={class:"flex items-center justify-between mb-6"},Q={class:"flex items-center space-x-4"},W={class:"flex items-center space-x-6 text-sm text-gray-500"},X={class:"font-medium text-gray-900 dark:text-white"},Y={key:0},Z={class:"font-medium text-gray-900 dark:text-white"},tt={class:"font-medium text-gray-900 dark:text-white"},et={key:0,class:"mb-4"},st=["value"],at=["value"],ot={key:0},nt={class:"grid grid-cols-1 lg:grid-cols-3 gap-6"},rt={class:"lg:col-span-2 space-y-4"},lt={class:"card"},it={key:0,class:"p-4 text-gray-500"},dt={key:1,class:"divide-y divide-gray-200 dark:divide-gray-700"},ut=["onClick"],ct={class:"flex items-start justify-between"},vt={class:"flex-1 min-w-0"},xt={class:"flex items-center space-x-2"},yt={key:0,class:"w-2 h-2 bg-primary-500 rounded-full",title:"In-app frame"},pt={key:1,class:"w-2 h-2 bg-gray-300 rounded-full",title:"System frame"},gt={class:"text-sm font-medium text-gray-900 dark:text-white truncate"},_t={class:"text-xs text-gray-500 mt-1 truncate"},kt={key:0},mt={key:1},ht={key:0,class:"bg-gray-900 p-4"},bt={class:"text-xs font-mono overflow-x-auto"},ft={key:1,class:"block text-white bg-error-900/50 -mx-4 px-4"},wt={key:0,class:"card"},Ct={class:"divide-y divide-gray-200 dark:divide-gray-700 max-h-96 overflow-y-auto"},It={class:"flex items-center justify-between"},$t={class:"flex items-center space-x-2"},St={class:"badge badge-info"},jt={class:"text-gray-900 dark:text-white"},Et={key:0,class:"text-xs text-gray-400"},Ft={class:"space-y-4"},Rt={class:"card p-4"},Lt={class:"space-y-2 text-sm"},Dt={class:"text-gray-900 dark:text-white font-mono text-xs"},Tt={class:"text-gray-900 dark:text-white"},Bt={key:0},Nt={class:"text-gray-900 dark:text-white"},Vt={key:1},Mt={class:"text-gray-900 dark:text-white font-mono text-xs"},Pt={key:0,class:"card p-4"},qt={class:"space-y-2 text-sm"},zt={key:0},At={class:"text-gray-900 dark:text-white font-mono text-xs"},Ot={key:1},Ut={class:"text-gray-900 dark:text-white"},Gt={key:2},Ht={class:"text-gray-900 dark:text-white font-mono"},Jt={key:1,class:"card p-4"},Kt={class:"flex flex-wrap gap-2"},Qt={class:"text-gray-500"},Wt={class:"ml-1 text-gray-900 dark:text-white"},Zt=T({__name:"IssueDetail",setup(Xt){const S=B(),k=E(()=>S.params.slug),f=E(()=>S.params.issueId),d=v(null),m=v([]),r=v(null),w=v(!0),h=v(null),p=v(new Set);async function R(){w.value=!0,h.value=null;try{const[i,e]=await Promise.all([$.get(`/api/projects/${k.value}/issues/${f.value}`),$.get(`/api/projects/${k.value}/issues/${f.value}/events?limit=10`)]);d.value=i.issue,m.value=e.events,r.value=e.events[0]||null}catch(i){h.value=i instanceof Error?i.message:"Failed to load issue"}finally{w.value=!1}}async function C(i){if(d.value)try{await $.patch(`/api/projects/${k.value}/issues/${f.value}`,{status:i}),d.value.status=i}catch(e){console.error("Failed to update status:",e)}}function I(i){return new Date(i).toLocaleString()}function L(i){p.value.has(i)?p.value.delete(i):p.value.add(i)}function j(){var e,g,s,u;const i=(s=(g=(e=r.value)==null?void 0:e.exception)==null?void 0:g.values)==null?void 0:s[0];return(u=i==null?void 0:i.stacktrace)!=null&&u.frames?[...i.stacktrace.frames].reverse():[]}function D(i){switch(i){case"fatal":case"error":return"text-error-600 dark:text-error-400";case"warning":return"text-warning-600 dark:text-warning-400";default:return"text-primary-600 dark:text-primary-400"}}return N(()=>R()),(i,e)=>{var g;return o(),a("div",null,[w.value?(o(),a("div",z,[...e[4]||(e[4]=[t("div",{class:"animate-spin rounded-full h-8 w-8 border-b-2 border-primary-600 mx-auto"},null,-1)])])):h.value?(o(),a("div",A,n(h.value),1)):d.value&&r.value?(o(),a("div",O,[t("div",U,[t("div",G,[V(P(q),{to:`/projects/${k.value}/issues`,class:"hover:text-gray-700"},{default:M(()=>[...e[5]||(e[5]=[c(" Issues ",-1)])]),_:1},8,["to"]),e[6]||(e[6]=t("span",null,"/",-1)),t("span",null,n(d.value.metadata.type),1)]),t("h1",H,[t("span",{class:F(D(d.value.level))},n(d.value.metadata.type)+":",3),c(" "+n(d.value.metadata.value),1)]),d.value.culprit?(o(),a("p",J,n(d.value.culprit),1)):l("",!0)]),t("div",K,[t("div",Q,[d.value.status!=="resolved"?(o(),a("button",{key:0,class:"btn btn-secondary",onClick:e[0]||(e[0]=s=>C("resolved"))}," Resolve ")):l("",!0),d.value.status!=="ignored"?(o(),a("button",{key:1,class:"btn btn-secondary",onClick:e[1]||(e[1]=s=>C("ignored"))}," Ignore ")):l("",!0),d.value.status!=="unresolved"?(o(),a("button",{key:2,class:"btn btn-secondary",onClick:e[2]||(e[2]=s=>C("unresolved"))}," Reopen ")):l("",!0)]),t("div",W,[t("div",null,[t("span",X,n(d.value.count.toLocaleString()),1),e[7]||(e[7]=c(" events ",-1))]),d.value.userCount>0?(o(),a("div",Y,[t("span",Z,n(d.value.userCount.toLocaleString()),1),e[8]||(e[8]=c(" users ",-1))])):l("",!0),t("div",null,[e[9]||(e[9]=c(" First seen ",-1)),t("span",tt,n(I(d.value.firstSeen)),1)])])]),m.value.length>1?(o(),a("div",et,[e[10]||(e[10]=t("label",{class:"label"},"Event",-1)),t("select",{class:"input w-auto",value:r.value.event_id,onChange:e[3]||(e[3]=s=>r.value=m.value.find(u=>u.event_id===s.target.value)||null)},[(o(!0),a(x,null,y(m.value,s=>(o(),a("option",{key:s.event_id,value:s.event_id},[c(n(I(s.timestamp))+" ",1),s.environment?(o(),a("span",ot," - "+n(s.environment),1)):l("",!0)],8,at))),128))],40,st)])):l("",!0),t("div",nt,[t("div",rt,[t("div",lt,[e[12]||(e[12]=t("div",{class:"p-4 border-b border-gray-200 dark:border-gray-700"},[t("h2",{class:"font-semibold text-gray-900 dark:text-white"},"Stack Trace")],-1)),j().length===0?(o(),a("div",it," No stack trace available ")):(o(),a("div",dt,[(o(!0),a(x,null,y(j(),(s,u)=>(o(),a("div",{key:u,class:"group"},[t("button",{class:"w-full p-3 text-left hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors",onClick:b=>L(u)},[t("div",ct,[t("div",vt,[t("div",xt,[s.in_app!==!1?(o(),a("span",yt)):(o(),a("span",pt)),t("code",gt,n(s.function||"(anonymous)"),1)]),t("p",_t,[c(n(s.filename)+" ",1),s.lineno?(o(),a("span",kt,":"+n(s.lineno),1)):l("",!0),s.colno?(o(),a("span",mt,":"+n(s.colno),1)):l("",!0)])]),(o(),a("svg",{class:F(["w-5 h-5 text-gray-400 transition-transform",{"rotate-180":p.value.has(u)}]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...e[11]||(e[11]=[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"},null,-1)])],2))])],8,ut),p.value.has(u)&&(s.context_line||s.pre_context||s.post_context)?(o(),a("div",ht,[t("pre",bt,[s.pre_context?(o(!0),a(x,{key:0},y(s.pre_context,(b,_)=>(o(),a("code",{key:"pre-"+_,class:"block text-gray-500"},n((s.lineno||0)-s.pre_context.length+_)+" "+n(b),1))),128)):l("",!0),s.context_line?(o(),a("code",ft,n(s.lineno)+" "+n(s.context_line),1)):l("",!0),s.post_context?(o(!0),a(x,{key:2},y(s.post_context,(b,_)=>(o(),a("code",{key:"post-"+_,class:"block text-gray-500"},n((s.lineno||0)+_+1)+" "+n(b),1))),128)):l("",!0)])])):l("",!0)]))),128))]))]),(g=r.value.breadcrumbs)!=null&&g.length?(o(),a("div",wt,[e[13]||(e[13]=t("div",{class:"p-4 border-b border-gray-200 dark:border-gray-700"},[t("h2",{class:"font-semibold text-gray-900 dark:text-white"},"Breadcrumbs")],-1)),t("div",Ct,[(o(!0),a(x,null,y(r.value.breadcrumbs,(s,u)=>(o(),a("div",{key:u,class:"p-3 text-sm"},[t("div",It,[t("div",$t,[t("span",St,n(s.category||s.type||"default"),1),t("span",jt,n(s.message),1)]),s.timestamp?(o(),a("span",Et,n(new Date(s.timestamp).toLocaleTimeString()),1)):l("",!0)])]))),128))])])):l("",!0)]),t("div",Ft,[t("div",Rt,[e[18]||(e[18]=t("h3",{class:"font-semibold text-gray-900 dark:text-white mb-3"},"Event Info",-1)),t("dl",Lt,[t("div",null,[e[14]||(e[14]=t("dt",{class:"text-gray-500"},"Event ID",-1)),t("dd",Dt,n(r.value.event_id),1)]),t("div",null,[e[15]||(e[15]=t("dt",{class:"text-gray-500"},"Timestamp",-1)),t("dd",Tt,n(I(r.value.timestamp)),1)]),r.value.environment?(o(),a("div",Bt,[e[16]||(e[16]=t("dt",{class:"text-gray-500"},"Environment",-1)),t("dd",Nt,n(r.value.environment),1)])):l("",!0),r.value.release?(o(),a("div",Vt,[e[17]||(e[17]=t("dt",{class:"text-gray-500"},"Release",-1)),t("dd",Mt,n(r.value.release),1)])):l("",!0)])]),r.value.user?(o(),a("div",Pt,[e[22]||(e[22]=t("h3",{class:"font-semibold text-gray-900 dark:text-white mb-3"},"User",-1)),t("dl",qt,[r.value.user.id?(o(),a("div",zt,[e[19]||(e[19]=t("dt",{class:"text-gray-500"},"ID",-1)),t("dd",At,n(r.value.user.id),1)])):l("",!0),r.value.user.email?(o(),a("div",Ot,[e[20]||(e[20]=t("dt",{class:"text-gray-500"},"Email",-1)),t("dd",Ut,n(r.value.user.email),1)])):l("",!0),r.value.user.ip_address?(o(),a("div",Gt,[e[21]||(e[21]=t("dt",{class:"text-gray-500"},"IP Address",-1)),t("dd",Ht,n(r.value.user.ip_address),1)])):l("",!0)])])):l("",!0),r.value.tags&&Object.keys(r.value.tags).length>0?(o(),a("div",Jt,[e[23]||(e[23]=t("h3",{class:"font-semibold text-gray-900 dark:text-white mb-3"},"Tags",-1)),t("div",Kt,[(o(!0),a(x,null,y(r.value.tags,(s,u)=>(o(),a("span",{key:u,class:"inline-flex items-center px-2 py-1 bg-gray-100 dark:bg-gray-700 rounded text-xs"},[t("span",Qt,n(u)+":",1),t("span",Wt,n(s),1)]))),128))])])):l("",!0)])])])):l("",!0)])}}});export{Zt as default};