Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions packages/core/src/components/TempDir.test.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -74,3 +74,34 @@ Without `as` the same form simply renders the path.
<Capture as="rendered"><TempDir /></Capture>
<AssertMatch actual={rendered} expected={/xmd-tempdir-/} />
</Test>

The directory belongs to the invocation, and so does everything the content
starts inside it. A daemon written by the caller is stopped before the
directory is removed, never after — a background process is never left
reaching for a directory that is already gone. The daemon reports what it saw
when it was signalled, into a second directory that outlives the first.

<Test name="A daemon in the content stops before the directory is removed">
<TempDir as="report" />
<TempDir>
```sh daemon exec
directory="$(pwd)"
trap 'if [ -d "$directory" ]; then echo ALIVE > {report}/observed; else echo GONE > {report}/observed; fi; exit 0' TERM
echo "$directory" > {report}/directory
while true; do sleep 0.1; done
```
```sh exec
i=0
while [ ! -s {report}/directory ] && [ $i -lt 50 ]; do sleep 0.1; i=$((i+1)); done
echo watching
```
</TempDir>
<Capture as="afterwards">
```sh exec
cat {report}/observed
test -d "$(cat {report}/directory)" || echo REMOVED
```
</Capture>
<AssertStringIncludes actual={afterwards} expected={"ALIVE"} />
<AssertStringIncludes actual={afterwards} expected={"REMOVED"} />
</Test>
55 changes: 55 additions & 0 deletions packages/core/tests/daemon-integration.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -118,6 +118,61 @@ describe("Tier Q — Daemon integration", () => {
}
});

// Q14: the caller writes the daemon and the component only projects it, so
// the process belongs to the content scope rather than to the component's
// own. It still stops with the invocation that hosted the projection.
//
// Both markers are load-bearing and both fail closed. `RUNNING` is printed
// only once the process has been seen alive from inside the component, so a
// daemon that never started cannot satisfy the premise; `STOPPED` is chosen
// only against a pid that exists, so a missing pid file reports NOPID rather
// than passing for the absence of a process.
it("Q14: a daemon in projected content is gone once the invocation completes", function* () {
const tmpDir = makeTempDir();

try {
const pidFile = path.join(tmpDir, "daemon.pid");
writeFiles(tmpDir, {
"components/Holder.md": "<Content />\n",
"doc.md": [
"<Holder>",
"",
"```bash daemon exec",
`sh -c 'echo $$ > ${pidFile}; while true; do sleep 1; done'`,
"```",
"",
"```bash exec",
`i=0; while [ ! -s ${pidFile} ] && [ $i -lt 50 ]; do sleep 0.1; i=$((i+1)); done`,
`if [ -s ${pidFile} ] && kill -0 "$(cat ${pidFile})" 2>/dev/null; then echo RUNNING; fi`,
"```",
"",
"</Holder>",
"",
"```bash exec",
`if [ ! -s ${pidFile} ]; then echo NOPID;`,
`elif kill -0 "$(cat ${pidFile})" 2>/dev/null; then echo LEAKED;`,
"else echo STOPPED; fi",
"```",
].join("\n"),
});

const stream = new InMemoryStream();
const output = yield* collect(
yield* execute({
path: path.join(tmpDir, "doc.md"),
stream,
componentDirs: [path.join(tmpDir, "components"), tmpDir],
}),
);

expect(output).toContain("RUNNING");
expect(output).toContain("STOPPED");
expect(output).not.toContain("LEAKED");
} finally {
cleanup(tmpDir);
}
});

// Q3: daemon returns empty output — no rendered output in document
it("Q3: daemon produces no rendered output", function* () {
const tmpDir = makeTempDir();
Expand Down
47 changes: 47 additions & 0 deletions packages/core/tests/eval-persist.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -190,6 +190,53 @@ describe("Tier T6 — persist modifier", () => {
expect(output).toContain("alive=false");
});

// L8: a persist block the caller projected into a component anchors in the
// content scope, so it stops ahead of a persist resource the component
// retained for itself — even though the component retained that one after
// projecting, which is the order a single scope would release in reverse.
it("L8: a projected persist resource stops before the component's own", function* () {
const stream = new InMemoryStream();
yield* useStubFs({
"components/Holder.md": [
"<Content />",
"",
"```js persist eval",
"globalThis.__l8.push('start:own');",
"yield* spawn(function*() {",
" try { yield* suspend(); } finally { globalThis.__l8.push('stop:own'); }",
"});",
"yield* sleep(1);",
"```",
].join("\n"),
"doc.md": [
"```js eval",
"globalThis.__l8 = [];",
"```",
"",
"<Holder>",
"",
"```js persist eval",
"globalThis.__l8.push('start:projected');",
"yield* spawn(function*() {",
" try { yield* suspend(); } finally { globalThis.__l8.push('stop:projected'); }",
"});",
"yield* sleep(1);",
"```",
"",
"</Holder>",
"",
"```js eval",
"output(globalThis.__l8.join(','));",
"```",
].join("\n"),
});
yield* useEchoExec();

const output = yield* collect(yield* execute({ path: "doc.md", stream }));

expect(output).toContain("start:projected,start:own,stop:projected,stop:own");
});

// T49b: persist eval retains spawned resource across blocks
// A background task spawned in a persist eval block sets status.ready
// after 10ms. The next eval block uses when() to converge on it.
Expand Down
2 changes: 2 additions & 0 deletions specs/executable-mdx-spec.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -6135,6 +6135,7 @@ visible warning blocks, gather into a separate error report).
| L5 | Multiple persist blocks in one component | Each retains its own resources independently |
| L6 | Persist on repeated run | Resource is created and retained again for the current component lifetime |
| L7 | Persist flag does not leak to sibling blocks | Non-persist block after persist block → flag is false |
| L8 | Projected persist stops before the component's own | A projected `persist` resource stops ahead of one the component retained *after* projecting: `start:projected, start:own, stop:projected, stop:own` |

### Tier M — Timeout modifier

Expand DownExpand Up@@ -6438,6 +6439,7 @@ visible warning blocks, gather into a separate error report).
| Q11 | Modifier chain: `bash daemon exec` | `daemon` is outermost terminal; `exec` present but never called |
| Q12 | Repeated run: daemon starts and stops | Process is spawned and terminated again |
| Q13 | Repeated run: current port used | Eval allocates a current port; daemon binds it |
| Q14 | Projected daemon terminated with the invocation | A daemon the caller wrote and the component only projected is gone in a block after the component; inside `<TempDir>` it is signalled while the directory still exists |

