@striae-org/striae 3.0.5 → 3.1.1

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 (84) hide show
  1. package/app/components/actions/case-export/core-export.ts +1 -1
  2. package/app/components/actions/case-export/download-handlers.ts +10 -12
  3. package/app/components/actions/case-export/metadata-helpers.ts +1 -1
  4. package/app/components/actions/case-import/confirmation-import.ts +24 -9
  5. package/app/components/actions/case-import/orchestrator.ts +3 -4
  6. package/app/components/actions/case-import/validation.ts +3 -3
  7. package/app/components/actions/case-import/zip-processing.ts +12 -48
  8. package/app/components/actions/case-manage.ts +0 -1
  9. package/app/components/actions/confirm-export.ts +2 -2
  10. package/app/components/audit/user-audit-viewer.tsx +53 -15
  11. package/app/components/audit/user-audit.module.css +11 -4
  12. package/app/components/canvas/box-annotations/box-annotations.tsx +36 -7
  13. package/app/components/canvas/canvas.tsx +35 -24
  14. package/app/components/canvas/confirmation/confirmation.module.css +5 -2
  15. package/app/components/canvas/confirmation/confirmation.tsx +25 -8
  16. package/app/components/icon/icons.svg +4 -71
  17. package/app/components/icon/manifest.json +3 -75
  18. package/app/components/public-signing-key-modal/public-signing-key-modal.module.css +171 -0
  19. package/app/components/public-signing-key-modal/public-signing-key-modal.tsx +223 -0
  20. package/app/components/sidebar/case-export/case-export.module.css +36 -5
  21. package/app/components/sidebar/case-export/case-export.tsx +115 -12
  22. package/app/components/sidebar/case-import/case-import.module.css +9 -5
  23. package/app/components/sidebar/case-import/case-import.tsx +30 -7
  24. package/app/components/sidebar/case-import/components/CasePreviewSection.tsx +2 -2
  25. package/app/components/sidebar/case-import/components/ConfirmationDialog.tsx +1 -1
  26. package/app/components/sidebar/case-import/components/ExistingCaseSection.tsx +1 -1
  27. package/app/components/sidebar/case-import/hooks/useFilePreview.ts +34 -9
  28. package/app/components/sidebar/cases/case-sidebar.tsx +13 -13
  29. package/app/components/sidebar/cases/cases-modal.tsx +12 -2
  30. package/app/components/sidebar/files/files-modal.tsx +28 -8
  31. package/app/components/sidebar/sidebar.module.css +2 -3
  32. package/app/components/sidebar/sidebar.tsx +1 -16
  33. package/app/components/sidebar/upload/image-upload-zone.tsx +4 -4
  34. package/app/components/toolbar/toolbar-color-selector.tsx +3 -3
  35. package/app/components/toolbar/toolbar.tsx +19 -9
  36. package/app/components/user/delete-account.module.css +4 -1
  37. package/app/components/user/delete-account.tsx +22 -3
  38. package/app/components/user/manage-profile.tsx +0 -2
  39. package/app/entry.server.tsx +2 -3
  40. package/app/hooks/useInactivityTimeout.ts +5 -1
  41. package/app/routes/_index.tsx +1 -16
  42. package/app/routes/auth/emailVerification.tsx +1 -1
  43. package/app/routes/auth/route.ts +3 -12
  44. package/app/routes/striae/striae.tsx +1 -1
  45. package/app/services/audit-export.service.ts +1 -1
  46. package/app/services/audit.service.ts +29 -9
  47. package/app/tailwind.css +16 -1
  48. package/app/types/audit.ts +3 -3
  49. package/app/types/case.ts +1 -1
  50. package/app/types/import.ts +0 -2
  51. package/app/utils/SHA256.ts +3 -3
  52. package/app/utils/batch-operations.ts +6 -6
  53. package/app/utils/data-operations.ts +14 -7
  54. package/app/utils/permissions.ts +0 -2
  55. package/functions/[[path]].ts +0 -1
  56. package/package.json +5 -3
  57. package/public/assets/striae.jpg +0 -0
  58. package/scripts/deploy-pages.sh +2 -2
  59. package/scripts/run-eslint.cjs +14 -6
  60. package/worker-configuration.d.ts +2 -2
  61. package/workers/audit-worker/src/audit-worker.example.ts +9 -7
  62. package/workers/audit-worker/worker-configuration.d.ts +2 -2
  63. package/workers/audit-worker/wrangler.jsonc.example +1 -1
  64. package/workers/data-worker/src/data-worker.example.ts +1 -1
  65. package/workers/data-worker/worker-configuration.d.ts +2 -2
  66. package/workers/data-worker/wrangler.jsonc.example +1 -1
  67. package/workers/image-worker/worker-configuration.d.ts +2 -2
  68. package/workers/image-worker/wrangler.jsonc.example +1 -1
  69. package/workers/keys-worker/worker-configuration.d.ts +2 -2
  70. package/workers/keys-worker/wrangler.jsonc.example +1 -1
  71. package/workers/pdf-worker/src/pdf-worker.example.ts +3 -3
  72. package/workers/pdf-worker/worker-configuration.d.ts +2 -2
  73. package/workers/pdf-worker/wrangler.jsonc.example +1 -1
  74. package/workers/user-worker/src/user-worker.example.ts +10 -10
  75. package/workers/user-worker/worker-configuration.d.ts +2 -2
  76. package/workers/user-worker/wrangler.jsonc.example +1 -1
  77. package/wrangler.toml.example +1 -1
  78. package/app/components/sidebar/hash/hash-utility.module.css +0 -366
  79. package/app/components/sidebar/hash/hash-utility.tsx +0 -982
  80. package/app/routes/mobile-prevented/mobilePrevented.module.css +0 -47
  81. package/app/routes/mobile-prevented/mobilePrevented.tsx +0 -28
  82. package/app/routes/mobile-prevented/route.ts +0 -14
  83. package/app/utils/device-detection.ts +0 -5
  84. package/app/utils/html-sanitizer.ts +0 -80
