Skip to content

emrg: TUI user messages render as markdown + stop_all self-held lock attribution - #847

Merged
argszero merged 1 commit into
masterfrom
feature/user-markdown-and-stop-selfheld
Aug 18, 2026
Merged

emrg: TUI user messages render as markdown + stop_all self-held lock attribution#847
argszero merged 1 commit into
masterfrom
feature/user-markdown-and-stop-selfheld

Conversation

@argszero

Copy link
Copy Markdown
Owner

Two small fixes from host rants:

1. TUI user messages render as markdown (rant 2026-08-18T18:52:45, Plan B, superseding 18:50:14)

User messages in the TUI previously went through ChatRow, which split on \n but did not wrap to the terminal width — the buffer's width cap then truncated anything beyond one row. Per host-confirmed Plan B, user messages now render through the same Rich markdown pipeline as assistant messages (width-based wrapping + CJK wide-char handling), via a new UserMarkdown widget that preserves the > prefix + bold cyan role visual:

  • emrg/client/python_tui/widgets/markdown.py: new UserMarkdown (static Markdown rendered at ctx.width - len(prefix) so the first-line prefix never overflows; continuation lines get a same-width indent)
  • emrg/client/widgets.py: ChatHistory.add('user', ...) routes to UserMarkdown; update_last() also updates UserMarkdown rows (assistant plain-text fallback path); system/tool/assistant roles unchanged (ChatRow)
  • tests/test_user_markdown.py: 6 tests — wrap/no-content-loss, markdown styling, CJK boundary, ChatHistory routing, update_last

2. stop_all: self-held python-dist locks no longer abort the install (rant 2026-08-18T18:57:09)

v0.2.49 evidence: stop_all killed the external browser-harness holder but then aborted because verify counted 12 python-dist DLLs (python313.dll, select.pyd, ...) held by stop_all's own runtime as residuals. Those locks are released when stop_all exits — and the installer runs stop_all synchronously (ewWaitUntilTerminated) before overwriting, so the abort was a false positive.

  • emrg/_stop_all.py: new _classify_locked_files() — createfile-probe locked files attributed to module-holder processes; files held only by excluded (self/ancestor) holders are self-held (advisory WARNING), only external-holder or unattributable locks stay residuals; final self-lock guard message changed from "installer will fail; re-run installer" to advisory "released when stop_all exits; installer continues"
  • tests/test_installer_stop.py: 4 new unit tests for the attribution (self-held / external / unattributable / mixed) + updated assertions for the new advisory text

Verification

  • pytest: 961 passed + 1 skipped (962 collected) — Agent.md count synced 952 → 962
  • import + CLI checks pass; GUI npm test 259 pass

…attribution
Rant 2026-08-18T18:52:45 (Plan B, superseding 18:50:14): user messages in
the TUI now render through the same Rich markdown pipeline as assistant
messages (width-based wrapping, CJK handling) via a new UserMarkdown
widget, while keeping the "> " prefix + bold cyan role visual.
ChatHistory.add('user', ...) routes to UserMarkdown; system/tool/assistant
stay on ChatRow. update_last() handles UserMarkdown rows for the assistant
plain-text fallback path. +6 tests.
Rant 2026-08-18T18:57:09: stop_all no longer aborts installs whose only
locked files are python-dist DLLs held by stop_all's own runtime (the
interpreter must load them; they are released when stop_all exits, before
the installer overwrites via ewWaitUntilTerminated). createfile-probe
verify now attributes locked files to module-holder processes —
self/excluded-ancestor-held locks are self-held (advisory WARNING), only
external-holder or unattributable locks are residuals. Final self-lock
guard message changed from "installer will fail" to advisory. +4 tests.
Agent.md test count 952 -> 962.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 746: two host-rant fixes. ① Plan B user messages → UserMarkdown (Rich markdown pipeline = free width wrap + CJK, > prefix + cyan preserved; ChatHistory routes user→UserMarkdown, others stay ChatRow; update_last handles both). ② stop_all self-held attribution — _classify_locked_files splits self/excluded-ancestor-held locks (advisory, released on exit) from external/unattributable residuals (abort); final guard text advisory. Verified: pytest 961+1 (962), import+CLI OK, GUI 259; CI test+test-windows PASS.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 747 (2nd, independent re-review): head db0b000 unchanged since 746, CI test+test-windows PASS (run 32130391015), MERGEABLE CLEAN. Re-verified diff: ① UserMarkdown — static Rich markdown at ctx.width-len(prefix), > bold-cyan first-line lead + same-width indent continuations; ChatHistory.add routes 'user' only; update_last covers UserMarkdown; assistant/system/tool untouched. ② stop_all — _classify_locked_files pure fn (separator-agnostic norm, self/excluded-ancestor-held → self-held advisory, external/unattributable → residual conservative); verify wiring correct (mh_holders computed before probe block); final guard advisory text. _install_root() dedup + check_install_writable uses it. 10 tests (6+4) + doc count 962. No ❌ — 2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 748 (3rd, independent re-review): head db0b000 unchanged since 747, CI test+test-windows PASS (run 32130391015), MERGEABLE CLEAN. 6 files (Agent.md, emrg/_stop_all.py, markdown.py, widgets.py, test_installer_stop.py, test_user_markdown.py) match the two-rant scope. 3/3 consecutive ✅ from cycles 746/747/748, no ❌ — merging.

@argszero
argszero merged commit 198ef51 into masterAug 18, 2026
2 checks passed
@argszero
argszero deleted the feature/user-markdown-and-stop-selfheld branch August 18, 2026 11:20
argszero added a commit that referenced this pull request Aug 18, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@argszero
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
emrg: TUI user messages render as markdown + stop_all self-held lock attribution by argszero · Pull Request #847 · argszero/emrg · GitHub
Skip to content