### Tier R — VM globals

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions packages/core/src/components/TempDir.test.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -74,3 +74,34 @@ Without `as` the same form simply renders the path.
<Capture as="rendered"><TempDir /></Capture>
<AssertMatch actual={rendered} expected={/xmd-tempdir-/} />
</Test>

The directory belongs to the invocation, and so does everything the content
starts inside it. A daemon written by the caller is stopped before the
directory is removed, never after — a background process is never left
reaching for a directory that is already gone. The daemon reports what it saw
when it was signalled, into a second directory that outlives the first.

<Test name="A daemon in the content stops before the directory is removed">
<TempDir as="report" />
<TempDir>
```sh daemon exec
directory="$(pwd)"
trap 'if [ -d "$directory" ]; then echo ALIVE > {report}/observed; else echo GONE > {report}/observed; fi; exit 0' TERM
echo "$directory" > {report}/directory
while true; do sleep 0.1; done
```
```sh exec
i=0
while [ ! -s {report}/directory ] && [ $i -lt 50 ]; do sleep 0.1; i=$((i+1)); done
echo watching
```
</TempDir>
<Capture as="afterwards">
```sh exec
cat {report}/observed
test -d "$(cat {report}/directory)" || echo REMOVED
```
</Capture>
<AssertStringIncludes actual={afterwards} expected={"ALIVE"} />
<AssertStringIncludes actual={afterwards} expected={"REMOVED"} />
</Test>
55 changes: 55 additions & 0 deletions packages/core/tests/daemon-integration.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -118,6 +118,61 @@ describe("Tier Q — Daemon integration", () => {
}
});

// Q14: the caller writes the daemon and the component only projects it, so
// the process belongs to the content scope rather than to the component's
// own. It still stops with the invocation that hosted the projection.
//
// Both markers are load-bearing and both fail closed. `RUNNING` is printed
// only once the process has been seen alive from inside the component, so a
// daemon that never started cannot satisfy the premise; `STOPPED` is chosen
// only against a pid that exists, so a missing pid file reports NOPID rather
// than passing for the absence of a process.
it("Q14: a daemon in projected content is gone once the invocation completes", function* () {
const tmpDir = makeTempDir();

try {
const pidFile = path.join(tmpDir, "daemon.pid");
writeFiles(tmpDir, {
"components/Holder.md": "<Content />\n",
"doc.md": [
"<Holder>",
"",
"```bash daemon exec",
`sh -c 'echo $$ > ${pidFile}; while true; do sleep 1; done'`,
"```",
"",
"```bash exec",
`i=0; while [ ! -s ${pidFile} ] && [ $i -lt 50 ]; do sleep 0.1; i=$((i+1)); done`,
`if [ -s ${pidFile} ] && kill -0 "$(cat ${pidFile})" 2>/dev/null; then echo RUNNING; fi`,
"```",
"",
"</Holder>",
"",
"```bash exec",
`if [ ! -s ${pidFile} ]; then echo NOPID;`,
`elif kill -0 "$(cat ${pidFile})" 2>/dev/null; then echo LEAKED;`,
"else echo STOPPED; fi",
"```",
].join("\n"),
});

const stream = new InMemoryStream();
const output = yield* collect(
yield* execute({
path: path.join(tmpDir, "doc.md"),
stream,
componentDirs: [path.join(tmpDir, "components"), tmpDir],
}),
);

expect(output).toContain("RUNNING");
expect(output).toContain("STOPPED");
expect(output).not.toContain("LEAKED");
} finally {
cleanup(tmpDir);
}
});

// Q3: daemon returns empty output — no rendered output in document
it("Q3: daemon produces no rendered output", function* () {
const tmpDir = makeTempDir();
Expand Down
47 changes: 47 additions & 0 deletions packages/core/tests/eval-persist.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -190,6 +190,53 @@ describe("Tier T6 — persist modifier", () => {
expect(output).toContain("alive=false");
});

// L8: a persist block the caller projected into a component anchors in the
// content scope, so it stops ahead of a persist resource the component
// retained for itself — even though the component retained that one after
// projecting, which is the order a single scope would release in reverse.
it("L8: a projected persist resource stops before the component's own", function* () {
const stream = new InMemoryStream();
yield* useStubFs({
"components/Holder.md": [
"<Content />",
"",
"```js persist eval",
"globalThis.__l8.push('start:own');",
"yield* spawn(function*() {",
" try { yield* suspend(); } finally { globalThis.__l8.push('stop:own'); }",
"});",
"yield* sleep(1);",
"```",
].join("\n"),
"doc.md": [
"```js eval",
"globalThis.__l8 = [];",
"```",
"",
"<Holder>",
"",
"```js persist eval",
"globalThis.__l8.push('start:projected');",
"yield* spawn(function*() {",
" try { yield* suspend(); } finally { globalThis.__l8.push('stop:projected'); }",
"});",
"yield* sleep(1);",
"```",
"",
"</Holder>",
"",
"```js eval",
"output(globalThis.__l8.join(','));",
"```",
].join("\n"),
});
yield* useEchoExec();

const output = yield* collect(yield* execute({ path: "doc.md", stream }));

expect(output).toContain("start:projected,start:own,stop:projected,stop:own");
});

// T49b: persist eval retains spawned resource across blocks
// A background task spawned in a persist eval block sets status.ready
// after 10ms. The next eval block uses when() to converge on it.
Expand Down
2 changes: 2 additions & 0 deletions specs/executable-mdx-spec.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -6135,6 +6135,7 @@ visible warning blocks, gather into a separate error report).
| L5 | Multiple persist blocks in one component | Each retains its own resources independently |
| L6 | Persist on repeated run | Resource is created and retained again for the current component lifetime |
| L7 | Persist flag does not leak to sibling blocks | Non-persist block after persist block → flag is false |
| L8 | Projected persist stops before the component's own | A projected `persist` resource stops ahead of one the component retained *after* projecting: `start:projected, start:own, stop:projected, stop:own` |

### Tier M — Timeout modifier

Expand DownExpand Up@@ -6438,6 +6439,7 @@ visible warning blocks, gather into a separate error report).
| Q11 | Modifier chain: `bash daemon exec` | `daemon` is outermost terminal; `exec` present but never called |
| Q12 | Repeated run: daemon starts and stops | Process is spawned and terminated again |
| Q13 | Repeated run: current port used | Eval allocates a current port; daemon binds it |
| Q14 | Projected daemon terminated with the invocation | A daemon the caller wrote and the component only projected is gone in a block after the component; inside `<TempDir>` it is signalled while the directory still exists |

