@superblocksteam/shared 2.0.0-SNAPSHOT.dacafd95ee5ff6bb → 2.0.0-SNAPSHOT.fe3e10d22aff0c65

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 (112) hide show
  1. package/dist/database-lifecycle/appDatabaseCompatibility.d.ts +5 -3
  2. package/dist/database-lifecycle/appDatabaseCompatibility.d.ts.map +1 -1
  3. package/dist/database-lifecycle/appDatabaseCompatibility.js.map +1 -1
  4. package/dist/database-lifecycle/appDatabaseStatus.d.ts +79 -0
  5. package/dist/database-lifecycle/appDatabaseStatus.d.ts.map +1 -0
  6. package/dist/database-lifecycle/appDatabaseStatus.js +28 -0
  7. package/dist/database-lifecycle/appDatabaseStatus.js.map +1 -0
  8. package/dist/database-lifecycle/appDatabaseStatus.test.d.ts +2 -0
  9. package/dist/database-lifecycle/appDatabaseStatus.test.d.ts.map +1 -0
  10. package/dist/database-lifecycle/appDatabaseStatus.test.js +88 -0
  11. package/dist/database-lifecycle/appDatabaseStatus.test.js.map +1 -0
  12. package/dist/index.d.ts +1 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +1 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/plugins/templates/workflow.d.ts.map +1 -1
  17. package/dist/plugins/templates/workflow.js +1 -3
  18. package/dist/plugins/templates/workflow.js.map +1 -1
  19. package/dist/socket/protocol.d.ts +10 -1
  20. package/dist/socket/protocol.d.ts.map +1 -1
  21. package/dist/socket/socketWithClientAuth.d.ts +2 -0
  22. package/dist/socket/socketWithClientAuth.d.ts.map +1 -1
  23. package/dist/socket/socketWithClientAuth.js +7 -1
  24. package/dist/socket/socketWithClientAuth.js.map +1 -1
  25. package/dist/socket/socketWithClientAuth.test.d.ts +2 -0
  26. package/dist/socket/socketWithClientAuth.test.d.ts.map +1 -0
  27. package/dist/socket/socketWithClientAuth.test.js +79 -0
  28. package/dist/socket/socketWithClientAuth.test.js.map +1 -0
  29. package/dist/types/reviewPolicy/index.d.ts +1 -1
  30. package/dist/types/reviewPolicy/index.d.ts.map +1 -1
  31. package/dist/types/reviewPolicy/index.js +1 -1
  32. package/dist/types/reviewPolicy/index.js.map +1 -1
  33. package/dist/utils/attachment-delivery.js +1 -1
  34. package/dist/utils/attachment-delivery.js.map +1 -1
  35. package/dist/utils/attachment-delivery.test.js +11 -0
  36. package/dist/utils/attachment-delivery.test.js.map +1 -1
  37. package/dist/utils/attachment-upload.d.ts +15 -0
  38. package/dist/utils/attachment-upload.d.ts.map +1 -1
  39. package/dist/utils/attachment-upload.js +44 -2
  40. package/dist/utils/attachment-upload.js.map +1 -1
  41. package/dist/utils/attachment-upload.test.js +37 -1
  42. package/dist/utils/attachment-upload.test.js.map +1 -1
  43. package/dist/utils/attachment-validation.d.ts +18 -1
  44. package/dist/utils/attachment-validation.d.ts.map +1 -1
  45. package/dist/utils/attachment-validation.js +38 -5
  46. package/dist/utils/attachment-validation.js.map +1 -1
  47. package/dist/utils/attachment-validation.test.js +22 -3
  48. package/dist/utils/attachment-validation.test.js.map +1 -1
  49. package/dist-esm/database-lifecycle/appDatabaseCompatibility.d.ts +5 -3
  50. package/dist-esm/database-lifecycle/appDatabaseCompatibility.d.ts.map +1 -1
  51. package/dist-esm/database-lifecycle/appDatabaseCompatibility.js.map +1 -1
  52. package/dist-esm/database-lifecycle/appDatabaseStatus.d.ts +79 -0
  53. package/dist-esm/database-lifecycle/appDatabaseStatus.d.ts.map +1 -0
  54. package/dist-esm/database-lifecycle/appDatabaseStatus.js +23 -0
  55. package/dist-esm/database-lifecycle/appDatabaseStatus.js.map +1 -0
  56. package/dist-esm/database-lifecycle/appDatabaseStatus.test.d.ts +2 -0
  57. package/dist-esm/database-lifecycle/appDatabaseStatus.test.d.ts.map +1 -0
  58. package/dist-esm/database-lifecycle/appDatabaseStatus.test.js +86 -0
  59. package/dist-esm/database-lifecycle/appDatabaseStatus.test.js.map +1 -0
  60. package/dist-esm/index.d.ts +1 -0
  61. package/dist-esm/index.d.ts.map +1 -1
  62. package/dist-esm/index.js +1 -0
  63. package/dist-esm/index.js.map +1 -1
  64. package/dist-esm/plugins/templates/workflow.d.ts.map +1 -1
  65. package/dist-esm/plugins/templates/workflow.js +1 -3
  66. package/dist-esm/plugins/templates/workflow.js.map +1 -1
  67. package/dist-esm/socket/protocol.d.ts +10 -1
  68. package/dist-esm/socket/protocol.d.ts.map +1 -1
  69. package/dist-esm/socket/socketWithClientAuth.d.ts +2 -0
  70. package/dist-esm/socket/socketWithClientAuth.d.ts.map +1 -1
  71. package/dist-esm/socket/socketWithClientAuth.js +7 -1
  72. package/dist-esm/socket/socketWithClientAuth.js.map +1 -1
  73. package/dist-esm/socket/socketWithClientAuth.test.d.ts +2 -0
  74. package/dist-esm/socket/socketWithClientAuth.test.d.ts.map +1 -0
  75. package/dist-esm/socket/socketWithClientAuth.test.js +74 -0
  76. package/dist-esm/socket/socketWithClientAuth.test.js.map +1 -0
  77. package/dist-esm/types/reviewPolicy/index.d.ts +1 -1
  78. package/dist-esm/types/reviewPolicy/index.d.ts.map +1 -1
  79. package/dist-esm/types/reviewPolicy/index.js +1 -1
  80. package/dist-esm/types/reviewPolicy/index.js.map +1 -1
  81. package/dist-esm/utils/attachment-delivery.js +2 -2
  82. package/dist-esm/utils/attachment-delivery.js.map +1 -1
  83. package/dist-esm/utils/attachment-delivery.test.js +11 -0
  84. package/dist-esm/utils/attachment-delivery.test.js.map +1 -1
  85. package/dist-esm/utils/attachment-upload.d.ts +15 -0
  86. package/dist-esm/utils/attachment-upload.d.ts.map +1 -1
  87. package/dist-esm/utils/attachment-upload.js +41 -1
  88. package/dist-esm/utils/attachment-upload.js.map +1 -1
  89. package/dist-esm/utils/attachment-upload.test.js +38 -2
  90. package/dist-esm/utils/attachment-upload.test.js.map +1 -1
  91. package/dist-esm/utils/attachment-validation.d.ts +18 -1
  92. package/dist-esm/utils/attachment-validation.d.ts.map +1 -1
  93. package/dist-esm/utils/attachment-validation.js +38 -5
  94. package/dist-esm/utils/attachment-validation.js.map +1 -1
  95. package/dist-esm/utils/attachment-validation.test.js +23 -4
  96. package/dist-esm/utils/attachment-validation.test.js.map +1 -1
  97. package/package.json +1 -1
  98. package/src/database-lifecycle/appDatabaseCompatibility.ts +6 -3
  99. package/src/database-lifecycle/appDatabaseStatus.test.ts +105 -0
  100. package/src/database-lifecycle/appDatabaseStatus.ts +95 -0
  101. package/src/index.ts +1 -0
  102. package/src/plugins/templates/workflow.ts +1 -3
  103. package/src/socket/protocol.ts +4 -2
  104. package/src/socket/socketWithClientAuth.test.ts +84 -0
  105. package/src/socket/socketWithClientAuth.ts +7 -1
  106. package/src/types/reviewPolicy/index.ts +1 -1
  107. package/src/utils/attachment-delivery.test.ts +14 -0
  108. package/src/utils/attachment-delivery.ts +2 -2
  109. package/src/utils/attachment-upload.test.ts +48 -1
  110. package/src/utils/attachment-upload.ts +48 -1
  111. package/src/utils/attachment-validation.test.ts +35 -3
  112. package/src/utils/attachment-validation.ts +52 -6
