@multiplayer-app/sandbox 0.0.11 → 0.0.14

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 (122) hide show
  1. package/dist/agents/blocknote.agent.d.ts +6 -0
  2. package/dist/agents/blocknote.agent.d.ts.map +1 -0
  3. package/dist/agents/blocknote.agent.js +18 -0
  4. package/dist/agents/blocknote.agent.js.map +1 -0
  5. package/dist/agents/shared/blocknote-system-prompt.d.ts +2 -0
  6. package/dist/agents/shared/blocknote-system-prompt.d.ts.map +1 -0
  7. package/dist/agents/shared/blocknote-system-prompt.js +40 -0
  8. package/dist/agents/shared/blocknote-system-prompt.js.map +1 -0
  9. package/dist/builder-api-config.d.ts +3 -2
  10. package/dist/builder-api-config.d.ts.map +1 -1
  11. package/dist/builder-api-config.js +4 -1
  12. package/dist/builder-api-config.js.map +1 -1
  13. package/dist/context.d.ts +4 -0
  14. package/dist/context.d.ts.map +1 -1
  15. package/dist/context.js.map +1 -1
  16. package/dist/create-builder-api.d.ts +4 -0
  17. package/dist/create-builder-api.d.ts.map +1 -1
  18. package/dist/create-builder-api.js +3 -1
  19. package/dist/create-builder-api.js.map +1 -1
  20. package/dist/index.d.ts +5 -1
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +11 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/lib/ai/agent-ai-service.d.ts +3 -0
  25. package/dist/lib/ai/agent-ai-service.d.ts.map +1 -0
  26. package/dist/lib/ai/agent-ai-service.js +15 -0
  27. package/dist/lib/ai/agent-ai-service.js.map +1 -0
  28. package/dist/lib/ai/ai-error-details.d.ts +13 -0
  29. package/dist/lib/ai/ai-error-details.d.ts.map +1 -0
  30. package/dist/lib/ai/ai-error-details.js +84 -0
  31. package/dist/lib/ai/ai-error-details.js.map +1 -0
  32. package/dist/lib/ai/generate-ai-text.d.ts +12 -0
  33. package/dist/lib/ai/generate-ai-text.d.ts.map +1 -0
  34. package/dist/lib/ai/generate-ai-text.js +105 -0
  35. package/dist/lib/ai/generate-ai-text.js.map +1 -0
  36. package/dist/lib/ai/run-explicit-agent.d.ts +15 -0
  37. package/dist/lib/ai/run-explicit-agent.d.ts.map +1 -0
  38. package/dist/lib/ai/run-explicit-agent.js +30 -0
  39. package/dist/lib/ai/run-explicit-agent.js.map +1 -0
  40. package/dist/lib/notebooks/notebook-assistant-prompts.d.ts +6 -0
  41. package/dist/lib/notebooks/notebook-assistant-prompts.d.ts.map +1 -0
  42. package/dist/lib/notebooks/notebook-assistant-prompts.js +42 -0
  43. package/dist/lib/notebooks/notebook-assistant-prompts.js.map +1 -0
  44. package/dist/lib/notebooks/notebook-assistant.d.ts +15 -0
  45. package/dist/lib/notebooks/notebook-assistant.d.ts.map +1 -0
  46. package/dist/lib/notebooks/notebook-assistant.js +145 -0
  47. package/dist/lib/notebooks/notebook-assistant.js.map +1 -0
  48. package/dist/lib/notebooks/notebook-content.d.ts +16 -0
  49. package/dist/lib/notebooks/notebook-content.d.ts.map +1 -0
  50. package/dist/lib/notebooks/notebook-content.js +104 -0
  51. package/dist/lib/notebooks/notebook-content.js.map +1 -0
  52. package/dist/lib/notebooks/notebook-repository.d.ts +47 -0
  53. package/dist/lib/notebooks/notebook-repository.d.ts.map +1 -0
  54. package/dist/lib/notebooks/notebook-repository.js +3 -0
  55. package/dist/lib/notebooks/notebook-repository.js.map +1 -0
  56. package/dist/lib/notebooks/notebook-sql-client.d.ts +5 -0
  57. package/dist/lib/notebooks/notebook-sql-client.d.ts.map +1 -0
  58. package/dist/lib/notebooks/notebook-sql-client.js +37 -0
  59. package/dist/lib/notebooks/notebook-sql-client.js.map +1 -0
  60. package/dist/lib/notebooks/notebook-sql-schema.d.ts +16 -0
  61. package/dist/lib/notebooks/notebook-sql-schema.d.ts.map +1 -0
  62. package/dist/lib/notebooks/notebook-sql-schema.js +117 -0
  63. package/dist/lib/notebooks/notebook-sql-schema.js.map +1 -0
  64. package/dist/lib/notebooks/notebook-sql.d.ts +9 -0
  65. package/dist/lib/notebooks/notebook-sql.d.ts.map +1 -0
  66. package/dist/lib/notebooks/notebook-sql.js +36 -0
  67. package/dist/lib/notebooks/notebook-sql.js.map +1 -0
  68. package/dist/lib/sql-schema.d.ts +23 -0
  69. package/dist/lib/sql-schema.d.ts.map +1 -0
  70. package/dist/lib/sql-schema.js +3 -0
  71. package/dist/lib/sql-schema.js.map +1 -0
  72. package/dist/realtime/init-realtime.d.ts +2 -2
  73. package/dist/realtime/init-realtime.d.ts.map +1 -1
  74. package/dist/realtime/init-realtime.js +31 -12
  75. package/dist/realtime/init-realtime.js.map +1 -1
  76. package/dist/realtime/notebook-document-id.d.ts +6 -0
  77. package/dist/realtime/notebook-document-id.d.ts.map +1 -0
  78. package/dist/realtime/notebook-document-id.js +30 -0
  79. package/dist/realtime/notebook-document-id.js.map +1 -0
  80. package/dist/realtime/realtime-auth.d.ts +12 -0
  81. package/dist/realtime/realtime-auth.d.ts.map +1 -0
  82. package/dist/realtime/realtime-auth.js +25 -0
  83. package/dist/realtime/realtime-auth.js.map +1 -0
  84. package/dist/realtime/session-artifact-y-socket-io.d.ts +4 -11
  85. package/dist/realtime/session-artifact-y-socket-io.d.ts.map +1 -1
  86. package/dist/realtime/session-artifact-y-socket-io.js +30 -32
  87. package/dist/realtime/session-artifact-y-socket-io.js.map +1 -1
  88. package/dist/realtime/session-artifact-yjs-store.d.ts +9 -0
  89. package/dist/realtime/session-artifact-yjs-store.d.ts.map +1 -1
  90. package/dist/realtime/session-artifact-yjs-store.js +93 -9
  91. package/dist/realtime/session-artifact-yjs-store.js.map +1 -1
  92. package/dist/realtime/yjs-account-namespace.d.ts +5 -0
  93. package/dist/realtime/yjs-account-namespace.d.ts.map +1 -0
  94. package/dist/realtime/yjs-account-namespace.js +21 -0
  95. package/dist/realtime/yjs-account-namespace.js.map +1 -0
  96. package/dist/routes/notebooks/assistant-generate.d.ts +3 -0
  97. package/dist/routes/notebooks/assistant-generate.d.ts.map +1 -0
  98. package/dist/routes/notebooks/assistant-generate.js +45 -0
  99. package/dist/routes/notebooks/assistant-generate.js.map +1 -0
  100. package/dist/routes/notebooks/errors.d.ts +3 -0
  101. package/dist/routes/notebooks/errors.d.ts.map +1 -0
  102. package/dist/routes/notebooks/errors.js +28 -0
  103. package/dist/routes/notebooks/errors.js.map +1 -0
  104. package/dist/routes/notebooks/sql-execute.d.ts +3 -0
  105. package/dist/routes/notebooks/sql-execute.d.ts.map +1 -0
  106. package/dist/routes/notebooks/sql-execute.js +45 -0
  107. package/dist/routes/notebooks/sql-execute.js.map +1 -0
  108. package/dist/routes/notebooks.d.ts +2 -0
  109. package/dist/routes/notebooks.d.ts.map +1 -0
  110. package/dist/routes/notebooks.js +132 -0
  111. package/dist/routes/notebooks.js.map +1 -0
  112. package/dist/routes/sessions.d.ts.map +1 -1
  113. package/dist/routes/sessions.js +0 -11
  114. package/dist/routes/sessions.js.map +1 -1
  115. package/dist/routes/sql.d.ts +2 -0
  116. package/dist/routes/sql.d.ts.map +1 -0
  117. package/dist/routes/sql.js +50 -0
  118. package/dist/routes/sql.js.map +1 -0
  119. package/dist/server.d.ts.map +1 -1
  120. package/dist/server.js +2 -0
  121. package/dist/server.js.map +1 -1
  122. package/package.json +9 -5
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listNotebookSqlTables = listNotebookSqlTables;
4
+ exports.getNotebookSqlTableSchema = getNotebookSqlTableSchema;
5
+ const notebook_sql_client_1 = require("./notebook-sql-client");
6
+ const LIST_COLUMNS_SQL = `
7
+ SELECT
8
+ c.table_schema,
9
+ c.table_name,
10
+ c.column_name,
11
+ c.data_type,
12
+ c.is_nullable,
13
+ c.column_default,
14
+ c.ordinal_position
15
+ FROM information_schema.columns c
16
+ INNER JOIN information_schema.tables t
17
+ ON t.table_schema = c.table_schema
18
+ AND t.table_name = c.table_name
19
+ WHERE c.table_schema = 'public'
20
+ AND t.table_type = 'BASE TABLE'
21
+ ORDER BY c.table_name, c.ordinal_position
22
+ `;
23
+ const LIST_PRIMARY_KEYS_SQL = `
24
+ SELECT
25
+ tc.table_schema,
26
+ tc.table_name,
27
+ kcu.column_name
28
+ FROM information_schema.table_constraints tc
29
+ INNER JOIN information_schema.key_column_usage kcu
30
+ ON tc.constraint_name = kcu.constraint_name
31
+ AND tc.table_schema = kcu.table_schema
32
+ AND tc.table_name = kcu.table_name
33
+ WHERE tc.constraint_type = 'PRIMARY KEY'
34
+ AND tc.table_schema = 'public'
35
+ `;
36
+ function buildPrimaryKeySet(rows) {
37
+ return new Set(rows.map(row => `${row.table_schema}.${row.table_name}.${row.column_name}`));
38
+ }
39
+ function groupColumnsByTable(columnRows, primaryKeys) {
40
+ const tables = new Map();
41
+ for (const row of columnRows) {
42
+ const key = `${row.table_schema}.${row.table_name}`;
43
+ let table = tables.get(key);
44
+ if (!table) {
45
+ table = {
46
+ schema: row.table_schema,
47
+ name: row.table_name,
48
+ columns: [],
49
+ };
50
+ tables.set(key, table);
51
+ }
52
+ table.columns.push({
53
+ name: row.column_name,
54
+ dataType: row.data_type,
55
+ isNullable: row.is_nullable === 'YES',
56
+ defaultValue: row.column_default,
57
+ isPrimaryKey: primaryKeys.has(`${row.table_schema}.${row.table_name}.${row.column_name}`),
58
+ ordinalPosition: row.ordinal_position,
59
+ });
60
+ }
61
+ return Array.from(tables.values());
62
+ }
63
+ async function listNotebookSqlTables() {
64
+ return (0, notebook_sql_client_1.withNotebookSqlClient)(async (client) => {
65
+ const [columnsResult, primaryKeysResult] = await Promise.all([
66
+ client.query(LIST_COLUMNS_SQL),
67
+ client.query(LIST_PRIMARY_KEYS_SQL),
68
+ ]);
69
+ return groupColumnsByTable(columnsResult.rows, buildPrimaryKeySet(primaryKeysResult.rows));
70
+ });
71
+ }
72
+ async function getNotebookSqlTableSchema(tableName) {
73
+ const trimmed = tableName.trim();
74
+ if (!trimmed) {
75
+ throw new Error('Table name is required');
76
+ }
77
+ return (0, notebook_sql_client_1.withNotebookSqlClient)(async (client) => {
78
+ var _a;
79
+ const columnsResult = await client.query(`
80
+ SELECT
81
+ c.table_schema,
82
+ c.table_name,
83
+ c.column_name,
84
+ c.data_type,
85
+ c.is_nullable,
86
+ c.column_default,
87
+ c.ordinal_position
88
+ FROM information_schema.columns c
89
+ INNER JOIN information_schema.tables t
90
+ ON t.table_schema = c.table_schema
91
+ AND t.table_name = c.table_name
92
+ WHERE c.table_schema = 'public'
93
+ AND t.table_type = 'BASE TABLE'
94
+ AND c.table_name = $1
95
+ ORDER BY c.ordinal_position
96
+ `, [trimmed]);
97
+ if (columnsResult.rows.length === 0) {
98
+ return null;
99
+ }
100
+ const primaryKeysResult = await client.query(`
101
+ SELECT
102
+ tc.table_schema,
103
+ tc.table_name,
104
+ kcu.column_name
105
+ FROM information_schema.table_constraints tc
106
+ INNER JOIN information_schema.key_column_usage kcu
107
+ ON tc.constraint_name = kcu.constraint_name
108
+ AND tc.table_schema = kcu.table_schema
109
+ AND tc.table_name = kcu.table_name
110
+ WHERE tc.constraint_type = 'PRIMARY KEY'
111
+ AND tc.table_schema = 'public'
112
+ AND tc.table_name = $1
113
+ `, [trimmed]);
114
+ return (_a = groupColumnsByTable(columnsResult.rows, buildPrimaryKeySet(primaryKeysResult.rows))[0]) !== null && _a !== void 0 ? _a : null;
115
+ });
116
+ }
117
+ //# sourceMappingURL=notebook-sql-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebook-sql-schema.js","sourceRoot":"","sources":["../../../src/lib/notebooks/notebook-sql-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface SqlQueryResult {
2
+ columns: string[];
3
+ rows: Record<string, unknown>[];
4
+ rowCount: number;
5
+ durationMs: number;
6
+ }
7
+ export declare function executeNotebookSqlQuery(query: string): Promise<SqlQueryResult>;
8
+ export { closeNotebookSqlPool } from './notebook-sql-client';
9
+ //# sourceMappingURL=notebook-sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebook-sql.d.ts","sourceRoot":"","sources":["../../../src/lib/notebooks/notebook-sql.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB;AAYD,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAsBpF;AAED,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.closeNotebookSqlPool = void 0;
4
+ exports.executeNotebookSqlQuery = executeNotebookSqlQuery;
5
+ const notebook_sql_client_1 = require("./notebook-sql-client");
6
+ function rowsToResult(rows, rowCount, durationMs) {
7
+ const columns = rows.length > 0 ? Object.keys(rows[0]) : [];
8
+ return {
9
+ columns,
10
+ rows,
11
+ rowCount,
12
+ durationMs,
13
+ };
14
+ }
15
+ async function executeNotebookSqlQuery(query) {
16
+ const trimmed = query.trim();
17
+ if (!trimmed) {
18
+ throw new Error('Query is empty');
19
+ }
20
+ const start = performance.now();
21
+ try {
22
+ return await (0, notebook_sql_client_1.withNotebookSqlClient)(async (client) => {
23
+ var _a;
24
+ const result = await client.query(trimmed);
25
+ const durationMs = Math.round(performance.now() - start);
26
+ return rowsToResult(result.rows, (_a = result.rowCount) !== null && _a !== void 0 ? _a : result.rows.length, durationMs);
27
+ });
28
+ }
29
+ catch (error) {
30
+ const message = error instanceof Error ? error.message : String(error);
31
+ throw new Error(message);
32
+ }
33
+ }
34
+ var notebook_sql_client_2 = require("./notebook-sql-client");
35
+ Object.defineProperty(exports, "closeNotebookSqlPool", { enumerable: true, get: function () { return notebook_sql_client_2.closeNotebookSqlPool; } });
36
+ //# sourceMappingURL=notebook-sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebook-sql.js","sourceRoot":"","sources":["../../../src/lib/notebooks/notebook-sql.ts"],"names":[],"mappings":";;;AAmBA,0DAsBC;AAzCD,+DAA6D;AAS7D,SAAS,YAAY,CAAC,IAA+B,EAAE,QAAgB,EAAE,UAAkB;IACzF,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC3D,OAAO;QACL,OAAO;QACP,IAAI;QACJ,QAAQ;QACR,UAAU;KACX,CAAA;AACH,CAAC;AAEM,KAAK,UAAU,uBAAuB,CAAC,KAAa;IACzD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAA;IACnC,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;IAE/B,IAAI,CAAC;QACH,OAAO,MAAM,IAAA,2CAAqB,EAAC,KAAK,EAAC,MAAM,EAAC,EAAE;;YAChD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAA;YACxD,OAAO,YAAY,CACjB,MAAM,CAAC,IAAiC,EACxC,MAAA,MAAM,CAAC,QAAQ,mCAAI,MAAM,CAAC,IAAI,CAAC,MAAM,EACrC,UAAU,CACX,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACtE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAA;IAC1B,CAAC;AACH,CAAC;AAED,6DAA4D;AAAnD,2HAAA,oBAAoB,OAAA"}
@@ -0,0 +1,23 @@
1
+ export interface SqlTableColumn {
2
+ name: string;
3
+ dataType: string;
4
+ isNullable: boolean;
5
+ defaultValue: string | null;
6
+ isPrimaryKey: boolean;
7
+ ordinalPosition: number;
8
+ }
9
+ export interface SqlTableSchema {
10
+ schema: string;
11
+ name: string;
12
+ columns: SqlTableColumn[];
13
+ }
14
+ export interface SqlSchemaProvider {
15
+ listTables(): Promise<SqlTableSchema[]>;
16
+ }
17
+ export interface SqlQueryResult {
18
+ columns: string[];
19
+ rows: Record<string, unknown>[];
20
+ rowCount: number;
21
+ durationMs: number;
22
+ }
23
+ //# sourceMappingURL=sql-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-schema.d.ts","sourceRoot":"","sources":["../../src/lib/sql-schema.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,YAAY,EAAE,OAAO,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,cAAc,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAA;CACxC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=sql-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-schema.js","sourceRoot":"","sources":["../../src/lib/sql-schema.ts"],"names":[],"mappings":""}
@@ -1,11 +1,11 @@
1
1
  import type { Server as HttpServer } from 'node:http';