### Tier R — VM globals

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions packages/core/src/components/TempDir.test.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -74,3 +74,34 @@ Without `as` the same form simply renders the path.
<Capture as="rendered"><TempDir /></Capture>
<AssertMatch actual={rendered} expected={/xmd-tempdir-/} />
</Test>

The directory belongs to the invocation, and so does everything the content
starts inside it. A daemon written by the caller is stopped before the
directory is removed, never after — a background process is never left
reaching for a directory that is already gone. The daemon reports what it saw
when it was signalled, into a second directory that outlives the first.

<Test name="A daemon in the content stops before the directory is removed">
<TempDir as="report" />
<TempDir>
```sh daemon exec
directory="$(pwd)"
trap 'if [ -d "$directory" ]; then echo ALIVE > {report}/observed; else echo GONE > {report}/observed; fi; exit 0' TERM
echo "$directory" > {report}/directory
while true; do sleep 0.1; done
```
```sh exec
i=0
while [ ! -s {report}/directory ] && [ $i -lt 50 ]; do sleep 0.1; i=$((i+1)); done
echo watching
```
</TempDir>
<Capture as="afterwards">
```sh exec
cat {report}/observed
test -d "$(cat {report}/directory)" || echo REMOVED
```
</Capture>
<AssertStringIncludes actual={afterwards} expected={"ALIVE"} />
<AssertStringIncludes actual={afterwards} expected={"REMOVED"} />
</Test>
55 changes: 55 additions & 0 deletions packages/core/tests/daemon-integration.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -118,6 +118,61 @@ describe("Tier Q — Daemon integration", () => {
}
});

// Q14: the caller writes the daemon and the component only projects it, so
// the process belongs to the content scope rather than to the component's
// own. It still stops with the invocation that hosted the projection.
//
// Both markers are load-bearing and both fail closed. `RUNNING` is printed
// only once the process has been seen alive from inside the component, so a
// daemon that never started cannot satisfy the premise; `STOPPED` is chosen
// only against a pid that exists, so a missing pid file reports NOPID rather
// than passing for the absence of a process.
it("Q14: a daemon in projected content is gone once the invocation completes", function* () {
const tmpDir = makeTempDir();

try {
const pidFile = path.join(tmpDir, "daemon.pid");
writeFiles(tmpDir, {
"components/Holder.md": "<Content />\n",
"doc.md": [
"<Holder>",
"",
"```bash daemon exec",
`sh -c 'echo $$ > ${pidFile}; while true; do sleep 1; done'`,
"```",
"",
"```bash exec",
`i=0; while [ ! -s ${pidFile} ] && [ $i -lt 50 ]; do sleep 0.1; i=$((i+1)); done`,
`if [ -s ${pidFile} ] && kill -0 "$(cat ${pidFile})" 2>/dev/null; then echo RUNNING; fi`,
"```",
"",
"</Holder>",
"",
"```bash exec",
`if [ ! -s ${pidFile} ]; then echo NOPID;`,
`elif kill -0 "$(cat ${pidFile})" 2>/dev/null; then echo LEAKED;`,
"else echo STOPPED; fi",
"```",
].join("\n"),
});

const stream = new InMemoryStream();
const output = yield* collect(
yield* execute({
path: path.join(tmpDir, "doc.md"),
stream,
componentDirs: [path.join(tmpDir, "components"), tmpDir],
}),
);

expect(output).toContain("RUNNING");
expect(output).toContain("STOPPED");
expect(output).not.toContain("LEAKED");
} finally {
cleanup(tmpDir);
}
});

// Q3: daemon returns empty output — no rendered output in document
it("Q3: daemon produces no rendered output", function* () {
const tmpDir = makeTempDir();
Expand Down
47 changes: 47 additions & 0 deletions packages/core/tests/eval-persist.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -190,6 +190,53 @@ describe("Tier T6 — persist modifier", () => {
expect(output).toContain("alive=false");
});

// L8: a persist block the caller projected into a component anchors in the
// content scope, so it stops ahead of a persist resource the component
// retained for itself — even though the component retained that one after
// projecting, which is the order a single scope would release in reverse.
it("L8: a projected persist resource stops before the component's own", function* () {
const stream = new InMemoryStream();
yield* useStubFs({
"components/Holder.md": [
"<Content />",
"",
"```js persist eval",
"globalThis.__l8.push('start:own');",
"yield* spawn(function*() {",
" try { yield* suspend(); } finally { globalThis.__l8.push('stop:own'); }",
"});",
"yield* sleep(1);",
"```",
].join("\n"),
"doc.md": [
"```js eval",
"globalThis.__l8 = [];",
"```",
"",
"<Holder>",
"",
"```js persist eval",
"globalThis.__l8.push('start:projected');",
"yield* spawn(function*() {",
" try { yield* suspend(); } finally { globalThis.__l8.push('stop:projected'); }",
"});",
"yield* sleep(1);",
"```",
"",
"</Holder>",
"",
"```js eval",
"output(globalThis.__l8.join(','));",
"```",
].join("\n"),
});
yield* useEchoExec();

const output = yield* collect(yield* execute({ path: "doc.md", stream }));

expect(output).toContain("start:projected,start:own,stop:projected,stop:own");
});

// T49b: persist eval retains spawned resource across blocks
// A background task spawned in a persist eval block sets status.ready
// after 10ms. The next eval block uses when() to converge on it.
Expand Down
2 changes: 2 additions & 0 deletions specs/executable-mdx-spec.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -6135,6 +6135,7 @@ visible warning blocks, gather into a separate error report).
| L5 | Multiple persist blocks in one component | Each retains its own resources independently |
| L6 | Persist on repeated run | Resource is created and retained again for the current component lifetime |
| L7 | Persist flag does not leak to sibling blocks | Non-persist block after persist block → flag is false |
| L8 | Projected persist stops before the component's own | A projected `persist` resource stops ahead of one the component retained *after* projecting: `start:projected, start:own, stop:projected, stop:own` |

### Tier M — Timeout modifier

Expand DownExpand Up@@ -6438,6 +6439,7 @@ visible warning blocks, gather into a separate error report).
| Q11 | Modifier chain: `bash daemon exec` | `daemon` is outermost terminal; `exec` present but never called |
| Q12 | Repeated run: daemon starts and stops | Process is spawned and terminated again |
| Q13 | Repeated run: current port used | Eval allocates a current port; daemon binds it |
| Q14 | Projected daemon terminated with the invocation | A daemon the caller wrote and the component only projected is gone in a block after the component; inside `<TempDir>` it is signalled while the directory still exists |

