@multiplayer-app/sandbox 0.0.33-beta.1 → 0.0.33-beta.3

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 (151) 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/filingramp-fetch.agent.d.ts +4 -0
  6. package/dist/agents/filingramp-fetch.agent.d.ts.map +1 -0
  7. package/dist/agents/filingramp-fetch.agent.js +195 -0
  8. package/dist/agents/filingramp-fetch.agent.js.map +1 -0
  9. package/dist/agents/knowledge/filingramp-endpoints.d.ts +23 -0
  10. package/dist/agents/knowledge/filingramp-endpoints.d.ts.map +1 -0
  11. package/dist/agents/knowledge/filingramp-endpoints.js +116 -0
  12. package/dist/agents/knowledge/filingramp-endpoints.js.map +1 -0
  13. package/dist/agents/shared/blocknote-system-prompt.d.ts +2 -0
  14. package/dist/agents/shared/blocknote-system-prompt.d.ts.map +1 -0
  15. package/dist/agents/shared/blocknote-system-prompt.js +40 -0
  16. package/dist/agents/shared/blocknote-system-prompt.js.map +1 -0
  17. package/dist/agents/shared/get-latest-session-artifact.tool.d.ts +7 -0
  18. package/dist/agents/shared/get-latest-session-artifact.tool.d.ts.map +1 -0
  19. package/dist/agents/shared/get-latest-session-artifact.tool.js +43 -0
  20. package/dist/agents/shared/get-latest-session-artifact.tool.js.map +1 -0
  21. package/dist/agents/shared/get-session-artifact-content.tool.d.ts +7 -0
  22. package/dist/agents/shared/get-session-artifact-content.tool.d.ts.map +1 -0
  23. package/dist/agents/shared/get-session-artifact-content.tool.js +44 -0
  24. package/dist/agents/shared/get-session-artifact-content.tool.js.map +1 -0
  25. package/dist/agents/shared/list-session-artifact-paths.tool.d.ts +5 -0
  26. package/dist/agents/shared/list-session-artifact-paths.tool.d.ts.map +1 -0
  27. package/dist/agents/shared/list-session-artifact-paths.tool.js +37 -0
  28. package/dist/agents/shared/list-session-artifact-paths.tool.js.map +1 -0
  29. package/dist/agents/shared/notebook-tools.js +1 -1
  30. package/dist/agents/shared/notebook-tools.js.map +1 -1
  31. package/dist/lib/ai/agent-ai-service.d.ts +3 -0
  32. package/dist/lib/ai/agent-ai-service.d.ts.map +1 -0
  33. package/dist/lib/ai/agent-ai-service.js +15 -0
  34. package/dist/lib/ai/agent-ai-service.js.map +1 -0
  35. package/dist/lib/ai/ai-error-details.d.ts +13 -0
  36. package/dist/lib/ai/ai-error-details.d.ts.map +1 -0
  37. package/dist/lib/ai/ai-error-details.js +84 -0
  38. package/dist/lib/ai/ai-error-details.js.map +1 -0
  39. package/dist/lib/ai/generate-ai-text.d.ts +12 -0
  40. package/dist/lib/ai/generate-ai-text.d.ts.map +1 -0
  41. package/dist/lib/ai/generate-ai-text.js +105 -0
  42. package/dist/lib/ai/generate-ai-text.js.map +1 -0
  43. package/dist/lib/ai/run-explicit-agent.d.ts +15 -0
  44. package/dist/lib/ai/run-explicit-agent.d.ts.map +1 -0
  45. package/dist/lib/ai/run-explicit-agent.js +30 -0
  46. package/dist/lib/ai/run-explicit-agent.js.map +1 -0
  47. package/dist/lib/notebooks/notebook-sql-client.d.ts +5 -0
  48. package/dist/lib/notebooks/notebook-sql-client.d.ts.map +1 -0
  49. package/dist/lib/notebooks/notebook-sql-client.js +37 -0
  50. package/dist/lib/notebooks/notebook-sql-client.js.map +1 -0
  51. package/dist/lib/notebooks/notebook-sql-schema.d.ts +16 -0
  52. package/dist/lib/notebooks/notebook-sql-schema.d.ts.map +1 -0
  53. package/dist/lib/notebooks/notebook-sql-schema.js +117 -0
  54. package/dist/lib/notebooks/notebook-sql-schema.js.map +1 -0
  55. package/dist/lib/notebooks/notebook-sql.d.ts +9 -0
  56. package/dist/lib/notebooks/notebook-sql.d.ts.map +1 -0
  57. package/dist/lib/notebooks/notebook-sql.js +36 -0
  58. package/dist/lib/notebooks/notebook-sql.js.map +1 -0
  59. package/dist/lib/notebooks/notebook-storage-paths.d.ts +8 -0
  60. package/dist/lib/notebooks/notebook-storage-paths.d.ts.map +1 -0
  61. package/dist/lib/notebooks/notebook-storage-paths.js +22 -0
  62. package/dist/lib/notebooks/notebook-storage-paths.js.map +1 -0
  63. package/dist/lib/notebooks/notebook-yjs-content.d.ts +6 -0
  64. package/dist/lib/notebooks/notebook-yjs-content.d.ts.map +1 -0
  65. package/dist/lib/notebooks/notebook-yjs-content.js +42 -0
  66. package/dist/lib/notebooks/notebook-yjs-content.js.map +1 -0
  67. package/dist/lib/object-storage/keys.d.ts +1 -0
  68. package/dist/lib/object-storage/keys.d.ts.map +1 -1
  69. package/dist/lib/object-storage/keys.js +5 -0
  70. package/dist/lib/object-storage/keys.js.map +1 -1
  71. package/dist/lib/object-storage/named-snapshot-paths.d.ts +9 -0
  72. package/dist/lib/object-storage/named-snapshot-paths.d.ts.map +1 -0
  73. package/dist/lib/object-storage/named-snapshot-paths.js +39 -0
  74. package/dist/lib/object-storage/named-snapshot-paths.js.map +1 -0
  75. package/dist/lib/session-artifacts/apply-hashline-edits.d.ts +3 -0
  76. package/dist/lib/session-artifacts/apply-hashline-edits.d.ts.map +1 -0
  77. package/dist/lib/session-artifacts/apply-hashline-edits.js +25 -0
  78. package/dist/lib/session-artifacts/apply-hashline-edits.js.map +1 -0
  79. package/dist/lib/session-artifacts/artifact-text-edit.d.ts +8 -0
  80. package/dist/lib/session-artifacts/artifact-text-edit.d.ts.map +1 -0
  81. package/dist/lib/session-artifacts/artifact-text-edit.js +23 -0
  82. package/dist/lib/session-artifacts/artifact-text-edit.js.map +1 -0
  83. package/dist/lib/session-artifacts/hashline-tag.d.ts +33 -0
  84. package/dist/lib/session-artifacts/hashline-tag.d.ts.map +1 -0
  85. package/dist/lib/session-artifacts/hashline-tag.js +80 -0
  86. package/dist/lib/session-artifacts/hashline-tag.js.map +1 -0
  87. package/dist/lib/session-pages/artifact-storage-paths.d.ts +1 -0
  88. package/dist/lib/session-pages/artifact-storage-paths.d.ts.map +1 -1
  89. package/dist/lib/session-pages/artifact-storage-paths.js +9 -5
  90. package/dist/lib/session-pages/artifact-storage-paths.js.map +1 -1
  91. package/dist/lib/session-pages/inject-preview-error-reporter.d.ts +3 -0
  92. package/dist/lib/session-pages/inject-preview-error-reporter.d.ts.map +1 -0
  93. package/dist/lib/session-pages/inject-preview-error-reporter.js +30 -0
  94. package/dist/lib/session-pages/inject-preview-error-reporter.js.map +1 -0
  95. package/dist/lib/session-pages/read-session-artifact.d.ts +7 -0
  96. package/dist/lib/session-pages/read-session-artifact.d.ts.map +1 -0
  97. package/dist/lib/session-pages/read-session-artifact.js +60 -0
  98. package/dist/lib/session-pages/read-session-artifact.js.map +1 -0
  99. package/dist/lib/session-pages/session-pico-css.d.ts +5 -0
  100. package/dist/lib/session-pages/session-pico-css.d.ts.map +1 -0
  101. package/dist/lib/session-pages/session-pico-css.js +11 -0
  102. package/dist/lib/session-pages/session-pico-css.js.map +1 -0
  103. package/dist/lib/yjs-pending/flush-worker.d.ts +1 -1
  104. package/dist/lib/yjs-pending/flush-worker.d.ts.map +1 -1
  105. package/dist/lib/yjs-pending/flush-worker.js +3 -33
  106. package/dist/lib/yjs-pending/flush-worker.js.map +1 -1
  107. package/dist/lib/yjs-pending/snapshot-retention.d.ts +6 -0
  108. package/dist/lib/yjs-pending/snapshot-retention.d.ts.map +1 -0
  109. package/dist/lib/yjs-pending/snapshot-retention.js +33 -0
  110. package/dist/lib/yjs-pending/snapshot-retention.js.map +1 -0
  111. package/dist/lib/yjs-pending/yjs-persistence.d.ts +1 -0
  112. package/dist/lib/yjs-pending/yjs-persistence.d.ts.map +1 -1
  113. package/dist/lib/yjs-pending/yjs-persistence.js +36 -0
  114. package/dist/lib/yjs-pending/yjs-persistence.js.map +1 -1
  115. package/dist/realtime/realtime-auth.d.ts +12 -0
  116. package/dist/realtime/realtime-auth.d.ts.map +1 -0
  117. package/dist/realtime/realtime-auth.js +25 -0
  118. package/dist/realtime/realtime-auth.js.map +1 -0
  119. package/dist/realtime/session-artifact-yjs-store.d.ts +3 -0
  120. package/dist/realtime/session-artifact-yjs-store.d.ts.map +1 -1
  121. package/dist/realtime/session-artifact-yjs-store.js +22 -0
  122. package/dist/realtime/session-artifact-yjs-store.js.map +1 -1
  123. package/dist/realtime/yjs-account-namespace.d.ts +5 -0
  124. package/dist/realtime/yjs-account-namespace.d.ts.map +1 -0
  125. package/dist/realtime/yjs-account-namespace.js +21 -0
  126. package/dist/realtime/yjs-account-namespace.js.map +1 -0
  127. package/dist/routes/notebooks/sql-execute.d.ts +3 -0
  128. package/dist/routes/notebooks/sql-execute.d.ts.map +1 -0
  129. package/dist/routes/notebooks/sql-execute.js +45 -0
  130. package/dist/routes/notebooks/sql-execute.js.map +1 -0
  131. package/dist/routes/notebooks.d.ts.map +1 -1
  132. package/dist/routes/notebooks.js +2 -0
  133. package/dist/routes/notebooks.js.map +1 -1
  134. package/dist/routes/schemas.d.ts +2 -2
  135. package/dist/routes/sql.d.ts +2 -0
  136. package/dist/routes/sql.d.ts.map +1 -0
  137. package/dist/routes/sql.js +50 -0
  138. package/dist/routes/sql.js.map +1 -0
  139. package/package.json +7 -7
  140. package/dist/agents/shared/design-skills.d.ts +0 -48
  141. package/dist/agents/shared/design-skills.d.ts.map +0 -1
  142. package/dist/agents/shared/design-skills.js +0 -230
  143. package/dist/agents/shared/design-skills.js.map +0 -1
  144. package/dist/agents/shared/generate-session-images.tool.d.ts +0 -15
  145. package/dist/agents/shared/generate-session-images.tool.d.ts.map +0 -1
  146. package/dist/agents/shared/generate-session-images.tool.js +0 -98
  147. package/dist/agents/shared/generate-session-images.tool.js.map +0 -1
  148. package/dist/lib/session-pages/write-binary-session-artifact.d.ts +0 -12
  149. package/dist/lib/session-pages/write-binary-session-artifact.d.ts.map +0 -1
  150. package/dist/lib/session-pages/write-binary-session-artifact.js +0 -23
  151. package/dist/lib/session-pages/write-binary-session-artifact.js.map +0 -1
