@multiplayer-app/sandbox 0.0.32 → 0.0.33-beta.2
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.
- package/dist/agents/content-generator.agent.d.ts +8 -0
- package/dist/agents/content-generator.agent.d.ts.map +1 -1
- package/dist/agents/content-generator.agent.js +53 -6
- package/dist/agents/content-generator.agent.js.map +1 -1
- package/dist/agents/notebook.agent.d.ts.map +1 -1
- package/dist/agents/notebook.agent.js +2 -1
- package/dist/agents/notebook.agent.js.map +1 -1
- package/dist/agents/shared/build-plan.tools.d.ts.map +1 -1
- package/dist/agents/shared/build-plan.tools.js +4 -4
- package/dist/agents/shared/build-plan.tools.js.map +1 -1
- package/dist/agents/shared/content-generator-system-prompt.d.ts +3 -2
- package/dist/agents/shared/content-generator-system-prompt.d.ts.map +1 -1
- package/dist/agents/shared/content-generator-system-prompt.js +41 -24
- package/dist/agents/shared/content-generator-system-prompt.js.map +1 -1
- package/dist/agents/shared/publish-session-artifacts.tool.d.ts +5 -0
- package/dist/agents/shared/publish-session-artifacts.tool.d.ts.map +1 -1
- package/dist/agents/shared/publish-session-artifacts.tool.js +154 -15
- package/dist/agents/shared/publish-session-artifacts.tool.js.map +1 -1
- package/dist/agents/shared/session-quality-report.tool.js +1 -1
- package/dist/agents/shared/session-quality-report.tool.js.map +1 -1
- package/dist/agents/shared/update-session-artifacts.tool.d.ts +5 -0
- package/dist/agents/shared/update-session-artifacts.tool.d.ts.map +1 -1
- package/dist/agents/shared/update-session-artifacts.tool.js +136 -26
- package/dist/agents/shared/update-session-artifacts.tool.js.map +1 -1
- package/dist/agents/shared/validate-artifact-content.tools.d.ts +4 -0
- package/dist/agents/shared/validate-artifact-content.tools.d.ts.map +1 -1
- package/dist/agents/shared/validate-artifact-content.tools.js +24 -1
- package/dist/agents/shared/validate-artifact-content.tools.js.map +1 -1
- package/dist/agents/skills/designer.skill.d.ts.map +1 -1
- package/dist/agents/skills/designer.skill.js +75 -113
- package/dist/agents/skills/designer.skill.js.map +1 -1
- package/dist/agents/skills/skill-injection.d.ts.map +1 -1
- package/dist/agents/skills/skill-injection.js +9 -3
- package/dist/agents/skills/skill-injection.js.map +1 -1
- package/dist/context.d.ts +4 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js.map +1 -1
- package/dist/create-builder-api.d.ts +6 -0
- package/dist/create-builder-api.d.ts.map +1 -1
- package/dist/create-builder-api.js +2 -0
- package/dist/create-builder-api.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/notebooks/notebook-storage-paths.d.ts +8 -0
- package/dist/lib/notebooks/notebook-storage-paths.d.ts.map +1 -0
- package/dist/lib/notebooks/notebook-storage-paths.js +22 -0
- package/dist/lib/notebooks/notebook-storage-paths.js.map +1 -0
- package/dist/lib/notebooks/notebook-yjs-content.d.ts +6 -0
- package/dist/lib/notebooks/notebook-yjs-content.d.ts.map +1 -0
- package/dist/lib/notebooks/notebook-yjs-content.js +42 -0
- package/dist/lib/notebooks/notebook-yjs-content.js.map +1 -0
- package/dist/lib/object-storage/keys.d.ts +1 -0
- package/dist/lib/object-storage/keys.d.ts.map +1 -1
- package/dist/lib/object-storage/keys.js +5 -0
- package/dist/lib/object-storage/keys.js.map +1 -1
- package/dist/lib/object-storage/named-snapshot-paths.d.ts +9 -0
- package/dist/lib/object-storage/named-snapshot-paths.d.ts.map +1 -0
- package/dist/lib/object-storage/named-snapshot-paths.js +39 -0
- package/dist/lib/object-storage/named-snapshot-paths.js.map +1 -0
- package/dist/lib/session-artifacts/hashline-diff-guide.d.ts +1 -1
- package/dist/lib/session-artifacts/hashline-diff-guide.d.ts.map +1 -1
- package/dist/lib/session-artifacts/hashline-diff-guide.js +9 -5
- package/dist/lib/session-artifacts/hashline-diff-guide.js.map +1 -1
- package/dist/lib/session-artifacts/parse-hashline-diff.d.ts +13 -0
- package/dist/lib/session-artifacts/parse-hashline-diff.d.ts.map +1 -1
- package/dist/lib/session-artifacts/parse-hashline-diff.js +72 -0
- package/dist/lib/session-artifacts/parse-hashline-diff.js.map +1 -1
- package/dist/lib/session-pages/artifact-quality-audit.d.ts.map +1 -1
- package/dist/lib/session-pages/artifact-quality-audit.js +19 -14
- package/dist/lib/session-pages/artifact-quality-audit.js.map +1 -1
- package/dist/lib/session-pages/artifact-storage-paths.d.ts +1 -0
- package/dist/lib/session-pages/artifact-storage-paths.d.ts.map +1 -1
- package/dist/lib/session-pages/artifact-storage-paths.js +9 -5
- package/dist/lib/session-pages/artifact-storage-paths.js.map +1 -1
- package/dist/lib/session-pages/html-artifact-template.d.ts +16 -0
- package/dist/lib/session-pages/html-artifact-template.d.ts.map +1 -1
- package/dist/lib/session-pages/html-artifact-template.js +166 -10
- package/dist/lib/session-pages/html-artifact-template.js.map +1 -1
- package/dist/lib/session-pages/index.d.ts +4 -0
- package/dist/lib/session-pages/index.d.ts.map +1 -1
- package/dist/lib/session-pages/index.js +11 -1
- package/dist/lib/session-pages/index.js.map +1 -1
- package/dist/lib/session-pages/write-session-artifacts.d.ts +1 -0
- package/dist/lib/session-pages/write-session-artifacts.d.ts.map +1 -1
- package/dist/lib/session-pages/write-session-artifacts.js +4 -1
- package/dist/lib/session-pages/write-session-artifacts.js.map +1 -1
- package/dist/lib/session-plans/build-plan.d.ts +13 -3
- package/dist/lib/session-plans/build-plan.d.ts.map +1 -1
- package/dist/lib/session-plans/build-plan.js +37 -6
- package/dist/lib/session-plans/build-plan.js.map +1 -1
- package/dist/lib/yjs-pending/flush-worker.d.ts +1 -1
- package/dist/lib/yjs-pending/flush-worker.d.ts.map +1 -1
- package/dist/lib/yjs-pending/flush-worker.js +3 -33
- package/dist/lib/yjs-pending/flush-worker.js.map +1 -1
- package/dist/lib/yjs-pending/snapshot-retention.d.ts +6 -0
- package/dist/lib/yjs-pending/snapshot-retention.d.ts.map +1 -0
- package/dist/lib/yjs-pending/snapshot-retention.js +33 -0
- package/dist/lib/yjs-pending/snapshot-retention.js.map +1 -0
- package/dist/lib/yjs-pending/yjs-persistence.d.ts +1 -0
- package/dist/lib/yjs-pending/yjs-persistence.d.ts.map +1 -1
- package/dist/lib/yjs-pending/yjs-persistence.js +36 -0
- package/dist/lib/yjs-pending/yjs-persistence.js.map +1 -1
- package/dist/realtime/session-artifact-yjs-store.d.ts +21 -0
- package/dist/realtime/session-artifact-yjs-store.d.ts.map +1 -1
- package/dist/realtime/session-artifact-yjs-store.js +84 -0
- package/dist/realtime/session-artifact-yjs-store.js.map +1 -1
- package/dist/routes/notebooks.d.ts.map +1 -1
- package/dist/routes/notebooks.js +2 -0
- package/dist/routes/notebooks.js.map +1 -1
- package/dist/routes/schemas.d.ts +2 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -1
- package/package.json +4 -4
|
@@ -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":";;
|
|
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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/** Injected into session-artefact-updater system prompt. */
|
|
2
|
-
export declare const HASHLINE_DIFF_GUIDE = "Hashline diffs reference line tags from getSessionArtifactLatestContent (format lineNumber:hash, e.g. 45:d4)
|
|
2
|
+
export declare const HASHLINE_DIFF_GUIDE = "Hashline diffs reference line tags from getSessionArtifactLatestContent (format lineNumber:hash, e.g. 45:d4).\n\n## Prefer wholesale rewrite for structural work\nIf the task fixes duplicates, broken <script>/<footer>, nested sections, consistency polish, or touches more than a small localized change: pass the COMPLETE new page (fragment or full document) as `diff` with NO <<<SEARCH markers. The server replaces the file atomically. Do NOT try to \"patch your way\" out of corrupted HTML.\n\n## Small localized edits \u2014 hashline format\n<<<SEARCH 45:d4..52:a3\n old text (optional; ignored)\n>>>REPLACE\n new data goes here\n<<<END\n\nRules:\n- range start/end tags on the <<<SEARCH line must come from the latest content snapshot you just read.\n- A single-tag range (e.g. 10:ab..10:ab) replaces one line.\n- Multiple SEARCH/REPLACE blocks are allowed; apply minimal ranges.\n- On hash mismatch: call getSessionArtifactLatestContent again \u2014 do not resend the stale diff.\n- Never invent <<<SEARCH markers around a full page; that fails classification. Either valid blocks OR a clean wholesale body.";
|
|
3
3
|
//# sourceMappingURL=hashline-diff-guide.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hashline-diff-guide.d.ts","sourceRoot":"","sources":["../../../src/lib/session-artifacts/hashline-diff-guide.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,eAAO,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"hashline-diff-guide.d.ts","sourceRoot":"","sources":["../../../src/lib/session-artifacts/hashline-diff-guide.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,eAAO,MAAM,mBAAmB,imCAiB+F,CAAA"}
|
|
@@ -2,18 +2,22 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.HASHLINE_DIFF_GUIDE = void 0;
|
|
4
4
|
/** Injected into session-artefact-updater system prompt. */
|
|
5
|
-
exports.HASHLINE_DIFF_GUIDE = `Hashline diffs reference line tags from getSessionArtifactLatestContent (format lineNumber:hash, e.g. 45:d4).
|
|
5
|
+
exports.HASHLINE_DIFF_GUIDE = `Hashline diffs reference line tags from getSessionArtifactLatestContent (format lineNumber:hash, e.g. 45:d4).
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## Prefer wholesale rewrite for structural work
|
|
8
|
+
If the task fixes duplicates, broken <script>/<footer>, nested sections, consistency polish, or touches more than a small localized change: pass the COMPLETE new page (fragment or full document) as \`diff\` with NO <<<SEARCH markers. The server replaces the file atomically. Do NOT try to "patch your way" out of corrupted HTML.
|
|
9
|
+
|
|
10
|
+
## Small localized edits — hashline format
|
|
8
11
|
<<<SEARCH 45:d4..52:a3
|
|
9
|
-
old text
|
|
12
|
+
old text (optional; ignored)
|
|
10
13
|
>>>REPLACE
|
|
11
14
|
new data goes here
|
|
12
15
|
<<<END
|
|
13
16
|
|
|
14
17
|
Rules:
|
|
15
18
|
- range start/end tags on the <<<SEARCH line must come from the latest content snapshot you just read.
|
|
16
|
-
- you may include the old lines between <<<SEARCH and >>>REPLACE for clarity; edits are applied by tags only.
|
|
17
19
|
- A single-tag range (e.g. 10:ab..10:ab) replaces one line.
|
|
18
|
-
-
|
|
20
|
+
- Multiple SEARCH/REPLACE blocks are allowed; apply minimal ranges.
|
|
21
|
+
- On hash mismatch: call getSessionArtifactLatestContent again — do not resend the stale diff.
|
|
22
|
+
- Never invent <<<SEARCH markers around a full page; that fails classification. Either valid blocks OR a clean wholesale body.`;
|
|
19
23
|
//# sourceMappingURL=hashline-diff-guide.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hashline-diff-guide.js","sourceRoot":"","sources":["../../../src/lib/session-artifacts/hashline-diff-guide.ts"],"names":[],"mappings":";;;AAAA,4DAA4D;AAC/C,QAAA,mBAAmB,GAAG
|
|
1
|
+
{"version":3,"file":"hashline-diff-guide.js","sourceRoot":"","sources":["../../../src/lib/session-artifacts/hashline-diff-guide.ts"],"names":[],"mappings":";;;AAAA,4DAA4D;AAC/C,QAAA,mBAAmB,GAAG;;;;;;;;;;;;;;;;;+HAiB4F,CAAA"}
|
|
@@ -7,5 +7,18 @@ interface Patch {
|
|
|
7
7
|
export declare function parsePatches(input: string): Patch[];
|
|
8
8
|
export declare function applyPatchToLines(lines: string[], patchText: string): string[];
|
|
9
9
|
export declare function applyPatch(ytext: Y.Text, patchText: string): void;
|
|
10
|
+
export type ArtifactDiffClassification = {
|
|
11
|
+
kind: 'hashline';
|
|
12
|
+
patchCount: number;
|
|
13
|
+
} | {
|
|
14
|
+
kind: 'replace';
|
|
15
|
+
content: string;
|
|
16
|
+
} | {
|
|
17
|
+
kind: 'invalid';
|
|
18
|
+
reason: string;
|
|
19
|
+
};
|
|
20
|
+
export declare function classifyArtifactDiff(diff: string, options: {
|
|
21
|
+
isHtml: boolean;
|
|
22
|
+
}): ArtifactDiffClassification;
|
|
10
23
|
export {};
|
|
11
24
|
//# sourceMappingURL=parse-hashline-diff.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-hashline-diff.d.ts","sourceRoot":"","sources":["../../../src/lib/session-artifacts/parse-hashline-diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AAQxB,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB;
|
|
1
|
+
{"version":3,"file":"parse-hashline-diff.d.ts","sourceRoot":"","sources":["../../../src/lib/session-artifacts/parse-hashline-diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AAQxB,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB;AAQD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,CAqBnD;AAUD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAY9E;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAcjE;AAED,MAAM,MAAM,0BAA0B,GAClC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AA6BvC,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GAC3B,0BAA0B,CA+C5B"}
|
|
@@ -3,11 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.parsePatches = parsePatches;
|
|
4
4
|
exports.applyPatchToLines = applyPatchToLines;
|
|
5
5
|
exports.applyPatch = applyPatch;
|
|
6
|
+
exports.classifyArtifactDiff = classifyArtifactDiff;
|
|
6
7
|
const hashline_tags_1 = require("./hashline-tags");
|
|
7
8
|
const PATCH_PATTERN = /<<<SEARCH\s+([^\n]+)\n([\s\S]*?)>>>REPLACE\n([\s\S]*?)<<<END/g;
|
|
9
|
+
/** Loose marker detection — models invent spacing/casing variants. */
|
|
10
|
+
const SEARCH_MARKER = /<<<\s*SEARCH/i;
|
|
8
11
|
function parsePatches(input) {
|
|
9
12
|
const patches = [];
|
|
10
13
|
let match;
|
|
14
|
+
// Reset lastIndex in case of prior exec on the shared regex.
|
|
15
|
+
PATCH_PATTERN.lastIndex = 0;
|
|
11
16
|
while ((match = PATCH_PATTERN.exec(input)) !== null) {
|
|
12
17
|
let replace = match[3];
|
|
13
18
|
if (replace.endsWith('\n')) {
|
|
@@ -30,6 +35,9 @@ function sortPatchesForApplication(patches) {
|
|
|
30
35
|
}
|
|
31
36
|
function applyPatchToLines(lines, patchText) {
|
|
32
37
|
const patches = sortPatchesForApplication(parsePatches(patchText));
|
|
38
|
+
if (patches.length === 0) {
|
|
39
|
+
throw new Error('No SEARCH/REPLACE blocks found in diff');
|
|
40
|
+
}
|
|
33
41
|
let nextLines = lines;
|
|
34
42
|
for (const patch of patches) {
|
|
35
43
|
nextLines = (0, hashline_tags_1.applyTaggedLinePatch)(nextLines, patch.range, patch.replace);
|
|
@@ -51,4 +59,68 @@ function applyPatch(ytext, patchText) {
|
|
|
51
59
|
}
|
|
52
60
|
});
|
|
53
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Decide how to interpret applySessionArtifactDiff input.
|
|
64
|
+
*
|
|
65
|
+
* Models often send a full page when hashline is hard, or malformed <<<SEARCH
|
|
66
|
+
* markers that previously fell through to applyPatchText and threw — after
|
|
67
|
+
* partial retries that left duplicated sections / orphaned script bodies.
|
|
68
|
+
*/
|
|
69
|
+
function looksLikeWholesaleHtml(html) {
|
|
70
|
+
var _a;
|
|
71
|
+
const looksLikeFullDocument = /<!DOCTYPE\s+html|<html[\s>]/i.test(html);
|
|
72
|
+
const sectionLikeCount = ((_a = html.match(/<(?:section|header|footer|main)[\s>]/gi)) !== null && _a !== void 0 ? _a : []).length;
|
|
73
|
+
const looksLikeFragmentPage = /<(?:header|main|footer)[\s>]/i.test(html) && html.length >= 600 && sectionLikeCount >= 2;
|
|
74
|
+
const looksLikeSubstantialBody = /<(?:main|body)[\s>]/i.test(html) && html.length >= 800;
|
|
75
|
+
return looksLikeFullDocument || looksLikeFragmentPage || looksLikeSubstantialBody;
|
|
76
|
+
}
|
|
77
|
+
/** Drop incomplete hashline marker lines so a botched patch can fall through
|
|
78
|
+
* to wholesale replace when the payload is actually a full page. */
|
|
79
|
+
function stripBrokenHashlineMarkers(diff) {
|
|
80
|
+
return diff
|
|
81
|
+
.replace(/^<<<\s*SEARCH[^\n]*\n?/gim, '')
|
|
82
|
+
.replace(/^>>>\s*REPLACE\s*\n?/gim, '')
|
|
83
|
+
.replace(/^<<<\s*END\s*$/gim, '')
|
|
84
|
+
.trim();
|
|
85
|
+
}
|
|
86
|
+
function classifyArtifactDiff(diff, options) {
|
|
87
|
+
const trimmed = diff.trim();
|
|
88
|
+
if (!trimmed) {
|
|
89
|
+
return {
|
|
90
|
+
kind: 'invalid',
|
|
91
|
+
reason: 'Empty diff — pass hashline SEARCH/REPLACE blocks or the complete new file contents.',
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const patches = parsePatches(trimmed);
|
|
95
|
+
if (patches.length > 0) {
|
|
96
|
+
return { kind: 'hashline', patchCount: patches.length };
|
|
97
|
+
}
|
|
98
|
+
// Mentions SEARCH but nothing parsed — try recovering a wholesale page
|
|
99
|
+
// (models often wrap a full rewrite in a broken <<<SEARCH). Otherwise reject.
|
|
100
|
+
if (SEARCH_MARKER.test(trimmed)) {
|
|
101
|
+
const recovered = stripBrokenHashlineMarkers(trimmed);
|
|
102
|
+
if (recovered && !SEARCH_MARKER.test(recovered)) {
|
|
103
|
+
if (!options.isHtml) {
|
|
104
|
+
return { kind: 'replace', content: recovered };
|
|
105
|
+
}
|
|
106
|
+
if (looksLikeWholesaleHtml(recovered)) {
|
|
107
|
+
return { kind: 'replace', content: recovered };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
kind: 'invalid',
|
|
112
|
+
reason: 'Malformed hashline diff: found <<<SEARCH but no complete <<<SEARCH … >>>REPLACE … <<<END blocks. Do NOT retry hashline — send the COMPLETE file contents with no SEARCH markers for a wholesale rewrite.',
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
if (!options.isHtml) {
|
|
116
|
+
return { kind: 'replace', content: trimmed };
|
|
117
|
+
}
|
|
118
|
+
if (looksLikeWholesaleHtml(trimmed)) {
|
|
119
|
+
return { kind: 'replace', content: trimmed };
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
kind: 'invalid',
|
|
123
|
+
reason: 'HTML diff is neither valid hashline SEARCH/REPLACE nor a complete page rewrite. For small edits use <<<SEARCH tag..tag >>>REPLACE … <<<END with fresh tags. For structural fixes (duplicates, broken script/footer, consistency polish) send the COMPLETE page body as diff with no SEARCH markers.',
|
|
124
|
+
};
|
|
125
|
+
}
|
|
54
126
|
//# sourceMappingURL=parse-hashline-diff.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-hashline-diff.js","sourceRoot":"","sources":["../../../src/lib/session-artifacts/parse-hashline-diff.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"parse-hashline-diff.js","sourceRoot":"","sources":["../../../src/lib/session-artifacts/parse-hashline-diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-quality-audit.d.ts","sourceRoot":"","sources":["../../../src/lib/session-pages/artifact-quality-audit.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAA;IAC7B,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,CAAA;IACd,QAAQ,EAAE,cAAc,EAAE,CAAA;CAC3B;AA+BD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,
|
|
1
|
+
{"version":3,"file":"artifact-quality-audit.d.ts","sourceRoot":"","sources":["../../../src/lib/session-pages/artifact-quality-audit.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAA;IAC7B,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,CAAA;IACd,QAAQ,EAAE,cAAc,EAAE,CAAA;CAC3B;AA+BD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAoTlE"}
|
|
@@ -149,25 +149,29 @@ function auditHtmlArtifact(html) {
|
|
|
149
149
|
// Contrast analysis is best-effort — never break the audit on it.
|
|
150
150
|
}
|
|
151
151
|
}
|
|
152
|
-
// Distinctive web fonts
|
|
153
|
-
//
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
152
|
+
// Distinctive web fonts: the shell auto-injects a Google Fonts <link> when
|
|
153
|
+
// missing (see ensureWebFontHeadExtras). Leftover gaps are advisory only —
|
|
154
|
+
// blocking publish on fonts caused endless "revising once" loops.
|
|
155
|
+
const hasFontLink = /fonts\.googleapis\.com|fonts\.gstatic\.com|fonts\.bunny\.net/i.test(html) ||
|
|
156
|
+
/<link[^>]+(?:fonts\.(?:googleapis|gstatic|bunny)\.com|css2\?family=)/i.test(html);
|
|
157
|
+
const hasFontFamily = /font-family\s*:/i.test(styles) || /font-family\s*:/i.test(html);
|
|
158
|
+
if (!hasFontLink || !hasFontFamily) {
|
|
157
159
|
findings.push({
|
|
158
160
|
rule: 'missing-web-font',
|
|
159
|
-
severity: '
|
|
160
|
-
message: '
|
|
161
|
+
severity: 'warning',
|
|
162
|
+
message: 'Web font incomplete — prefer a design-brief Google Fonts <link> plus font-family on body. The server usually injects a fallback pairing automatically.',
|
|
161
163
|
});
|
|
162
164
|
}
|
|
165
|
+
// Emoji are stripped in prepareHtmlArtifactContent before publish/update.
|
|
166
|
+
// Leftover glyphs (raw audit without prepare) are advisory — never block.
|
|
163
167
|
const emojiMatches = ((_e = markupOnly.match(/\p{Extended_Pictographic}/gu)) !== null && _e !== void 0 ? _e : []).filter((char) => !'©®™°†‡§¶'.includes(char));
|
|
164
168
|
if (emojiMatches.length > 0) {
|
|
165
169
|
findings.push({
|
|
166
170
|
rule: 'emoji-icons',
|
|
167
|
-
severity: '
|
|
171
|
+
severity: 'warning',
|
|
168
172
|
message: `${emojiMatches.length} emoji character(s) in the markup (${[...new Set(emojiMatches)]
|
|
169
173
|
.slice(0, 6)
|
|
170
|
-
.join(' ')}) —
|
|
174
|
+
.join(' ')}) — prefer inline SVG icons; the server strips emoji on publish/update.`,
|
|
171
175
|
});
|
|
172
176
|
}
|
|
173
177
|
const markupLength = markupOnly.length;
|
|
@@ -203,19 +207,20 @@ function auditHtmlArtifact(html) {
|
|
|
203
207
|
message: 'Generic sample data ("Item 1"…) found — use realistic, internally consistent examples.',
|
|
204
208
|
});
|
|
205
209
|
}
|
|
206
|
-
// Generic marketing filler —
|
|
210
|
+
// Generic marketing filler — server strips common phrases in prepareHtmlArtifactContent.
|
|
211
|
+
// Leftovers are advisory only so they cannot restart publish/revise loops.
|
|
207
212
|
if (/\bwelcome\s+to\s+(?:our|the)\b/i.test(markupOnly)) {
|
|
208
213
|
findings.push({
|
|
209
214
|
rule: 'template-copy',
|
|
210
|
-
severity: '
|
|
211
|
-
message: 'Template copy ("Welcome to our/the…") found —
|
|
215
|
+
severity: 'warning',
|
|
216
|
+
message: 'Template copy ("Welcome to our/the…") found — prefer leading with the product outcome. The server usually strips this phrase automatically.',
|
|
212
217
|
});
|
|
213
218
|
}
|
|
214
219
|
if (/\b(?:revolutionary|seamless|cutting-edge|unleash(?:ing)?|empower(?:ing)?)\b/i.test(markupOnly)) {
|
|
215
220
|
findings.push({
|
|
216
221
|
rule: 'template-copy',
|
|
217
|
-
severity: '
|
|
218
|
-
message: 'Banned template adjectives found (revolutionary/seamless/cutting-edge/unleash/empower) —
|
|
222
|
+
severity: 'warning',
|
|
223
|
+
message: 'Banned template adjectives found (revolutionary/seamless/cutting-edge/unleash/empower) — prefer concrete, domain-specific language. The server usually rewrites these automatically.',
|
|
219
224
|
});
|
|
220
225
|
}
|
|
221
226
|
// Inter is the default AI-page tell — designer skill and design brief forbid it.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-quality-audit.js","sourceRoot":"","sources":["../../../src/lib/session-pages/artifact-quality-audit.ts"],"names":[],"mappings":";;AA+CA,
|
|
1
|
+
{"version":3,"file":"artifact-quality-audit.js","sourceRoot":"","sources":["../../../src/lib/session-pages/artifact-quality-audit.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":"
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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":";;;
|
|
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"}
|
|
@@ -3,7 +3,23 @@ export interface WrapHtmlFragmentOptions {
|
|
|
3
3
|
lang?: string;
|
|
4
4
|
}
|
|
5
5
|
export declare function isHtmlFragment(content: string): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Repair missing webfont loading. Models often set font-family without the
|
|
8
|
+
* matching <link> (or forget both) — rejecting that caused endless revise loops.
|
|
9
|
+
* Prefer families already named in CSS; otherwise a non-Inter default pairing.
|
|
10
|
+
*/
|
|
11
|
+
export declare function ensureWebFontHeadExtras(html: string): string[];
|
|
6
12
|
export declare function wrapHtmlFragment(fragment: string, options?: WrapHtmlFragmentOptions): string;
|
|
13
|
+
/**
|
|
14
|
+
* Strip emoji-as-icons from markup. Models keep inserting 🚀/✨ then looping on
|
|
15
|
+
* the emoji-icons audit — repair beats reject.
|
|
16
|
+
*/
|
|
17
|
+
export declare function stripEmojiIcons(html: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Neutralize the most common "AI template" phrases that otherwise fail the
|
|
20
|
+
* template-copy audit and trigger revise loops.
|
|
21
|
+
*/
|
|
22
|
+
export declare function stripTemplateCopyPhrases(html: string): string;
|
|
7
23
|
export declare function prepareHtmlArtifactContent(content: string, options?: {
|
|
8
24
|
fragment?: boolean;
|
|
9
25
|
title?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-artifact-template.d.ts","sourceRoot":"","sources":["../../../src/lib/session-pages/html-artifact-template.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"html-artifact-template.d.ts","sourceRoot":"","sources":["../../../src/lib/session-pages/html-artifact-template.ts"],"names":[],"mappings":"AAiCA,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAID,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAsCD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAc9D;AAuCD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,MAAM,CAwBhG;AAsBD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ7D;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAClE,MAAM,CASR"}
|