### Tier R — VM globals

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions packages/core/src/components/TempDir.test.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -74,3 +74,34 @@ Without `as` the same form simply renders the path.
<Capture as="rendered"><TempDir /></Capture>
<AssertMatch actual={rendered} expected={/xmd-tempdir-/} />
</Test>

The directory belongs to the invocation, and so does everything the content
starts inside it. A daemon written by the caller is stopped before the
directory is removed, never after — a background process is never left
reaching for a directory that is already gone. The daemon reports what it saw
when it was signalled, into a second directory that outlives the first.

<Test name="A daemon in the content stops before the directory is removed">
<TempDir as="report" />
<TempDir>
```sh daemon exec
directory="$(pwd)"
trap 'if [ -d "$directory" ]; then echo ALIVE > {report}/observed; else echo GONE > {report}/observed; fi; exit 0' TERM
echo "$directory" > {report}/directory
while true; do sleep 0.1; done
```
```sh exec
i=0
while [ ! -s {report}/directory ] && [ $i -lt 50 ]; do sleep 0.1; i=$((i+1)); done
echo watching
```
</TempDir>
<Capture as="afterwards">
```sh exec
cat {report}/observed
test -d "$(cat {report}/directory)" || echo REMOVED
```
</Capture>
<AssertStringIncludes actual={afterwards} expected={"ALIVE"} />
<AssertStringIncludes actual={afterwards} expected={"REMOVED"} />
</Test>
55 changes: 55 additions & 0 deletions packages/core/tests/daemon-integration.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -118,6 +118,61 @@ describe("Tier Q — Daemon integration", () => {
}
});

// Q14: the caller writes the daemon and the component only projects it, so
// the process belongs to the content scope rather than to the component's
// own. It still stops with the invocation that hosted the projection.
//
// Both markers are load-bearing and both fail closed. `RUNNING` is printed
// only once the process has been seen alive from inside the component, so a
// daemon that never started cannot satisfy the premise; `STOPPED` is chosen
// only against a pid that exists, so a missing pid file reports NOPID rather
// than passing for the absence of a process.
it("Q14: a daemon in projected content is gone once the invocation completes", function* () {
const tmpDir = makeTempDir();

try {
const pidFile = path.join(tmpDir, "daemon.pid");
writeFiles(tmpDir, {
"components/Holder.md": "<Content />\n",
"doc.md": [
"<Holder>",
"",
"```bash daemon exec",
`sh -c 'echo $$ > ${pidFile}; while true; do sleep 1; done'`,
"```",
"",
"```bash exec",
`i=0; while [ ! -s ${pidFile} ] && [ $i -lt 50 ]; do sleep 0.1; i=$((i+1)); done`,
`if [ -s ${pidFile} ] && kill -0 "$(cat ${pidFile})" 2>/dev/null; then echo RUNNING; fi`,
"```",
"",
"</Holder>",
"",
"```bash exec",
`if [ ! -s ${pidFile} ]; then echo NOPID;`,
`elif kill -0 "$(cat ${pidFile})" 2>/dev/null; then echo LEAKED;`,
"else echo STOPPED; fi",
"```",
].join("\n"),
});

const stream = new InMemoryStream();
const output = yield* collect(
yield* execute({
path: path.join(tmpDir, "doc.md"),
stream,
componentDirs: [path.join(tmpDir, "components"), tmpDir],
}),
);

expect(output).toContain("RUNNING");
expect(output).toContain("STOPPED");
expect(output).not.toContain("LEAKED");
} finally {
cleanup(tmpDir);
}
});

// Q3: daemon returns empty output — no rendered output in document
it("Q3: daemon produces no rendered output", function* () {
const tmpDir = makeTempDir();
Expand Down
47 changes: 47 additions & 0 deletions packages/core/tests/eval-persist.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -190,6 +190,53 @@ describe("Tier T6 — persist modifier", () => {
expect(output).toContain("alive=false");
});

// L8: a persist block the caller projected into a component anchors in the
// content scope, so it stops ahead of a persist resource the component
// retained for itself — even though the component retained that one after
// projecting, which is the order a single scope would release in reverse.
it("L8: a projected persist resource stops before the component's own", function* () {
const stream = new InMemoryStream();
yield* useStubFs({
"components/Holder.md": [
"<Content />",
"",
"```js persist eval",
"globalThis.__l8.push('start:own');",
"yield* spawn(function*() {",
" try { yield* suspend(); } finally { globalThis.__l8.push('stop:own'); }",
"});",
"yield* sleep(1);",
"```",
].join("\n"),
"doc.md": [
"```js eval",
"globalThis.__l8 = [];",
"```",
"",
"<Holder>",
"",
"```js persist eval",
"globalThis.__l8.push('start:projected');",
"yield* spawn(function*() {",
" try { yield* suspend(); } finally { globalThis.__l8.push('stop:projected'); }",
"});",
"yield* sleep(1);",
"```",
"",
"</Holder>",
"",
"```js eval",
"output(globalThis.__l8.join(','));",
"```",
].join("\n"),
});
yield* useEchoExec();

const output = yield* collect(yield* execute({ path: "doc.md", stream }));

expect(output).toContain("start:projected,start:own,stop:projected,stop:own");
});

// T49b: persist eval retains spawned resource across blocks
// A background task spawned in a persist eval block sets status.ready
// after 10ms. The next eval block uses when() to converge on it.
Expand Down
2 changes: 2 additions & 0 deletions specs/executable-mdx-spec.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -6135,6 +6135,7 @@ visible warning blocks, gather into a separate error report).
| L5 | Multiple persist blocks in one component | Each retains its own resources independently |
| L6 | Persist on repeated run | Resource is created and retained again for the current component lifetime |
| L7 | Persist flag does not leak to sibling blocks | Non-persist block after persist block → flag is false |
| L8 | Projected persist stops before the component's own | A projected `persist` resource stops ahead of one the component retained *after* projecting: `start:projected, start:own, stop:projected, stop:own` |

### Tier M — Timeout modifier

Expand DownExpand Up@@ -6438,6 +6439,7 @@ visible warning blocks, gather into a separate error report).
| Q11 | Modifier chain: `bash daemon exec` | `daemon` is outermost terminal; `exec` present but never called |
| Q12 | Repeated run: daemon starts and stops | Process is spawned and terminated again |
| Q13 | Repeated run: current port used | Eval allocates a current port; daemon binds it |
| Q14 | Projected daemon terminated with the invocation | A daemon the caller wrote and the component only projected is gone in a block after the component; inside `<TempDir>` it is signalled while the directory still exists |