2
2
  import { type RedisClientType } from 'redis';
3
- import { type RealtimeServer } from '@multiplayer-app/realtime-server';
3
+ import { type Middleware, type RealtimeServer } from '@multiplayer-app/realtime-server';
4
4
  import type { BuilderApiConfig } from '../builder-api-config';
5
5
  export interface RealtimeServices {
6
6
  realtimeServer: RealtimeServer;
7
7
  redisClient: RedisClientType;
8
8
  close: () => Promise<void>;
9
9
  }
10
- export declare function initRealtime(httpServer: HttpServer, config: BuilderApiConfig, redisUrl?: string): Promise<RealtimeServices | null>;
10
+ export declare function initRealtime(httpServer: HttpServer, config: BuilderApiConfig, redisUrl?: string, socketAuth?: Middleware): Promise<RealtimeServices | null>;
11
11
  //# sourceMappingURL=init-realtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init-realtime.d.ts","sourceRoot":"","sources":["../../src/realtime/init-realtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAA;AACrD,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,OAAO,CAAA;AAC1D,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAE5F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAM7D,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,cAAc,CAAA;IAC9B,WAAW,EAAE,eAAe,CAAA;IAC5B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;AAQD,wBAAsB,YAAY,CAChC,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,gBAAgB,EACxB,QAAQ,SAAoD,GAC3D,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAoClC"}