@@ -2,7 +2,7 @@
2
2
  "name": "KEYS_WORKER_NAME",
3
3
  "account_id": "ACCOUNT_ID",
4
4
  "main": "src/keys.ts",
5
- "compatibility_date": "2026-03-09",
5
+ "compatibility_date": "2026-03-12",
6
6
  "compatibility_flags": [
7
7
  "nodejs_compat"
8
8
  ],
@@ -1,4 +1,4 @@
1
- import puppeteer from "@cloudflare/puppeteer";
1
+ import { launch } from "@cloudflare/puppeteer";
2
2
  import type { PDFGenerationData, PDFGenerationRequest, ReportModule } from './report-types';
3
3
 
4
4
  interface Env {
@@ -72,13 +72,13 @@ export default {
72
72
  }
73
73
 
74
74
  if (request.method === 'POST') {
75
- let browser: Awaited<ReturnType<typeof puppeteer.launch>> | undefined;
75
+ let browser: Awaited<ReturnType<typeof launch>> | undefined;
76
76
 
77
77
  try {
78
78
  const payload = await request.json() as PDFGenerationData | PDFGenerationRequest;
79
79
  const { reportFormat, data } = resolveReportRequest(payload);
80
80
 
81
- browser = await puppeteer.launch(env.BROWSER);
81
+ browser = await launch(env.BROWSER);
82
82
  const page = await browser.newPage();
83
83
 
84
84
  // Render report from module selected by report format name.
@@ -5440,7 +5440,7 @@ type AIGatewayHeaders = {
5440
5440
  [key: string]: string | number | boolean | object;
5441
5441
  };
5442
5442
  type AIGatewayUniversalRequest = {
5443
- provider: AIGatewayProviders | string; // eslint-disable-line
5443
+ provider: AIGatewayProviders | string;
5444
5444
  endpoint: string;
5445
5445
  headers: Partial<AIGatewayHeaders>;
5446
5446
  query: unknown;
@@ -5456,7 +5456,7 @@ declare abstract class AiGateway {
5456
5456
  gateway?: UniversalGatewayOptions;
5457
5457
  extraHeaders?: object;
5458
5458
  }): Promise<Response>;
5459
- getUrl(provider?: AIGatewayProviders | string): Promise<string>; // eslint-disable-line
5459
+ getUrl(provider?: AIGatewayProviders | string): Promise<string>;
5460
5460
  }
5461
5461
  interface AutoRAGInternalError extends Error {
5462
5462
  }
@@ -2,7 +2,7 @@
2
2
  "name": "PDF_WORKER_NAME",
3
3
  "account_id": "ACCOUNT_ID",
4
4
  "main": "src/pdf-worker.ts",
5
- "compatibility_date": "2026-03-09",
5
+ "compatibility_date": "2026-03-12",
6
6
  "compatibility_flags": [
7
7
  "nodejs_compat"
8
8
  ],
@@ -24,13 +24,13 @@ interface UserData {
24
24
  interface CaseItem {
25
25
  caseNumber: string;
26
26
  caseName?: string;
27
- [key: string]: any;
27
+ [key: string]: unknown;
28
28
  }
29
29
 
30
30
  interface ReadOnlyCaseItem {
31
31
  caseNumber: string;
32
32
  caseName?: string;
33
- [key: string]: any;
33
+ [key: string]: unknown;
34
34
  }
35
35
 
36
36
  interface UserRequestData {
@@ -51,8 +51,8 @@ interface DeleteCasesRequest {
51
51
  }
52
52
 
53
53
  interface CaseData {
54
- files?: Array<{ id: string; [key: string]: any }>;
55
- [key: string]: any;
54
+ files?: Array<{ id: string; [key: string]: unknown }>;
55
+ [key: string]: unknown;
56
56
  }
57
57
 
58
58
  interface AccountDeletionProgressEvent {
@@ -247,7 +247,7 @@ async function handleGetUser(env: Env, userUid: string): Promise<Response> {
247
247
  status: 200,
248
248
  headers: corsHeaders
249
249
  });
250
- } catch (error) {
250
+ } catch {
251
251
  return new Response('Failed to get user data', {
252
252
  status: 500,
253
253
  headers: corsHeaders
@@ -304,7 +304,7 @@ async function handleAddUser(request: Request, env: Env, userUid: string): Promi
304
304
  status: value !== null ? 200 : 201,
305
305
  headers: corsHeaders
306
306
  });
307
- } catch (error) {
307
+ } catch {
308
308
  return new Response('Failed to save user data', {
309
309
  status: 500,
310
310
  headers: corsHeaders
@@ -346,7 +346,7 @@ async function deleteSingleCase(env: Env, userUid: string, caseNumber: string):
346
346
  method: 'DELETE',
347
347
  headers: { 'X-Custom-Auth-Key': dataApiKey }
348
348
  });
349
- } catch (fileError) {
349
+ } catch {
350
350
  // Continue with other files
351
351
  }
352
352
  }
@@ -358,7 +358,7 @@ async function deleteSingleCase(env: Env, userUid: string, caseNumber: string):
358
358
  headers: { 'X-Custom-Auth-Key': dataApiKey }
359
359
  });
