Skip to content

Dev (#500) - #501

Merged
CraftOS-dev merged 1 commit into
mainfrom
staging
Oct 23, 2026
Merged

CraftOS-dev merged 1 commit into
mainfrom
staging

Conversation

@ahmad-ajmal

Copy link
Copy Markdown
Collaborator
  • fix: install env + installer UI

  • fix: decode and stop silently truncating inbound integration messages

  • Fix posthog proxy destination issue and agent app bidirectional communication issue

  • clean comments

  • clean up comments

  • agent recieves truncated information

  • Provide LLM reasoning effort param

  • create effort setting knob

  • fix max token ignores the reasoning output cap bug

  • openai setting update

  • fix duplicated steps and second decision per request

  • fix incoming message encoding issue

  • very minor UI update

  • make gmail able to send inline email

  • Sidebar UI update

  • Fix default reasoning effort issue when switching model

  • supabase integration

  • Upload agent app showcase

  • Update agent app visual

  • Update README.md

  • discard action sets umbrella of and describe set function

  • figma integrations

  • docs: add Figma integration result screenshots

  • allow agent app's iframe to enable device access

  • fix tunnel failed silently and get error from API rather than log file

  • fix: allow cloudflared time to finish edge retries

  • fix Windows run_shell: prevent nested-shell quoting failures and silent wrong output #475: guide Windows shell execution and report quoting hazards

  • fix Windows run_shell: prevent nested-shell quoting failures and silent wrong output #475: scope shell guidance and preserve native errors

  • feat(mini-browser): import the Web Agent browser prototype onto main

Squash of the original korivi-Exp1 prototype (web agent V1/V2, password vault, onboarding error wrap) applied on top of current main. Conflicts resolved against main's newer browser adapter and sidebar; the local-only slow_mode and profile-interview workarounds were dropped.

The page still targets the old task API; it is adapted in the next commits.

  • feat(mini-browser): rebuild the Web Agent prototype as the Mini Browser

A real Chromium that agents drive and the user watches live, usable by every kind of agent (main and chat sessions, a dedicated Mini Browser chat, scheduled runs, Agent App trigger runs and the new browser_agent sub-agent).

Engine (app/mini_browser):

  • dedicated "mini-browser" thread + event loop owns Playwright; callers on any loop marshal in (fixes sub-agents, which run on their own loops)
  • one tab per agent session with per-tab locks, owner labels, take-control, follow-view, crash and driver-death recovery, idle shutdown, profile lock
  • live view via CDP screencast of the viewed tab, only while a UI tab is subscribed, latest-frame-wins delivery
  • ad blocking via CDP Network.setBlockedURLs (context.route disabled the HTTP cache); CraftBot's own UI origins blocked browser-wide
  • human-like mouse paths, typing rhythm and scrolling
  • 13 mini_browser_* actions; every result carries a fresh page observation

Password vault: Fernet + Windows DPAPI in .credentials/, atomic writes, no silent data loss, strict origin matching; autofill only for the current page's origin and never exposed to the model, logs or UI.

Platform: mini_browser_* WebSocket protocol and lanes, new session type mini_browser, settings section, error codes, AgentBase run-state / stop / delete / sub-agent / shutdown hooks, skill, prompt rule and AGENT.md.

Frontend: Mini Browser page (sidebar entry, live view with IME/paste/ shortcuts, tabs, take control, passwords dialog), 7 languages.

  • fix(mini-browser): address the multi-agent review (53 confirmed findings)

Engine

  • shared start/close/recovery tasks are awaited without inheriting their cancellation; a close during a launch aborts at a phase boundary, keeps the profile lock until Chromium exits and leaks no driver
  • every agent tab gets its own Chromium window, so background owners are no longer throttled (clicks went from ~25 s to ~1 s)
  • ops race against a per-tab closed event: a closed tab or browser ends the op with MINI_BROWSER_TAB_CLOSED / MINI_BROWSER_CLOSED, never a fake success
  • run states and Stop are kept process-wide, so Stop before the first browser use still revokes sub-agents; the host is terminal after shutdown
  • agents see only their own tabs' URLs; user tabs are claimed only when blank, by the Mini Browser chat for the viewed tab, or by an explicit switch to the viewed tab
  • UI-origin blocking covers IPv4-mapped / 0.0.0.0 / [::] spellings; secrets are masked in their URL/HTML/JSON-encoded forms too
  • downloads get Mark-of-the-Web on Windows and a "dangerous" flag

Agent operations

  • take-control stops in-flight typing/mouse/scroll at once
  • date/time inputs, framework click handlers, slotted labels, row context, iframes, modal text, slow-XHR settling and results kept under 16k chars
  • conservative login outcomes; CAPTCHA/2FA flow via wait(for_user)
  • vault autofill limited to the exact site (with or without www.)

Platform

  • managed installs receive newly shipped action files and skills on upgrade (app/state_sync.py), without overwriting user edits
  • the Mini Browser prompt rule is shown only when the browser is usable
  • full /reset keeps per-session streams; input/control/shutdown get their own WebSocket lanes with input coalescing; settings reload live

Frontend

  • no one-click Open for executable downloads; address bar binds to the edited tab; pending input never follows a view switch; passwords dialog error states; contrast, layout and translation fixes
  • Agent input never lands after the user takes control. Waits for an element run in 250 ms slices that check control; clicks press through page.mouse at a point just checked to hit the element instead of Playwright's click, which kept waiting inside the driver. Focus, clear, caret, select, upload and whole-value inputs, and the vault login's fill and Enter, act on element handles right after the control check.
  • Agents cannot close a tab the user controls.
  • Opening a tab reserves its slot before the first await, so concurrent opens never exceed the browser-wide or per-owner tab limits.
  • Agent screenshots cover password and secret fields, including fields that were password fields before a "show password" toggle.
  • A saved password in a download's suggested name is masked before it becomes the file name, a log line or a notice.
  • Cut deletes the selection only after its own copy reached the clipboard, in the tab it was copied from (copy replies echo requestId).
  • One settings normalizer (mini_browser.config.clean_setting) for app.config and MiniBrowserSettings.
  • Browser tests skip only when Playwright or Chromium is not installed; CRAFTBOT_REQUIRE_BROWSER_TESTS=1 makes that a failure too.
  • fix Windows run_shell: prevent nested-shell quoting failures and silent wrong output #475: allow PowerShell validation checks

  • grep improvement update using ripgrep

  • Make agent aware of NOTE and make missions obsolete

  • Fixed action set accumulation issue causing system prompt to bloat

  • fix: generalize message authority and quoted-reply interpretation

  • read and decode rg's plan output instead of json

  • fix(mini-browser): stop the post-box retype loop; let pages play sound

Threads (and other sites that link addresses as you type) put agents into a delete-and-retype loop, with link previews flipping between sites:

  • Web and e-mail addresses are inserted whole, like a paste. Typed key by key, the site saw every partial address ("https://e", ..., "example.co") and previewed the wrong ones.
  • After typing into a rich text box (contenteditable), the box is read back and the result says whether it holds the whole text; links, link previews and styled mentions are named as the site's formatting.
  • The same text is typed into the same page at most 3 times in 10 minutes; the 4th attempt is refused with a "stop and check or ask the user" message. Only a hash of the text is kept.
  • The mini-browser skill and the type action describe link previews and say never to delete and retype a post because it looks different.

Sound: Playwright starts Chromium with --mute-audio, so no page could play sound. New setting mini_browser.sound (default true) drops that switch; it applies at the browser's next start.

  • fix(mini-browser): show whole posts in observations, never half a link

The compact page observation showed only the first 40 characters of a post or message box, so a post with a link often appeared as "https://example.c…": a broken-looking link the agent took for its own typo, one more trigger of the Threads retype loop.

  • Textareas and rich text boxes show up to 300 characters, cut between words (also in the tighter fallback format), and say how long the full text is when it is cut.
  • The read-back after typing covers the whole editor, also when the element is one of its paragraphs.
  • The retype guard counts a retry that only writes an address differently ("https://" added or dropped) as the same text.

Checked against the real Lexical editor with its AutoLinkPlugin: typing an address key by key changed the link five times (example.c -> example.co -> example.com -> ...), now it is created once. Sound was measured in the Windows mixer: Chromium plays (live-view and agent clicks) with sound on, and is silent with it off.

  • Dropdowns: Playwright's select_option keeps waiting in the driver while the option is missing (force does not stop that retry), so a choice could land after the user took control. Each attempt is now one in-page step that finds the option again and selects it only if it is there and enabled (input + change, like Playwright); between attempts the wait only reads, and every attempt checks control first.
  • Closing the last tab: the owner and take-control checks run again after the replacement tab has opened, right before the close.
  • Cut: the copy is marked as a cut and the backend keeps the text it copied (memory only, 30 s). The delete is a "cut" input event in the ordered input queue, after whatever the user did meanwhile, and runs only while the selection is still exactly that text; otherwise it is skipped, so nothing that is not on the clipboard is deleted.
  • Cut: only a complete copy can be cut. A selection longer than the copy limit, or one with a saved password masked out, reaches the clipboard only in part, so it is copied but never deleted; the delete compares the whole selection. Pending cuts are kept per request, with ids scoped to the viewer connection (and unique per view mount), so two viewers' cuts never share a record and a mismatched delete leaves the others intact.
  • Retype guard: scoped to the same field (data-mb-field) and to text that was not sent; Enter or the page moving on resets it. Addresses only ignore "https://" and "www.", so different links are different texts. Filling several fields with the same value is never refused.
  • Navigation: control is checked again right before an operation runs (after crash recovery and bringing its window forward), right before navigate's goto / back / forward / reload, and before a new tab opened with a URL loads it.
  • fix: change google scopes

  • fix browser interface launching delay issue

  • fix requirement repeating in event stream and frequent folding issue

  • major UI update to incoporate session based browser and generative UI

  • Show model aware context budget, fix KV cache more, fix /clear, and adjusted model context windows and budget

  • Update model catalog to also handle cache expiration

  • feat: add protected shared credential manager

Add profile-scoped vaults, protected Windows host execution and native owner consent. Route browser, model, integration and isolated agent consumers through approved credential helpers while preserving existing generated tokens and sessions.

Include security review fixes, regression coverage, offline migration tooling and deployment documentation. Windows installation and interactive acceptance remain deferred.

  • refactor: reduce credential manager to shared browser vault extraction

  • feat: add shared saved-login manager to Settings

  • feat: improve credential manager browsing and item types

  • feat: let agents use saved API keys without revealing secrets

  • fix: adapt credential manager to session browser components

  • fix: let agents select saved logins by name

  • Add Claude subscription access with an isolated Claude Code profile

  • Fix automatic opening of the first generated output

  • fix: match saved API keys to their exact www host, stop replaying repeated API calls, decode undeclared text as UTF-8, and pass 304 responses through

  • Update and fix windows behaviour

  • fix: honor Claude reasoning choices and offload status checks

  • fix: align output budgets and clear remaining validation failures

  • fix: retain Claude recovery controls and serialize settings changes

  • fix: order model activation and cancel stale Claude sign-ins

  • update agent question behaviour

  • docs: record final closure checks and account validation gap

  • Fix memory count issue and stop logging irrelavant unprocessed event

  • update default LLM model and update some APIs

  • fix: sort chats by activity and persist unread receipts

  • Small improvement to the generative UI

  • UI update for credential tabs

  • Update V1.4.4 instruction/context to AGENT.md

  • fix: durability fixes


* fix: install env + installer UI

* fix: decode and stop silently truncating inbound integration messages

* Fix posthog proxy destination issue and agent app bidirectional communication issue

* clean comments

* clean up comments

* agent recieves truncated information

* Provide LLM reasoning effort param

* create effort setting knob

* fix max token ignores the reasoning output cap bug

* openai setting update

* fix duplicated steps and second decision per request

* fix incoming message encoding issue

* very minor UI update

* make gmail able to send inline email

* Sidebar UI update

* Fix default reasoning effort issue when switching model

* supabase integration

* Upload agent app showcase

* Update agent app visual

* Update README.md

* discard action sets umbrella of and describe set function

* figma integrations

* docs: add Figma integration result screenshots

* allow agent app's iframe to enable device access

* fix tunnel failed silently and get error from API rather than log file

* fix: allow cloudflared time to finish edge retries

Signed-off-by: ahmad-ajmal <ahmadajmal1514@gmail.com>

* fix #475: guide Windows shell execution and report quoting hazards

Signed-off-by: ahmad-ajmal <ahmadajmal1514@gmail.com>

* fix #475: scope shell guidance and preserve native errors

Signed-off-by: ahmad-ajmal <ahmadajmal1514@gmail.com>

* feat(mini-browser): import the Web Agent browser prototype onto main

Squash of the original korivi-Exp1 prototype (web agent V1/V2, password
vault, onboarding error wrap) applied on top of current main. Conflicts
resolved against main's newer browser adapter and sidebar; the local-only
slow_mode and profile-interview workarounds were dropped.

The page still targets the old task API; it is adapted in the next commits.

* feat(mini-browser): rebuild the Web Agent prototype as the Mini Browser

A real Chromium that agents drive and the user watches live, usable by every
kind of agent (main and chat sessions, a dedicated Mini Browser chat,
scheduled runs, Agent App trigger runs and the new browser_agent sub-agent).

Engine (app/mini_browser):
- dedicated "mini-browser" thread + event loop owns Playwright; callers on any
  loop marshal in (fixes sub-agents, which run on their own loops)
- one tab per agent session with per-tab locks, owner labels, take-control,
  follow-view, crash and driver-death recovery, idle shutdown, profile lock
- live view via CDP screencast of the viewed tab, only while a UI tab is
  subscribed, latest-frame-wins delivery
- ad blocking via CDP Network.setBlockedURLs (context.route disabled the HTTP
  cache); CraftBot's own UI origins blocked browser-wide
- human-like mouse paths, typing rhythm and scrolling
- 13 mini_browser_* actions; every result carries a fresh page observation

Password vault: Fernet + Windows DPAPI in .credentials/, atomic writes, no
silent data loss, strict origin matching; autofill only for the current
page's origin and never exposed to the model, logs or UI.

Platform: mini_browser_* WebSocket protocol and lanes, new session type
mini_browser, settings section, error codes, AgentBase run-state / stop /
delete / sub-agent / shutdown hooks, skill, prompt rule and AGENT.md.

Frontend: Mini Browser page (sidebar entry, live view with IME/paste/
shortcuts, tabs, take control, passwords dialog), 7 languages.

* fix(mini-browser): address the multi-agent review (53 confirmed findings)

Engine
- shared start/close/recovery tasks are awaited without inheriting their
  cancellation; a close during a launch aborts at a phase boundary, keeps
  the profile lock until Chromium exits and leaks no driver
- every agent tab gets its own Chromium window, so background owners are no
  longer throttled (clicks went from ~25 s to ~1 s)
- ops race against a per-tab closed event: a closed tab or browser ends the
  op with MINI_BROWSER_TAB_CLOSED / MINI_BROWSER_CLOSED, never a fake success
- run states and Stop are kept process-wide, so Stop before the first
  browser use still revokes sub-agents; the host is terminal after shutdown
- agents see only their own tabs' URLs; user tabs are claimed only when
  blank, by the Mini Browser chat for the viewed tab, or by an explicit
  switch to the viewed tab
- UI-origin blocking covers IPv4-mapped / 0.0.0.0 / [::] spellings;
  secrets are masked in their URL/HTML/JSON-encoded forms too
- downloads get Mark-of-the-Web on Windows and a "dangerous" flag

Agent operations
- take-control stops in-flight typing/mouse/scroll at once
- date/time inputs, framework click handlers, slotted labels, row context,
  iframes, modal text, slow-XHR settling and results kept under 16k chars
- conservative login outcomes; CAPTCHA/2FA flow via wait(for_user)
- vault autofill limited to the exact site (with or without www.)

Platform
- managed installs receive newly shipped action files and skills on
  upgrade (app/state_sync.py), without overwriting user edits
- the Mini Browser prompt rule is shown only when the browser is usable
- full /reset keeps per-session streams; input/control/shutdown get their
  own WebSocket lanes with input coalescing; settings reload live

Frontend
- no one-click Open for executable downloads; address bar binds to the
  edited tab; pending input never follows a view switch; passwords dialog
  error states; contrast, layout and translation fixes

* feat #479: add interactive Generative UI outputs

Signed-off-by: ahmad-ajmal <ahmadajmal1514@gmail.com>

* update logs accumulation issue

* feat #479: improve Generative UI workspace UX and motion

Signed-off-by: ahmad-ajmal <ahmadajmal1514@gmail.com>

* refactor #479: shorten Generative UI action instructions

Signed-off-by: ahmad-ajmal <ahmadajmal1514@gmail.com>

* fix: add agent app marketplace repository fallback

Signed-off-by: ahmad-ajmal <ahmadajmal1514@gmail.com>

* added run powershell action for windows only to prevent run shell encoding issue

* fix #475: reject non-cmd Windows shell selections

Signed-off-by: ahmad-ajmal <ahmadajmal1514@gmail.com>

* fix: enable selected-contact Telegram bot auto-replies

* fix: authenticate Telegram owners and preserve reply context with typing feedback

* fix: resolve short owner replies to quoted Telegram requests

* fix: enforce Telegram conversation-only tools before dispatch

* fix(ui): prevent integration settings loader from hanging

* fix(mini-browser): address the PR #483 review

- Agent input never lands after the user takes control. Waits for an
  element run in 250 ms slices that check control; clicks press through
  page.mouse at a point just checked to hit the element instead of
  Playwright's click, which kept waiting inside the driver. Focus, clear,
  caret, select, upload and whole-value inputs, and the vault login's fill
  and Enter, act on element handles right after the control check.
- Agents cannot close a tab the user controls.
- Opening a tab reserves its slot before the first await, so concurrent
  opens never exceed the browser-wide or per-owner tab limits.
- Agent screenshots cover password and secret fields, including fields
  that were password fields before a "show password" toggle.
- A saved password in a download's suggested name is masked before it
  becomes the file name, a log line or a notice.
- Cut deletes the selection only after its own copy reached the
  clipboard, in the tab it was copied from (copy replies echo requestId).
- One settings normalizer (mini_browser.config.clean_setting) for
  app.config and MiniBrowserSettings.
- Browser tests skip only when Playwright or Chromium is not installed;
  CRAFTBOT_REQUIRE_BROWSER_TESTS=1 makes that a failure too.

* fix #475: allow PowerShell validation checks

Signed-off-by: ahmad-ajmal <ahmadajmal1514@gmail.com>

* grep improvement update using ripgrep

* Make agent aware of NOTE and make missions obsolete

* Fixed action set accumulation issue causing system prompt to bloat

* fix: generalize message authority and quoted-reply interpretation

* read and decode rg's plan output instead of json

* fix(mini-browser): stop the post-box retype loop; let pages play sound

Threads (and other sites that link addresses as you type) put agents into
a delete-and-retype loop, with link previews flipping between sites:

- Web and e-mail addresses are inserted whole, like a paste. Typed key by
  key, the site saw every partial address ("https://e", ...,
  "example.co") and previewed the wrong ones.
- After typing into a rich text box (contenteditable), the box is read
  back and the result says whether it holds the whole text; links, link
  previews and styled mentions are named as the site's formatting.
- The same text is typed into the same page at most 3 times in 10
  minutes; the 4th attempt is refused with a "stop and check or ask the
  user" message. Only a hash of the text is kept.
- The mini-browser skill and the type action describe link previews and
  say never to delete and retype a post because it looks different.

Sound: Playwright starts Chromium with --mute-audio, so no page could play
sound. New setting mini_browser.sound (default true) drops that switch; it
applies at the browser's next start.

* fix(mini-browser): show whole posts in observations, never half a link

The compact page observation showed only the first 40 characters of a
post or message box, so a post with a link often appeared as
"https://example.c…": a broken-looking link the agent took for its own
typo, one more trigger of the Threads retype loop.

- Textareas and rich text boxes show up to 300 characters, cut between
  words (also in the tighter fallback format), and say how long the full
  text is when it is cut.
- The read-back after typing covers the whole editor, also when the
  element is one of its paragraphs.
- The retype guard counts a retry that only writes an address
  differently ("https://" added or dropped) as the same text.

Checked against the real Lexical editor with its AutoLinkPlugin: typing
an address key by key changed the link five times (example.c ->
example.co -> example.com -> ...), now it is created once. Sound was
measured in the Windows mixer: Chromium plays (live-view and agent
clicks) with sound on, and is silent with it off.

* fix(mini-browser): address the PR #483 re-review

- Dropdowns: Playwright's select_option keeps waiting in the driver while
  the option is missing (force does not stop that retry), so a choice
  could land after the user took control. Each attempt is now one
  in-page step that finds the option again and selects it only if it is
  there and enabled (input + change, like Playwright); between attempts
  the wait only reads, and every attempt checks control first.
- Closing the last tab: the owner and take-control checks run again after
  the replacement tab has opened, right before the close.
- Cut: the copy is marked as a cut and the backend keeps the text it
  copied (memory only, 30 s). The delete is a "cut" input event in the
  ordered input queue, after whatever the user did meanwhile, and runs
  only while the selection is still exactly that text; otherwise it is
  skipped, so nothing that is not on the clipboard is deleted.

* fix: preserve integration guidance for action subgroups

Signed-off-by: ahmad-ajmal <ahmadajmal1514@gmail.com>

* fix(mini-browser): address the third PR #483 review

- Cut: only a complete copy can be cut. A selection longer than the copy
  limit, or one with a saved password masked out, reaches the clipboard
  only in part, so it is copied but never deleted; the delete compares the
  whole selection. Pending cuts are kept per request, with ids scoped to
  the viewer connection (and unique per view mount), so two viewers' cuts
  never share a record and a mismatched delete leaves the others intact.
- Retype guard: scoped to the same field (data-mb-field) and to text that
  was not sent; Enter or the page moving on resets it. Addresses only
  ignore "https://" and "www.", so different links are different texts.
  Filling several fields with the same value is never refused.
- Navigation: control is checked again right before an operation runs
  (after crash recovery and bringing its window forward), right before
  navigate's goto / back / forward / reload, and before a new tab opened
  with a URL loads it.

* fix: change google scopes

* fix browser interface launching delay issue

* fix requirement repeating in event stream and frequent folding issue

* major UI update to incoporate session based browser and generative UI

* Show model aware context budget, fix KV cache more, fix /clear, and adjusted model context windows and budget

* Update model catalog to also handle cache expiration

* feat: add protected shared credential manager

Add profile-scoped vaults, protected Windows host execution and native owner consent. Route browser, model, integration and isolated agent consumers through approved credential helpers while preserving existing generated tokens and sessions.

Include security review fixes, regression coverage, offline migration tooling and deployment documentation. Windows installation and interactive acceptance remain deferred.

Signed-off-by: ahmad-ajmal <165422770+ahmad-ajmal@users.noreply.github.com>

* refactor: reduce credential manager to shared browser vault extraction

Signed-off-by: ahmad-ajmal <ahmadajmal1514@gmail.com>

* feat: add shared saved-login manager to Settings

* feat: improve credential manager browsing and item types

* feat: let agents use saved API keys without revealing secrets

* fix: adapt credential manager to session browser components

* fix: let agents select saved logins by name

* Add Claude subscription access with an isolated Claude Code profile

* Fix automatic opening of the first generated output

* fix: match saved API keys to their exact www host, stop replaying repeated API calls, decode undeclared text as UTF-8, and pass 304 responses through

* Update and fix windows behaviour

* fix: honor Claude reasoning choices and offload status checks

Signed-off-by: ahmad-ajmal <ahmadajmal1514@gmail.com>

* fix: align output budgets and clear remaining validation failures

Signed-off-by: ahmad-ajmal <ahmadajmal1514@gmail.com>

* fix: retain Claude recovery controls and serialize settings changes

Signed-off-by: ahmad-ajmal <ahmadajmal1514@gmail.com>

* fix: order model activation and cancel stale Claude sign-ins

Signed-off-by: ahmad-ajmal <ahmadajmal1514@gmail.com>

* update agent question behaviour

* docs: record final closure checks and account validation gap

Signed-off-by: ahmad-ajmal <ahmadajmal1514@gmail.com>

* Fix memory count issue and stop logging irrelavant unprocessed event

* update default LLM model and update some APIs

* fix: sort chats by activity and persist unread receipts

* Small improvement to the generative UI

* UI update for credential tabs

* Update V1.4.4 instruction/context to AGENT.md

* fix: durability fixes

---------

Signed-off-by: ahmad-ajmal <ahmadajmal1514@gmail.com>
Signed-off-by: ahmad-ajmal <165422770+ahmad-ajmal@users.noreply.github.com>
Co-authored-by: CraftBot <craftbot@craftbot.dev>
Co-authored-by: イツミネ <tham_yikfoong@outlook.com>
Co-authored-by: CraftOS <thamyikfoong@craftos.net>
Co-authored-by: Korivi <korivi@craftos.net>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@CraftOS-dev
CraftOS-dev merged commit 94aa652 into main Oct 23, 2026
21 of 22 checks passed
Sign up for free to 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.

Windows run_shell: prevent nested-shell quoting failures and silent wrong output

2 participants