@@ -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,8 @@
1
+ export declare const NOTEBOOK_CONTENT_FILENAME = "content.json";
2
+ export declare const NOTEBOOK_YJS_STATE_FILENAME = "yjs.state";
3
+ /** Relative path for a point-in-time content snapshot beside content.json. */
4
+ export declare function notebookContentSnapshotPath(at: Date): string;
5
+ export declare function isNotebookSnapshotPath(relativePath: string): boolean;
6
+ /** Sidecar files managed by the notebook storage layer (not user-facing content). */
7
+ export declare function isNotebookStorageSidecar(relativePath: string): boolean;
8
+ //# sourceMappingURL=notebook-storage-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebook-storage-paths.d.ts","sourceRoot":"","sources":["../../../src/lib/notebooks/notebook-storage-paths.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,yBAAyB,iBAAiB,CAAA;AACvD,eAAO,MAAM,2BAA2B,cAAc,CAAA;AAEtD,8EAA8E;AAC9E,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,IAAI,GAAG,MAAM,CAE5D;AAED,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAKpE;AAED,qFAAqF;AACrF,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAItE"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NOTEBOOK_YJS_STATE_FILENAME = exports.NOTEBOOK_CONTENT_FILENAME = void 0;
4
+ exports.notebookContentSnapshotPath = notebookContentSnapshotPath;
5
+ exports.isNotebookSnapshotPath = isNotebookSnapshotPath;
6
+ exports.isNotebookStorageSidecar = isNotebookStorageSidecar;
7
+ const named_snapshot_paths_1 = require("../object-storage/named-snapshot-paths");
8
+ exports.NOTEBOOK_CONTENT_FILENAME = 'content.json';
9
+ exports.NOTEBOOK_YJS_STATE_FILENAME = 'yjs.state';
10
+ /** Relative path for a point-in-time content snapshot beside content.json. */
11
+ function notebookContentSnapshotPath(at) {
12
+ return `${exports.NOTEBOOK_CONTENT_FILENAME}${(0, named_snapshot_paths_1.namedSnapshotSuffix)(at)}`;
13
+ }
14
+ function isNotebookSnapshotPath(relativePath) {
15
+ return (relativePath.startsWith(`${exports.NOTEBOOK_CONTENT_FILENAME}${named_snapshot_paths_1.NAMED_SNAPSHOT_SEGMENT}`) &&
16
+ (0, named_snapshot_paths_1.hasNamedSnapshotTimestamp)(relativePath));
17
+ }
18
+ /** Sidecar files managed by the notebook storage layer (not user-facing content). */
19
+ function isNotebookStorageSidecar(relativePath) {
20
+ return (relativePath === exports.NOTEBOOK_YJS_STATE_FILENAME || isNotebookSnapshotPath(relativePath));
21
+ }
22
+ //# sourceMappingURL=notebook-storage-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebook-storage-paths.js","sourceRoot":"","sources":["../../../src/lib/notebooks/notebook-storage-paths.ts"],"names":[],"mappings":";;;AAUA,kEAEC;AAED,wDAKC;AAGD,4DAIC;AA1BD,iFAI+C;AAElC,QAAA,yBAAyB,GAAG,cAAc,CAAA;AAC1C,QAAA,2BAA2B,GAAG,WAAW,CAAA;AAEtD,8EAA8E;AAC9E,SAAgB,2BAA2B,CAAC,EAAQ;IAClD,OAAO,GAAG,iCAAyB,GAAG,IAAA,0CAAmB,EAAC,EAAE,CAAC,EAAE,CAAA;AACjE,CAAC;AAED,SAAgB,sBAAsB,CAAC,YAAoB;IACzD,OAAO,CACL,YAAY,CAAC,UAAU,CAAC,GAAG,iCAAyB,GAAG,6CAAsB,EAAE,CAAC;QAChF,IAAA,gDAAyB,EAAC,YAAY,CAAC,CACxC,CAAA;AACH,CAAC;AAED,qFAAqF;AACrF,SAAgB,wBAAwB,CAAC,YAAoB;IAC3D,OAAO,CACL,YAAY,KAAK,mCAA2B,IAAI,sBAAsB,CAAC,YAAY,CAAC,CACrF,CAAA;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import * as Y from 'yjs';
2
+ import { type NotebookContent } from './notebook-content';
3
+ export declare function hydrateNotebookDocFromContent(doc: Y.Doc, content: NotebookContent): void;
4
+ export declare function serializeNotebookContentFromDoc(doc: Y.Doc, options: Pick<NotebookContent, 'title' | 'metadata'>): string;
5
+ export declare function resolveNotebookContentEnvelope(accountId: string, notebookId: string, readContent: (accountId: string, notebookId: string) => Promise<string | null>, fallbackTitle: string): Promise<Pick<NotebookContent, 'title' | 'metadata'>>;
6
+ //# sourceMappingURL=notebook-yjs-content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebook-yjs-content.d.ts","sourceRoot":"","sources":["../../../src/lib/notebooks/notebook-yjs-content.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AACxB,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAA;AAK3B,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CAOxF;AAED,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,CAAC,CAAC,GAAG,EACV,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,UAAU,CAAC,GACnD,MAAM,CAQR;AAED,wBAAsB,8BAA8B,CAClD,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,EAC9E,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,UAAU,CAAC,CAAC,CActD"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hydrateNotebookDocFromContent = hydrateNotebookDocFromContent;
4
+ exports.serializeNotebookContentFromDoc = serializeNotebookContentFromDoc;
5
+ exports.resolveNotebookContentEnvelope = resolveNotebookContentEnvelope;
6
+ const notebook_content_1 = require("./notebook-content");
7
+ const notebook_yjs_blocks_1 = require("./notebook-yjs-blocks");
8
+ const NOTEBOOK_XML_FIELD = 'xml';
9
+ function hydrateNotebookDocFromContent(doc, content) {
10
+ const fragment = doc.getXmlFragment(NOTEBOOK_XML_FIELD);
11
+ const blocks = content.blocks;
12
+ if (blocks.length === 0) {
13
+ return;
14
+ }
15
+ fragment.insert(0, blocks.map(notebook_yjs_blocks_1.tipTapNodeToYXml));
16
+ }
17
+ function serializeNotebookContentFromDoc(doc, options) {
18
+ const blocks = (0, notebook_yjs_blocks_1.readFragmentBlocks)(doc.getXmlFragment(NOTEBOOK_XML_FIELD));
19
+ return (0, notebook_content_1.serializeNotebookContent)({
20
+ version: 1,
21
+ title: options.title,
22
+ blocks,
23
+ ...(options.metadata ? { metadata: options.metadata } : {}),
24
+ });
25
+ }
26
+ async function resolveNotebookContentEnvelope(accountId, notebookId, readContent, fallbackTitle) {
27
+ const raw = await readContent(accountId, notebookId);
28
+ if (!raw) {
29
+ return { title: fallbackTitle };
30
+ }
31
+ try {
32
+ const parsed = (0, notebook_content_1.parseNotebookContent)(raw);
33
+ return {
34
+ title: parsed.title,
35
+ ...(parsed.metadata ? { metadata: parsed.metadata } : {}),
36
+ };
37
+ }
38
+ catch (_a) {
39
+ return { title: fallbackTitle };
40
+ }
41
+ }
42
+ //# sourceMappingURL=notebook-yjs-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebook-yjs-content.js","sourceRoot":"","sources":["../../../src/lib/notebooks/notebook-yjs-content.ts"],"names":[],"mappings":";;AAUA,sEAOC;AAED,0EAWC;AAED,wEAmBC;AAlDD,yDAI2B;AAC3B,+DAA6F;AAE7F,MAAM,kBAAkB,GAAG,KAAK,CAAA;AAEhC,SAAgB,6BAA6B,CAAC,GAAU,EAAE,OAAwB;IAChF,MAAM,QAAQ,GAAG,GAAG,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAA;IACvD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAsB,CAAA;IAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAM;IACR,CAAC;IACD,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,sCAAgB,CAAC,CAAC,CAAA;AAClD,CAAC;AAED,SAAgB,+BAA+B,CAC7C,GAAU,EACV,OAAoD;IAEpD,MAAM,MAAM,GAAG,IAAA,wCAAkB,EAAC,GAAG,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,CAAA;IACzE,OAAO,IAAA,2CAAwB,EAAC;QAC9B,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM;QACN,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5D,CAAC,CAAA;AACJ,CAAC;AAEM,KAAK,UAAU,8BAA8B,CAClD,SAAiB,EACjB,UAAkB,EAClB,WAA8E,EAC9E,aAAqB;IAErB,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;IACpD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAA;IACjC,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,uCAAoB,EAAC,GAAG,CAAC,CAAA;QACxC,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1D,CAAA;IACH,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAA;IACjC,CAAC;AACH,CAAC"}
@@ -5,6 +5,7 @@ export declare function sessionArtifactNamedSnapshotKey(accountId: string, sessi
5
5
  export declare function notebookPrefix(accountId: string, notebookId: string): string;
6
6
  export declare function notebookContentKey(accountId: string, notebookId: string): string;
7
7
  export declare function notebookYjsStateKey(accountId: string, notebookId: string): string;
8
+ export declare function notebookNamedSnapshotKey(accountId: string, notebookId: string, at?: Date): string;
8
9
  export declare function isSessionArtifactUserFacingKey(prefix: string, key: string): boolean;
9
10
  export declare function relativeSessionArtifactPath(prefix: string, key: string): string;
10
11
  //# sourceMappingURL=keys.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../src/lib/object-storage/keys.ts"],"names":[],"mappings":"AAcA,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,MAAM,CAER;AAED,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,MAAM,CAER;AAED,wBAAgB,+BAA+B,CAC7C,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,EAAE,GAAE,IAAiB,GACpB,MAAM,CAER;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAMnF;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/E"}
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../src/lib/object-storage/keys.ts"],"names":[],"mappings":"AAeA,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,MAAM,CAER;AAED,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,MAAM,CAER;AAED,wBAAgB,+BAA+B,CAC7C,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,EAAE,GAAE,IAAiB,GACpB,MAAM,CAER;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,EAAE,GAAE,IAAiB,GACpB,MAAM,CAER;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAMnF;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/E"}
@@ -7,10 +7,12 @@ exports.sessionArtifactNamedSnapshotKey = sessionArtifactNamedSnapshotKey;
7
7
  exports.notebookPrefix = notebookPrefix;
8
8
  exports.notebookContentKey = notebookContentKey;
9
9
  exports.notebookYjsStateKey = notebookYjsStateKey;
10
+ exports.notebookNamedSnapshotKey = notebookNamedSnapshotKey;
10
11
  exports.isSessionArtifactUserFacingKey = isSessionArtifactUserFacingKey;
11
12
  exports.relativeSessionArtifactPath = relativeSessionArtifactPath;
12
13
  const paths_1 = require("../session-pages/paths");
13
14
  const artifact_storage_paths_1 = require("../session-pages/artifact-storage-paths");
15
+ const notebook_storage_paths_1 = require("../notebooks/notebook-storage-paths");
14
16
  function assertSafeSegment(value, label) {
15
17
  if (!value || value.includes('..') || value.includes('/') || value.includes('\\')) {
16
18
  throw new Error(`Invalid ${label}`);
@@ -38,6 +40,9 @@ function notebookContentKey(accountId, notebookId) {
38
40
  function notebookYjsStateKey(accountId, notebookId) {
39
41
  return `${notebookPrefix(accountId, notebookId)}yjs.state`;
40
42
  }
43
+ function notebookNamedSnapshotKey(accountId, notebookId, at = new Date()) {
44
+ return `${notebookPrefix(accountId, notebookId)}${(0, notebook_storage_paths_1.notebookContentSnapshotPath)(at)}`;
45
+ }
41
46
  function isSessionArtifactUserFacingKey(prefix, key) {
42
47
  if (!key.startsWith(prefix)) {
43
48
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/lib/object-storage/keys.ts"],"names":[],"mappings":";;AAcA,wDAEC;AAED,8DAMC;AAED,sEAMC;AAED,0EAOC;AAED,wCAEC;AAED,gDAEC;AAED,kDAEC;AAED,wEAMC;AAED,kEAEC;AAjED,kDAA8D;AAC9D,oFAIgD;AAEhD,SAAS,iBAAiB,CAAC,KAAa,EAAE,KAAa;IACrD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,EAAE,CAAC,CAAA;IACrC,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAgB,sBAAsB,CAAC,SAAiB,EAAE,SAAiB;IACzE,OAAO,GAAG,iBAAiB,CAAC,SAAS,EAAE,WAAW,CAAC,aAAa,iBAAiB,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,CAAA;AAC9G,CAAC;AAED,SAAgB,yBAAyB,CACvC,SAAiB,EACjB,SAAiB,EACjB,YAAoB;IAEpB,OAAO,GAAG,sBAAsB,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,IAAA,6BAAqB,EAAC,YAAY,CAAC,EAAE,CAAA;AAChG,CAAC;AAED,SAAgB,6BAA6B,CAC3C,SAAiB,EACjB,SAAiB,EACjB,YAAoB;IAEpB,OAAO,yBAAyB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAA,gDAAuB,EAAC,YAAY,CAAC,CAAC,CAAA;AAC/F,CAAC;AAED,SAAgB,+BAA+B,CAC7C,SAAiB,EACjB,SAAiB,EACjB,YAAoB,EACpB,KAAW,IAAI,IAAI,EAAE;IAErB,OAAO,yBAAyB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAA,6CAAoB,EAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAA;AAChG,CAAC;AAED,SAAgB,cAAc,CAAC,SAAiB,EAAE,UAAkB;IAClE,OAAO,GAAG,iBAAiB,CAAC,SAAS,EAAE,WAAW,CAAC,cAAc,iBAAiB,CAAC,UAAU,EAAE,YAAY,CAAC,GAAG,CAAA;AACjH,CAAC;AAED,SAAgB,kBAAkB,CAAC,SAAiB,EAAE,UAAkB;IACtE,OAAO,GAAG,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,cAAc,CAAA;AAC/D,CAAC;AAED,SAAgB,mBAAmB,CAAC,SAAiB,EAAE,UAAkB;IACvE,OAAO,GAAG,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,WAAW,CAAA;AAC5D,CAAC;AAED,SAAgB,8BAA8B,CAAC,MAAc,EAAE,GAAW;IACxE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACzC,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAA,iDAAwB,EAAC,QAAQ,CAAC,CAAA;AACnE,CAAC;AAED,SAAgB,2BAA2B,CAAC,MAAc,EAAE,GAAW;IACrE,OAAO,IAAA,6BAAqB,EAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;AACxD,CAAC"}
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/lib/object-storage/keys.ts"],"names":[],"mappings":";;AAeA,wDAEC;AAED,8DAMC;AAED,sEAMC;AAED,0EAOC;AAED,wCAEC;AAED,gDAEC;AAED,kDAEC;AAED,4DAMC;AAED,wEAMC;AAED,kEAEC;AA1ED,kDAA8D;AAC9D,oFAIgD;AAChD,gFAAiF;AAEjF,SAAS,iBAAiB,CAAC,KAAa,EAAE,KAAa;IACrD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,EAAE,CAAC,CAAA;IACrC,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAgB,sBAAsB,CAAC,SAAiB,EAAE,SAAiB;IACzE,OAAO,GAAG,iBAAiB,CAAC,SAAS,EAAE,WAAW,CAAC,aAAa,iBAAiB,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,CAAA;AAC9G,CAAC;AAED,SAAgB,yBAAyB,CACvC,SAAiB,EACjB,SAAiB,EACjB,YAAoB;IAEpB,OAAO,GAAG,sBAAsB,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,IAAA,6BAAqB,EAAC,YAAY,CAAC,EAAE,CAAA;AAChG,CAAC;AAED,SAAgB,6BAA6B,CAC3C,SAAiB,EACjB,SAAiB,EACjB,YAAoB;IAEpB,OAAO,yBAAyB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAA,gDAAuB,EAAC,YAAY,CAAC,CAAC,CAAA;AAC/F,CAAC;AAED,SAAgB,+BAA+B,CAC7C,SAAiB,EACjB,SAAiB,EACjB,YAAoB,EACpB,KAAW,IAAI,IAAI,EAAE;IAErB,OAAO,yBAAyB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAA,6CAAoB,EAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAA;AAChG,CAAC;AAED,SAAgB,cAAc,CAAC,SAAiB,EAAE,UAAkB;IAClE,OAAO,GAAG,iBAAiB,CAAC,SAAS,EAAE,WAAW,CAAC,cAAc,iBAAiB,CAAC,UAAU,EAAE,YAAY,CAAC,GAAG,CAAA;AACjH,CAAC;AAED,SAAgB,kBAAkB,CAAC,SAAiB,EAAE,UAAkB;IACtE,OAAO,GAAG,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,cAAc,CAAA;AAC/D,CAAC;AAED,SAAgB,mBAAmB,CAAC,SAAiB,EAAE,UAAkB;IACvE,OAAO,GAAG,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,WAAW,CAAA;AAC5D,CAAC;AAED,SAAgB,wBAAwB,CACtC,SAAiB,EACjB,UAAkB,EAClB,KAAW,IAAI,IAAI,EAAE;IAErB,OAAO,GAAG,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,IAAA,oDAA2B,EAAC,EAAE,CAAC,EAAE,CAAA;AACrF,CAAC;AAED,SAAgB,8BAA8B,CAAC,MAAc,EAAE,GAAW;IACxE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACzC,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAA,iDAAwB,EAAC,QAAQ,CAAC,CAAA;AACnE,CAAC;AAED,SAAgB,2BAA2B,CAAC,MAAc,EAAE,GAAW;IACrE,OAAO,IAAA,6BAAqB,EAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;AACxD,CAAC"}
@@ -0,0 +1,9 @@
1
+ /** Shared dated snapshot suffix used by session artifacts and notebooks. */
2
+ export declare const NAMED_SNAPSHOT_SEGMENT = ".snapshot-";
3
+ export declare function formatNamedSnapshotTimestamp(at: Date): string;
4
+ export declare function namedSnapshotSuffix(at: Date): string;
5
+ export declare function parseNamedSnapshotTimestamp(pathOrKey: string): number | null;
6
+ export declare function hasNamedSnapshotTimestamp(pathOrKey: string): boolean;
7
+ /** Whether `relativePath` is `{basePath}.snapshot-{timestamp}` for any nested base path. */
8
+ export declare function isDatedSnapshotForBase(relativePath: string, basePath: string): boolean;
9
+ //# sourceMappingURL=named-snapshot-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"named-snapshot-paths.d.ts","sourceRoot":"","sources":["../../../src/lib/object-storage/named-snapshot-paths.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,eAAO,MAAM,sBAAsB,eAAe,CAAA;AAKlD,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,IAAI,GAAG,MAAM,CAE7D;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,IAAI,GAAG,MAAM,CAEpD;AAED,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAY5E;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEpE;AAED,4FAA4F;AAC5F,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAKtF"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NAMED_SNAPSHOT_SEGMENT = void 0;
4
+ exports.formatNamedSnapshotTimestamp = formatNamedSnapshotTimestamp;
5
+ exports.namedSnapshotSuffix = namedSnapshotSuffix;
6
+ exports.parseNamedSnapshotTimestamp = parseNamedSnapshotTimestamp;
7
+ exports.hasNamedSnapshotTimestamp = hasNamedSnapshotTimestamp;
8
+ exports.isDatedSnapshotForBase = isDatedSnapshotForBase;
9
+ /** Shared dated snapshot suffix used by session artifacts and notebooks. */
10
+ exports.NAMED_SNAPSHOT_SEGMENT = '.snapshot-';
11
+ const NAMED_SNAPSHOT_TIMESTAMP_PATTERN = /^(\d{4}-\d{2}-\d{2})T(\d{2})-(\d{2})-(\d{2})-(\d{3})Z$/;
12
+ function formatNamedSnapshotTimestamp(at) {
13
+ return at.toISOString().replace(/[:.]/g, '-');
14
+ }
15
+ function namedSnapshotSuffix(at) {
16
+ return `${exports.NAMED_SNAPSHOT_SEGMENT}${formatNamedSnapshotTimestamp(at)}`;
17
+ }
18
+ function parseNamedSnapshotTimestamp(pathOrKey) {
19
+ const idx = pathOrKey.lastIndexOf(exports.NAMED_SNAPSHOT_SEGMENT);
20
+ if (idx < 0) {
21
+ return null;
22
+ }
23
+ const stamp = pathOrKey.slice(idx + exports.NAMED_SNAPSHOT_SEGMENT.length);
24
+ const match = NAMED_SNAPSHOT_TIMESTAMP_PATTERN.exec(stamp);
25
+ if (!match) {
26
+ return null;
27
+ }
28
+ const ms = Date.parse(`${match[1]}T${match[2]}:${match[3]}:${match[4]}.${match[5]}Z`);
29
+ return Number.isFinite(ms) ? ms : null;
30
+ }
31
+ function hasNamedSnapshotTimestamp(pathOrKey) {
32
+ return parseNamedSnapshotTimestamp(pathOrKey) !== null;
33
+ }
34
+ /** Whether `relativePath` is `{basePath}.snapshot-{timestamp}` for any nested base path. */
35
+ function isDatedSnapshotForBase(relativePath, basePath) {
36
+ return (relativePath.startsWith(`${basePath}${exports.NAMED_SNAPSHOT_SEGMENT}`) &&
37
+ hasNamedSnapshotTimestamp(relativePath));
38
+ }
39
+ //# sourceMappingURL=named-snapshot-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"named-snapshot-paths.js","sourceRoot":"","sources":["../../../src/lib/object-storage/named-snapshot-paths.ts"],"names":[],"mappings":";;;AAMA,oEAEC;AAED,kDAEC;AAED,kEAYC;AAED,8DAEC;AAGD,wDAKC;AAtCD,4EAA4E;AAC/D,QAAA,sBAAsB,GAAG,YAAY,CAAA;AAElD,MAAM,gCAAgC,GACpC,wDAAwD,CAAA;AAE1D,SAAgB,4BAA4B,CAAC,EAAQ;IACnD,OAAO,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;AAC/C,CAAC;AAED,SAAgB,mBAAmB,CAAC,EAAQ;IAC1C,OAAO,GAAG,8BAAsB,GAAG,4BAA4B,CAAC,EAAE,CAAC,EAAE,CAAA;AACvE,CAAC;AAED,SAAgB,2BAA2B,CAAC,SAAiB;IAC3D,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,CAAC,8BAAsB,CAAC,CAAA;IACzD,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACZ,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,GAAG,8BAAsB,CAAC,MAAM,CAAC,CAAA;IAClE,MAAM,KAAK,GAAG,gCAAgC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC1D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACrF,OAAO,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AACxC,CAAC;AAED,SAAgB,yBAAyB,CAAC,SAAiB;IACzD,OAAO,2BAA2B,CAAC,SAAS,CAAC,KAAK,IAAI,CAAA;AACxD,CAAC;AAED,4FAA4F;AAC5F,SAAgB,sBAAsB,CAAC,YAAoB,EAAE,QAAgB;IAC3E,OAAO,CACL,YAAY,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,8BAAsB,EAAE,CAAC;QAC/D,yBAAyB,CAAC,YAAY,CAAC,CACxC,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { HashlineReplaceEdit } from './parse-hashline-diff';
2
+ export declare function applyHashlineEditsToContent(content: string, edits: HashlineReplaceEdit[]): string;
3
+ //# sourceMappingURL=apply-hashline-edits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-hashline-edits.d.ts","sourceRoot":"","sources":["../../../src/lib/session-artifacts/apply-hashline-edits.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAEhE,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAwBjG"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyHashlineEditsToContent = applyHashlineEditsToContent;
4
+ const hashline_tag_1 = require("./hashline-tag");
5
+ function applyHashlineEditsToContent(content, edits) {
6
+ if (edits.length === 0) {
7
+ throw new Error('At least one hashline edit is required');
8
+ }
9
+ const baseDocument = (0, hashline_tag_1.buildHashlineDocument)(content);
10
+ const { trailingNewline } = baseDocument;
11
+ let lineTexts = baseDocument.lines.map((line) => line.text);
12
+ const resolveStartIndex = (edit) => {
13
+ const snapshot = (0, hashline_tag_1.buildHashlineDocument)((0, hashline_tag_1.joinContentLines)(lineTexts, trailingNewline));
14
+ return (0, hashline_tag_1.resolveHashlineRange)(snapshot, edit.startTag, edit.endTag).startIndex;
15
+ };
16
+ const sortedEdits = [...edits].sort((a, b) => resolveStartIndex(b) - resolveStartIndex(a));
17
+ for (const edit of sortedEdits) {
18
+ const snapshot = (0, hashline_tag_1.buildHashlineDocument)((0, hashline_tag_1.joinContentLines)(lineTexts, trailingNewline));
19
+ const { startIndex, endIndex } = (0, hashline_tag_1.resolveHashlineRange)(snapshot, edit.startTag, edit.endTag);
20
+ const replacementLines = (0, hashline_tag_1.splitContentLines)(edit.content).lines;
21
+ lineTexts.splice(startIndex, endIndex - startIndex + 1, ...replacementLines);
22
+ }
23
+ return (0, hashline_tag_1.joinContentLines)(lineTexts, trailingNewline);
24
+ }
25
+ //# sourceMappingURL=apply-hashline-edits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-hashline-edits.js","sourceRoot":"","sources":["../../../src/lib/session-artifacts/apply-hashline-edits.ts"],"names":[],"mappings":";;AAQA,kEAwBC;AAhCD,iDAKuB;AAGvB,SAAgB,2BAA2B,CAAC,OAAe,EAAE,KAA4B;IACvF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;IAC3D,CAAC;IAED,MAAM,YAAY,GAAG,IAAA,oCAAqB,EAAC,OAAO,CAAC,CAAA;IACnD,MAAM,EAAE,eAAe,EAAE,GAAG,YAAY,CAAA;IACxC,IAAI,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAE3D,MAAM,iBAAiB,GAAG,CAAC,IAAyB,EAAU,EAAE;QAC9D,MAAM,QAAQ,GAAG,IAAA,oCAAqB,EAAC,IAAA,+BAAgB,EAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAA;QACpF,OAAO,IAAA,mCAAoB,EAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,UAAU,CAAA;IAC9E,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;IAE1F,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAA,oCAAqB,EAAC,IAAA,+BAAgB,EAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAA;QACpF,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAA,mCAAoB,EAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QAC3F,MAAM,gBAAgB,GAAG,IAAA,gCAAiB,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAA;QAC9D,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,GAAG,UAAU,GAAG,CAAC,EAAE,GAAG,gBAAgB,CAAC,CAAA;IAC9E,CAAC;IAED,OAAO,IAAA,+BAAgB,EAAC,SAAS,EAAE,eAAe,CAAC,CAAA;AACrD,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface ArtifactTextEdit {
2
+ /** Exact substring in the current document (must occur exactly once). */
3
+ search: string;
4
+ /** Replacement text (empty string deletes the match). */
5
+ replace: string;
6
+ }
7
+ export declare function applyArtifactTextEditsToContent(content: string, edits: ArtifactTextEdit[]): string;
8
+ //# sourceMappingURL=artifact-text-edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-text-edit.d.ts","sourceRoot":"","sources":["../../../src/lib/session-artifacts/artifact-text-edit.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAA;IACd,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,gBAAgB,EAAE,GACxB,MAAM,CAuBR"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyArtifactTextEditsToContent = applyArtifactTextEditsToContent;
4
+ function applyArtifactTextEditsToContent(content, edits) {
5
+ let current = content;
6
+ for (let index = 0; index < edits.length; index++) {
7
+ const edit = edits[index];
8
+ if (!edit.search.length) {
9
+ throw new Error(`Edit ${index + 1}: search must not be empty`);
10
+ }
11
+ const first = current.indexOf(edit.search);
12
+ if (first === -1) {
13
+ throw new Error(`Edit ${index + 1}: search text not found in document`);
14
+ }
15
+ const second = current.indexOf(edit.search, first + edit.search.length);
16
+ if (second !== -1) {
17
+ throw new Error(`Edit ${index + 1}: search text is ambiguous (multiple matches)`);
18
+ }
19
+ current = current.slice(0, first) + edit.replace + current.slice(first + edit.search.length);
20
+ }
21
+ return current;
22
+ }
23
+ //# sourceMappingURL=artifact-text-edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-text-edit.js","sourceRoot":"","sources":["../../../src/lib/session-artifacts/artifact-text-edit.ts"],"names":[],"mappings":";;AAOA,0EA0BC;AA1BD,SAAgB,+BAA+B,CAC7C,OAAe,EACf,KAAyB;IAEzB,IAAI,OAAO,GAAG,OAAO,CAAA;IAErB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;QACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,GAAG,CAAC,4BAA4B,CAAC,CAAA;QAChE,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC1C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,GAAG,CAAC,qCAAqC,CAAC,CAAA;QACzE,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACvE,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,GAAG,CAAC,+CAA+C,CAAC,CAAA;QACnF,CAAC;QAED,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC9F,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,33 @@
1
+ export interface HashlineLine {
2
+ /** 1-based line number in the current document snapshot */
3
+ lineNumber: number;
4
+ text: string;
5
+ /** e.g. 45:d4 — line number + content fingerprint */
6
+ tag: string;
7
+ }
8
+ export declare function hashlineFingerprint(text: string): string;
9
+ export declare function buildLineTag(lineNumber: number, text: string): string;
10
+ export declare function parseLineTag(tag: string): {
11
+ lineNumber: number;
12
+ hash: string;
13
+ };
14
+ export declare function parseTagRange(range: string): {
15
+ startTag: string;
16
+ endTag: string;
17
+ };
18
+ export declare function splitContentLines(content: string): {
19
+ lines: string[];
20
+ trailingNewline: boolean;
21
+ };
22
+ export declare function joinContentLines(lines: string[], trailingNewline: boolean): string;
23
+ export declare function buildHashlineDocument(content: string): {
24
+ lines: HashlineLine[];
25
+ trailingNewline: boolean;
26
+ };
27
+ export declare function resolveHashlineRange(document: {
28
+ lines: HashlineLine[];
29
+ }, startTag: string, endTag: string): {
30
+ startIndex: number;
31
+ endIndex: number;
32
+ };
33
+ //# sourceMappingURL=hashline-tag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hashline-tag.d.ts","sourceRoot":"","sources":["../../../src/lib/session-artifacts/hashline-tag.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,qDAAqD;IACrD,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAM9E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAcjF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,CAYhG;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,eAAe,EAAE,OAAO,GAAG,MAAM,CAKlF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG;IACtD,KAAK,EAAE,YAAY,EAAE,CAAA;IACrB,eAAe,EAAE,OAAO,CAAA;CACzB,CAOA;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE;IAAE,KAAK,EAAE,YAAY,EAAE,CAAA;CAAE,EACnC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAiB1C"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hashlineFingerprint = hashlineFingerprint;
4
+ exports.buildLineTag = buildLineTag;
5
+ exports.parseLineTag = parseLineTag;
6
+ exports.parseTagRange = parseTagRange;
7
+ exports.splitContentLines = splitContentLines;
8
+ exports.joinContentLines = joinContentLines;
9
+ exports.buildHashlineDocument = buildHashlineDocument;
10
+ exports.resolveHashlineRange = resolveHashlineRange;
11
+ const node_crypto_1 = require("node:crypto");
12
+ function hashlineFingerprint(text) {
13
+ return (0, node_crypto_1.createHash)('sha256').update(text, 'utf8').digest('hex').slice(0, 2);
14
+ }
15
+ function buildLineTag(lineNumber, text) {
16
+ return `${lineNumber}:${hashlineFingerprint(text)}`;
17
+ }
18
+ function parseLineTag(tag) {
19
+ const match = /^(\d+):([0-9a-f]+)$/i.exec(tag.trim());
20
+ if (!match) {
21
+ throw new Error(`Invalid line tag: ${tag}`);
22
+ }
23
+ return { lineNumber: Number(match[1]), hash: match[2].toLowerCase() };
24
+ }
25
+ function parseTagRange(range) {
26
+ const trimmed = range.trim();
27
+ const separator = trimmed.indexOf('..');
28
+ if (separator === -1) {
29
+ const tag = trimmed;
30
+ return { startTag: tag, endTag: tag };
31
+ }
32
+ const startTag = trimmed.slice(0, separator).trim();
33
+ const endTag = trimmed.slice(separator + 2).trim();
34
+ if (!startTag || !endTag) {
35
+ throw new Error(`Invalid tag range: ${range}`);
36
+ }
37
+ return { startTag, endTag };
38
+ }
39
+ function splitContentLines(content) {
40
+ if (content.length === 0) {
41
+ return { lines: [], trailingNewline: false };
42
+ }
43
+ const trailingNewline = content.endsWith('\n');
44
+ const body = trailingNewline ? content.slice(0, -1) : content;
45
+ if (body.length === 0) {
46
+ return { lines: [], trailingNewline };
47
+ }
48
+ return { lines: body.split('\n'), trailingNewline };
49
+ }
50
+ function joinContentLines(lines, trailingNewline) {
51
+ if (lines.length === 0) {
52
+ return trailingNewline ? '\n' : '';
53
+ }
54
+ return lines.join('\n') + (trailingNewline ? '\n' : '');
55
+ }
56
+ function buildHashlineDocument(content) {
57
+ const { lines: rawLines, trailingNewline } = splitContentLines(content);
58
+ const lines = rawLines.map((text, index) => {
59
+ const lineNumber = index + 1;
60
+ return { lineNumber, text, tag: buildLineTag(lineNumber, text) };
61
+ });
62
+ return { lines, trailingNewline };
63
+ }
64
+ function resolveHashlineRange(document, startTag, endTag) {
65
+ const normalizedStart = startTag.trim();
66
+ const normalizedEnd = endTag.trim();
67
+ const startIndex = document.lines.findIndex((line) => line.tag === normalizedStart);
68
+ const endIndex = document.lines.findIndex((line) => line.tag === normalizedEnd);
69
+ if (startIndex === -1) {
70
+ throw new Error(`Start tag not found: ${normalizedStart}`);
71
+ }
72
+ if (endIndex === -1) {
73
+ throw new Error(`End tag not found: ${normalizedEnd}`);
74
+ }
75
+ if (startIndex > endIndex) {
76
+ throw new Error(`Invalid tag range: ${normalizedStart}..${normalizedEnd}`);
77
+ }
78
+ return { startIndex, endIndex };
79
+ }
80
+ //# sourceMappingURL=hashline-tag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hashline-tag.js","sourceRoot":"","sources":["../../../src/lib/session-artifacts/hashline-tag.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ export declare function artifactLatestStatePath(artifactPath: string): string;
4
4
  /** Relative path for a point-in-time content snapshot. */
5
5
  export declare function artifactSnapshotPath(artifactPath: string, at: Date): string;
6
6
  export declare function isArtifactLatestStatePath(relativePath: string): boolean;
7
+ /** Any session artifact sidecar snapshot, including nested paths like `src/App.tsx.snapshot-*`. */
7
8
  export declare function isArtifactSnapshotPath(relativePath: string): boolean;
8
9
  /** Sidecar files managed by the artifact storage layer (not user-facing artifacts). */
9
10
  export declare function isArtifactStorageSidecar(relativePath: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-storage-paths.d.ts","sourceRoot":"","sources":["../../../src/lib/session-pages/artifact-storage-paths.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,4BAA4B,kBAAkB,CAAA;AAG3D,uDAAuD;AACvD,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAGpE;AAED,0DAA0D;AAC1D,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,GAAG,MAAM,CAI3E;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAEpE;AAED,uFAAuF;AACvF,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAEtE;AAED,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKhF;AAED,qEAAqE;AACrE,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAGzF"}
1
+ {"version":3,"file":"artifact-storage-paths.d.ts","sourceRoot":"","sources":["../../../src/lib/session-pages/artifact-storage-paths.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,4BAA4B,kBAAkB,CAAA;AAE3D,uDAAuD;AACvD,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAGpE;AAED,0DAA0D;AAC1D,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,GAAG,MAAM,CAG3E;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED,mGAAmG;AACnG,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAMpE;AAED,uFAAuF;AACvF,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAEtE;AAED,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKhF;AAED,qEAAqE;AACrE,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAGzF"}
@@ -9,8 +9,8 @@ exports.isArtifactStorageSidecar = isArtifactStorageSidecar;
9
9
  exports.artifactPathFromLatestStatePath = artifactPathFromLatestStatePath;
10
10
  exports.isSnapshotForArtifact = isSnapshotForArtifact;
11
11
  const paths_1 = require("./paths");
12
+ const named_snapshot_paths_1 = require("../object-storage/named-snapshot-paths");
12
13
  exports.ARTIFACT_LATEST_STATE_SUFFIX = '.latest.state';
13
- const SNAPSHOT_SEGMENT = '.snapshot-';
14
14
  /** Relative path for the persisted Yjs update blob. */
15
15
  function artifactLatestStatePath(artifactPath) {
16
16
  const base = (0, paths_1.normalizeArtifactPath)(artifactPath);
@@ -19,14 +19,18 @@ function artifactLatestStatePath(artifactPath) {
19
19
  /** Relative path for a point-in-time content snapshot. */
20
20
  function artifactSnapshotPath(artifactPath, at) {
21
21
  const base = (0, paths_1.normalizeArtifactPath)(artifactPath);
22
- const stamp = at.toISOString().replace(/[:.]/g, '-');
23
- return `${base}${SNAPSHOT_SEGMENT}${stamp}`;
22
+ return `${base}${(0, named_snapshot_paths_1.namedSnapshotSuffix)(at)}`;
24
23
  }
25
24
  function isArtifactLatestStatePath(relativePath) {
26
25
  return relativePath.endsWith(exports.ARTIFACT_LATEST_STATE_SUFFIX);
27
26
  }
27
+ /** Any session artifact sidecar snapshot, including nested paths like `src/App.tsx.snapshot-*`. */
28
28
  function isArtifactSnapshotPath(relativePath) {
29
- return relativePath.includes(SNAPSHOT_SEGMENT);
29
+ if (!(0, named_snapshot_paths_1.hasNamedSnapshotTimestamp)(relativePath)) {
30
+ return false;
31
+ }
32
+ const idx = relativePath.lastIndexOf(named_snapshot_paths_1.NAMED_SNAPSHOT_SEGMENT);
33
+ return idx > 0;
30
34
  }
31
35
  /** Sidecar files managed by the artifact storage layer (not user-facing artifacts). */
32
36
  function isArtifactStorageSidecar(relativePath) {
@@ -41,6 +45,6 @@ function artifactPathFromLatestStatePath(statePath) {
41
45
  /** Whether `relativePath` is a dated snapshot for `artifactPath`. */
42
46
  function isSnapshotForArtifact(relativePath, artifactPath) {
43
47
  const base = (0, paths_1.normalizeArtifactPath)(artifactPath);
44
- return relativePath.startsWith(`${base}${SNAPSHOT_SEGMENT}`);
48
+ return (0, named_snapshot_paths_1.isDatedSnapshotForBase)(relativePath, base);
45
49
  }
46
50
  //# sourceMappingURL=artifact-storage-paths.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-storage-paths.js","sourceRoot":"","sources":["../../../src/lib/session-pages/artifact-storage-paths.ts"],"names":[],"mappings":";;;AAMA,0DAGC;AAGD,oDAIC;AAED,8DAEC;AAED,wDAEC;AAGD,4DAEC;AAED,0EAKC;AAGD,sDAGC;AA1CD,mCAA+C;AAElC,QAAA,4BAA4B,GAAG,eAAe,CAAA;AAC3D,MAAM,gBAAgB,GAAG,YAAY,CAAA;AAErC,uDAAuD;AACvD,SAAgB,uBAAuB,CAAC,YAAoB;IAC1D,MAAM,IAAI,GAAG,IAAA,6BAAqB,EAAC,YAAY,CAAC,CAAA;IAChD,OAAO,GAAG,IAAI,GAAG,oCAA4B,EAAE,CAAA;AACjD,CAAC;AAED,0DAA0D;AAC1D,SAAgB,oBAAoB,CAAC,YAAoB,EAAE,EAAQ;IACjE,MAAM,IAAI,GAAG,IAAA,6BAAqB,EAAC,YAAY,CAAC,CAAA;IAChD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IACpD,OAAO,GAAG,IAAI,GAAG,gBAAgB,GAAG,KAAK,EAAE,CAAA;AAC7C,CAAC;AAED,SAAgB,yBAAyB,CAAC,YAAoB;IAC5D,OAAO,YAAY,CAAC,QAAQ,CAAC,oCAA4B,CAAC,CAAA;AAC5D,CAAC;AAED,SAAgB,sBAAsB,CAAC,YAAoB;IACzD,OAAO,YAAY,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA;AAChD,CAAC;AAED,uFAAuF;AACvF,SAAgB,wBAAwB,CAAC,YAAoB;IAC3D,OAAO,yBAAyB,CAAC,YAAY,CAAC,IAAI,sBAAsB,CAAC,YAAY,CAAC,CAAA;AACxF,CAAC;AAED,SAAgB,+BAA+B,CAAC,SAAiB;IAC/D,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,oCAA4B,CAAC,MAAM,CAAC,CAAA;AACjE,CAAC;AAED,qEAAqE;AACrE,SAAgB,qBAAqB,CAAC,YAAoB,EAAE,YAAoB;IAC9E,MAAM,IAAI,GAAG,IAAA,6BAAqB,EAAC,YAAY,CAAC,CAAA;IAChD,OAAO,YAAY,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,gBAAgB,EAAE,CAAC,CAAA;AAC9D,CAAC"}
1
+ {"version":3,"file":"artifact-storage-paths.js","sourceRoot":"","sources":["../../../src/lib/session-pages/artifact-storage-paths.ts"],"names":[],"mappings":";;;AAWA,0DAGC;AAGD,oDAGC;AAED,8DAEC;AAGD,wDAMC;AAGD,4DAEC;AAED,0EAKC;AAGD,sDAGC;AAnDD,mCAA+C;AAC/C,iFAK+C;AAElC,QAAA,4BAA4B,GAAG,eAAe,CAAA;AAE3D,uDAAuD;AACvD,SAAgB,uBAAuB,CAAC,YAAoB;IAC1D,MAAM,IAAI,GAAG,IAAA,6BAAqB,EAAC,YAAY,CAAC,CAAA;IAChD,OAAO,GAAG,IAAI,GAAG,oCAA4B,EAAE,CAAA;AACjD,CAAC;AAED,0DAA0D;AAC1D,SAAgB,oBAAoB,CAAC,YAAoB,EAAE,EAAQ;IACjE,MAAM,IAAI,GAAG,IAAA,6BAAqB,EAAC,YAAY,CAAC,CAAA;IAChD,OAAO,GAAG,IAAI,GAAG,IAAA,0CAAmB,EAAC,EAAE,CAAC,EAAE,CAAA;AAC5C,CAAC;AAED,SAAgB,yBAAyB,CAAC,YAAoB;IAC5D,OAAO,YAAY,CAAC,QAAQ,CAAC,oCAA4B,CAAC,CAAA;AAC5D,CAAC;AAED,mGAAmG;AACnG,SAAgB,sBAAsB,CAAC,YAAoB;IACzD,IAAI,CAAC,IAAA,gDAAyB,EAAC,YAAY,CAAC,EAAE,CAAC;QAC7C,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,CAAC,6CAAsB,CAAC,CAAA;IAC5D,OAAO,GAAG,GAAG,CAAC,CAAA;AAChB,CAAC;AAED,uFAAuF;AACvF,SAAgB,wBAAwB,CAAC,YAAoB;IAC3D,OAAO,yBAAyB,CAAC,YAAY,CAAC,IAAI,sBAAsB,CAAC,YAAY,CAAC,CAAA;AACxF,CAAC;AAED,SAAgB,+BAA+B,CAAC,SAAiB;IAC/D,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,oCAA4B,CAAC,MAAM,CAAC,CAAA;AACjE,CAAC;AAED,qEAAqE;AACrE,SAAgB,qBAAqB,CAAC,YAAoB,EAAE,YAAoB;IAC9E,MAAM,IAAI,GAAG,IAAA,6BAAqB,EAAC,YAAY,CAAC,CAAA;IAChD,OAAO,IAAA,6CAAsB,EAAC,YAAY,EAAE,IAAI,CAAC,CAAA;AACnD,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function buildPreviewErrorReporterScript(sessionId: string, previewPath: string): string;
2
+ export declare function injectPreviewErrorReporter(html: string, sessionId: string, previewPath: string): string;
3
+ //# sourceMappingURL=inject-preview-error-reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject-preview-error-reporter.d.ts","sourceRoot":"","sources":["../../../src/lib/session-pages/inject-preview-error-reporter.ts"],"names":[],"mappings":"AAMA,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAG9F;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,MAAM,CAoBR"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildPreviewErrorReporterScript = buildPreviewErrorReporterScript;
4
+ exports.injectPreviewErrorReporter = injectPreviewErrorReporter;
5
+ const REPORTER_MARKER = 'id="multiplayer-artifact-preview-error-reporter"';
6
+ function escapeJsString(value) {
7
+ return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
8
+ }
9
+ function buildPreviewErrorReporterScript(sessionId, previewPath) {
10
+ const meta = `{sessionId:"${escapeJsString(sessionId)}",path:"${escapeJsString(previewPath)}"}`;
11
+ return `<script ${REPORTER_MARKER}>(function(){var meta=${meta};function report(d){try{parent.postMessage(Object.assign({type:"artifact-preview-error"},meta,d),"*")}catch(e){}}window.addEventListener("error",function(e){report({kind:"error",message:e.message||String(e.error||"Unknown error"),filename:e.filename||"",lineno:e.lineno||0,colno:e.colno||0,at:new Date().toISOString()})});window.addEventListener("unhandledrejection",function(e){report({kind:"unhandledrejection",message:String(e.reason),filename:"",lineno:0,colno:0,at:new Date().toISOString()})})})();</script>`;
12
+ }
13
+ function injectPreviewErrorReporter(html, sessionId, previewPath) {
14
+ if (html.includes(REPORTER_MARKER)) {
15
+ return html;
16
+ }
17
+ const script = buildPreviewErrorReporterScript(sessionId, previewPath);
18
+ const headMatch = html.match(/<head(\s[^>]*)?>/i);
19
+ if (headMatch && headMatch.index !== undefined) {
20
+ const insertAt = headMatch.index + headMatch[0].length;
21
+ return `${html.slice(0, insertAt)}${script}${html.slice(insertAt)}`;
22
+ }
23
+ const htmlMatch = html.match(/<html(\s[^>]*)?>/i);
24
+ if (htmlMatch && htmlMatch.index !== undefined) {
25
+ const insertAt = htmlMatch.index + htmlMatch[0].length;
26
+ return `${html.slice(0, insertAt)}${script}${html.slice(insertAt)}`;
27
+ }
28
+ return `${script}${html}`;
29
+ }
30
+ //# sourceMappingURL=inject-preview-error-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject-preview-error-reporter.js","sourceRoot":"","sources":["../../../src/lib/session-pages/inject-preview-error-reporter.ts"],"names":[],"mappings":";;AAMA,0EAGC;AAED,gEAwBC;AAnCD,MAAM,eAAe,GAAG,kDAAkD,CAAA;AAE1E,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AAC1D,CAAC;AAED,SAAgB,+BAA+B,CAAC,SAAiB,EAAE,WAAmB;IACpF,MAAM,IAAI,GAAG,eAAe,cAAc,CAAC,SAAS,CAAC,WAAW,cAAc,CAAC,WAAW,CAAC,IAAI,CAAA;IAC/F,OAAO,WAAW,eAAe,yBAAyB,IAAI,kgBAAkgB,CAAA;AAClkB,CAAC;AAED,SAAgB,0BAA0B,CACxC,IAAY,EACZ,SAAiB,EACjB,WAAmB;IAEnB,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,MAAM,GAAG,+BAA+B,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IAEtE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;IACjD,IAAI,SAAS,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;QACtD,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAA;IACrE,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;IACjD,IAAI,SAAS,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;QACtD,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAA;IACrE,CAAC;IAED,OAAO,GAAG,MAAM,GAAG,IAAI,EAAE,CAAA;AAC3B,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface ReadLatestSessionArtifactResult {
2
+ path: string;
3
+ content: string;
4
+ bytes: number;
5
+ }
6
+ export declare function readLatestSessionArtifactText(sessionId: string, artifactPath: string): Promise<ReadLatestSessionArtifactResult>;
7
+ //# sourceMappingURL=read-session-artifact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-session-artifact.d.ts","sourceRoot":"","sources":["../../../src/lib/session-pages/read-session-artifact.ts"],"names":[],"mappings":"AAoCA,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd;AAED,wBAAsB,6BAA6B,CACjD,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,+BAA+B,CAAC,CAoB1C"}