### Tier R — VM globals

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions packages/core/src/components/TempDir.test.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -74,3 +74,34 @@ Without `as` the same form simply renders the path.
<Capture as="rendered"><TempDir /></Capture>
<AssertMatch actual={rendered} expected={/xmd-tempdir-/} />
</Test>

The directory belongs to the invocation, and so does everything the content
starts inside it. A daemon written by the caller is stopped before the
directory is removed, never after — a background process is never left
reaching for a directory that is already gone. The daemon reports what it saw
when it was signalled, into a second directory that outlives the first.

<Test name="A daemon in the content stops before the directory is removed">
<TempDir as="report" />
<TempDir>
```sh daemon exec
directory="$(pwd)"
trap 'if [ -d "$directory" ]; then echo ALIVE > {report}/observed; else echo GONE > {report}/observed; fi; exit 0' TERM
echo "$directory" > {report}/directory
while true; do sleep 0.1; done
```
```sh exec
i=0
while [ ! -s {report}/directory ] && [ $i -lt 50 ]; do sleep 0.1; i=$((i+1)); done
echo watching
```
</TempDir>
<Capture as="afterwards">
```sh exec
cat {report}/observed
test -d "$(cat {report}/directory)" || echo REMOVED
```
</Capture>
<AssertStringIncludes actual={afterwards} expected={"ALIVE"} />
<AssertStringIncludes actual={afterwards} expected={"REMOVED"} />
</Test>
55 changes: 55 additions & 0 deletions packages/core/tests/daemon-integration.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -118,6 +118,61 @@ describe("Tier Q — Daemon integration", () => {
}
});

// Q14: the caller writes the daemon and the component only projects it, so
// the process belongs to the content scope rather than to the component's
// own. It still stops with the invocation that hosted the projection.
//
// Both markers are load-bearing and both fail closed. `RUNNING` is printed
// only once the process has been seen alive from inside the component, so a
// daemon that never started cannot satisfy the premise; `STOPPED` is chosen
// only against a pid that exists, so a missing pid file reports NOPID rather
// than passing for the absence of a process.
it("Q14: a daemon in projected content is gone once the invocation completes", function* () {
const tmpDir = makeTempDir();

try {
const pidFile = path.join(tmpDir, "daemon.pid");
writeFiles(tmpDir, {
"components/Holder.md": "<Content />\n",
"doc.md": [
"<Holder>",
"",
"```bash daemon exec",
`sh -c 'echo $$ > ${pidFile}; while true; do sleep 1; done'`,
"```",
"",
"```bash exec",
`i=0; while [ ! -s ${pidFile} ] && [ $i -lt 50 ]; do sleep 0.1; i=$((i+1)); done`,
`if [ -s ${pidFile} ] && kill -0 "$(cat ${pidFile})" 2>/dev/null; then echo RUNNING; fi`,
"```",
"",
"</Holder>",
"",
"```bash exec",
`if [ ! -s ${pidFile} ]; then echo NOPID;`,
`elif kill -0 "$(cat ${pidFile})" 2>/dev/null; then echo LEAKED;`,
"else echo STOPPED; fi",
"```",
].join("\n"),
});

const stream = new InMemoryStream();
const output = yield* collect(
yield* execute({
path: path.join(tmpDir, "doc.md"),
stream,
componentDirs: [path.join(tmpDir, "components"), tmpDir],
}),
);

expect(output).toContain("RUNNING");
expect(output).toContain("STOPPED");
expect(output).not.toContain("LEAKED");
} finally {
cleanup(tmpDir);
}
});

// Q3: daemon returns empty output — no rendered output in document
it("Q3: daemon produces no rendered output", function* () {
const tmpDir = makeTempDir();
Expand Down
47 changes: 47 additions & 0 deletions packages/core/tests/eval-persist.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -190,6 +190,53 @@ describe("Tier T6 — persist modifier", () => {
expect(output).toContain("alive=false");
});

// L8: a persist block the caller projected into a component anchors in the
// content scope, so it stops ahead of a persist resource the component
// retained for itself — even though the component retained that one after
// projecting, which is the order a single scope would release in reverse.
it("L8: a projected persist resource stops before the component's own", function* () {
const stream = new InMemoryStream();
yield* useStubFs({
"components/Holder.md": [
"<Content />",
"",
"```js persist eval",
"globalThis.__l8.push('start:own');",
"yield* spawn(function*() {",
" try { yield* suspend(); } finally { globalThis.__l8.push('stop:own'); }",
"});",
"yield* sleep(1);",
"```",
].join("\n"),
"doc.md": [
"```js eval",
"globalThis.__l8 = [];",
"```",
"",
"<Holder>",
"",
"```js persist eval",
"globalThis.__l8.push('start:projected');",
"yield* spawn(function*() {",
" try { yield* suspend(); } finally { globalThis.__l8.push('stop:projected'); }",
"});",
"yield* sleep(1);",
"```",
"",
"</Holder>",
"",
"```js eval",
"output(globalThis.__l8.join(','));",
"```",
].join("\n"),
});
yield* useEchoExec();

const output = yield* collect(yield* execute({ path: "doc.md", stream }));

expect(output).toContain("start:projected,start:own,stop:projected,stop:own");
});

// T49b: persist eval retains spawned resource across blocks
// A background task spawned in a persist eval block sets status.ready
// after 10ms. The next eval block uses when() to converge on it.
Expand Down
2 changes: 2 additions & 0 deletions specs/executable-mdx-spec.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -6135,6 +6135,7 @@ visible warning blocks, gather into a separate error report).
| L5 | Multiple persist blocks in one component | Each retains its own resources independently |
| L6 | Persist on repeated run | Resource is created and retained again for the current component lifetime |
| L7 | Persist flag does not leak to sibling blocks | Non-persist block after persist block → flag is false |
| L8 | Projected persist stops before the component's own | A projected `persist` resource stops ahead of one the component retained *after* projecting: `start:projected, start:own, stop:projected, stop:own` |

### Tier M — Timeout modifier

Expand DownExpand Up@@ -6438,6 +6439,7 @@ visible warning blocks, gather into a separate error report).
| Q11 | Modifier chain: `bash daemon exec` | `daemon` is outermost terminal; `exec` present but never called |
| Q12 | Repeated run: daemon starts and stops | Process is spawned and terminated again |
| Q13 | Repeated run: current port used | Eval allocates a current port; daemon binds it |
| Q14 | Projected daemon terminated with the invocation | A daemon the caller wrote and the component only projected is gone in a block after the component; inside `<TempDir>` it is signalled while the directory still exists |

