@cryptiklemur/lattice 1.3.0 → 1.5.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 (109) hide show
  1. package/bun.lock +776 -2
  2. package/client/index.html +1 -13
  3. package/client/package.json +7 -1
  4. package/client/src/App.tsx +2 -0
  5. package/client/src/commands.ts +36 -0
  6. package/client/src/components/analytics/AnalyticsView.tsx +61 -0
  7. package/client/src/components/analytics/ChartCard.tsx +22 -0
  8. package/client/src/components/analytics/PeriodSelector.tsx +42 -0
  9. package/client/src/components/analytics/QuickStats.tsx +99 -0
  10. package/client/src/components/analytics/charts/CostAreaChart.tsx +83 -0
  11. package/client/src/components/analytics/charts/CostDistributionChart.tsx +62 -0
  12. package/client/src/components/analytics/charts/CostDonutChart.tsx +93 -0
  13. package/client/src/components/analytics/charts/CumulativeCostChart.tsx +62 -0
  14. package/client/src/components/analytics/charts/SessionBubbleChart.tsx +122 -0
  15. package/client/src/components/chat/AttachmentChips.tsx +116 -0
  16. package/client/src/components/chat/ChatInput.tsx +250 -73
  17. package/client/src/components/chat/ChatView.tsx +242 -10
  18. package/client/src/components/chat/CommandPalette.tsx +162 -0
  19. package/client/src/components/chat/Message.tsx +23 -2
  20. package/client/src/components/chat/PromptQuestion.tsx +271 -0
  21. package/client/src/components/chat/TodoCard.tsx +57 -0
  22. package/client/src/components/chat/ToolResultRenderer.tsx +2 -1
  23. package/client/src/components/chat/VoiceRecorder.tsx +85 -0
  24. package/client/src/components/dashboard/DashboardView.tsx +5 -0
  25. package/client/src/components/project-settings/ProjectMemory.tsx +12 -2
  26. package/client/src/components/project-settings/ProjectNotifications.tsx +48 -0
  27. package/client/src/components/project-settings/ProjectRules.tsx +10 -1
  28. package/client/src/components/project-settings/ProjectSettingsView.tsx +6 -0
  29. package/client/src/components/settings/Appearance.tsx +1 -0
  30. package/client/src/components/settings/ClaudeSettings.tsx +10 -0
  31. package/client/src/components/settings/Editor.tsx +123 -0
  32. package/client/src/components/settings/GlobalMcp.tsx +10 -1
  33. package/client/src/components/settings/GlobalMemory.tsx +19 -0
  34. package/client/src/components/settings/GlobalRules.tsx +149 -0
  35. package/client/src/components/settings/GlobalSkills.tsx +10 -0
  36. package/client/src/components/settings/Notifications.tsx +88 -0
  37. package/client/src/components/settings/SettingsView.tsx +12 -0
  38. package/client/src/components/settings/skill-shared.tsx +2 -1
  39. package/client/src/components/setup/SetupWizard.tsx +1 -1
  40. package/client/src/components/sidebar/NodeSettingsModal.tsx +23 -1
  41. package/client/src/components/sidebar/ProjectDropdown.tsx +176 -27
  42. package/client/src/components/sidebar/SettingsSidebar.tsx +11 -1
  43. package/client/src/components/sidebar/Sidebar.tsx +43 -2
  44. package/client/src/components/sidebar/UserIsland.tsx +18 -7
  45. package/client/src/components/ui/UpdatePrompt.tsx +47 -0
  46. package/client/src/components/workspace/FileBrowser.tsx +174 -0
  47. package/client/src/components/workspace/FileTree.tsx +129 -0
  48. package/client/src/components/workspace/FileViewer.tsx +211 -0
  49. package/client/src/components/workspace/NoteCard.tsx +119 -0
  50. package/client/src/components/workspace/NotesView.tsx +102 -0
  51. package/client/src/components/workspace/ScheduledTasksView.tsx +117 -0
  52. package/client/src/components/workspace/SplitPane.tsx +81 -0
  53. package/client/src/components/workspace/TabBar.tsx +185 -0
  54. package/client/src/components/workspace/TaskCard.tsx +158 -0
  55. package/client/src/components/workspace/TaskEditModal.tsx +114 -0
  56. package/client/src/components/{panels/Terminal.tsx → workspace/TerminalInstance.tsx} +50 -7
  57. package/client/src/components/workspace/TerminalView.tsx +110 -0
  58. package/client/src/components/workspace/WorkspaceView.tsx +116 -0
  59. package/client/src/hooks/useAnalytics.ts +75 -0
  60. package/client/src/hooks/useAttachments.ts +280 -0
  61. package/client/src/hooks/useEditorConfig.ts +28 -0
  62. package/client/src/hooks/useIdleDetection.ts +44 -0
  63. package/client/src/hooks/useInstallPrompt.ts +53 -0
  64. package/client/src/hooks/useNotifications.ts +54 -0
  65. package/client/src/hooks/useOnline.ts +6 -0
  66. package/client/src/hooks/useSession.ts +110 -4
  67. package/client/src/hooks/useSpinnerVerb.ts +36 -0
  68. package/client/src/hooks/useSwipeDrawer.ts +275 -0
  69. package/client/src/hooks/useVoiceRecorder.ts +123 -0
  70. package/client/src/hooks/useWorkspace.ts +48 -0
  71. package/client/src/providers/WebSocketProvider.tsx +18 -0
  72. package/client/src/router.tsx +52 -20
  73. package/client/src/stores/analytics.ts +54 -0
  74. package/client/src/stores/session.ts +136 -0
  75. package/client/src/stores/sidebar.ts +11 -2
  76. package/client/src/stores/workspace.ts +254 -0
  77. package/client/src/styles/global.css +123 -0
  78. package/client/src/utils/editorUrl.ts +62 -0
  79. package/client/vite.config.ts +54 -1
  80. package/package.json +1 -1
  81. package/server/src/analytics/engine.ts +491 -0
  82. package/server/src/daemon.ts +12 -1
  83. package/server/src/features/scheduler.ts +23 -0
  84. package/server/src/features/sticky-notes.ts +5 -3
  85. package/server/src/handlers/analytics.ts +34 -0
  86. package/server/src/handlers/attachment.ts +172 -0
  87. package/server/src/handlers/chat.ts +43 -2
  88. package/server/src/handlers/editor.ts +40 -0
  89. package/server/src/handlers/fs.ts +10 -2
  90. package/server/src/handlers/memory.ts +3 -0
  91. package/server/src/handlers/notes.ts +4 -2
  92. package/server/src/handlers/scheduler.ts +18 -1
  93. package/server/src/handlers/session.ts +14 -8
  94. package/server/src/handlers/settings.ts +37 -2
  95. package/server/src/handlers/terminal.ts +13 -6
  96. package/server/src/project/pty-worker.cjs +83 -0
  97. package/server/src/project/sdk-bridge.ts +266 -11
  98. package/server/src/project/session.ts +4 -4
  99. package/server/src/project/terminal.ts +78 -34
  100. package/shared/src/analytics.ts +24 -0
  101. package/shared/src/index.ts +1 -0
  102. package/shared/src/messages.ts +173 -4
  103. package/shared/src/models.ts +27 -1
  104. package/shared/src/project-settings.ts +1 -1
  105. package/tp.js +19 -0
  106. package/client/public/manifest.json +0 -24
  107. package/client/public/sw.js +0 -61
  108. package/client/src/components/panels/FileBrowser.tsx +0 -241
  109. package/client/src/components/panels/StickyNotes.tsx +0 -187