@@ -1,6 +1,6 @@
1
1
  import { PDFDocument, PDFPageLeaf, PDFPageTree } from 'pdf-lib';
2
2
  import { detectAttachmentArchiveType, isDumpAttachment } from './attachment-delivery.js';
3
- import { getTextAttachmentType, isOfficeXml } from './attachment-upload.js';
3
+ import { getTextAttachmentType, isOfficeXml, isXlsxAttachmentFile } from './attachment-upload.js';
4
4
  const ATTACHMENT_UPLOAD_POLICIES = {
5
5
  archive: {
6
6
  maxBytes: 50 * 1024 * 1024,
@@ -16,6 +16,16 @@ const ATTACHMENT_UPLOAD_POLICIES = {
16
16
  advice: 'Produce a smaller dump or split the data before attaching it.',
17
17
  invalidContentMessage: 'This database dump could not be read. Re-create it with pg_dump custom format (-Fc) so the file starts with PGDMP, then try again.'
18
18
  },
19
+ spreadsheet: {
20
+ // Reading a workbook builds the whole grid in memory: a 6 MB file already
21
+ // costs ~800 MB and a 32 MB one costs ~3 GB, which the editor process
22
+ // cannot absorb. Cap the upload where the conversion stays affordable.
23
+ maxBytes: 5 * 1024 * 1024,
24
+ sizeLabel: '5 MiB',
25
+ label: 'Excel workbook',
26
+ advice: 'Remove unused sheets or split the workbook before attaching it.',
27
+ invalidContentMessage: 'This Excel workbook could not be read. Re-save it as .xlsx without a password and try again.'
28
+ },
19
29
  image: {
20
30
  maxBytes: 3_750_000,
21
31
  sizeLabel: '3.75 MB after conversion',
@@ -42,16 +52,29 @@ export const MAX_PDF_ATTACHMENT_BYTES = ATTACHMENT_UPLOAD_POLICIES.pdf.maxBytes;
42
52
  export const MAX_IMAGE_ATTACHMENT_BYTES = ATTACHMENT_UPLOAD_POLICIES.image.maxBytes;
43
53
  export const MAX_TEXT_ATTACHMENT_BYTES = ATTACHMENT_UPLOAD_POLICIES.text.maxBytes;
44
54
  export const MAX_ARCHIVE_ATTACHMENT_BYTES = ATTACHMENT_UPLOAD_POLICIES.archive.maxBytes;
55
+ export const MAX_SPREADSHEET_ATTACHMENT_BYTES = ATTACHMENT_UPLOAD_POLICIES.spreadsheet.maxBytes;
45
56
  export const MAX_PDF_ATTACHMENT_PAGES = 100;
46
- export function getAttachmentLimitsHelp(archiveAttachmentsEnabled) {
57
+ export function getAttachmentLimitsHelp(flags) {
47
58
  const { archive, image, pdf, text } = ATTACHMENT_UPLOAD_POLICIES;
48
- return `PDFs: ${pdf.sizeLabel} each, ${MAX_PDF_ATTACHMENT_PAGES} pages total. Images: ${image.sizeLabel}. Text/code: ${text.sizeLabel}.${archiveAttachmentsEnabled ? ` Supported archives and .dump files: ${archive.sizeLabel}.` : ''}`;
59
+ const base = `PDFs: ${pdf.sizeLabel} each, ${MAX_PDF_ATTACHMENT_PAGES} pages total. Images: ${image.sizeLabel}. Text/code: ${text.sizeLabel}.`;
60
+ const archivesEnabled = flags.archiveAttachmentsEnabled === true;
61
+ const workbooksEnabled = flags.spreadsheetAttachmentsEnabled === true;
62
+ if (archivesEnabled && workbooksEnabled) {
63
+ return `${base} Supported archives and .dump files: ${archive.sizeLabel}. Excel workbooks (.xlsx): ${ATTACHMENT_UPLOAD_POLICIES.spreadsheet.sizeLabel}.`;
64
+ }
65
+ if (archivesEnabled) {
66
+ return `${base} Supported archives and .dump files: ${archive.sizeLabel}.`;
67
+ }
68
+ if (workbooksEnabled) {
69
+ return `${base} Excel workbooks (.xlsx): ${ATTACHMENT_UPLOAD_POLICIES.spreadsheet.sizeLabel}.`;
70
+ }
71
+ return base;
49
72
  }
50
73
  const VALIDATION_MESSAGES = {
51
74
  invalid_content: 'This file could not be read. Re-export it and try again.',
52
75
  too_large: 'This upload is too large. Reduce its size and try again.',
53
76
  too_many_pdf_pages: `Clark supports up to ${MAX_PDF_ATTACHMENT_PAGES} PDF pages per request. Remove another PDF or attach fewer pages.`,
54
- unsupported_type: 'This file type is not supported. Use an image, PDF, text/code file, a supported ZIP, GZIP, or TGZ archive, or a Postgres .dump file.'
77
+ unsupported_type: 'This file type is not supported. Use an image, PDF, text/code file, an Excel workbook (.xlsx), a supported ZIP, GZIP, or TGZ archive, or a Postgres .dump file.'
55
78
  };
56
79
  export class AttachmentValidationError extends Error {
57
80
  reason;
@@ -72,6 +95,9 @@ function normalizedFileName(fileName) {
72
95
  return fileName?.trim().toLowerCase() ?? '';
73
96
  }
74
97
  function getAttachmentKind(input) {
98
+ if (isXlsxAttachmentFile(input)) {
99
+ return 'spreadsheet';
100
+ }
75
101
  if (isOfficeXml(input)) {
76
102
  throw new AttachmentValidationError('unsupported_type');
77
103
  }
@@ -121,7 +147,7 @@ function getAttachmentKind(input) {
121
147
  /** Resolve the validated upload policy by MIME, falling back to the extension only when MIME is absent or generic. */
122
148
  export function getAttachmentUploadPolicy(input) {
123
149
  const kind = getAttachmentKind(input);
124
- const policy = ATTACHMENT_UPLOAD_POLICIES[kind === 'archive' || kind === 'dump' || kind === 'pdf' || kind === 'text' ? kind : 'image'];
150
+ const policy = ATTACHMENT_UPLOAD_POLICIES[kind === 'archive' || kind === 'dump' || kind === 'pdf' || kind === 'spreadsheet' || kind === 'text' ? kind : 'image'];
125
151
  return {
126
152
  ...policy,
127
153
  tooLargeMessage: `This ${policy.label} is too large. The limit is ${policy.sizeLabel}. ${policy.advice}`
@@ -172,6 +198,11 @@ function validateDump(bytes) {
172
198
  throw new AttachmentValidationError('invalid_content');
173
199
  }
174
200
  }
201
+ /** An .xlsx workbook is an OOXML zip, so the zip magic is what has to match. */
202
+ function validateSpreadsheet(bytes) {
203
+ if (!isZip(bytes))
204
+ throw new AttachmentValidationError('invalid_content');
205
+ }
175
206
  function validateText(bytes) {
176
207
  if (bytes.includes(0) ||
177
208
  startsWith(bytes, [0x25, 0x50, 0x44, 0x46, 0x2d]) ||
@@ -246,6 +277,8 @@ export async function validateAttachmentBytes(input) {
246
277
  validateArchive(input, input.bytes);
247
278
  else if (kind === 'dump')
248
279
  validateDump(input.bytes);
280
+ else if (kind === 'spreadsheet')
281
+ validateSpreadsheet(input.bytes);
249
282
  else
250
283
  validateImage(kind, input.bytes);
251
284
  return { pdfPages: 0 };
@@ -1 +1 @@
1
- {"version":3,"file":"attachment-validation.js","sourceRoot":"","sources":["../../src/utils/attachment-validation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"attachment-validation.js","sourceRoot":"","sources":["../../src/utils/attachment-validation.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { PDFDocument } from 'pdf-lib';
2
2
  import { describe, expect, test } from 'vitest';
3
- import { AttachmentValidationError, MAX_ARCHIVE_ATTACHMENT_BYTES, MAX_IMAGE_ATTACHMENT_BYTES, MAX_PDF_ATTACHMENT_BYTES, MAX_TEXT_ATTACHMENT_BYTES, assertAttachmentSize, getAttachmentLimitsHelp, getAttachmentUploadPolicy, getAttachmentUploadLimit, validateAttachmentBytes } from './attachment-validation.js';
3
+ import { AttachmentValidationError, MAX_ARCHIVE_ATTACHMENT_BYTES, MAX_SPREADSHEET_ATTACHMENT_BYTES, MAX_IMAGE_ATTACHMENT_BYTES, MAX_PDF_ATTACHMENT_BYTES, MAX_TEXT_ATTACHMENT_BYTES, assertAttachmentSize, getAttachmentLimitsHelp, getAttachmentUploadPolicy, getAttachmentUploadLimit, validateAttachmentBytes } from './attachment-validation.js';
4
4
  const encoder = new TextEncoder();
5
5
  async function pdfWithPages(pageCount, useObjectStreams = true) {
6
6
  const document = await PDFDocument.create();
@@ -39,7 +39,8 @@ describe('attachment size policy', () => {
39
39
  ['notes.md', 'text/markdown', MAX_TEXT_ATTACHMENT_BYTES],
40
40
  ['bundle.zip', 'application/zip', MAX_ARCHIVE_ATTACHMENT_BYTES],
41
41
  ['bundle.tgz', 'application/octet-stream', MAX_ARCHIVE_ATTACHMENT_BYTES],
42
- ['orders_prod.dump', 'application/octet-stream', MAX_ARCHIVE_ATTACHMENT_BYTES]
42
+ ['orders_prod.dump', 'application/octet-stream', MAX_ARCHIVE_ATTACHMENT_BYTES],
43
+ ['budget.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', MAX_SPREADSHEET_ATTACHMENT_BYTES]
43
44
  ])('allows the exact limit and rejects one byte more for %s', (fileName, mimeType, limit) => {
44
45
  expect(getAttachmentUploadLimit({ fileName, mimeType })).toBe(limit);
45
46
  expect(() => assertAttachmentSize({ fileName, mimeType, sizeBytes: limit })).not.toThrow();
@@ -67,12 +68,18 @@ describe('attachment size policy', () => {
67
68
  test('uses the same policy for MIME types and extension fallback without trusting a conflicting extension', () => {
68
69
  expect(getAttachmentUploadPolicy({ fileName: 'SPEC.PDF' })).toEqual(getAttachmentUploadPolicy({ mimeType: 'application/pdf' }));
69
70
  expect(getAttachmentUploadPolicy({ fileName: 'spec.pdf', mimeType: 'image/png' }).maxBytes).toBe(3_750_000);
70
- expect(getAttachmentLimitsHelp(false)).toBe('PDFs: 4.5 MB each, 100 pages total. Images: 3.75 MB after conversion. Text/code: 5 MiB.');
71
- expect(getAttachmentLimitsHelp(true)).toBe('PDFs: 4.5 MB each, 100 pages total. Images: 3.75 MB after conversion. Text/code: 5 MiB. Supported archives and .dump files: 50 MiB.');
71
+ });
72
+ test('lists limits only for the file families a surface accepts', () => {
73
+ expect(getAttachmentLimitsHelp({})).toBe('PDFs: 4.5 MB each, 100 pages total. Images: 3.75 MB after conversion. Text/code: 5 MiB.');
74
+ expect(getAttachmentLimitsHelp({ spreadsheetAttachmentsEnabled: true })).toBe('PDFs: 4.5 MB each, 100 pages total. Images: 3.75 MB after conversion. Text/code: 5 MiB. Excel workbooks (.xlsx): 5 MiB.');
75
+ expect(getAttachmentLimitsHelp({ archiveAttachmentsEnabled: true })).toBe('PDFs: 4.5 MB each, 100 pages total. Images: 3.75 MB after conversion. Text/code: 5 MiB. Supported archives and .dump files: 50 MiB.');
76
+ expect(getAttachmentLimitsHelp({ archiveAttachmentsEnabled: true, spreadsheetAttachmentsEnabled: true })).toBe('PDFs: 4.5 MB each, 100 pages total. Images: 3.75 MB after conversion. Text/code: 5 MiB. Supported archives and .dump files: 50 MiB. Excel workbooks (.xlsx): 5 MiB.');
72
77
  });
73
78
  test('rejects unsupported and Office types', () => {
74
79
  expectReason(() => getAttachmentUploadLimit({ fileName: 'logo.svg', mimeType: 'image/svg+xml' }), 'unsupported_type');
75
80
  expectReason(() => getAttachmentUploadLimit({ fileName: 'report.docx', mimeType: 'text/plain' }), 'unsupported_type');
81
+ expectReason(() => getAttachmentUploadLimit({ fileName: 'macros.xlsm' }), 'unsupported_type');
82
+ expectReason(() => getAttachmentUploadLimit({ fileName: 'inventory.xls', mimeType: 'application/vnd.ms-excel' }), 'unsupported_type');
76
83
  expectReason(() => getAttachmentUploadLimit({ fileName: 'notes.txt', mimeType: 'application/octet-stream' }), 'unsupported_type');
77
84
  });
78
85
  });
@@ -107,6 +114,18 @@ describe('attachment content validation', () => {
107
114
  bytes: encoder.encode('not a dump')
108
115
  }), 'invalid_content');
109
116
  });
117
+ test('accepts Excel workbook magic for .xlsx', async () => {
118
+ await expect(validateAttachmentBytes({
119
+ fileName: 'budget.xlsx',
120
+ mimeType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
121
+ bytes: new Uint8Array([0x50, 0x4b, 0x03, 0x04])
122
+ })).resolves.toEqual({ pdfPages: 0 });
123
+ await expectAsyncReason(() => validateAttachmentBytes({
124
+ fileName: 'budget.xlsx',
125
+ mimeType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
126
+ bytes: encoder.encode('not a workbook')
127
+ }), 'invalid_content');
128
+ });
110
129
  test('accepts dump mime type without a .dump filename', async () => {
111
130
  const bytes = encoder.encode('PGDMP\x01\x0e\x00');
112
131
  await expect(validateAttachmentBytes({ fileName: 'orders', mimeType: 'application/x-postgresql-dump', bytes })).resolves.toEqual({
@@ -1 +1 @@
1
- {"version":3,"file":"attachment-validation.test.js","sourceRoot":"","sources":["../../src/utils/attachment-validation.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"attachment-validation.test.js","sourceRoot":"","sources":["../../src/utils/attachment-validation.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@superblocksteam/shared",
3
- "version": "2.0.0-SNAPSHOT.dacafd95ee5ff6bb",
3
+ "version": "2.0.0-SNAPSHOT.fe3e10d22aff0c65",
4
4
  "description": "Superblocks Shared Resources",
5
5
  "license": "Superblocks Community Software License",
6
6
  "repository": {
@@ -18,11 +18,14 @@ export type AppDatabaseCompatibilityState = (typeof APP_DATABASE_COMPATIBILITY_S
18
18
  /** Lifecycle operations an App Database cannot work without. */
19
19
  export const APP_DATABASE_REQUIRED_OPERATIONS: readonly LifecycleOperation[] = ['ensure_database', 'migrate_schema'];
20
20
 
21
- export type AppDatabaseTagCompatibility = {
22
- /** App view modes that offer this data tag, for messaging. */
21
+ export type AppDatabaseTagRef = {
22
+ /** App view modes that offer this data tag. */
23
23
  availableModes: ViewMode[];
24
- missingOperations: LifecycleOperation[];
25
24
  profileKey: string;
25
+ };
26
+
27
+ export type AppDatabaseTagCompatibility = AppDatabaseTagRef & {
28
+ missingOperations: LifecycleOperation[];
26
29
  requiredOperations: LifecycleOperation[];
27
30
  supportState: AppDatabaseTagSupportState;
28
31
  };
@@ -0,0 +1,105 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import { ViewMode } from '../types/event/index.js';
4
+ import { isProductionDatabaseRetirementEligible, type AppDatabaseStatus, type AppDatabaseStatusBinding } from './appDatabaseStatus.js';
5
+
6
+ const binding: AppDatabaseStatusBinding = {
7
+ bindingId: 'binding-1',
8
+ created: '2026-09-14T00:00:00.000Z',
9
+ instance: null,
10
+ integration: null,
11
+ lastActivity: '2026-09-14T00:00:00.000Z',
12
+ lifecycleState: 'ready',
13
+ logicalName: 'app_db',
14
+ migrationDirectory: null,
15
+ migrationState: 'migrated'
16
+ };
17
+
18
+ function status(overrides: Partial<AppDatabaseStatus> = {}): AppDatabaseStatus {
19
+ return {
20
+ applicationId: 'app-1',
21
+ hasAppDatabase: false,
22
+ hasDatabaseCode: false,
23
+ liveVersionHasAppDatabase: false,
24
+ tags: [
25
+ {
26
+ availableModes: [ViewMode.DEPLOYED],
27
+ binding,
28
+ deleted: false,
29
+ displayName: 'Production',
30
+ isDefaultEditor: false,
31
+ profileKey: 'production'
32
+ }
33
+ ],
34
+ ...overrides
35
+ };
36
+ }
37
+
38
+ describe('production database retirement eligibility', () => {
39
+ it('offers deletion after a live version that does not need a database and Edit leftovers are gone', () => {
40
+ expect(isProductionDatabaseRetirementEligible(status())).toBe(true);
41
+ });
42
+
43
+ it('refuses deletion while the live version still needs a database', () => {
44
+ expect(isProductionDatabaseRetirementEligible(status({ liveVersionHasAppDatabase: true }))).toBe(false);
45
+ });
46
+
47
+ it('refuses deletion while an Edit-only database remains', () => {
48
+ expect(
49
+ isProductionDatabaseRetirementEligible(
50
+ status({
51
+ tags: [
52
+ ...status().tags,
53
+ {
54
+ availableModes: [ViewMode.EDITOR],
55
+ binding: { ...binding, bindingId: 'edit-binding' },
56
+ deleted: false,
57
+ displayName: 'Staging',
58
+ isDefaultEditor: true,
59
+ profileKey: 'staging'
60
+ }
61
+ ]
62
+ })
63
+ )
64
+ ).toBe(false);
65
+ });
66
+
67
+ it('offers deletion of an unassigned leftover after a live version that does not need a database', () => {
68
+ expect(
69
+ isProductionDatabaseRetirementEligible(
70
+ status({
71
+ tags: [
72
+ {
73
+ availableModes: [],
74
+ binding,
75
+ deleted: false,
76
+ displayName: 'Removed production',
77
+ isDefaultEditor: false,
78
+ profileKey: 'removed-production'
79
+ }
80
+ ]
81
+ })
82
+ )
83
+ ).toBe(true);
84
+ });
85
+
86
+ it('refuses deletion while the editor default is still live, even when that tag is also deploy-allowed', () => {
87
+ expect(
88
+ isProductionDatabaseRetirementEligible(
89
+ status({
90
+ tags: [
91
+ ...status().tags,
92
+ {
93
+ availableModes: [ViewMode.EDITOR, ViewMode.DEPLOYED],
94
+ binding: { ...binding, bindingId: 'edit-binding' },
95
+ deleted: false,
96
+ displayName: 'Staging',
97
+ isDefaultEditor: true,
98
+ profileKey: 'staging'
99
+ }
100
+ ]
101
+ })
102
+ )
103
+ ).toBe(false);
104
+ });
105
+ });
@@ -0,0 +1,95 @@
1
+ import { ViewMode } from '../types/event/index.js';
2
+ import type { AppDatabaseTagRef } from './appDatabaseCompatibility.js';
3
+ import type { DatabaseEngine, LifecycleMigrationState, LifecycleState } from './index.js';
4
+
5
+ /**
6
+ * Builder-safe physical instance fields. Pool capacity and the internal
7
+ * instance id stay off this payload: they are org-wide admin facts, and
8
+ * capacity.used counts every application in the org.
9
+ */
10
+ export type AppDatabaseStatusInstance = {
11
+ engine: DatabaseEngine;
12
+ engineVersion: string | null;
13
+ region: string;
14
+ };
15
+
16
+ export type AppDatabaseStatusIntegration = {
17
+ apiNames: string[];
18
+ id: string;
19
+ name: string;
20
+ pluginId: string;
21
+ };
22
+
23
+ export type AppDatabaseStatusBinding = {
24
+ bindingId: string;
25
+ created: string;
26
+ instance: AppDatabaseStatusInstance | null;
27
+ integration: AppDatabaseStatusIntegration | null;
28
+ lastActivity: string;
29
+ lifecycleState: LifecycleState;
30
+ logicalName: string;
31
+ migrationDirectory: string | null;
32
+ migrationState: LifecycleMigrationState;
33
+ };
34
+
35
+ export type AppDatabaseStatusTag = AppDatabaseTagRef & {
36
+ /** Null when this data tag has no live (non-cancelled) database. */
37
+ binding: AppDatabaseStatusBinding | null;
38
+ /**
39
+ * True when this data tag had a database that was retired. The live
40
+ * binding is omitted so the tag can be provisioned again, but Status
41
+ * still shows Deleted instead of No database.
42
+ */
43
+ deleted: boolean;
44
+ displayName: string;
45
+ isDefaultEditor: boolean;
46
+ };
47
+
48
+ export type AppDatabaseStatus = {
49
+ applicationId: string;
50
+ /**
51
+ * Whether the app declares an App Database right now (working-state
52
+ * requirement). Same meaning as AppDatabaseCompatibility.hasAppDatabase.
53
+ * A leftover live binding with no requirement still appears under tags.
54
+ */
55
+ hasAppDatabase: boolean;
56
+ /**
57
+ * Whether leftover App Database code is still in the working tree: SQL
58
+ * in the last known migration folder, or APIs still wired to the app's
59
+ * Postgres integration. Used to offer Clark cleanup after Edit databases
60
+ * are gone. Not a complete scan of every page or helper.
61
+ */
62
+ hasDatabaseCode: boolean;
63
+ /**
64
+ * Whether the currently live published version stamped a database
65
+ * requirement. Working-state (Edit) rows are not this signal: a leftover
66
+ * production database stays undeletable until a version without databases
67
+ * is live.
68
+ */
69
+ liveVersionHasAppDatabase: boolean;
70
+ tags: AppDatabaseStatusTag[];
71
+ };
72
+
73
+ /**
74
+ * Edit lifecycle membership: tags used for edit provisioning and migrations.
75
+ * That is every editor-only tag, plus the editor default even when that
76
+ * default is also deploy-allowed.
77
+ */
78
+ export function isEditLifecycleTag(tag: Pick<AppDatabaseStatusTag, 'availableModes'>): boolean {
79
+ return tag.availableModes.includes(ViewMode.EDITOR);
80
+ }
81
+
82
+ /**
83
+ * Deploy lifecycle membership for builder-facing grouping: deploy-allowed
84
+ * tags that are not the editor default. Publish still may write the editor
85
+ * default when it is also deploy-allowed; that tag stays an Edit database.
86
+ */
87
+ export function isDeployLifecycleTag(tag: Pick<AppDatabaseStatusTag, 'availableModes'>): boolean {
88
+ return tag.availableModes.includes(ViewMode.DEPLOYED) && !tag.availableModes.includes(ViewMode.EDITOR);
89
+ }
90
+
91
+ export function isProductionDatabaseRetirementEligible(status: AppDatabaseStatus): boolean {
92
+ const hasEditDatabase = status.tags.some((tag) => tag.binding !== null && isEditLifecycleTag(tag));
93
+ const hasLeftoverProductionDatabase = status.tags.some((tag) => tag.binding !== null && !isEditLifecycleTag(tag));
94
+ return !hasEditDatabase && hasLeftoverProductionDatabase && !status.liveVersionHasAppDatabase;
95
+ }
package/src/index.ts CHANGED
@@ -28,5 +28,6 @@ export * from './jwt/index.js';
28
28
  export * from './org-features/index.js';
29
29
  export * from './database-lifecycle/index.js';
30
30
  export * from './database-lifecycle/appDatabaseCompatibility.js';
31
+ export * from './database-lifecycle/appDatabaseStatus.js';
31
32
  export * from './database-lifecycle/edit-lifecycle-capability.js';
32
33
  export * from './environment-compatibility/appEnvironmentCompatibility.js';
@@ -14,8 +14,6 @@ export const WorkflowPlugin: Plugin = {
14
14
  sections: []
15
15
  },
16
16
  actionTemplate: {
17
- sections: [
18
- /* Dynamically filled out by resolverContext */
19
- ]
17
+ sections: [/* Dynamically filled out by resolverContext */]
20
18
  }
21
19
  };
@@ -148,9 +148,11 @@ export interface ServerMethods {
148
148
  >;
149
149
  getMessages: ServerMethodSchema<
150
150
  { applicationId: string; branchName?: string | null; limit?: number },
151
- { messages: AiChatMessageDto[] }
151
+ { chatSessionId: string; messages: AiChatMessageDto[] }
152
152
  >;
153
- new: ServerMethodSchema<{ applicationId: string; branchName?: string | null }, void>;
153
+ /** Id of the active chat session, created if the app has none yet. Reads no messages. */
154
+ getActiveSessionId: ServerMethodSchema<{ applicationId: string }, { chatSessionId: string }>;
155
+ new: ServerMethodSchema<{ applicationId: string; branchName?: string | null }, { chatSessionId: string }>;
154
156
  truncateAfterTimestamp: ServerMethodSchema<{ applicationId: string; sinceTimestamp: number }, void>;
155
157
  };
156
158
  billing: {
@@ -0,0 +1,84 @@
1
+ import { once } from 'node:events';
2
+
3
+ import { trace } from '@opentelemetry/api';
4
+ import WebSocket from 'isomorphic-ws';
5
+ import { afterEach, describe, expect, it } from 'vitest';
6
+
7
+ import type { SocketMessage } from './socket.js';
8
+ import { ISocketWithClientAuth } from './socketWithClientAuth.js';
9
+ import { connectWebSocket } from './util.js';
10
+
11
+ describe('socket request authorization', () => {
12
+ const servers: WebSocket.Server[] = [];
13
+ const authorizations: Array<string | undefined> = [];
14
+
15
+ async function connect(options: { authorization?: string; getAuthorization?: () => Promise<string> }) {
16
+ const server = new WebSocket.Server({ host: '127.0.0.1', port: 0 });
17
+ servers.push(server);
18
+ server.on('connection', (ws) => {
19
+ ws.on('message', (data) => {
20
+ const message: SocketMessage = JSON.parse(data.toString());
21
+ if (!message.request) throw new Error('Expected a socket request');
22
+ authorizations.push(message.request.setAuthorization);
23
+ ws.send(JSON.stringify({ response: { error: null, id: message.request.id, payload: 'ok' } }));
24
+ });
25
+ });
26
+ await once(server, 'listening');
27
+ const address = server.address();
28
+ if (!address || typeof address === 'string') throw new Error('Expected a TCP test server');
29
+ const ws = await connectWebSocket(`ws://127.0.0.1:${address.port}`);
30
+ return new ISocketWithClientAuth(ws, options.authorization, {}, [], trace.getTracer('socket-auth-test'), {
31
+ getAuthorization: options.getAuthorization,
32
+ onClose: () => undefined
33
+ });
34
+ }
35
+
36
+ afterEach(async () => {
37
+ authorizations.length = 0;
38
+ for (const server of servers.splice(0)) {
39
+ for (const client of server.clients) client.terminate();
40
+ await new Promise<void>((resolve, reject) => server.close((error) => (error ? reject(error) : resolve())));
41
+ }
42
+ });
43
+
44
+ it('refreshes authorization before each request and sends only changed credentials', async () => {
45
+ let authorization = 'Bearer first-token';
46
+ const socket = await connect({ authorization: 'Bearer expired-token', getAuthorization: async () => authorization });
47
+
48
+ await expect(socket.request('test.read', {})).resolves.toBe('ok');
49
+ await expect(socket.request('test.read', {})).resolves.toBe('ok');
50
+ authorization = 'Bearer second-token';
51
+ await expect(socket.request('test.read', {})).resolves.toBe('ok');
52
+
53
+ expect(authorizations).toEqual(['Bearer first-token', undefined, 'Bearer second-token']);
54
+ socket.close();
55
+ });
56
+
57
+ it('sends no request when refreshing authorization fails and allows a later retry', async () => {
58
+ let refreshFailed = true;
59
+ const socket = await connect({
60
+ authorization: 'Bearer expired-token',
61
+ getAuthorization: async () => {
62
+ if (refreshFailed) throw new Error('Refresh unavailable');
63
+ return 'Bearer refreshed-token';
64
+ }
65
+ });
66
+
67
+ await expect(socket.request('test.read', {})).rejects.toThrow('Refresh unavailable');
68
+ refreshFailed = false;
69
+ await expect(socket.request('test.read', {})).resolves.toBe('ok');
70
+
71
+ expect(authorizations).toEqual(['Bearer refreshed-token']);
72
+ socket.close();
73
+ });
74
+
75
+ it('preserves static authorization when no provider is supplied', async () => {
76
+ const socket = await connect({ authorization: 'Bearer personal-token' });
77
+
78
+ await expect(socket.request('test.read', {})).resolves.toBe('ok');
79
+ await expect(socket.request('test.read', {})).resolves.toBe('ok');
80
+
81
+ expect(authorizations).toEqual(['Bearer personal-token', undefined]);
82
+ socket.close();
83
+ });
84
+ });
@@ -15,6 +15,7 @@ export class ISocketWithClientAuth<ImplementedMethods, CallableMethods, RequestC
15
15
  > {
16
16
  private authorization?: string;
17
17
  private authorizationVersion = 0;
18
+ private readonly getAuthorization?: () => Promise<string>;
18
19
  private hasSentAuth = false;
19
20
 
20
21
  constructor(
@@ -28,15 +29,20 @@ export class ISocketWithClientAuth<ImplementedMethods, CallableMethods, RequestC
28
29
  timeouts?: SocketTimeouts;
29
30
  logger?: { error: (message?: string) => void; info: (message?: string) => void; warn: (message?: string) => void };
30
31
  getAbortSignal?: () => AbortSignal | undefined;
32
+ getAuthorization?: () => Promise<string>;
31
33
  }
32
34
  ) {
33
35
  super(ws, requestHandlers, globalMiddlewares, tracer, options);
34
36
  this.authorization = authorization;
37
+ this.getAuthorization = options.getAuthorization;
35
38
  }
36
39
 
37
40
  // override `request` from the base class to send `authorization` when appropriate
38
41
  async request<Params, Result>(method: string, params: Params): Promise<Result> {
39
- // only send `authorization` on the first request
42
+ if (this.getAuthorization) {
43
+ const authorization = await this.getAuthorization();
44
+ if (authorization !== this.authorization) this.setAuthorization(authorization);
45
+ }
40
46
  const authorizationVersion = this.authorizationVersion;
41
47
  const authorization = this.hasSentAuth ? undefined : this.authorization;
42
48
  const result = await super.request<Params, Result>(method, params, authorization);
@@ -14,7 +14,7 @@ export const SUPERBLOCKS_SECURITY_AGENT_NAME = 'Superblocks Security Agent';
14
14
 
15
15
  // Display name of the Superblocks-managed pre-publish dependency CVE check. One per organization;
16
16
  // runs synchronously against the vulnerability index, so it needs no runner config to enable.
17
- export const DEPENDENCY_VULNERABILITY_SCAN_NAME = 'Superblocks Dependency Vulnerability Scan';
17
+ export const DEPENDENCY_VULNERABILITY_SCAN_NAME = 'Superblocks Vulnerability Detection';
18
18
 
19
19
  export const REVIEW_POLICY_TYPES = ['built_in_security_scan', 'security_agent', 'dependency_vulnerability_scan'] as const;
20
20
  export const REVIEW_POLICY_SOURCES = ['admin_configured', 'superblocks_managed'] as const;