360
360
 
361
- } catch (error) {
361
+ } catch {
362
362
  // Continue with user deletion even if case deletion fails
363
363
  }
364
364
  }
@@ -532,7 +532,7 @@ async function handleAddCases(request: Request, env: Env, userUid: string): Prom
532
532
  status: 200,
533
533
  headers: corsHeaders
534
534
  });
535
- } catch (error) {
535
+ } catch {
536
536
  return new Response('Failed to add cases', {
537
537
  status: 500,
538
538
  headers: corsHeaders
@@ -567,7 +567,7 @@ async function handleDeleteCases(request: Request, env: Env, userUid: string): P
567
567
  status: 200,
568
568
  headers: corsHeaders
569
569
  });
570
- } catch (error) {
570
+ } catch {
571
571
  return new Response('Failed to delete cases', {
572
572
  status: 500,
573
573
  headers: corsHeaders
@@ -5440,7 +5440,7 @@ type AIGatewayHeaders = {
5440
5440
  [key: string]: string | number | boolean | object;
5441
5441
  };
5442
5442
  type AIGatewayUniversalRequest = {
5443
- provider: AIGatewayProviders | string; // eslint-disable-line
5443
+ provider: AIGatewayProviders | string;
5444
5444
  endpoint: string;
5445
5445
  headers: Partial<AIGatewayHeaders>;
5446
5446
  query: unknown;
@@ -5456,7 +5456,7 @@ declare abstract class AiGateway {
5456
5456
  gateway?: UniversalGatewayOptions;
5457
5457
  extraHeaders?: object;
5458
5458
  }): Promise<Response>;
5459
- getUrl(provider?: AIGatewayProviders | string): Promise<string>; // eslint-disable-line
5459
+ getUrl(provider?: AIGatewayProviders | string): Promise<string>;
5460
5460
  }
5461
5461
  interface AutoRAGInternalError extends Error {
5462
5462
  }
@@ -2,7 +2,7 @@
2
2
  "name": "USER_WORKER_NAME",
3
3
  "account_id": "ACCOUNT_ID",
4
4
  "main": "src/user-worker.ts",
5
- "compatibility_date": "2026-03-09",
5
+ "compatibility_date": "2026-03-12",
6
6
  "compatibility_flags": [
7
7
  "nodejs_compat"
8
8
  ],
@@ -1,6 +1,6 @@
1
1
  #:schema node_modules/wrangler/config-schema.json
2
2
  name = "PAGES_PROJECT_NAME"
3
- compatibility_date = "2026-03-09"
3
+ compatibility_date = "2026-03-12"
4
4
  compatibility_flags = ["nodejs_compat"]
5
5
  pages_build_output_dir = "./build/client"
6
6
 
@@ -1,366 +0,0 @@
1
- /* Modal Overlay */
2
- .overlay {
3
- position: fixed;
4
- inset: 0;
5
- background-color: color-mix(in lab, var(--background) 50%, transparent);
6
- display: flex;
7
- justify-content: center;
8
- align-items: center;
9
- z-index: var(--zIndex5);
10
- transition: background-color var(--durationM) var(--bezierFastoutSlowin);
11
- }
12
-
13
-
14
- /* Modal Container */
15
- .modal {
16
- background: var(--backgroundLight);
17
- border-radius: var(--spaceXS);
18
- width: 90%;
19
- max-width: 600px;
20
- max-height: 90vh;
21
- box-shadow: 0 var(--spaceXS) var(--spaceL) color-mix(in lab, var(--black) 10%, transparent);
22
- transition: background-color var(--durationM) var(--bezierFastoutSlowin);
23
- display: flex;
24
- flex-direction: column;
25
- }
26
-
27
-
28
- /* Header */
29
- .header {
30
- display: flex;
31
- font-size: var(--fontSizeBodyL);
32
- justify-content: space-between;
33
- align-items: center;
34
- padding: var(--spaceL);
35
- border-bottom: 1px solid color-mix(in lab, var(--text) 10%, transparent);
36
- color: var(--textTitle);
37
- flex-shrink: 0;
38
- }
39
-
40
- .title {
41
- margin: 0;
42
- font-size: var(--fontSizeBodyL);
43
- font-weight: 600;
44
- color: var(--textTitle);
45
- }
46
-
47
- .closeButton {
48
- background: none;
49
- border: none;
50
- font-size: var(--fontSizeH5);
51
- cursor: pointer;
52
- padding: var(--spaceS);
53
- color: var(--textLight);
54
- transition: color var(--durationS) var(--bezierFastoutSlowin);
55
- }
56
-
57
- .closeButton:hover:not(:disabled) {
58
- color: var(--text);
59
- }
60
-
61
- .closeButton:disabled {
62
- opacity: 0.5;
63
- cursor: not-allowed;
64
- }
65
-
66
- /* Content */
67
- .content {
68
- padding: var(--spaceL);
69
- overflow-y: auto;
70
- flex: 1;
71
- min-height: 0;
72
- }
73
-
74
- .description {
75
- color: var(--textBody);
76
- line-height: 1.5;
77
- margin: 0 0 var(--spaceL) 0;
78
- font-size: var(--fontSizeBodyM);
79
- }
80
-
81
- /* Upload Area */
82
- .uploadWrapper {
83
- position: relative;
84
- margin-bottom: var(--spaceL);
85
- }
86
-
87
- .uploadArea {
88
- border: 2px dashed color-mix(in lab, var(--primary) 30%, transparent);
89
- border-radius: var(--spaceXS);
90
- background: color-mix(in lab, var(--primary) 5%, transparent);
91
- padding: var(--spaceXL);
92
- text-align: center;
93
- cursor: pointer;
94
- transition: all var(--durationS) var(--bezierFastoutSlowin);
95
- min-height: 120px;
96
- display: flex;
97
- align-items: center;
98
- justify-content: center;
99
- }
100
-
101
- .uploadArea:hover {
102
- border-color: var(--primary);
103
- background: color-mix(in lab, var(--primary) 10%, transparent);
104
- transform: translateY(-1px);
105
- }
106
-
107
- .uploadArea:focus-visible {
108
- outline: none;
109
- border-color: var(--primary);
110
- box-shadow: 0 0 0 2px color-mix(in lab, var(--primary) 20%, transparent);
111
- }
112
-
113
- .uploadArea.dragOver {
114
- border-color: var(--accent);
115
- background: color-mix(in lab, var(--accent) 15%, transparent);
116
- border-style: solid;
117
- transform: scale(1.02);
118
- box-shadow: 0 0 0 2px color-mix(in lab, var(--accent) 30%, transparent);
119
- }
120
-
121
- .uploadArea[aria-disabled="true"] {
122
- opacity: 0.5;
123
- cursor: not-allowed;
124
- border-color: color-mix(in lab, var(--text) 15%, transparent);
125
- background: color-mix(in lab, var(--background) 95%, transparent);
126
- }
127
-
128
- .uploadArea[aria-disabled="true"]:hover {
129
- border-color: color-mix(in lab, var(--text) 15%, transparent);
130
- background: color-mix(in lab, var(--background) 95%, transparent);
131
- transform: none;
132
- }
133
-
134
- .uploadContent {
135
- display: flex;
136
- flex-direction: column;
137
- align-items: center;
138
- gap: var(--spaceS);
139
- }
140
-
141
- .uploadIcon {
142
- font-size: var(--fontSizeBodyL);
143
- opacity: 0.7;
144
- transition: all var(--durationS) var(--bezierFastoutSlowin);
145
- }
146
-
147
- .dragOver .uploadIcon {
148
- opacity: 1;
149
- transform: scale(1.1);
150
- }
151
-
152
- .uploadText {
153
- font-size: var(--fontSizeBodyS);
154
- font-weight: var(--fontWeightMedium);
155
- color: var(--textBody);
156
- transition: all var(--durationS) var(--bezierFastoutSlowin);
157
- flex: 1;
158
- }
159
-
160
- .dragOver .uploadText {
161
- color: var(--accent);
162
- }
163
-
164
- .uploadText strong {
165
- color: var(--primary);
166
- font-weight: var(--fontWeightSemibold);
167
- transition: all var(--durationS) var(--bezierFastoutSlowin);
168
- }
169
-
170
- .dragOver .uploadText strong {
171
- color: var(--accent);
172
- font-weight: var(--fontWeightBold);
173
- }
174
-
175
- .uploadSubtext {
176
- font-size: var(--fontSizeBodyXS);
177
- color: var(--textLight);
178
- }
179
-
180
- .hiddenInput {
181
- position: absolute;
182
- opacity: 0;
183
- width: 0;
184
- height: 0;
185
- pointer-events: none;
186
- }
187
-
188
- /* Verification Status */
189
- .verifyingSection {
190
- margin: var(--spaceM) 0;
191
- padding: var(--spaceM);
192
- background: var(--backgroundLight);
193
- border-radius: var(--spaceXS);
194
- border: 1px solid color-mix(in lab, var(--text) 10%, transparent);
195
- display: flex;
196
- align-items: center;
197
- justify-content: center;
198
- gap: var(--spaceM);
199
- }
200
-
201
- .spinner {
202
- width: 24px;
203
- height: 24px;
204
- border: 3px solid var(--divider);
205
- border-top: 3px solid var(--primary);
206
- border-radius: 50%;
207
- animation: spin 1s linear infinite;
208
- }
209
-
210
- @keyframes spin {
211
- 0% { transform: rotate(0deg); }
212
- 100% { transform: rotate(360deg); }
213
- }
214
-
215
- .verifyingText {
216
- color: var(--textTitle);
217
- font-size: var(--fontSizeBodyS);
218
- font-weight: var(--fontWeightMedium);
219
- }
220
-
221
- /* Results Section */
222
- .resultSection {
223
- margin-top: var(--spaceM);
224
- padding: var(--spaceM);
225
- border-radius: var(--spaceXS);
226
- }
227
-
228
- .resultSection.success {
229
- background: color-mix(in lab, var(--success) 10%, transparent);
230
- border: 1px solid color-mix(in lab, var(--success) 20%, transparent);
231
- }
232
-
233
- .resultSection.failure {
234
- background: color-mix(in lab, var(--error) 10%, transparent);
235
- border: 1px solid color-mix(in lab, var(--error) 20%, transparent);
236
- }
237
-
238
- .resultHeader {
239
- display: flex;
240
- align-items: center;
241
- gap: var(--spaceS);
242
- margin-bottom: var(--spaceM);
243
- }
244
-
245
- .resultIcon {
246
- font-size: var(--fontSizeBodyL);
247
- line-height: 1;
248
- }
249
-
250
- .resultIcon.successIcon {
251
- color: var(--success);
252
- }
253
-
254
- .resultIcon.failureIcon {
255
- color: var(--error);
256
- }
257
-
258
- .resultTitle {
259
- font-size: var(--fontSizeBodyL);
260
- font-weight: var(--fontWeightSemibold);
261
- margin: 0;
262
- }
263
-
264
- .resultSection.success .resultTitle {
265
- color: var(--success);
266
- }
267
-
268
- .resultSection.failure .resultTitle {
269
- color: var(--error);
270
- }
271
-
272
- /* Result Details */
273
- .resultDetails {
274
- display: flex;
275
- flex-direction: column;
276
- gap: var(--spaceXS);
277
- margin-bottom: var(--spaceM);
278
- background: color-mix(in lab, var(--background) 50%, transparent);
279
- padding: var(--spaceS);
280
- border-radius: var(--spaceXS);
281
- border: 1px solid color-mix(in lab, var(--text) 5%, transparent);
282
- }
283
-
284
- .resultRow {
285
- display: flex;
286
- flex-direction: column;
287
- align-items: flex-start;
288
- gap: var(--spaceXS);
289
- }
290
-
291
- .resultLabel {
292
- font-weight: var(--fontWeightMedium);
293
- color: var(--textBody);
294
- font-size: var(--fontSizeBodyXS);
295
- flex-shrink: 0;
296
- }
297
-
298
- .resultValue {
299
- color: var(--text);
300
- font-family: var(--fontFamilyMono);
301
- font-size: var(--fontSizeBodyXS);
302
- word-break: break-word;
303
- word-wrap: break-word;
304
- overflow-wrap: break-word;
305
- white-space: normal;
306
- text-align: left;
307
- width: 100%;
308
- }
309
-
310
- /* Special handling for error messages - use normal text wrapping */
311
- .resultValue.errorMessage {
312
- font-family: var(--fontFamilyBody);
313
- word-break: normal;
314
- word-wrap: break-word;
315
- overflow-wrap: break-word;
316
- hyphens: auto;
317
- text-align: left;
318
- }
319
-
320
- .resultMessage {
321
- font-size: var(--fontSizeBodyS);
322
- font-weight: var(--fontWeightMedium);
323
- line-height: 1.6;
324
- padding: var(--spaceS);
325
- border-radius: var(--spaceXS);
326
- margin-top: var(--spaceXS);
327
- word-wrap: break-word;
328
- overflow-wrap: break-word;
329
- hyphens: auto;
330
- white-space: pre-wrap;
331
- }
332
-
333
- .resultSection.success .resultMessage {
334
- background: color-mix(in lab, var(--success) 8%, transparent);
335
- color: var(--success);
336
- }
337
-
338
- .resultSection.failure .resultMessage {
339
- background: color-mix(in lab, var(--error) 8%, transparent);
340
- color: var(--error);
341
- }
342
-
343
- /* Responsive Design */
344
- @media (max-width: 768px) {
345
- .modal {
346
- width: 95%;
347
- max-height: 90vh;
348
- }
349
-
350
- .content {
351
- padding: var(--spaceM);
352
- }
353
-
354
- .uploadArea {
355
- padding: var(--spaceL);
356
- }
357
-
358
- .resultRow {
359
- flex-direction: column;
360
- gap: var(--spaceXS);
361
- }
362
-
363
- .resultValue {
364
- text-align: left;
365
- }
366
- }