### Tier R — VM globals

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions packages/core/src/components/TempDir.test.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -74,3 +74,34 @@ Without `as` the same form simply renders the path.
<Capture as="rendered"><TempDir /></Capture>
<AssertMatch actual={rendered} expected={/xmd-tempdir-/} />
</Test>

The directory belongs to the invocation, and so does everything the content
starts inside it. A daemon written by the caller is stopped before the
directory is removed, never after — a background process is never left
reaching for a directory that is already gone. The daemon reports what it saw
when it was signalled, into a second directory that outlives the first.

<Test name="A daemon in the content stops before the directory is removed">
<TempDir as="report" />
<TempDir>
```sh daemon exec
directory="$(pwd)"
trap 'if [ -d "$directory" ]; then echo ALIVE > {report}/observed; else echo GONE > {report}/observed; fi; exit 0' TERM
echo "$directory" > {report}/directory
while true; do sleep 0.1; done
```
```sh exec
i=0
while [ ! -s {report}/directory ] && [ $i -lt 50 ]; do sleep 0.1; i=$((i+1)); done
echo watching
```
</TempDir>
<Capture as="afterwards">
```sh exec
cat {report}/observed
test -d "$(cat {report}/directory)" || echo REMOVED
```
</Capture>
<AssertStringIncludes actual={afterwards} expected={"ALIVE"} />
<AssertStringIncludes actual={afterwards} expected={"REMOVED"} />
</Test>
55 changes: 55 additions & 0 deletions packages/core/tests/daemon-integration.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -118,6 +118,61 @@ describe("Tier Q — Daemon integration", () => {
}
});

// Q14: the caller writes the daemon and the component only projects it, so
// the process belongs to the content scope rather than to the component's
// own. It still stops with the invocation that hosted the projection.
//
// Both markers are load-bearing and both fail closed. `RUNNING` is printed
// only once the process has been seen alive from inside the component, so a
// daemon that never started cannot satisfy the premise; `STOPPED` is chosen
// only against a pid that exists, so a missing pid file reports NOPID rather
// than passing for the absence of a process.
it("Q14: a daemon in projected content is gone once the invocation completes", function* () {
const tmpDir = makeTempDir();

try {
const pidFile = path.join(tmpDir, "daemon.pid");
writeFiles(tmpDir, {
"components/Holder.md": "<Content />\n",
"doc.md": [
"<Holder>",
"",
"```bash daemon exec",
`sh -c 'echo $$ > ${pidFile}; while true; do sleep 1; done'`,
"```",
"",
"```bash exec",
`i=0; while [ ! -s ${pidFile} ] && [ $i -lt 50 ]; do sleep 0.1; i=$((i+1)); done`,
`if [ -s ${pidFile} ] && kill -0 "$(cat ${pidFile})" 2>/dev/null; then echo RUNNING; fi`,
"```",
"",
"</Holder>",
"",
"```bash exec",
`if [ ! -s ${pidFile} ]; then echo NOPID;`,
`elif kill -0 "$(cat ${pidFile})" 2>/dev/null; then echo LEAKED;`,
"else echo STOPPED; fi",
"```",
].join("\n"),
});

const stream = new InMemoryStream();
const output = yield* collect(
yield* execute({
path: path.join(tmpDir, "doc.md"),
stream,
componentDirs: [path.join(tmpDir, "components"), tmpDir],
}),
);

expect(output).toContain("RUNNING");
expect(output).toContain("STOPPED");
expect(output).not.toContain("LEAKED");
} finally {
cleanup(tmpDir);
}
});

// Q3: daemon returns empty output — no rendered output in document
it("Q3: daemon produces no rendered output", function* () {
const tmpDir = makeTempDir();
Expand Down
47 changes: 47 additions & 0 deletions packages/core/tests/eval-persist.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -190,6 +190,53 @@ describe("Tier T6 — persist modifier", () => {
expect(output).toContain("alive=false");
});

// L8: a persist block the caller projected into a component anchors in the
// content scope, so it stops ahead of a persist resource the component
// retained for itself — even though the component retained that one after
// projecting, which is the order a single scope would release in reverse.
it("L8: a projected persist resource stops before the component's own", function* () {
const stream = new InMemoryStream();
yield* useStubFs({
"components/Holder.md": [
"<Content />",
"",
"```js persist eval",
"globalThis.__l8.push('start:own');",
"yield* spawn(function*() {",
" try { yield* suspend(); } finally { globalThis.__l8.push('stop:own'); }",
"});",
"yield* sleep(1);",
"```",
].join("\n"),
"doc.md": [
"```js eval",
"globalThis.__l8 = [];",
"```",
"",
"<Holder>",
"",
"```js persist eval",
"globalThis.__l8.push('start:projected');",
"yield* spawn(function*() {",
" try { yield* suspend(); } finally { globalThis.__l8.push('stop:projected'); }",
"});",
"yield* sleep(1);",
"```",
"",
"</Holder>",
"",
"```js eval",
"output(globalThis.__l8.join(','));",
"```",
].join("\n"),
});
yield* useEchoExec();

const output = yield* collect(yield* execute({ path: "doc.md", stream }));

expect(output).toContain("start:projected,start:own,stop:projected,stop:own");
});

// T49b: persist eval retains spawned resource across blocks
// A background task spawned in a persist eval block sets status.ready
// after 10ms. The next eval block uses when() to converge on it.
Expand Down
2 changes: 2 additions & 0 deletions specs/executable-mdx-spec.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -6135,6 +6135,7 @@ visible warning blocks, gather into a separate error report).
| L5 | Multiple persist blocks in one component | Each retains its own resources independently |
| L6 | Persist on repeated run | Resource is created and retained again for the current component lifetime |
| L7 | Persist flag does not leak to sibling blocks | Non-persist block after persist block → flag is false |
| L8 | Projected persist stops before the component's own | A projected `persist` resource stops ahead of one the component retained *after* projecting: `start:projected, start:own, stop:projected, stop:own` |

### Tier M — Timeout modifier

Expand DownExpand Up@@ -6438,6 +6439,7 @@ visible warning blocks, gather into a separate error report).
| Q11 | Modifier chain: `bash daemon exec` | `daemon` is outermost terminal; `exec` present but never called |
| Q12 | Repeated run: daemon starts and stops | Process is spawned and terminated again |
| Q13 | Repeated run: current port used | Eval allocates a current port; daemon binds it |
| Q14 | Projected daemon terminated with the invocation | A daemon the caller wrote and the component only projected is gone in a block after the component; inside `<TempDir>` it is signalled while the directory still exists |