emrg: TUI user messages render as markdown + stop_all self-held lock attribution - #847

Merged
argszero merged 1 commit into
masterfrom
feature/user-markdown-and-stop-selfheld
Aug 18, 2026
Merged

emrg: TUI user messages render as markdown + stop_all self-held lock attribution#847
argszero merged 1 commit into
masterfrom
feature/user-markdown-and-stop-selfheld

Conversation

@argszero

Copy link
Copy Markdown
Owner

Two small fixes from host rants:

1. TUI user messages render as markdown (rant 2026-08-18T18:52:45, Plan B, superseding 18:50:14)

User messages in the TUI previously went through ChatRow, which split on \n but did not wrap to the terminal width — the buffer's width cap then truncated anything beyond one row. Per host-confirmed Plan B, user messages now render through the same Rich markdown pipeline as assistant messages (width-based wrapping + CJK wide-char handling), via a new UserMarkdown widget that preserves the > prefix + bold cyan role visual:

  • emrg/client/python_tui/widgets/markdown.py: new UserMarkdown (static Markdown rendered at ctx.width - len(prefix) so the first-line prefix never overflows; continuation lines get a same-width indent)
  • emrg/client/widgets.py: ChatHistory.add('user', ...) routes to UserMarkdown; update_last() also updates UserMarkdown rows (assistant plain-text fallback path); system/tool/assistant roles unchanged (ChatRow)
  • tests/test_user_markdown.py: 6 tests — wrap/no-content-loss, markdown styling, CJK boundary, ChatHistory routing, update_last

2. stop_all: self-held python-dist locks no longer abort the install (rant 2026-08-18T18:57:09)

v0.2.49 evidence: stop_all killed the external browser-harness holder but then aborted because verify counted 12 python-dist DLLs (python313.dll, select.pyd, ...) held by stop_all's own runtime as residuals. Those locks are released when stop_all exits — and the installer runs stop_all synchronously (ewWaitUntilTerminated) before overwriting, so the abort was a false positive.

  • emrg/_stop_all.py: new _classify_locked_files() — createfile-probe locked files attributed to module-holder processes; files held only by excluded (self/ancestor) holders are self-held (advisory WARNING), only external-holder or unattributable locks stay residuals; final self-lock guard message changed from "installer will fail; re-run installer" to advisory "released when stop_all exits; installer continues"
  • tests/test_installer_stop.py: 4 new unit tests for the attribution (self-held / external / unattributable / mixed) + updated assertions for the new advisory text

Verification

  • pytest: 961 passed + 1 skipped (962 collected) — Agent.md count synced 952 → 962
  • import + CLI checks pass; GUI npm test 259 pass

…attribution
Rant 2026-08-18T18:52:45 (Plan B, superseding 18:50:14): user messages in
the TUI now render through the same Rich markdown pipeline as assistant
messages (width-based wrapping, CJK handling) via a new UserMarkdown
widget, while keeping the "> " prefix + bold cyan role visual.
ChatHistory.add('user', ...) routes to UserMarkdown; system/tool/assistant
stay on ChatRow. update_last() handles UserMarkdown rows for the assistant
plain-text fallback path. +6 tests.
Rant 2026-08-18T18:57:09: stop_all no longer aborts installs whose only
locked files are python-dist DLLs held by stop_all's own runtime (the
interpreter must load them; they are released when stop_all exits, before
the installer overwrites via ewWaitUntilTerminated). createfile-probe
verify now attributes locked files to module-holder processes —
self/excluded-ancestor-held locks are self-held (advisory WARNING), only
external-holder or unattributable locks are residuals. Final self-lock
guard message changed from "installer will fail" to advisory. +4 tests.
Agent.md test count 952 -> 962.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 746: two host-rant fixes. ① Plan B user messages → UserMarkdown (Rich markdown pipeline = free width wrap + CJK, > prefix + cyan preserved; ChatHistory routes user→UserMarkdown, others stay ChatRow; update_last handles both). ② stop_all self-held attribution — _classify_locked_files splits self/excluded-ancestor-held locks (advisory, released on exit) from external/unattributable residuals (abort); final guard text advisory. Verified: pytest 961+1 (962), import+CLI OK, GUI 259; CI test+test-windows PASS.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 747 (2nd, independent re-review): head db0b000 unchanged since 746, CI test+test-windows PASS (run 32130391015), MERGEABLE CLEAN. Re-verified diff: ① UserMarkdown — static Rich markdown at ctx.width-len(prefix), > bold-cyan first-line lead + same-width indent continuations; ChatHistory.add routes 'user' only; update_last covers UserMarkdown; assistant/system/tool untouched. ② stop_all — _classify_locked_files pure fn (separator-agnostic norm, self/excluded-ancestor-held → self-held advisory, external/unattributable → residual conservative); verify wiring correct (mh_holders computed before probe block); final guard advisory text. _install_root() dedup + check_install_writable uses it. 10 tests (6+4) + doc count 962. No ❌ — 2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 748 (3rd, independent re-review): head db0b000 unchanged since 747, CI test+test-windows PASS (run 32130391015), MERGEABLE CLEAN. 6 files (Agent.md, emrg/_stop_all.py, markdown.py, widgets.py, test_installer_stop.py, test_user_markdown.py) match the two-rant scope. 3/3 consecutive ✅ from cycles 746/747/748, no ❌ — merging.

@argszero
argszero merged commit 198ef51 into masterAug 18, 2026
2 checks passed
@argszero
argszero deleted the feature/user-markdown-and-stop-selfheld branch August 18, 2026 11:20
argszero added a commit that referenced this pull request Aug 18, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@argszero
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' emrg: TUI user messages render as markdown + stop_all self-held lock attribution by argszero · Pull Request #847 · argszero/emrg · GitHub
Skip to content