@@ -1,5 +1,5 @@
1
+ import type { AnalyticsPayload } from "./analytics.js";
1
2
  import type {
2
- Attachment,
3
3
  FileEntry,
4
4
  HistoryMessage,
5
5
  LatticeConfig,
@@ -44,7 +44,7 @@ export interface SessionListRequestMessage {
44
44
  export interface ChatSendMessage {
45
45
  type: "chat:send";
46
46
  text: string;
47
- attachments?: Attachment[];
47
+ attachmentIds?: string[];
48
48
  model?: string;
49
49
  effort?: string;
50
50
  }
@@ -71,14 +71,85 @@ export interface ChatSetPermissionModeMessage {
71
71
  mode: "default" | "acceptEdits" | "plan" | "dontAsk";
72
72
  }
73
73
 
74
+ export interface AttachmentChunkMessage {
75
+ type: "attachment:chunk";
76
+ attachmentId: string;
77
+ chunkIndex: number;
78
+ totalChunks: number;
79
+ data: string;
80
+ }
81
+
82
+ export interface AttachmentCompleteMessage {
83
+ type: "attachment:complete";
84
+ attachmentId: string;
85
+ attachmentType: "file" | "image" | "paste";
86
+ name: string;
87
+ mimeType: string;
88
+ size: number;
89
+ lineCount?: number;
90
+ }
91
+
92
+ export interface AttachmentProgressMessage {
93
+ type: "attachment:progress";
94
+ attachmentId: string;
95
+ received: number;
96
+ total: number;
97
+ }
98
+
99
+ export interface AttachmentErrorMessage {
100
+ type: "attachment:error";
101
+ attachmentId: string;
102
+ error: string;
103
+ }
104
+
105
+ export interface ChatPromptRequestMessage {
106
+ type: "chat:prompt_request";
107
+ requestId: string;
108
+ questions: Array<{
109
+ question: string;
110
+ header: string;
111
+ options: Array<{ label: string; description: string; preview?: string }>;
112
+ multiSelect: boolean;
113
+ }>;
114
+ }
115
+
116
+ export interface ChatPromptResponseMessage {
117
+ type: "chat:prompt_response";
118
+ requestId: string;
119
+ answers: Record<string, string>;
120
+ annotations?: Record<string, { notes?: string; preview?: string }>;
121
+ }
122
+
123
+ export interface ChatPromptResolvedMessage {
124
+ type: "chat:prompt_resolved";
125
+ requestId: string;
126
+ }
127
+
128
+ export interface ChatTodoUpdateMessage {
129
+ type: "chat:todo_update";
130
+ todos: Array<{
131
+ id: string;
132
+ content: string;
133
+ status: "pending" | "in_progress" | "completed";
134
+ priority: "high" | "medium" | "low";
135
+ }>;
136
+ }
137
+
138
+ export interface ChatPlanModeMessage {
139
+ type: "chat:plan_mode";
140
+ active: boolean;
141
+ }
142
+
74
143
  export interface FsListMessage {
75
144
  type: "fs:list";
76
145
  path: string;
146
+ projectSlug?: string;
77
147
  }
78
148
 
79
149
  export interface FsReadMessage {
80
150
  type: "fs:read";
81
151
  path: string;
152
+ projectSlug?: string;
82
153
  }
83
154
 
84
155
  export interface FsWriteMessage {
@@ -89,6 +160,7 @@ export interface FsWriteMessage {
89
160
 
90
161
  export interface TerminalCreateMessage {
91
162
  type: "terminal:create";
163
+ projectSlug?: string;
92
164
  }
93
165
 
94
166
  export interface TerminalInputMessage {
@@ -168,13 +240,23 @@ export interface SchedulerToggleMessage {
168
240
  taskId: string;
169
241
  }
170
242
 
243
+ export interface SchedulerUpdateMessage {
244
+ type: "scheduler:update";
245
+ taskId: string;
246
+ name?: string;
247
+ prompt?: string;
248
+ cron?: string;
249
+ }
250
+
171
251
  export interface NotesListMessage {
172
252
  type: "notes:list";
253
+ projectSlug?: string;
173
254
  }
174
255
 
175
256
  export interface NotesCreateMessage {
176
257
  type: "notes:create";
177
258
  content: string;
259
+ projectSlug?: string;
178
260
  }
179
261
 
180
262
  export interface NotesUpdateMessage {
@@ -256,6 +338,24 @@ export interface BrowseSuggestionsMessage {
256
338
  type: "browse:suggestions";
257
339
  }
258
340
 
341
+ export interface EditorOpenMessage {
342
+ type: "editor:open";
343
+ path: string;
344
+ line?: number;
345
+ projectSlug?: string;
346
+ }
347
+
348
+ export interface EditorDetectMessage {
349
+ type: "editor:detect";
350
+ editorType: string;
351
+ }
352
+
353
+ export interface EditorDetectResultMessage {
354
+ type: "editor:detect_result";
355
+ editorType: string;
356
+ path: string | null;
357
+ }
358
+
259
359
  export interface ProjectSettingsGetMessage {
260
360
  type: "project-settings:get";
261
361
  projectSlug: string;
@@ -280,12 +380,42 @@ export interface ProjectSettingsErrorMessage {
280
380
  message: string;
281
381
  }
282
382
 
383
+ export interface SessionStopExternalMessage {
384
+ type: "session:stop_external";
385
+ sessionId: string;
386
+ }
387
+
388
+ export interface AnalyticsRequestMessage {
389
+ type: "analytics:request";
390
+ requestId: string;
391
+ scope: "global" | "project" | "session";
392
+ projectSlug?: string;
393
+ sessionId?: string;
394
+ period: "24h" | "7d" | "30d" | "90d" | "all";
395
+ forceRefresh?: boolean;
396
+ }
397
+
398
+ export interface AnalyticsDataMessage {
399
+ type: "analytics:data";
400
+ requestId: string;
401
+ scope: "global" | "project" | "session";
402
+ period: "24h" | "7d" | "30d" | "90d" | "all";
403
+ data: AnalyticsPayload;
404
+ }
405
+
406
+ export interface AnalyticsErrorMessage {
407
+ type: "analytics:error";
408
+ scope: "global" | "project" | "session";
409
+ message: string;
410
+ }
411
+
283
412
  export type ClientMessage =
284
413
  | SessionCreateMessage
285
414
  | SessionActivateMessage
286
415
  | SessionRenameMessage
287
416
  | SessionDeleteMessage
288
417
  | SessionListRequestMessage
418
+ | SessionStopExternalMessage
289
419
  | ChatSendMessage
290
420
  | ChatPermissionResponseMessage
291
421
  | ChatRewindMessage
@@ -309,12 +439,15 @@ export type ClientMessage =
309
439
  | SchedulerCreateMessage
310
440
  | SchedulerDeleteMessage
311
441
  | SchedulerToggleMessage
442
+ | SchedulerUpdateMessage
312
443
  | NotesListMessage
313
444
  | NotesCreateMessage
314
445
  | NotesUpdateMessage
315
446
  | NotesDeleteMessage
316
447
  | SkillsListRequestMessage
317
448
  | ChatSetPermissionModeMessage
449
+ | AttachmentChunkMessage
450
+ | AttachmentCompleteMessage
318
451
  | ProjectSettingsGetMessage
319
452
  | ProjectSettingsUpdateMessage
320
453
  | SessionListAllRequestMessage
@@ -328,7 +461,11 @@ export type ClientMessage =
328
461
  | MemoryViewMessage
329
462
  | MemorySaveMessage
330
463
  | MemoryDeleteMessage
331
- | BrowseSuggestionsMessage;
464
+ | BrowseSuggestionsMessage
465
+ | EditorOpenMessage
466
+ | EditorDetectMessage
467
+ | ChatPromptResponseMessage
468
+ | AnalyticsRequestMessage;
332
469
 
333
470
  export interface SessionListMessage {
334
471
  type: "session:list";
@@ -348,6 +485,13 @@ export interface SessionHistoryMessage {
348
485
  messages: HistoryMessage[];
349
486
  title?: string;
350
487
  interrupted?: boolean;
488
+ busy?: boolean;
489
+ }
490
+
491
+ export interface SessionBusyMessage {
492
+ type: "session:busy";
493
+ sessionId: string;
494
+ busy: boolean;
351
495
  }
352
496
 
353
497
  export interface ChatUserMessage {
@@ -380,6 +524,11 @@ export interface ChatDoneMessage {
380
524
  duration: number;
381
525
  }
382
526
 
527
+ export interface ChatPromptSuggestionMessage {
528
+ type: "chat:prompt_suggestion";
529
+ suggestion: string;
530
+ }
531
+
383
532
  export interface ChatErrorMessage {
384
533
  type: "chat:error";
385
534
  message: string;
@@ -502,6 +651,9 @@ export interface SettingsDataMessage {
502
651
  config: LatticeConfig;
503
652
  mcpServers?: Record<string, McpServerConfig>;
504
653
  globalSkills?: SkillInfo[];
654
+ globalRules?: Array<{ filename: string; content: string }>;
655
+ spinnerVerbs?: string[];
656
+ wslDistro?: string;
505
657
  }
506
658
 
507
659
  export interface LoopStatusMessage {
@@ -531,6 +683,11 @@ export interface SchedulerTaskCreatedMessage {
531
683
  task: ScheduledTask;
532
684
  }
533
685
 
686
+ export interface SchedulerTaskUpdatedMessage {
687
+ type: "scheduler:task_updated";
688
+ task: ScheduledTask;
689
+ }
690
+
534
691
  export interface NotesListResultMessage {
535
692
  type: "notes:list_result";
536
693
  notes: StickyNote[];
@@ -641,11 +798,13 @@ export type ServerMessage =
641
798
  | SessionListMessage
642
799
  | SessionCreatedMessage
643
800
  | SessionHistoryMessage
801
+ | SessionBusyMessage
644
802
  | ChatUserMessage
645
803
  | ChatDeltaMessage
646
804
  | ChatToolStartMessage
647
805
  | ChatToolResultMessage
648
806
  | ChatDoneMessage
807
+ | ChatPromptSuggestionMessage
649
808
  | ChatErrorMessage
650
809
  | ChatPermissionRequestMessage
651
810
  | ChatStatusMessage
@@ -669,6 +828,7 @@ export type ServerMessage =
669
828
  | LoopDeltaMessage
670
829
  | SchedulerTasksMessage
671
830
  | SchedulerTaskCreatedMessage
831
+ | SchedulerTaskUpdatedMessage
672
832
  | NotesListResultMessage
673
833
  | NoteCreatedMessage
674
834
  | NoteUpdatedMessage
@@ -687,7 +847,16 @@ export type ServerMessage =
687
847
  | MemoryViewResultMessage
688
848
  | MemorySaveResultMessage
689
849
  | MemoryDeleteResultMessage
690
- | BrowseSuggestionsResultMessage;
850
+ | BrowseSuggestionsResultMessage
851
+ | EditorDetectResultMessage
852
+ | AttachmentProgressMessage
853
+ | AttachmentErrorMessage
854
+ | ChatPromptRequestMessage
855
+ | ChatPromptResolvedMessage
856
+ | ChatTodoUpdateMessage
857
+ | ChatPlanModeMessage
858
+ | AnalyticsDataMessage
859
+ | AnalyticsErrorMessage;
691
860
 
692
861
  export interface MeshHelloMessage {
693
862
  type: "mesh:hello";
@@ -20,6 +20,7 @@ export interface ProjectSummary {
20
20
  export interface ProjectInfo extends ProjectSummary {
21
21
  nodeName: string;
22
22
  isRemote: boolean;
23
+ ideProjectName?: string;
23
24
  }
24
25
 
25
26
  export interface SessionSummary {
@@ -40,9 +41,12 @@ export interface FileEntry {
40
41
  }
41
42
 
42
43
  export interface Attachment {
43
- type: "file" | "image";
44
+ type: "file" | "image" | "paste";
44
45
  name: string;
45
46
  content: string;
47
+ mimeType?: string;
48
+ size: number;
49
+ lineCount?: number;
46
50
  }
47
51
 
48
52
  export interface HistoryMessage {
@@ -63,6 +67,20 @@ export interface HistoryMessage {
63
67
  model?: string;
64
68
  costEstimate?: number;
65
69
  duration?: number;
70
+ promptQuestions?: Array<{
71
+ question: string;
72
+ header: string;
73
+ options: Array<{ label: string; description: string; preview?: string }>;
74
+ multiSelect: boolean;
75
+ }>;
76
+ promptAnswers?: Record<string, string>;
77
+ promptStatus?: "pending" | "answered" | "timed_out";
78
+ todos?: Array<{
79
+ id: string;
80
+ content: string;
81
+ status: "pending" | "in_progress" | "completed";
82
+ priority: "high" | "medium" | "low";
83
+ }>;
66
84
  }
67
85
 
68
86
  export interface PeerInfo {
@@ -87,6 +105,13 @@ export interface LatticeConfig {
87
105
  env: Record<string, string>;
88
106
  icon?: ProjectIcon;
89
107
  }>;
108
+ editor?: {
109
+ type: "vscode" | "vscode-insiders" | "cursor" | "webstorm" | "intellij" | "pycharm" | "goland" | "notepad++" | "sublime" | "custom";
110
+ paths?: Record<string, string>;
111
+ customCommand?: string;
112
+ };
113
+ setupComplete?: boolean;
114
+ wsl?: boolean | "auto";
90
115
  }
91
116
 
92
117
  export interface StickyNote {
@@ -94,6 +119,7 @@ export interface StickyNote {
94
119
  content: string;
95
120
  createdAt: number;
96
121
  updatedAt: number;
122
+ projectSlug?: string;
97
123
  }
98
124
 
99
125
  export interface ScheduledTask {
@@ -15,7 +15,7 @@ export type McpServerConfig =
15
15
  | { type: "sse"; url: string; headers?: Record<string, string> };
16
16
 
17
17
  export type ProjectSettingsSection =
18
- | "general" | "claude" | "environment" | "mcp" | "skills" | "rules" | "permissions" | "memory";
18
+ | "general" | "claude" | "environment" | "mcp" | "skills" | "rules" | "permissions" | "memory" | "notifications";
19
19
 
20
20
  export interface ProjectSettings {
21
21
  title: string;
package/tp.js ADDED
@@ -0,0 +1,19 @@
1
+ var p = Bun.spawn(["bun", "run", "/home/aequasi/projects/cryptiklemur/lattice/server/src/project/pty-worker.js"], {
2
+ stdin: "pipe", stdout: "pipe", stderr: "pipe", cwd: "/tmp"
3
+ });
4
+ async function readOut() {
5
+ var d = new TextDecoder();
6
+ var rd = p.stdout.getReader();
7
+ while (true) { var x = await rd.read(); if (x.done) break; process.stdout.write("[OUT] " + d.decode(x.value)); }
8
+ }
9
+ async function readErr() {
10
+ var d = new TextDecoder();
11
+ var rd = p.stderr.getReader();
12
+ while (true) { var x = await rd.read(); if (x.done) break; process.stderr.write("[ERR] " + d.decode(x.value)); }
13
+ }
14
+ readOut();
15
+ readErr();
16
+ p.stdin.write('{"type":"create","cwd":"/tmp"}\n');
17
+ setTimeout(function() { p.stdin.write('{"type":"input","data":"echo hello\\r"}\n'); }, 1000);
18
+ setTimeout(function() { p.stdin.write('{"type":"kill"}\n'); }, 3000);
19
+ setTimeout(function() { process.exit(); }, 4000);
@@ -1,24 +0,0 @@
1
- {
2
- "name": "Lattice",
3
- "short_name": "Lattice",
4
- "description": "Multi-machine agentic dashboard for Claude Code",
5
- "display": "standalone",
6
- "start_url": "/",
7
- "scope": "/",
8
- "theme_color": "#0d0d0d",
9
- "background_color": "#0d0d0d",
10
- "icons": [
11
- {
12
- "src": "/icons/icon-192.svg",
13
- "sizes": "192x192",
14
- "type": "image/svg+xml",
15
- "purpose": "any maskable"
16
- },
17
- {
18
- "src": "/icons/icon-512.svg",
19
- "sizes": "512x512",
20
- "type": "image/svg+xml",
21
- "purpose": "any maskable"
22
- }
23
- ]
24
- }
@@ -1,61 +0,0 @@
1
- var CACHE_NAME = "lattice-v1";
2
- var STATIC_ASSETS = [
3
- "/",
4
- "/manifest.json",
5
- "/icons/icon-192.svg",
6
- "/icons/icon-512.svg",
7
- ];
8
-
9
- self.addEventListener("install", function (event) {
10
- event.waitUntil(
11
- caches.open(CACHE_NAME).then(function (cache) {
12
- return cache.addAll(STATIC_ASSETS);
13
- }).then(function () {
14
- return self.skipWaiting();
15
- })
16
- );
17
- });
18
-
19
- self.addEventListener("activate", function (event) {
20
- event.waitUntil(
21
- caches.keys().then(function (keys) {
22
- return Promise.all(
23
- keys.filter(function (key) {
24
- return key !== CACHE_NAME;
25
- }).map(function (key) {
26
- return caches.delete(key);
27
- })
28
- );
29
- }).then(function () {
30
- return self.clients.claim();
31
- })
32
- );
33
- });
34
-
35
- self.addEventListener("fetch", function (event) {
36
- var url = new URL(event.request.url);
37
-
38
- if (url.pathname.startsWith("/ws") || url.pathname.startsWith("/auth")) {
39
- return;
40
- }
41
-
42
- if (event.request.method !== "GET") {
43
- return;
44
- }
45
-
46
- event.respondWith(
47
- caches.match(event.request).then(function (cached) {
48
- var networkRequest = fetch(event.request).then(function (response) {
49
- if (response && response.status === 200 && response.type === "basic") {
50
- var clone = response.clone();
51
- caches.open(CACHE_NAME).then(function (cache) {
52
- cache.put(event.request, clone);
53
- });
54
- }
55
- return response;
56
- });
57
-
58
- return cached || networkRequest;
59
- })
60
- );
61
- });