### Tier R — VM globals

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions packages/core/src/components/TempDir.test.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -74,3 +74,34 @@ Without `as` the same form simply renders the path.
<Capture as="rendered"><TempDir /></Capture>
<AssertMatch actual={rendered} expected={/xmd-tempdir-/} />
</Test>

The directory belongs to the invocation, and so does everything the content
starts inside it. A daemon written by the caller is stopped before the
directory is removed, never after — a background process is never left
reaching for a directory that is already gone. The daemon reports what it saw
when it was signalled, into a second directory that outlives the first.

<Test name="A daemon in the content stops before the directory is removed">
<TempDir as="report" />
<TempDir>
```sh daemon exec
directory="$(pwd)"
trap 'if [ -d "$directory" ]; then echo ALIVE > {report}/observed; else echo GONE > {report}/observed; fi; exit 0' TERM
echo "$directory" > {report}/directory
while true; do sleep 0.1; done
```
```sh exec
i=0
while [ ! -s {report}/directory ] && [ $i -lt 50 ]; do sleep 0.1; i=$((i+1)); done
echo watching
```
</TempDir>
<Capture as="afterwards">
```sh exec
cat {report}/observed
test -d "$(cat {report}/directory)" || echo REMOVED
```
</Capture>
<AssertStringIncludes actual={afterwards} expected={"ALIVE"} />
<AssertStringIncludes actual={afterwards} expected={"REMOVED"} />
</Test>
55 changes: 55 additions & 0 deletions packages/core/tests/daemon-integration.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -118,6 +118,61 @@ describe("Tier Q — Daemon integration", () => {
}
});

// Q14: the caller writes the daemon and the component only projects it, so
// the process belongs to the content scope rather than to the component's
// own. It still stops with the invocation that hosted the projection.
//
// Both markers are load-bearing and both fail closed. `RUNNING` is printed
// only once the process has been seen alive from inside the component, so a
// daemon that never started cannot satisfy the premise; `STOPPED` is chosen
// only against a pid that exists, so a missing pid file reports NOPID rather
// than passing for the absence of a process.
it("Q14: a daemon in projected content is gone once the invocation completes", function* () {
const tmpDir = makeTempDir();

try {
const pidFile = path.join(tmpDir, "daemon.pid");
writeFiles(tmpDir, {
"components/Holder.md": "<Content />\n",
"doc.md": [
"<Holder>",
"",
"```bash daemon exec",
`sh -c 'echo $$ > ${pidFile}; while true; do sleep 1; done'`,
"```",
"",
"```bash exec",
`i=0; while [ ! -s ${pidFile} ] && [ $i -lt 50 ]; do sleep 0.1; i=$((i+1)); done`,
`if [ -s ${pidFile} ] && kill -0 "$(cat ${pidFile})" 2>/dev/null; then echo RUNNING; fi`,
"```",
"",
"</Holder>",
"",
"```bash exec",
`if [ ! -s ${pidFile} ]; then echo NOPID;`,
`elif kill -0 "$(cat ${pidFile})" 2>/dev/null; then echo LEAKED;`,
"else echo STOPPED; fi",
"```",
].join("\n"),
});

const stream = new InMemoryStream();
const output = yield* collect(
yield* execute({
path: path.join(tmpDir, "doc.md"),
stream,
componentDirs: [path.join(tmpDir, "components"), tmpDir],
}),
);

expect(output).toContain("RUNNING");
expect(output).toContain("STOPPED");
expect(output).not.toContain("LEAKED");
} finally {
cleanup(tmpDir);
}
});

// Q3: daemon returns empty output — no rendered output in document
it("Q3: daemon produces no rendered output", function* () {
const tmpDir = makeTempDir();
Expand Down
47 changes: 47 additions & 0 deletions packages/core/tests/eval-persist.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -190,6 +190,53 @@ describe("Tier T6 — persist modifier", () => {
expect(output).toContain("alive=false");
});

// L8: a persist block the caller projected into a component anchors in the
// content scope, so it stops ahead of a persist resource the component
// retained for itself — even though the component retained that one after
// projecting, which is the order a single scope would release in reverse.
it("L8: a projected persist resource stops before the component's own", function* () {
const stream = new InMemoryStream();
yield* useStubFs({
"components/Holder.md": [
"<Content />",
"",
"```js persist eval",
"globalThis.__l8.push('start:own');",
"yield* spawn(function*() {",
" try { yield* suspend(); } finally { globalThis.__l8.push('stop:own'); }",
"});",
"yield* sleep(1);",
"```",
].join("\n"),
"doc.md": [
"```js eval",
"globalThis.__l8 = [];",
"```",
"",
"<Holder>",
"",
"```js persist eval",
"globalThis.__l8.push('start:projected');",
"yield* spawn(function*() {",
" try { yield* suspend(); } finally { globalThis.__l8.push('stop:projected'); }",
"});",
"yield* sleep(1);",
"```",
"",
"</Holder>",
"",
"```js eval",
"output(globalThis.__l8.join(','));",
"```",
].join("\n"),
});
yield* useEchoExec();

const output = yield* collect(yield* execute({ path: "doc.md", stream }));

expect(output).toContain("start:projected,start:own,stop:projected,stop:own");
});

// T49b: persist eval retains spawned resource across blocks
// A background task spawned in a persist eval block sets status.ready
// after 10ms. The next eval block uses when() to converge on it.
Expand Down
2 changes: 2 additions & 0 deletions specs/executable-mdx-spec.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -6135,6 +6135,7 @@ visible warning blocks, gather into a separate error report).
| L5 | Multiple persist blocks in one component | Each retains its own resources independently |
| L6 | Persist on repeated run | Resource is created and retained again for the current component lifetime |
| L7 | Persist flag does not leak to sibling blocks | Non-persist block after persist block → flag is false |
| L8 | Projected persist stops before the component's own | A projected `persist` resource stops ahead of one the component retained *after* projecting: `start:projected, start:own, stop:projected, stop:own` |

### Tier M — Timeout modifier

Expand DownExpand Up@@ -6438,6 +6439,7 @@ visible warning blocks, gather into a separate error report).
| Q11 | Modifier chain: `bash daemon exec` | `daemon` is outermost terminal; `exec` present but never called |
| Q12 | Repeated run: daemon starts and stops | Process is spawned and terminated again |
| Q13 | Repeated run: current port used | Eval allocates a current port; daemon binds it |
| Q14 | Projected daemon terminated with the invocation | A daemon the caller wrote and the component only projected is gone in a block after the component; inside `<TempDir>` it is signalled while the directory still exists |