emrg: TUI user messages render as markdown + stop_all self-held lock attribution - #847

Merged
argszero merged 1 commit into
masterfrom
feature/user-markdown-and-stop-selfheld
Aug 18, 2026
Merged

emrg: TUI user messages render as markdown + stop_all self-held lock attribution#847
argszero merged 1 commit into
masterfrom
feature/user-markdown-and-stop-selfheld

Conversation

@argszero

Copy link
Copy Markdown
Owner

Two small fixes from host rants:

1. TUI user messages render as markdown (rant 2026-08-18T18:52:45, Plan B, superseding 18:50:14)

User messages in the TUI previously went through ChatRow, which split on \n but did not wrap to the terminal width — the buffer's width cap then truncated anything beyond one row. Per host-confirmed Plan B, user messages now render through the same Rich markdown pipeline as assistant messages (width-based wrapping + CJK wide-char handling), via a new UserMarkdown widget that preserves the > prefix + bold cyan role visual:

  • emrg/client/python_tui/widgets/markdown.py: new UserMarkdown (static Markdown rendered at ctx.width - len(prefix) so the first-line prefix never overflows; continuation lines get a same-width indent)
  • emrg/client/widgets.py: ChatHistory.add('user', ...) routes to UserMarkdown; update_last() also updates UserMarkdown rows (assistant plain-text fallback path); system/tool/assistant roles unchanged (ChatRow)
  • tests/test_user_markdown.py: 6 tests — wrap/no-content-loss, markdown styling, CJK boundary, ChatHistory routing, update_last

2. stop_all: self-held python-dist locks no longer abort the install (rant 2026-08-18T18:57:09)

v0.2.49 evidence: stop_all killed the external browser-harness holder but then aborted because verify counted 12 python-dist DLLs (python313.dll, select.pyd, ...) held by stop_all's own runtime as residuals. Those locks are released when stop_all exits — and the installer runs stop_all synchronously (ewWaitUntilTerminated) before overwriting, so the abort was a false positive.

  • emrg/_stop_all.py: new _classify_locked_files() — createfile-probe locked files attributed to module-holder processes; files held only by excluded (self/ancestor) holders are self-held (advisory WARNING), only external-holder or unattributable locks stay residuals; final self-lock guard message changed from "installer will fail; re-run installer" to advisory "released when stop_all exits; installer continues"
  • tests/test_installer_stop.py: 4 new unit tests for the attribution (self-held / external / unattributable / mixed) + updated assertions for the new advisory text

Verification

  • pytest: 961 passed + 1 skipped (962 collected) — Agent.md count synced 952 → 962
  • import + CLI checks pass; GUI npm test 259 pass

…attribution
Rant 2026-08-18T18:52:45 (Plan B, superseding 18:50:14): user messages in
the TUI now render through the same Rich markdown pipeline as assistant
messages (width-based wrapping, CJK handling) via a new UserMarkdown
widget, while keeping the "> " prefix + bold cyan role visual.
ChatHistory.add('user', ...) routes to UserMarkdown; system/tool/assistant
stay on ChatRow. update_last() handles UserMarkdown rows for the assistant
plain-text fallback path. +6 tests.
Rant 2026-08-18T18:57:09: stop_all no longer aborts installs whose only
locked files are python-dist DLLs held by stop_all's own runtime (the
interpreter must load them; they are released when stop_all exits, before
the installer overwrites via ewWaitUntilTerminated). createfile-probe
verify now attributes locked files to module-holder processes —
self/excluded-ancestor-held locks are self-held (advisory WARNING), only
external-holder or unattributable locks are residuals. Final self-lock
guard message changed from "installer will fail" to advisory. +4 tests.
Agent.md test count 952 -> 962.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 746: two host-rant fixes. ① Plan B user messages → UserMarkdown (Rich markdown pipeline = free width wrap + CJK, > prefix + cyan preserved; ChatHistory routes user→UserMarkdown, others stay ChatRow; update_last handles both). ② stop_all self-held attribution — _classify_locked_files splits self/excluded-ancestor-held locks (advisory, released on exit) from external/unattributable residuals (abort); final guard text advisory. Verified: pytest 961+1 (962), import+CLI OK, GUI 259; CI test+test-windows PASS.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 747 (2nd, independent re-review): head db0b000 unchanged since 746, CI test+test-windows PASS (run 32130391015), MERGEABLE CLEAN. Re-verified diff: ① UserMarkdown — static Rich markdown at ctx.width-len(prefix), > bold-cyan first-line lead + same-width indent continuations; ChatHistory.add routes 'user' only; update_last covers UserMarkdown; assistant/system/tool untouched. ② stop_all — _classify_locked_files pure fn (separator-agnostic norm, self/excluded-ancestor-held → self-held advisory, external/unattributable → residual conservative); verify wiring correct (mh_holders computed before probe block); final guard advisory text. _install_root() dedup + check_install_writable uses it. 10 tests (6+4) + doc count 962. No ❌ — 2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 748 (3rd, independent re-review): head db0b000 unchanged since 747, CI test+test-windows PASS (run 32130391015), MERGEABLE CLEAN. 6 files (Agent.md, emrg/_stop_all.py, markdown.py, widgets.py, test_installer_stop.py, test_user_markdown.py) match the two-rant scope. 3/3 consecutive ✅ from cycles 746/747/748, no ❌ — merging.

@argszero
argszero merged commit 198ef51 into masterAug 18, 2026
2 checks passed
@argszero
argszero deleted the feature/user-markdown-and-stop-selfheld branch August 18, 2026 11:20
argszero added a commit that referenced this pull request Aug 18, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@argszero
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' emrg: TUI user messages render as markdown + stop_all self-held lock attribution by argszero · Pull Request #847 · argszero/emrg · GitHub
Skip to content