1
+ {"version":3,"file":"init-realtime.d.ts","sourceRoot":"","sources":["../../src/realtime/init-realtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAA;AACrD,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,OAAO,CAAA;AAC1D,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,cAAc,EACpB,MAAM,kCAAkC,CAAA;AAEzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAK7D,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,cAAc,CAAA;IAC9B,WAAW,EAAE,eAAe,CAAA;IAC5B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;AAQD,wBAAsB,YAAY,CAChC,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,gBAAgB,EACxB,QAAQ,CAAC,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAwDlC"}
@@ -5,8 +5,7 @@ const redis_1 = require("redis");
5
5
  const realtime_server_1 = require("@multiplayer-app/realtime-server");
6
6
  const logger_1 = require("../logger");
7
7
  const session_artifact_y_socket_io_1 = require("./session-artifact-y-socket-io");
8
- const YJS_NAMESPACE = '/yjs';
9
- const REALTIME_NAMESPACE = '/';
8
+ const ACCOUNT_NAMESPACE = /^\/[^/]+$/;
10
9
  function resolveCorsOrigin(corsOrigin) {
11
10
  if (corsOrigin === true)
12
11
  return '*';
@@ -14,31 +13,51 @@ function resolveCorsOrigin(corsOrigin) {
14
13
  return corsOrigin.join(',');
15
14
  return String(corsOrigin);
16
15
  }
17
- async function initRealtime(httpServer, config, redisUrl) {
18
- var _a;
19
- if (redisUrl === void 0) { redisUrl = (_a = process.env.REDIS_URL) !== null && _a !== void 0 ? _a : 'redis://127.0.0.1:6379'; }
16
+ async function initRealtime(httpServer, config, redisUrl, socketAuth) {
17
+ const resolvedUrl = redisUrl !== null && redisUrl !== void 0 ? redisUrl : process.env.REDIS_URL;
18
+ if (!resolvedUrl) {
19
+ (0, logger_1.getBuilderApiLogger)().warn('REDIS_URL not set — collaborative file editing disabled.');
20
+ return null;
21
+ }
20
22
  let redisClient;
21
23
  try {
22
- redisClient = (0, redis_1.createClient)({ url: redisUrl });
24
+ redisClient = (0, redis_1.createClient)({ url: resolvedUrl });
23
25
  await redisClient.connect();
24
26
  }
25
27
  catch (error) {
26
- (0, logger_1.getBuilderApiLogger)().warn({ err: error, redisUrl }, 'Redis unavailable — collaborative file editing disabled. Start redis or set REDIS_URL.');
28
+ (0, logger_1.getBuilderApiLogger)().warn({ err: error, redisUrl: resolvedUrl }, 'Redis unavailable — collaborative file editing disabled. Start redis or set REDIS_URL.');
27
29
  return null;
28
30
  }
29
31
  const realtimeServer = await (0, realtime_server_1.createRealtimeServer)({
30
32
  httpServer,
31
33
  corsOrigin: resolveCorsOrigin(config.corsOrigin),
32
- namespace: REALTIME_NAMESPACE,
34
+ namespace: ACCOUNT_NAMESPACE,
33
35
  pubClient: redisClient,
34
36
  subClient: redisClient.duplicate(),
35
37
  path: config.realtimeSocketPath,
36
- authMiddleware: config.realtimeAuthMiddleware,
38
+ authMiddleware: socketAuth,
39
+ getUserInfo: config.getUserInfo,
40
+ });
41
+ realtimeServer.namespace.use(async (socket, next) => {
42
+ var _a;
43
+ try {
44
+ const namespaceAccountId = socket.nsp.name.slice(1).trim();
45
+ const requestAccountId = String((_a = socket.request.accountId) !== null && _a !== void 0 ? _a : '').trim();
46
+ if (!namespaceAccountId || !requestAccountId || namespaceAccountId !== requestAccountId) {
47
+ return next(new realtime_server_1.SocketIOError('Invalid account namespace', 403));
48
+ }
49
+ socket.data.allowEdit = true;
50
+ next();
51
+ }
52
+ catch (err) {
53
+ if (err instanceof realtime_server_1.SocketIOError) {
54
+ return next(err);
55
+ }
56
+ return next(new realtime_server_1.SocketIOError('Cannot init user data', 500));
57
+ }
37
58
  });
38
- const yjsNamespace = realtimeServer.io.of(YJS_NAMESPACE);
39
- const yjsServer = new session_artifact_y_socket_io_1.SessionArtifactYSocketIO(yjsNamespace);
59
+ const yjsServer = new session_artifact_y_socket_io_1.SessionArtifactYSocketIO(realtimeServer.namespace);
40
60
  yjsServer.initialize();
41
- (0, logger_1.getBuilderApiLogger)().info({ yjsNamespace: YJS_NAMESPACE }, 'Realtime Yjs server initialized');
42
61
  return {
43
62
  realtimeServer,
44
63
  redisClient,
@@ -1 +1 @@
1
- {"version":3,"file":"init-realtime.js","sourceRoot":"","sources":["../../src/realtime/init-realtime.ts"],"names":[],"mappings":";;AAsBA,oCAwCC;AA7DD,iCAA0D;AAC1D,sEAA4F;AAC5F,sCAA+C;AAE/C,iFAAyE;AAEzE,MAAM,aAAa,GAAG,MAAM,CAAA;AAC5B,MAAM,kBAAkB,GAAG,GAAG,CAAA;AAQ9B,SAAS,iBAAiB,CAAC,UAA0C;IACnE,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,GAAG,CAAA;IACnC,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC1D,OAAO,MAAM,CAAC,UAAU,CAAC,CAAA;AAC3B,CAAC;AAEM,KAAK,UAAU,YAAY,CAChC,UAAsB,EACtB,MAAwB,EACxB,QAA4D;;6BAA5D,EAAA,iBAAW,OAAO,CAAC,GAAG,CAAC,SAAS,mCAAI,wBAAwB;IAE5D,IAAI,WAA4B,CAAA;IAChC,IAAI,CAAC;QACH,WAAW,GAAG,IAAA,oBAAY,EAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAoB,CAAA;QAChE,MAAM,WAAW,CAAC,OAAO,EAAE,CAAA;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAA,4BAAmB,GAAE,CAAC,IAAI,CACxB,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,EACxB,wFAAwF,CACzF,CAAA;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,IAAA,sCAAoB,EAAC;QAChD,UAAU;QACV,UAAU,EAAE,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC;QAChD,SAAS,EAAE,kBAAkB;QAC7B,SAAS,EAAE,WAAW;QACtB,SAAS,EAAE,WAAW,CAAC,SAAS,EAAE;QAClC,IAAI,EAAE,MAAM,CAAC,kBAAkB;QAC/B,cAAc,EAAE,MAAM,CAAC,sBAAsB;KAC9C,CAAC,CAAA;IAEF,MAAM,YAAY,GAAG,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,CAAA;IACxD,MAAM,SAAS,GAAG,IAAI,uDAAwB,CAAC,YAAY,CAAC,CAAA;IAC5D,SAAS,CAAC,UAAU,EAAE,CAAA;IAEtB,IAAA,4BAAmB,GAAE,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,EAAE,iCAAiC,CAAC,CAAA;IAE9F,OAAO;QACL,cAAc;QACd,WAAW;QACX,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QACxE,CAAC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"init-realtime.js","sourceRoot":"","sources":["../../src/realtime/init-realtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function buildNotebookDocumentId(accountId: string, notebookId: string): string;
2
+ export declare function parseNotebookDocumentId(documentIdentifier: string): {
3
+ accountId: string;
4
+ notebookId: string;
5
+ } | null;
6
+ //# sourceMappingURL=notebook-document-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebook-document-id.d.ts","sourceRoot":"","sources":["../../src/realtime/notebook-document-id.ts"],"names":[],"mappings":"AAEA,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAOrF;AAED,wBAAgB,uBAAuB,CACrC,kBAAkB,EAAE,MAAM,GACzB;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAkBlD"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildNotebookDocumentId = buildNotebookDocumentId;
4
+ exports.parseNotebookDocumentId = parseNotebookDocumentId;
5
+ const NOTEBOOK_DOCUMENT_ID_PREFIX = 'notebook:';
6
+ function buildNotebookDocumentId(accountId, notebookId) {
7
+ const normalizedAccountId = accountId.trim();
8
+ const normalizedNotebookId = notebookId.trim();
9
+ if (!normalizedAccountId || !normalizedNotebookId) {
10
+ throw new Error('Invalid notebook document id parts');
11
+ }
12
+ return `${NOTEBOOK_DOCUMENT_ID_PREFIX}${normalizedAccountId}:${normalizedNotebookId}`;
13
+ }
14
+ function parseNotebookDocumentId(documentIdentifier) {
15
+ if (!documentIdentifier.startsWith(NOTEBOOK_DOCUMENT_ID_PREFIX)) {
16
+ return null;
17
+ }
18
+ const rest = documentIdentifier.slice(NOTEBOOK_DOCUMENT_ID_PREFIX.length);
19
+ const separator = rest.indexOf(':');
20
+ if (separator <= 0) {
21
+ return null;
22
+ }
23
+ const accountId = rest.slice(0, separator).trim();
24
+ const notebookId = rest.slice(separator + 1).trim();
25
+ if (!accountId || !notebookId) {
26
+ return null;
27
+ }
28
+ return { accountId, notebookId };
29
+ }
30
+ //# sourceMappingURL=notebook-document-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebook-document-id.js","sourceRoot":"","sources":["../../src/realtime/notebook-document-id.ts"],"names":[],"mappings":";;AAEA,0DAOC;AAED,0DAoBC;AA/BD,MAAM,2BAA2B,GAAG,WAAW,CAAA;AAE/C,SAAgB,uBAAuB,CAAC,SAAiB,EAAE,UAAkB;IAC3E,MAAM,mBAAmB,GAAG,SAAS,CAAC,IAAI,EAAE,CAAA;IAC5C,MAAM,oBAAoB,GAAG,UAAU,CAAC,IAAI,EAAE,CAAA;IAC9C,IAAI,CAAC,mBAAmB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IACvD,CAAC;IACD,OAAO,GAAG,2BAA2B,GAAG,mBAAmB,IAAI,oBAAoB,EAAE,CAAA;AACvF,CAAC;AAED,SAAgB,uBAAuB,CACrC,kBAA0B;IAE1B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,2BAA2B,CAAC,EAAE,CAAC;QAChE,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAA;IACzE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACnC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAA;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACnD,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAA;AAClC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { AuthenticatedPresentUser } from '@multiplayer-app/realtime-types';
2
+ import type { Middleware } from '@multiplayer-app/realtime-server';
3
+ export type RealtimeDocumentAuthHandler = (request: unknown) => Promise<{
4
+ name: string;
5
+ id: string;
6
+ color: string;
7
+ }>;
8
+ export declare function toRealtimeAuthMiddleware(handler: RealtimeDocumentAuthHandler): Middleware;
9
+ export declare function getSocketPresentUser(socket: {
10
+ request: unknown;
11
+ }): AuthenticatedPresentUser | null;
12
+ //# sourceMappingURL=realtime-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime-auth.d.ts","sourceRoot":"","sources":["../../src/realtime/realtime-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAA;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAElE,MAAM,MAAM,2BAA2B,GAAG,CACxC,OAAO,EAAE,OAAO,KACb,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAQzD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,2BAA2B,GAAG,UAAU,CAazF;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,wBAAwB,GAAG,IAAI,CAGlG"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toRealtimeAuthMiddleware = toRealtimeAuthMiddleware;
4
+ exports.getSocketPresentUser = getSocketPresentUser;
5
+ function toRealtimeAuthMiddleware(handler) {
6
+ return async (request, _response, next) => {
7
+ try {
8
+ const presentUser = await handler(request);
9
+ const req = request;
10
+ req.presentUser = presentUser;
11
+ req.userId = presentUser.id;
12
+ next();
13
+ }
14
+ catch (error) {
15
+ const err = error instanceof Error ? error : new Error(String(error));
16
+ next(err);
17
+ }
18
+ };
19
+ }
20
+ function getSocketPresentUser(socket) {
21
+ var _a;
22
+ const req = socket.request;
23
+ return (_a = req.presentUser) !== null && _a !== void 0 ? _a : null;
24
+ }
25
+ //# sourceMappingURL=realtime-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime-auth.js","sourceRoot":"","sources":["../../src/realtime/realtime-auth.ts"],"names":[],"mappings":";;AAaA,4DAaC;AAED,oDAGC;AAlBD,SAAgB,wBAAwB,CAAC,OAAoC;IAC3E,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE;QACxC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;YAC1C,MAAM,GAAG,GAAG,OAAsB,CAAA;YAClC,GAAG,CAAC,WAAW,GAAG,WAAW,CAAA;YAC7B,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC,EAAE,CAAA;YAC3B,IAAI,EAAE,CAAA;QACR,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;YACrE,IAAI,CAAC,GAAG,CAAC,CAAA;QACX,CAAC;IACH,CAAC,CAAA;AACH,CAAC;AAED,SAAgB,oBAAoB,CAAC,MAA4B;;IAC/D,MAAM,GAAG,GAAG,MAAM,CAAC,OAAsB,CAAA;IACzC,OAAO,MAAA,GAAG,CAAC,WAAW,mCAAI,IAAI,CAAA;AAChC,CAAC"}
@@ -1,18 +1,11 @@
1
- import { GenericYSocketIO, type GenericYjsSocketData } from '@multiplayer-app/realtime-server';
2
- interface PersistedUpdateRow {
3
- _id: {
4
- toString(): string;
5
- };
6
- update?: Buffer | Uint8Array;
7
- }
1
+ import { PersistedYSocketIO, type GenericYSocketConnection } from '@multiplayer-app/realtime-server';
8
2
  /**
9
3
  * Yjs relay for session artifact files. Loads initial state from disk and persists edits back.
10
4
  */
11
- export declare class SessionArtifactYSocketIO extends GenericYSocketIO {
5
+ export declare class SessionArtifactYSocketIO extends PersistedYSocketIO {
12
6
  private readonly store;
7
+ constructor(namespace: GenericYSocketConnection);
13
8
  initialize(): void;
14
- protected getNonCommittedUpdates(_socketData: GenericYjsSocketData, documentIdentifier: string): Promise<PersistedUpdateRow[] | undefined>;
15
- protected storeUpdate(_data: GenericYjsSocketData, update: Uint8Array, documentIdentifier: string): Promise<void>;
9
+ private relayDocCache;
16
10
  }
17
- export {};
18
11
  //# sourceMappingURL=session-artifact-y-socket-io.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-artifact-y-socket-io.d.ts","sourceRoot":"","sources":["../../src/realtime/session-artifact-y-socket-io.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAEhB,KAAK,oBAAoB,EAC1B,MAAM,kCAAkC,CAAA;AAKzC,UAAU,kBAAkB;IAC1B,GAAG,EAAE;QAAE,QAAQ,IAAI,MAAM,CAAA;KAAE,CAAA;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAA;CAC7B;AAED;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,gBAAgB;IAC5D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;IAErD,UAAU,IAAI,IAAI;cAiBO,sBAAsB,CAC7C,WAAW,EAAE,oBAAoB,EACjC,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,kBAAkB,EAAE,GAAG,SAAS,CAAC;cAoBnB,WAAW,CAClC,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE,UAAU,EAClB,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,IAAI,CAAC;CAejB"}
1
+ {"version":3,"file":"session-artifact-y-socket-io.d.ts","sourceRoot":"","sources":["../../src/realtime/session-artifact-y-socket-io.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAElB,KAAK,wBAAwB,EAE9B,MAAM,kCAAkC,CAAA;AAOzC;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,kBAAkB;IAC9D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;gBAEzC,SAAS,EAAE,wBAAwB;IA6BtC,UAAU,IAAI,IAAI;IAoB3B,OAAO,CAAC,aAAa;CAGtB"}
@@ -41,9 +41,32 @@ const session_artifact_yjs_store_1 = require("./session-artifact-yjs-store");
41
41
  /**
42
42
  * Yjs relay for session artifact files. Loads initial state from disk and persists edits back.
43
43
  */
44
- class SessionArtifactYSocketIO extends realtime_server_1.GenericYSocketIO {
45
- constructor() {
46
- super(...arguments);
44
+ class SessionArtifactYSocketIO extends realtime_server_1.PersistedYSocketIO {
45
+ constructor(namespace) {
46
+ const store = (0, session_artifact_yjs_store_1.getSessionArtifactYjsStore)();
47
+ const storageAdapter = {
48
+ async getDocumentStateRecord(documentIdentifier) {
49
+ var _a;
50
+ const persisted = await store.getPersistedStateRecord(documentIdentifier);
51
+ if ((_a = persisted === null || persisted === void 0 ? void 0 : persisted.state) === null || _a === void 0 ? void 0 : _a.byteLength) {
52
+ return persisted;
53
+ }
54
+ // Artifact may exist as UTF-8 on disk without a `.yjs` state file yet.
55
+ const doc = await store.getOrLoadDoc(documentIdentifier);
56
+ if (!doc) {
57
+ return undefined;
58
+ }
59
+ const state = Y.encodeStateAsUpdate(doc);
60
+ if (!state.byteLength) {
61
+ return undefined;
62
+ }
63
+ return { id: { toString: () => documentIdentifier }, state };
64
+ },
65
+ async saveDocumentState(documentIdentifier, state) {
66
+ await store.persistBinaryState(documentIdentifier, state);
67
+ },
68
+ };
69
+ super(namespace, storageAdapter);
47
70
  this.store = (0, session_artifact_yjs_store_1.getSessionArtifactYjsStore)();
48
71
  }
49
72
  initialize() {
@@ -51,6 +74,8 @@ class SessionArtifactYSocketIO extends realtime_server_1.GenericYSocketIO {
51
74
  if (!update.byteLength || !(0, realtime_server_1.isValidYjsUpdate)(update)) {
52
75
  return;
53
76
  }
77
+ // Agent/tooling writes go through SessionArtifactYjsStore; drop stale relay cache.
78
+ this.relayDocCache().delete(documentIdentifier);
54
79
  this.io
55
80
  .to(this.getDocumentRoom(documentIdentifier))
56
81
  .emit(realtime_types_1.YjsEvents.SYNC_UPDATE, {
@@ -60,35 +85,8 @@ class SessionArtifactYSocketIO extends realtime_server_1.GenericYSocketIO {
60
85
  });
61
86
  super.initialize();
62
87
  }
63
- async getNonCommittedUpdates(_socketData, documentIdentifier) {
64
- const doc = await this.store.getOrLoadDoc(documentIdentifier);
65
- if (!doc) {
66
- return undefined;
67
- }
68
- const state = Y.encodeStateAsUpdate(doc);
69
- if (!state.byteLength) {
70
- return undefined;
71
- }
72
- return [
73
- {
74
- _id: { toString: () => documentIdentifier },
75
- update: Buffer.from(state),
76
- },
77
- ];
78
- }
79
- async storeUpdate(_data, update, documentIdentifier) {
80
- const doc = await this.store.getOrLoadDoc(documentIdentifier);
81
- if (!doc) {
82
- return;
83
- }
84
- try {
85
- Y.applyUpdate(doc, update);
86
- }
87
- catch (error) {
88
- console.warn(`Ignoring invalid Yjs update for ${documentIdentifier}:`, error);
89
- return;
90
- }
91
- this.store.schedulePersist(documentIdentifier, doc);
88
+ relayDocCache() {
89
+ return this.docCache;
92
90
  }
93
91
  }
94
92
  exports.SessionArtifactYSocketIO = SessionArtifactYSocketIO;
@@ -1 +1 @@
1
- {"version":3,"file":"session-artifact-y-socket-io.js","sourceRoot":"","sources":["../../src/realtime/session-artifact-y-socket-io.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sEAIyC;AACzC,oEAAoF;AACpF,uCAAwB;AACxB,6EAAyE;AAOzE;;GAEG;AACH,MAAa,wBAAyB,SAAQ,kCAAgB;IAA9D;;QACmB,UAAK,GAAG,IAAA,uDAA0B,GAAE,CAAA;IA6DvD,CAAC;IA3DC,UAAU;QACR,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,kBAAkB,EAAE,MAAM,EAAE,EAAE;YAC1D,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,IAAA,kCAAgB,EAAC,MAAM,CAAC,EAAE,CAAC;gBACpD,OAAM;YACR,CAAC;YAED,IAAI,CAAC,EAAE;iBACJ,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;iBAC5C,IAAI,CAAC,0BAAS,CAAC,WAAW,EAAE;gBAC3B,kBAAkB;gBAClB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;aAC5B,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,UAAU,EAAE,CAAA;IACpB,CAAC;IAEkB,KAAK,CAAC,sBAAsB,CAC7C,WAAiC,EACjC,kBAA0B;QAG1B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAA;QAC7D,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAA;QACxC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YACtB,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,OAAO;YACL;gBACE,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,kBAAkB,EAAE;gBAC3C,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;aAC3B;SACF,CAAA;IACH,CAAC;IAEkB,KAAK,CAAC,WAAW,CAClC,KAA2B,EAC3B,MAAkB,EAClB,kBAA0B;QAE1B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAA;QAC7D,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAM;QACR,CAAC;QAED,IAAI,CAAC;YACH,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,mCAAmC,kBAAkB,GAAG,EAAE,KAAK,CAAC,CAAA;YAC7E,OAAM;QACR,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAA;IACrD,CAAC;CACF;AA9DD,4DA8DC"}
1
+ {"version":3,"file":"session-artifact-y-socket-io.js","sourceRoot":"","sources":["../../src/realtime/session-artifact-y-socket-io.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sEAKyC;AACzC,oEAA2D;AAC3D,uCAAwB;AACxB,6EAAyE;AAIzE;;GAEG;AACH,MAAa,wBAAyB,SAAQ,oCAAkB;IAG9D,YAAY,SAAmC;QAC7C,MAAM,KAAK,GAAG,IAAA,uDAA0B,GAAE,CAAA;QAC1C,MAAM,cAAc,GAA+B;YACjD,KAAK,CAAC,sBAAsB,CAAC,kBAA0B;;gBACrD,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,CAAA;gBACzE,IAAI,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,0CAAE,UAAU,EAAE,CAAC;oBACjC,OAAO,SAAS,CAAA;gBAClB,CAAC;gBAED,uEAAuE;gBACvE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAA;gBACxD,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,OAAO,SAAS,CAAA;gBAClB,CAAC;gBAED,MAAM,KAAK,GAAG,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAA;gBACxC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;oBACtB,OAAO,SAAS,CAAA;gBAClB,CAAC;gBAED,OAAO,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,CAAA;YAC9D,CAAC;YACD,KAAK,CAAC,iBAAiB,CAAC,kBAA0B,EAAE,KAAiB;gBACnE,MAAM,KAAK,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAA;YAC3D,CAAC;SACF,CAAA;QACD,KAAK,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;QA5BjB,UAAK,GAAG,IAAA,uDAA0B,GAAE,CAAA;IA6BrD,CAAC;IAEQ,UAAU;QACjB,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,kBAAkB,EAAE,MAAM,EAAE,EAAE;YAC1D,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,IAAA,kCAAgB,EAAC,MAAM,CAAC,EAAE,CAAC;gBACpD,OAAM;YACR,CAAC;YAED,mFAAmF;YACnF,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAA;YAE/C,IAAI,CAAC,EAAE;iBACJ,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;iBAC5C,IAAI,CAAC,0BAAS,CAAC,WAAW,EAAE;gBAC3B,kBAAkB;gBAClB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;aAC5B,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,UAAU,EAAE,CAAA;IACpB,CAAC;IAEO,aAAa;QACnB,OAAQ,IAA+C,CAAC,QAAQ,CAAA;IAClE,CAAC;CACF;AAvDD,4DAuDC"}
@@ -29,10 +29,19 @@ export declare class SessionArtifactYjsStore {
29
29
  evictDocument(sessionId: string, artifactPath: string): void;
30
30
  resetFromFileContent(sessionId: string, artifactPath: string): Promise<void>;
31
31
  schedulePersist(documentIdentifier: string, doc: Y.Doc): void;
32
+ getPersistedStateRecord(documentIdentifier: string): Promise<{
33
+ id: {
34
+ toString(): string;
35
+ };
36
+ state?: Uint8Array;
37
+ } | undefined>;
38
+ persistBinaryState(documentIdentifier: string, state: Uint8Array): Promise<void>;
32
39
  private persistToDisk;
33
40
  private scheduleNamedSnapshot;
34
41
  private clearPersistTimer;
35
42
  private clearTimers;
43
+ private parseDocumentTarget;
44
+ private getNotebookRepository;
36
45
  }
37
46
  export declare function getSessionArtifactYjsStore(): SessionArtifactYjsStore;
38
47
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"session-artifact-yjs-store.d.ts","sourceRoot":"","sources":["../../src/realtime/session-artifact-yjs-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AAoBxB,KAAK,eAAe,GAAG,CAAC,kBAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,IAAI,CAAA;AAM/E,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmD;IACjF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmD;IAClF,OAAO,CAAC,eAAe,CAA+B;IAEtD,iBAAiB,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI;IAItC,YAAY,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC;IAiBrE,8FAA8F;YAChF,yBAAyB;IAmBjC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW7E;;;OAGG;IACG,qBAAqB,CACzB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,MAAM,CAAA;KAAE,CAAC;IAqCvE;;;OAGG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;KAAE,CAAC;IAyB7B,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAYtD,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlF,eAAe,CAAC,kBAAkB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,IAAI;YAe/C,aAAa;IAe3B,OAAO,CAAC,qBAAqB;IA0B7B,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,WAAW;CASpB;AAID,wBAAgB,0BAA0B,IAAI,uBAAuB,CAKpE"}
1
+ {"version":3,"file":"session-artifact-yjs-store.d.ts","sourceRoot":"","sources":["../../src/realtime/session-artifact-yjs-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AAsBxB,KAAK,eAAe,GAAG,CAAC,kBAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,IAAI,CAAA;AAS/E,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmD;IACjF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmD;IAClF,OAAO,CAAC,eAAe,CAA+B;IAEtD,iBAAiB,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI;IAItC,YAAY,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC;IAwBrE,8FAA8F;YAChF,yBAAyB;IAiCjC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW7E;;;OAGG;IACG,qBAAqB,CACzB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,MAAM,CAAA;KAAE,CAAC;IAqCvE;;;OAGG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;KAAE,CAAC;IAyB7B,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAYtD,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlF,eAAe,CAAC,kBAAkB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,IAAI;IAevD,uBAAuB,CAC3B,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC;QAAE,EAAE,EAAE;YAAE,QAAQ,IAAI,MAAM,CAAA;SAAE,CAAC;QAAC,KAAK,CAAC,EAAE,UAAU,CAAA;KAAE,GAAG,SAAS,CAAC;IAqBpE,kBAAkB,CAAC,kBAAkB,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;YAwBxE,aAAa;IAuB3B,OAAO,CAAC,qBAAqB;IA0B7B,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,qBAAqB;CAO9B;AAID,wBAAgB,0BAA0B,IAAI,uBAAuB,CAKpE"}