### Tier R — VM globals

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions packages/core/src/components/TempDir.test.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -74,3 +74,34 @@ Without `as` the same form simply renders the path.
<Capture as="rendered"><TempDir /></Capture>
<AssertMatch actual={rendered} expected={/xmd-tempdir-/} />
</Test>

The directory belongs to the invocation, and so does everything the content
starts inside it. A daemon written by the caller is stopped before the
directory is removed, never after — a background process is never left
reaching for a directory that is already gone. The daemon reports what it saw
when it was signalled, into a second directory that outlives the first.

<Test name="A daemon in the content stops before the directory is removed">
<TempDir as="report" />
<TempDir>
```sh daemon exec
directory="$(pwd)"
trap 'if [ -d "$directory" ]; then echo ALIVE > {report}/observed; else echo GONE > {report}/observed; fi; exit 0' TERM
echo "$directory" > {report}/directory
while true; do sleep 0.1; done
```
```sh exec
i=0
while [ ! -s {report}/directory ] && [ $i -lt 50 ]; do sleep 0.1; i=$((i+1)); done
echo watching
```
</TempDir>
<Capture as="afterwards">
```sh exec
cat {report}/observed
test -d "$(cat {report}/directory)" || echo REMOVED
```
</Capture>
<AssertStringIncludes actual={afterwards} expected={"ALIVE"} />
<AssertStringIncludes actual={afterwards} expected={"REMOVED"} />
</Test>
55 changes: 55 additions & 0 deletions packages/core/tests/daemon-integration.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -118,6 +118,61 @@ describe("Tier Q — Daemon integration", () => {
}
});

// Q14: the caller writes the daemon and the component only projects it, so
// the process belongs to the content scope rather than to the component's
// own. It still stops with the invocation that hosted the projection.
//
// Both markers are load-bearing and both fail closed. `RUNNING` is printed
// only once the process has been seen alive from inside the component, so a
// daemon that never started cannot satisfy the premise; `STOPPED` is chosen
// only against a pid that exists, so a missing pid file reports NOPID rather
// than passing for the absence of a process.
it("Q14: a daemon in projected content is gone once the invocation completes", function* () {
const tmpDir = makeTempDir();

try {
const pidFile = path.join(tmpDir, "daemon.pid");
writeFiles(tmpDir, {
"components/Holder.md": "<Content />\n",
"doc.md": [
"<Holder>",
"",
"```bash daemon exec",
`sh -c 'echo $$ > ${pidFile}; while true; do sleep 1; done'`,
"```",
"",
"```bash exec",
`i=0; while [ ! -s ${pidFile} ] && [ $i -lt 50 ]; do sleep 0.1; i=$((i+1)); done`,
`if [ -s ${pidFile} ] && kill -0 "$(cat ${pidFile})" 2>/dev/null; then echo RUNNING; fi`,
"```",
"",
"</Holder>",
"",
"```bash exec",
`if [ ! -s ${pidFile} ]; then echo NOPID;`,
`elif kill -0 "$(cat ${pidFile})" 2>/dev/null; then echo LEAKED;`,
"else echo STOPPED; fi",
"```",
].join("\n"),
});

const stream = new InMemoryStream();
const output = yield* collect(
yield* execute({
path: path.join(tmpDir, "doc.md"),
stream,
componentDirs: [path.join(tmpDir, "components"), tmpDir],
}),
);

expect(output).toContain("RUNNING");
expect(output).toContain("STOPPED");
expect(output).not.toContain("LEAKED");
} finally {
cleanup(tmpDir);
}
});

// Q3: daemon returns empty output — no rendered output in document
it("Q3: daemon produces no rendered output", function* () {
const tmpDir = makeTempDir();
Expand Down
47 changes: 47 additions & 0 deletions packages/core/tests/eval-persist.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -190,6 +190,53 @@ describe("Tier T6 — persist modifier", () => {
expect(output).toContain("alive=false");
});

// L8: a persist block the caller projected into a component anchors in the
// content scope, so it stops ahead of a persist resource the component
// retained for itself — even though the component retained that one after
// projecting, which is the order a single scope would release in reverse.
it("L8: a projected persist resource stops before the component's own", function* () {
const stream = new InMemoryStream();
yield* useStubFs({
"components/Holder.md": [
"<Content />",
"",
"```js persist eval",
"globalThis.__l8.push('start:own');",
"yield* spawn(function*() {",
" try { yield* suspend(); } finally { globalThis.__l8.push('stop:own'); }",
"});",
"yield* sleep(1);",
"```",
].join("\n"),
"doc.md": [
"```js eval",
"globalThis.__l8 = [];",
"```",
"",
"<Holder>",
"",
"```js persist eval",
"globalThis.__l8.push('start:projected');",
"yield* spawn(function*() {",
" try { yield* suspend(); } finally { globalThis.__l8.push('stop:projected'); }",
"});",
"yield* sleep(1);",
"```",
"",
"</Holder>",
"",
"```js eval",
"output(globalThis.__l8.join(','));",
"```",
].join("\n"),
});
yield* useEchoExec();

const output = yield* collect(yield* execute({ path: "doc.md", stream }));

expect(output).toContain("start:projected,start:own,stop:projected,stop:own");
});

// T49b: persist eval retains spawned resource across blocks
// A background task spawned in a persist eval block sets status.ready
// after 10ms. The next eval block uses when() to converge on it.
Expand Down
2 changes: 2 additions & 0 deletions specs/executable-mdx-spec.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -6135,6 +6135,7 @@ visible warning blocks, gather into a separate error report).
| L5 | Multiple persist blocks in one component | Each retains its own resources independently |
| L6 | Persist on repeated run | Resource is created and retained again for the current component lifetime |
| L7 | Persist flag does not leak to sibling blocks | Non-persist block after persist block → flag is false |
| L8 | Projected persist stops before the component's own | A projected `persist` resource stops ahead of one the component retained *after* projecting: `start:projected, start:own, stop:projected, stop:own` |

### Tier M — Timeout modifier

Expand DownExpand Up@@ -6438,6 +6439,7 @@ visible warning blocks, gather into a separate error report).
| Q11 | Modifier chain: `bash daemon exec` | `daemon` is outermost terminal; `exec` present but never called |
| Q12 | Repeated run: daemon starts and stops | Process is spawned and terminated again |
| Q13 | Repeated run: current port used | Eval allocates a current port; daemon binds it |
| Q14 | Projected daemon terminated with the invocation | A daemon the caller wrote and the component only projected is gone in a block after the component; inside `<TempDir>` it is signalled while the directory still exists |

### Tier R — VM globals

Expand Down
Loading