emrg: TUI user messages render as markdown + stop_all self-held lock attribution - #847

Merged
argszero merged 1 commit into
masterfrom
feature/user-markdown-and-stop-selfheld
Aug 18, 2026
Merged

emrg: TUI user messages render as markdown + stop_all self-held lock attribution#847
argszero merged 1 commit into
masterfrom
feature/user-markdown-and-stop-selfheld

Conversation

@argszero

Copy link
Copy Markdown
Owner

Two small fixes from host rants:

1. TUI user messages render as markdown (rant 2026-08-18T18:52:45, Plan B, superseding 18:50:14)

User messages in the TUI previously went through ChatRow, which split on \n but did not wrap to the terminal width — the buffer's width cap then truncated anything beyond one row. Per host-confirmed Plan B, user messages now render through the same Rich markdown pipeline as assistant messages (width-based wrapping + CJK wide-char handling), via a new UserMarkdown widget that preserves the > prefix + bold cyan role visual:

  • emrg/client/python_tui/widgets/markdown.py: new UserMarkdown (static Markdown rendered at ctx.width - len(prefix) so the first-line prefix never overflows; continuation lines get a same-width indent)
  • emrg/client/widgets.py: ChatHistory.add('user', ...) routes to UserMarkdown; update_last() also updates UserMarkdown rows (assistant plain-text fallback path); system/tool/assistant roles unchanged (ChatRow)
  • tests/test_user_markdown.py: 6 tests — wrap/no-content-loss, markdown styling, CJK boundary, ChatHistory routing, update_last

2. stop_all: self-held python-dist locks no longer abort the install (rant 2026-08-18T18:57:09)

v0.2.49 evidence: stop_all killed the external browser-harness holder but then aborted because verify counted 12 python-dist DLLs (python313.dll, select.pyd, ...) held by stop_all's own runtime as residuals. Those locks are released when stop_all exits — and the installer runs stop_all synchronously (ewWaitUntilTerminated) before overwriting, so the abort was a false positive.

  • emrg/_stop_all.py: new _classify_locked_files() — createfile-probe locked files attributed to module-holder processes; files held only by excluded (self/ancestor) holders are self-held (advisory WARNING), only external-holder or unattributable locks stay residuals; final self-lock guard message changed from "installer will fail; re-run installer" to advisory "released when stop_all exits; installer continues"
  • tests/test_installer_stop.py: 4 new unit tests for the attribution (self-held / external / unattributable / mixed) + updated assertions for the new advisory text

Verification

  • pytest: 961 passed + 1 skipped (962 collected) — Agent.md count synced 952 → 962
  • import + CLI checks pass; GUI npm test 259 pass

…attribution
Rant 2026-08-18T18:52:45 (Plan B, superseding 18:50:14): user messages in
the TUI now render through the same Rich markdown pipeline as assistant
messages (width-based wrapping, CJK handling) via a new UserMarkdown
widget, while keeping the "> " prefix + bold cyan role visual.
ChatHistory.add('user', ...) routes to UserMarkdown; system/tool/assistant
stay on ChatRow. update_last() handles UserMarkdown rows for the assistant
plain-text fallback path. +6 tests.
Rant 2026-08-18T18:57:09: stop_all no longer aborts installs whose only
locked files are python-dist DLLs held by stop_all's own runtime (the
interpreter must load them; they are released when stop_all exits, before
the installer overwrites via ewWaitUntilTerminated). createfile-probe
verify now attributes locked files to module-holder processes —
self/excluded-ancestor-held locks are self-held (advisory WARNING), only
external-holder or unattributable locks are residuals. Final self-lock
guard message changed from "installer will fail" to advisory. +4 tests.
Agent.md test count 952 -> 962.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 746: two host-rant fixes. ① Plan B user messages → UserMarkdown (Rich markdown pipeline = free width wrap + CJK, > prefix + cyan preserved; ChatHistory routes user→UserMarkdown, others stay ChatRow; update_last handles both). ② stop_all self-held attribution — _classify_locked_files splits self/excluded-ancestor-held locks (advisory, released on exit) from external/unattributable residuals (abort); final guard text advisory. Verified: pytest 961+1 (962), import+CLI OK, GUI 259; CI test+test-windows PASS.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 747 (2nd, independent re-review): head db0b000 unchanged since 746, CI test+test-windows PASS (run 32130391015), MERGEABLE CLEAN. Re-verified diff: ① UserMarkdown — static Rich markdown at ctx.width-len(prefix), > bold-cyan first-line lead + same-width indent continuations; ChatHistory.add routes 'user' only; update_last covers UserMarkdown; assistant/system/tool untouched. ② stop_all — _classify_locked_files pure fn (separator-agnostic norm, self/excluded-ancestor-held → self-held advisory, external/unattributable → residual conservative); verify wiring correct (mh_holders computed before probe block); final guard advisory text. _install_root() dedup + check_install_writable uses it. 10 tests (6+4) + doc count 962. No ❌ — 2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 748 (3rd, independent re-review): head db0b000 unchanged since 747, CI test+test-windows PASS (run 32130391015), MERGEABLE CLEAN. 6 files (Agent.md, emrg/_stop_all.py, markdown.py, widgets.py, test_installer_stop.py, test_user_markdown.py) match the two-rant scope. 3/3 consecutive ✅ from cycles 746/747/748, no ❌ — merging.

@argszero
argszero merged commit 198ef51 into masterAug 18, 2026
2 checks passed
@argszero
argszero deleted the feature/user-markdown-and-stop-selfheld branch August 18, 2026 11:20
argszero added a commit that referenced this pull request Aug 18, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@argszero
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' emrg: TUI user messages render as markdown + stop_all self-held lock attribution by argszero · Pull Request #847 · argszero/emrg · GitHub
Skip to content

emrg: TUI user messages render as markdown + stop_all self-held lock attribution - #847

Merged
argszero merged 1 commit into
masterfrom
feature/user-markdown-and-stop-selfheld
Aug 18, 2026
Merged

emrg: TUI user messages render as markdown + stop_all self-held lock attribution#847
argszero merged 1 commit into
masterfrom
feature/user-markdown-and-stop-selfheld

Conversation

@argszero

Copy link
Copy Markdown
Owner

Two small fixes from host rants:

1. TUI user messages render as markdown (rant 2026-08-18T18:52:45, Plan B, superseding 18:50:14)

User messages in the TUI previously went through ChatRow, which split on \n but did not wrap to the terminal width — the buffer's width cap then truncated anything beyond one row. Per host-confirmed Plan B, user messages now render through the same Rich markdown pipeline as assistant messages (width-based wrapping + CJK wide-char handling), via a new UserMarkdown widget that preserves the > prefix + bold cyan role visual:

  • emrg/client/python_tui/widgets/markdown.py: new UserMarkdown (static Markdown rendered at ctx.width - len(prefix) so the first-line prefix never overflows; continuation lines get a same-width indent)
  • emrg/client/widgets.py: ChatHistory.add('user', ...) routes to UserMarkdown; update_last() also updates UserMarkdown rows (assistant plain-text fallback path); system/tool/assistant roles unchanged (ChatRow)
  • tests/test_user_markdown.py: 6 tests — wrap/no-content-loss, markdown styling, CJK boundary, ChatHistory routing, update_last

2. stop_all: self-held python-dist locks no longer abort the install (rant 2026-08-18T18:57:09)

v0.2.49 evidence: stop_all killed the external browser-harness holder but then aborted because verify counted 12 python-dist DLLs (python313.dll, select.pyd, ...) held by stop_all's own runtime as residuals. Those locks are released when stop_all exits — and the installer runs stop_all synchronously (ewWaitUntilTerminated) before overwriting, so the abort was a false positive.

  • emrg/_stop_all.py: new _classify_locked_files() — createfile-probe locked files attributed to module-holder processes; files held only by excluded (self/ancestor) holders are self-held (advisory WARNING), only external-holder or unattributable locks stay residuals; final self-lock guard message changed from "installer will fail; re-run installer" to advisory "released when stop_all exits; installer continues"
  • tests/test_installer_stop.py: 4 new unit tests for the attribution (self-held / external / unattributable / mixed) + updated assertions for the new advisory text

Verification

  • pytest: 961 passed + 1 skipped (962 collected) — Agent.md count synced 952 → 962
  • import + CLI checks pass; GUI npm test 259 pass

…attribution
Rant 2026-08-18T18:52:45 (Plan B, superseding 18:50:14): user messages in
the TUI now render through the same Rich markdown pipeline as assistant
messages (width-based wrapping, CJK handling) via a new UserMarkdown
widget, while keeping the "> " prefix + bold cyan role visual.
ChatHistory.add('user', ...) routes to UserMarkdown; system/tool/assistant
stay on ChatRow. update_last() handles UserMarkdown rows for the assistant
plain-text fallback path. +6 tests.
Rant 2026-08-18T18:57:09: stop_all no longer aborts installs whose only
locked files are python-dist DLLs held by stop_all's own runtime (the
interpreter must load them; they are released when stop_all exits, before
the installer overwrites via ewWaitUntilTerminated). createfile-probe
verify now attributes locked files to module-holder processes —
self/excluded-ancestor-held locks are self-held (advisory WARNING), only
external-holder or unattributable locks are residuals. Final self-lock
guard message changed from "installer will fail" to advisory. +4 tests.
Agent.md test count 952 -> 962.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 746: two host-rant fixes. ① Plan B user messages → UserMarkdown (Rich markdown pipeline = free width wrap + CJK, > prefix + cyan preserved; ChatHistory routes user→UserMarkdown, others stay ChatRow; update_last handles both). ② stop_all self-held attribution — _classify_locked_files splits self/excluded-ancestor-held locks (advisory, released on exit) from external/unattributable residuals (abort); final guard text advisory. Verified: pytest 961+1 (962), import+CLI OK, GUI 259; CI test+test-windows PASS.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 747 (2nd, independent re-review): head db0b000 unchanged since 746, CI test+test-windows PASS (run 32130391015), MERGEABLE CLEAN. Re-verified diff: ① UserMarkdown — static Rich markdown at ctx.width-len(prefix), > bold-cyan first-line lead + same-width indent continuations; ChatHistory.add routes 'user' only; update_last covers UserMarkdown; assistant/system/tool untouched. ② stop_all — _classify_locked_files pure fn (separator-agnostic norm, self/excluded-ancestor-held → self-held advisory, external/unattributable → residual conservative); verify wiring correct (mh_holders computed before probe block); final guard advisory text. _install_root() dedup + check_install_writable uses it. 10 tests (6+4) + doc count 962. No ❌ — 2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 748 (3rd, independent re-review): head db0b000 unchanged since 747, CI test+test-windows PASS (run 32130391015), MERGEABLE CLEAN. 6 files (Agent.md, emrg/_stop_all.py, markdown.py, widgets.py, test_installer_stop.py, test_user_markdown.py) match the two-rant scope. 3/3 consecutive ✅ from cycles 746/747/748, no ❌ — merging.

@argszero
argszero merged commit 198ef51 into masterAug 18, 2026
2 checks passed
@argszero
argszero deleted the feature/user-markdown-and-stop-selfheld branch August 18, 2026 11:20
argszero added a commit that referenced this pull request Aug 18, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@argszero
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' emrg: TUI user messages render as markdown + stop_all self-held lock attribution by argszero · Pull Request #847 · argszero/emrg · GitHub
Skip to content

emrg: TUI user messages render as markdown + stop_all self-held lock attribution - #847

Merged
argszero merged 1 commit into
masterfrom
feature/user-markdown-and-stop-selfheld
Aug 18, 2026
Merged

emrg: TUI user messages render as markdown + stop_all self-held lock attribution#847
argszero merged 1 commit into
masterfrom
feature/user-markdown-and-stop-selfheld

Conversation

@argszero

Copy link
Copy Markdown
Owner

Two small fixes from host rants:

1. TUI user messages render as markdown (rant 2026-08-18T18:52:45, Plan B, superseding 18:50:14)

User messages in the TUI previously went through ChatRow, which split on \n but did not wrap to the terminal width — the buffer's width cap then truncated anything beyond one row. Per host-confirmed Plan B, user messages now render through the same Rich markdown pipeline as assistant messages (width-based wrapping + CJK wide-char handling), via a new UserMarkdown widget that preserves the > prefix + bold cyan role visual:

  • emrg/client/python_tui/widgets/markdown.py: new UserMarkdown (static Markdown rendered at ctx.width - len(prefix) so the first-line prefix never overflows; continuation lines get a same-width indent)
  • emrg/client/widgets.py: ChatHistory.add('user', ...) routes to UserMarkdown; update_last() also updates UserMarkdown rows (assistant plain-text fallback path); system/tool/assistant roles unchanged (ChatRow)
  • tests/test_user_markdown.py: 6 tests — wrap/no-content-loss, markdown styling, CJK boundary, ChatHistory routing, update_last

2. stop_all: self-held python-dist locks no longer abort the install (rant 2026-08-18T18:57:09)

v0.2.49 evidence: stop_all killed the external browser-harness holder but then aborted because verify counted 12 python-dist DLLs (python313.dll, select.pyd, ...) held by stop_all's own runtime as residuals. Those locks are released when stop_all exits — and the installer runs stop_all synchronously (ewWaitUntilTerminated) before overwriting, so the abort was a false positive.

  • emrg/_stop_all.py: new _classify_locked_files() — createfile-probe locked files attributed to module-holder processes; files held only by excluded (self/ancestor) holders are self-held (advisory WARNING), only external-holder or unattributable locks stay residuals; final self-lock guard message changed from "installer will fail; re-run installer" to advisory "released when stop_all exits; installer continues"
  • tests/test_installer_stop.py: 4 new unit tests for the attribution (self-held / external / unattributable / mixed) + updated assertions for the new advisory text

Verification

  • pytest: 961 passed + 1 skipped (962 collected) — Agent.md count synced 952 → 962
  • import + CLI checks pass; GUI npm test 259 pass

…attribution
Rant 2026-08-18T18:52:45 (Plan B, superseding 18:50:14): user messages in
the TUI now render through the same Rich markdown pipeline as assistant
messages (width-based wrapping, CJK handling) via a new UserMarkdown
widget, while keeping the "> " prefix + bold cyan role visual.
ChatHistory.add('user', ...) routes to UserMarkdown; system/tool/assistant
stay on ChatRow. update_last() handles UserMarkdown rows for the assistant
plain-text fallback path. +6 tests.
Rant 2026-08-18T18:57:09: stop_all no longer aborts installs whose only
locked files are python-dist DLLs held by stop_all's own runtime (the
interpreter must load them; they are released when stop_all exits, before
the installer overwrites via ewWaitUntilTerminated). createfile-probe
verify now attributes locked files to module-holder processes —
self/excluded-ancestor-held locks are self-held (advisory WARNING), only
external-holder or unattributable locks are residuals. Final self-lock
guard message changed from "installer will fail" to advisory. +4 tests.
Agent.md test count 952 -> 962.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 746: two host-rant fixes. ① Plan B user messages → UserMarkdown (Rich markdown pipeline = free width wrap + CJK, > prefix + cyan preserved; ChatHistory routes user→UserMarkdown, others stay ChatRow; update_last handles both). ② stop_all self-held attribution — _classify_locked_files splits self/excluded-ancestor-held locks (advisory, released on exit) from external/unattributable residuals (abort); final guard text advisory. Verified: pytest 961+1 (962), import+CLI OK, GUI 259; CI test+test-windows PASS.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 747 (2nd, independent re-review): head db0b000 unchanged since 746, CI test+test-windows PASS (run 32130391015), MERGEABLE CLEAN. Re-verified diff: ① UserMarkdown — static Rich markdown at ctx.width-len(prefix), > bold-cyan first-line lead + same-width indent continuations; ChatHistory.add routes 'user' only; update_last covers UserMarkdown; assistant/system/tool untouched. ② stop_all — _classify_locked_files pure fn (separator-agnostic norm, self/excluded-ancestor-held → self-held advisory, external/unattributable → residual conservative); verify wiring correct (mh_holders computed before probe block); final guard advisory text. _install_root() dedup + check_install_writable uses it. 10 tests (6+4) + doc count 962. No ❌ — 2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 748 (3rd, independent re-review): head db0b000 unchanged since 747, CI test+test-windows PASS (run 32130391015), MERGEABLE CLEAN. 6 files (Agent.md, emrg/_stop_all.py, markdown.py, widgets.py, test_installer_stop.py, test_user_markdown.py) match the two-rant scope. 3/3 consecutive ✅ from cycles 746/747/748, no ❌ — merging.

@argszero
argszero merged commit 198ef51 into masterAug 18, 2026
2 checks passed
@argszero
argszero deleted the feature/user-markdown-and-stop-selfheld branch August 18, 2026 11:20
argszero added a commit that referenced this pull request Aug 18, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@argszero
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' emrg: TUI user messages render as markdown + stop_all self-held lock attribution by argszero · Pull Request #847 · argszero/emrg · GitHub
Skip to content

emrg: TUI user messages render as markdown + stop_all self-held lock attribution - #847

Merged
argszero merged 1 commit into
masterfrom
feature/user-markdown-and-stop-selfheld
Aug 18, 2026
Merged

emrg: TUI user messages render as markdown + stop_all self-held lock attribution#847
argszero merged 1 commit into
masterfrom
feature/user-markdown-and-stop-selfheld

Conversation

@argszero

Copy link
Copy Markdown
Owner

Two small fixes from host rants:

1. TUI user messages render as markdown (rant 2026-08-18T18:52:45, Plan B, superseding 18:50:14)

User messages in the TUI previously went through ChatRow, which split on \n but did not wrap to the terminal width — the buffer's width cap then truncated anything beyond one row. Per host-confirmed Plan B, user messages now render through the same Rich markdown pipeline as assistant messages (width-based wrapping + CJK wide-char handling), via a new UserMarkdown widget that preserves the > prefix + bold cyan role visual:

  • emrg/client/python_tui/widgets/markdown.py: new UserMarkdown (static Markdown rendered at ctx.width - len(prefix) so the first-line prefix never overflows; continuation lines get a same-width indent)
  • emrg/client/widgets.py: ChatHistory.add('user', ...) routes to UserMarkdown; update_last() also updates UserMarkdown rows (assistant plain-text fallback path); system/tool/assistant roles unchanged (ChatRow)
  • tests/test_user_markdown.py: 6 tests — wrap/no-content-loss, markdown styling, CJK boundary, ChatHistory routing, update_last

2. stop_all: self-held python-dist locks no longer abort the install (rant 2026-08-18T18:57:09)

v0.2.49 evidence: stop_all killed the external browser-harness holder but then aborted because verify counted 12 python-dist DLLs (python313.dll, select.pyd, ...) held by stop_all's own runtime as residuals. Those locks are released when stop_all exits — and the installer runs stop_all synchronously (ewWaitUntilTerminated) before overwriting, so the abort was a false positive.

  • emrg/_stop_all.py: new _classify_locked_files() — createfile-probe locked files attributed to module-holder processes; files held only by excluded (self/ancestor) holders are self-held (advisory WARNING), only external-holder or unattributable locks stay residuals; final self-lock guard message changed from "installer will fail; re-run installer" to advisory "released when stop_all exits; installer continues"
  • tests/test_installer_stop.py: 4 new unit tests for the attribution (self-held / external / unattributable / mixed) + updated assertions for the new advisory text

Verification

  • pytest: 961 passed + 1 skipped (962 collected) — Agent.md count synced 952 → 962
  • import + CLI checks pass; GUI npm test 259 pass

…attribution
Rant 2026-08-18T18:52:45 (Plan B, superseding 18:50:14): user messages in
the TUI now render through the same Rich markdown pipeline as assistant
messages (width-based wrapping, CJK handling) via a new UserMarkdown
widget, while keeping the "> " prefix + bold cyan role visual.
ChatHistory.add('user', ...) routes to UserMarkdown; system/tool/assistant
stay on ChatRow. update_last() handles UserMarkdown rows for the assistant
plain-text fallback path. +6 tests.
Rant 2026-08-18T18:57:09: stop_all no longer aborts installs whose only
locked files are python-dist DLLs held by stop_all's own runtime (the
interpreter must load them; they are released when stop_all exits, before
the installer overwrites via ewWaitUntilTerminated). createfile-probe
verify now attributes locked files to module-holder processes —
self/excluded-ancestor-held locks are self-held (advisory WARNING), only
external-holder or unattributable locks are residuals. Final self-lock
guard message changed from "installer will fail" to advisory. +4 tests.
Agent.md test count 952 -> 962.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 746: two host-rant fixes. ① Plan B user messages → UserMarkdown (Rich markdown pipeline = free width wrap + CJK, > prefix + cyan preserved; ChatHistory routes user→UserMarkdown, others stay ChatRow; update_last handles both). ② stop_all self-held attribution — _classify_locked_files splits self/excluded-ancestor-held locks (advisory, released on exit) from external/unattributable residuals (abort); final guard text advisory. Verified: pytest 961+1 (962), import+CLI OK, GUI 259; CI test+test-windows PASS.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 747 (2nd, independent re-review): head db0b000 unchanged since 746, CI test+test-windows PASS (run 32130391015), MERGEABLE CLEAN. Re-verified diff: ① UserMarkdown — static Rich markdown at ctx.width-len(prefix), > bold-cyan first-line lead + same-width indent continuations; ChatHistory.add routes 'user' only; update_last covers UserMarkdown; assistant/system/tool untouched. ② stop_all — _classify_locked_files pure fn (separator-agnostic norm, self/excluded-ancestor-held → self-held advisory, external/unattributable → residual conservative); verify wiring correct (mh_holders computed before probe block); final guard advisory text. _install_root() dedup + check_install_writable uses it. 10 tests (6+4) + doc count 962. No ❌ — 2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 748 (3rd, independent re-review): head db0b000 unchanged since 747, CI test+test-windows PASS (run 32130391015), MERGEABLE CLEAN. 6 files (Agent.md, emrg/_stop_all.py, markdown.py, widgets.py, test_installer_stop.py, test_user_markdown.py) match the two-rant scope. 3/3 consecutive ✅ from cycles 746/747/748, no ❌ — merging.

@argszero
argszero merged commit 198ef51 into masterAug 18, 2026
2 checks passed
@argszero
argszero deleted the feature/user-markdown-and-stop-selfheld branch August 18, 2026 11:20
argszero added a commit that referenced this pull request Aug 18, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

emrg: TUI user messages render as markdown + stop_all self-held lock attribution - #847

Merged
argszero merged 1 commit into
masterfrom
feature/user-markdown-and-stop-selfheld
Aug 18, 2026
Merged

emrg: TUI user messages render as markdown + stop_all self-held lock attribution#847
argszero merged 1 commit into
masterfrom
feature/user-markdown-and-stop-selfheld

Conversation

@argszero

Copy link
Copy Markdown
Owner

Two small fixes from host rants:

1. TUI user messages render as markdown (rant 2026-08-18T18:52:45, Plan B, superseding 18:50:14)

User messages in the TUI previously went through ChatRow, which split on \n but did not wrap to the terminal width — the buffer's width cap then truncated anything beyond one row. Per host-confirmed Plan B, user messages now render through the same Rich markdown pipeline as assistant messages (width-based wrapping + CJK wide-char handling), via a new UserMarkdown widget that preserves the > prefix + bold cyan role visual:

  • emrg/client/python_tui/widgets/markdown.py: new UserMarkdown (static Markdown rendered at ctx.width - len(prefix) so the first-line prefix never overflows; continuation lines get a same-width indent)
  • emrg/client/widgets.py: ChatHistory.add('user', ...) routes to UserMarkdown; update_last() also updates UserMarkdown rows (assistant plain-text fallback path); system/tool/assistant roles unchanged (ChatRow)
  • tests/test_user_markdown.py: 6 tests — wrap/no-content-loss, markdown styling, CJK boundary, ChatHistory routing, update_last

2. stop_all: self-held python-dist locks no longer abort the install (rant 2026-08-18T18:57:09)

v0.2.49 evidence: stop_all killed the external browser-harness holder but then aborted because verify counted 12 python-dist DLLs (python313.dll, select.pyd, ...) held by stop_all's own runtime as residuals. Those locks are released when stop_all exits — and the installer runs stop_all synchronously (ewWaitUntilTerminated) before overwriting, so the abort was a false positive.

  • emrg/_stop_all.py: new _classify_locked_files() — createfile-probe locked files attributed to module-holder processes; files held only by excluded (self/ancestor) holders are self-held (advisory WARNING), only external-holder or unattributable locks stay residuals; final self-lock guard message changed from "installer will fail; re-run installer" to advisory "released when stop_all exits; installer continues"
  • tests/test_installer_stop.py: 4 new unit tests for the attribution (self-held / external / unattributable / mixed) + updated assertions for the new advisory text

Verification

  • pytest: 961 passed + 1 skipped (962 collected) — Agent.md count synced 952 → 962
  • import + CLI checks pass; GUI npm test 259 pass

…attribution
Rant 2026-08-18T18:52:45 (Plan B, superseding 18:50:14): user messages in
the TUI now render through the same Rich markdown pipeline as assistant
messages (width-based wrapping, CJK handling) via a new UserMarkdown
widget, while keeping the "> " prefix + bold cyan role visual.
ChatHistory.add('user', ...) routes to UserMarkdown; system/tool/assistant
stay on ChatRow. update_last() handles UserMarkdown rows for the assistant
plain-text fallback path. +6 tests.
Rant 2026-08-18T18:57:09: stop_all no longer aborts installs whose only
locked files are python-dist DLLs held by stop_all's own runtime (the
interpreter must load them; they are released when stop_all exits, before
the installer overwrites via ewWaitUntilTerminated). createfile-probe
verify now attributes locked files to module-holder processes —
self/excluded-ancestor-held locks are self-held (advisory WARNING), only
external-holder or unattributable locks are residuals. Final self-lock
guard message changed from "installer will fail" to advisory. +4 tests.
Agent.md test count 952 -> 962.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 746: two host-rant fixes. ① Plan B user messages → UserMarkdown (Rich markdown pipeline = free width wrap + CJK, > prefix + cyan preserved; ChatHistory routes user→UserMarkdown, others stay ChatRow; update_last handles both). ② stop_all self-held attribution — _classify_locked_files splits self/excluded-ancestor-held locks (advisory, released on exit) from external/unattributable residuals (abort); final guard text advisory. Verified: pytest 961+1 (962), import+CLI OK, GUI 259; CI test+test-windows PASS.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 747 (2nd, independent re-review): head db0b000 unchanged since 746, CI test+test-windows PASS (run 32130391015), MERGEABLE CLEAN. Re-verified diff: ① UserMarkdown — static Rich markdown at ctx.width-len(prefix), > bold-cyan first-line lead + same-width indent continuations; ChatHistory.add routes 'user' only; update_last covers UserMarkdown; assistant/system/tool untouched. ② stop_all — _classify_locked_files pure fn (separator-agnostic norm, self/excluded-ancestor-held → self-held advisory, external/unattributable → residual conservative); verify wiring correct (mh_holders computed before probe block); final guard advisory text. _install_root() dedup + check_install_writable uses it. 10 tests (6+4) + doc count 962. No ❌ — 2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 748 (3rd, independent re-review): head db0b000 unchanged since 747, CI test+test-windows PASS (run 32130391015), MERGEABLE CLEAN. 6 files (Agent.md, emrg/_stop_all.py, markdown.py, widgets.py, test_installer_stop.py, test_user_markdown.py) match the two-rant scope. 3/3 consecutive ✅ from cycles 746/747/748, no ❌ — merging.

@argszero
argszero merged commit 198ef51 into masterAug 18, 2026
2 checks passed
@argszero
argszero deleted the feature/user-markdown-and-stop-selfheld branch August 18, 2026 11:20
argszero added a commit that referenced this pull request Aug 18, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@argszero