4067 Commits

Author SHA1 Message Date
jh-block b00b8d1910 Remove shared mesh-constants module, inline constants in each file
The shared mesh-constants.ts module imported by both the main process
and renderer may cause Vite bundling issues. Inline the constants in
main.ts and MeshSettings.tsx instead.

Signed-off-by: jh-block <jhugo@block.xyz>
2026-03-31 12:36:39 +02:00
jh-block a8dbda494e Fix crash: replace top-level promisify(execFile) with local helper
The top-level promisify(execFile) call caused a renderer crash on
startup. Replace with a simple promise-wrapping helper function that
avoids module-scope side effects.

Signed-off-by: jh-block <jhugo@block.xyz>
2026-03-31 12:36:39 +02:00
jh-block d7c33547e1 Fix crash: move execFileAsync declaration after all imports
The promisify(execFile) statement was placed between import
declarations, breaking ESM module evaluation order and causing React
hooks to be null at app startup.

Signed-off-by: jh-block <jhugo@block.xyz>
2026-03-31 12:36:39 +02:00
jh-block c8a007e37b Cancel stale mesh-start timeout before retrying
Store the 5-minute startup timeout in a ref and clear it on each new
startMesh call, preventing a stale timer from interrupting a valid
retry with a false failure message.

Signed-off-by: jh-block <jhugo@block.xyz>
2026-03-31 12:36:39 +02:00
jh-block 7b7f8b8885 Gate mesh download button on Apple Silicon, expose arch in preload
Only show the Download mesh-llm button on arm64 Macs, matching the
backend guard. Intel Macs now see only the install guide link. Expose
process.arch via the electron preload bridge to support the check.

Signed-off-by: jh-block <jhugo@block.xyz>
2026-03-31 12:36:39 +02:00
jh-block ff78001393 Use async execFile in download-mesh to avoid blocking main process
Replace execFileSync calls (curl, tar, codesign, xattr) with
promisified execFile so Electron's main event loop stays responsive
during mesh-llm download and installation.

Signed-off-by: jh-block <jhugo@block.xyz>
2026-03-31 12:36:38 +02:00
jh-block bde5f56816 Validate mesh API probe response, gate mesh deep-link on availability
- check-mesh: verify HTTP 200 status and that response data is an array
  with string IDs before marking mesh as running, preventing false
  positives from other services on port 9337 or JSON error responses
- SettingsView: block section=mesh deep-link when tunnelDisabled, and
  reset activeTab to models if mesh tab becomes unavailable, matching
  the existing local-inference availability pattern

Signed-off-by: jh-block <jhugo@block.xyz>
2026-03-31 12:36:38 +02:00
jh-block 88ee7f69ef Persist mesh provider ID across remounts, reject download on Intel Macs
- Store meshProviderId in localStorage so reopening Settings finds the
  previously created provider instead of creating duplicates
- Gate auto-download on process.arch === 'arm64' in addition to darwin
  check, since the bundled binaries are Apple Silicon only

Signed-off-by: jh-block <jhugo@block.xyz>
2026-03-31 12:36:38 +02:00
jh-block 822f3f25e7 Address codex review: reuse provider ID across activations, avoid shell interpolation
- Track mesh provider ID in state so subsequent activations look up the
  correct ID returned by createCustomProvider (e.g. custom_inference_mesh)
  instead of always querying for 'mesh', which caused duplicate providers
- Replace shell-interpolated execSync calls in download-mesh with
  execFileSync argument arrays for curl, tar, codesign, and xattr to
  avoid path-dependent failures (e.g. apostrophes in home directory)
- Download to temp tarball then extract, with cleanup in finally block

Signed-off-by: jh-block <jhugo@block.xyz>
2026-03-31 12:36:38 +02:00
jh-block b21ebbaafd Revert accidental hermit node upgrade (24.10.0 -> 24.14.1)
The node version bump was unintentionally included in a mesh settings
commit. Restore bin/ symlinks to match main.

Signed-off-by: jh-block <jhugo@block.xyz>
2026-03-31 12:36:38 +02:00
jh-block e42fa974c6 Fix mesh settings: error handling, security, and code quality improvements
- stopMesh: check result.stopped before updating UI state
- stop-mesh IPC: return { stopped: false } when binary is not found
- start-mesh IPC: close log file descriptor after spawn to prevent fd leak
- start-mesh IPC: wait 500ms for early spawn errors (permissions, ENOENT)
- check-mesh: prioritize API probe over install check so running mesh
  from an undiscovered path is detected correctly
- stop-mesh IPC: use execFileSync instead of execSync to avoid shell
  metacharacter injection risk
- Remove redundant ensureMeshProvider IPC that wrote mesh.json directly;
  use REST API create-or-update pattern exclusively for atomic file
  writes and registry refresh
- Remove ensureMeshProvider from preload.ts and main.ts IPC handlers
- Replace dynamic imports of Node builtins (os, path, fs, child_process,
  http) with top-level imports, eliminating per-call overhead and .default
  access patterns
- Extract shared port/model constants to mesh-constants.ts, imported by
  both main.ts and MeshSettings.tsx to eliminate duplication

Signed-off-by: jh-block <jhugo@block.xyz>
2026-03-31 12:36:38 +02:00
Michael Neale 0c8ce0d38f Fix: trigger server-side provider refresh after writing mesh.json
Writing mesh.json directly ensures the ID is 'mesh', but the running
goosed server doesn't know about it until its registry is refreshed.
After writing the file, call updateCustomProvider via the API which
triggers refresh_custom_providers() server-side. Then setConfigProvider
can find the 'mesh' provider.

Signed-off-by: Michael Neale <michael.neale@gmail.com>
2026-03-31 12:36:38 +02:00
Michael Neale 83f85d1151 Fix provider ID, startup timeout, and public mesh warning
1. Write mesh.json directly to custom_providers/ via IPC instead of
   using the create API (which generates an unpredictable ID from the
   display name). Ensures the provider is always 'mesh' so
   setConfigProvider works on fresh installs.

2. Add 5-minute timeout on 'starting' state so the UI doesn't get
   stuck if mesh-llm crashes on startup. Shows log path in error.

3. Add privacy warning to auto-discover: public meshes are run by
   volunteers, prompts are sent to their hardware.

Signed-off-by: Michael Neale <michael.neale@gmail.com>
2026-03-31 12:36:37 +02:00
Michael Neale 49590982d2 Use GOOSE_TUNNEL to gate Mesh tab instead of new env var
Reuse the existing GOOSE_TUNNEL=no flag (already set by bundle.py
for corporate builds) to hide the Mesh tab. When tunnel is disabled,
mesh is hidden too — same intent: no external network features.

Removes the GOOSE_MESH_ENABLED variable added in the previous commit.

Signed-off-by: Michael Neale <michael.neale@gmail.com>
2026-03-31 12:36:35 +02:00
Michael Neale ea4827dfbd Add GOOSE_MESH_ENABLED feature flag
Mesh tab is shown by default (open-source). Set env var
GOOSE_MESH_ENABLED=false to hide the tab entirely — for use
in bundled/enterprise builds via goose-releases.

Signed-off-by: Michael Neale <michael.neale@gmail.com>
2026-03-31 12:35:53 +02:00
Michael Neale d52b25e036 Fix contribute GPU checkbox alignment
Remove pl-6 indent — the checkbox applies to both auto and join
modes equally, not as a sub-option of a specific radio button.

Signed-off-by: Michael Neale <michael.neale@gmail.com>
2026-03-31 12:35:10 +02:00
Michael Neale bd0bcd1a86 Improve mesh tab messaging and cross-platform UX
- Mark as 'Experimental' in the description
- Link to docs.anarchai.org as 'Learn more' and inline doc link
- Not-installed panel: show Download button on macOS, Install guide
  link on all platforms, no platform-shaming messaging
- Consistent tone: this is a new thing, use with care

Signed-off-by: Michael Neale <michael.neale@gmail.com>
2026-03-31 12:35:10 +02:00
Michael Neale cebc18535f Guard mesh-llm download to macOS only
The release bundle is aarch64 macOS (Apple Silicon) only. On other
platforms, show a note instead of the download button and suggest
manual install. Also guard the IPC handler server-side.

Signed-off-by: Michael Neale <michael.neale@gmail.com>
2026-03-31 12:35:10 +02:00
Michael Neale b5913f8b71 Fix model switch not reflecting in current chat window
After activating a mesh model, call refreshCurrentModelAndProvider()
so the existing chat window picks up the new provider/model
immediately — same pattern as LocalInferenceSettings.

Signed-off-by: Michael Neale <michael.neale@gmail.com>
2026-03-31 12:35:09 +02:00
Michael Neale d78beb216b Fix mesh status polling loop
Status was set to 'checking' which triggered the useEffect (depends
on status), which recreated the interval, which called checkStatus
again — infinite loop.

Fix: separate 'checking' into a boolean flag that doesn't affect
the polling interval. The status enum only holds stable states
(stopped/running/starting/etc). The checking spinner shows inline
on the current status indicator instead of replacing it.

Signed-off-by: Michael Neale <michael.neale@gmail.com>
2026-03-31 12:35:09 +02:00
Michael Neale 690521f16e Add mesh-llm auto-download to ~/.mesh-llm/
When mesh-llm isn't found on PATH or ~/.local/bin or ~/.mesh-llm,
the Mesh settings tab shows a 'Download mesh-llm' button (~19 MB).

Downloads the release bundle from GitHub, extracts to ~/.mesh-llm/,
and codesigns + clears quarantine on macOS. Once downloaded, the
setup panel (start/join/auto) unlocks.

Binary lookup order: PATH > ~/.mesh-llm/ > ~/.local/bin/
Shared findMeshBinary() used by all three IPC handlers.

Signed-off-by: Michael Neale <michael.neale@gmail.com>
2026-03-31 12:35:09 +02:00
Michael Neale 956e118de5 Add Inference Mesh settings tab
Settings > Mesh tab for integrating with mesh-llm:

- Start a new private mesh (pick a model from catalog)
- Join with invite token (optionally contribute GPU)
- Auto-discover public meshes
- View live models and select one as Goose's provider
- Copy invite token to share with others
- Open web console (localhost:3131)
- Stop mesh from UI

Architecture: no new Rust provider needed. mesh-llm exposes an
OpenAI-compatible API on localhost:9337. The UI creates/updates a
custom provider ('mesh') pointing at that endpoint via the existing
declarative provider system.

Electron spawns mesh-llm detached (it's a daemon — survives Goose
quit, serves peers, keeps models loaded). Same pattern as Ollama:
check if running, don't own the process lifecycle.

IPC handlers: check-mesh (probes API + console for status/token/peers),
start-mesh (spawns detached with mode-specific args), stop-mesh
(runs 'mesh-llm stop').

Signed-off-by: Michael Neale <michael.neale@gmail.com>
2026-03-31 12:35:09 +02:00
Lifei Zhou bc296816b1 only run windows compile on main branch (#8216) 2026-03-31 02:23:39 +00:00
Lifei Zhou b860e0f269 used simplified privacy info modal and removed unnecessary components (#8200)
Co-authored-by: Douwe Osinga <douwe@squareup.com>
2026-03-31 00:25:36 +00:00
Lifei Zhou 5b47740d73 removed unused welcome route (#8196) 2026-03-30 15:12:30 +00:00
Ravitez Dondeti 26d3d3ace3 fix: use build_host_url for GCP Vertex AI location fallback (#8185)
Signed-off-by: rdondeti <ravitez.dondeti@gmail.com>
2026-03-30 15:11:36 +00:00
Alex Hancock e3b78e8e81 fix: remove ui/acp/.npmrc to allow auth token inheritance
The ui/acp/.npmrc file with registry= prevents npm from inheriting
the auth token from the parent ui/.npmrc during publishing.

This is the same fix that was applied to ui/text/.npmrc in a36ca9a.

Fixes the ENEEDAUTH error in the publish-npm workflow.

Signed-off-by: Alex Hancock <alexhancock@block.xyz>
2026-03-30 11:47:40 -04:00
Douwe Osinga a7f5c6c112 fix(openai): use safely_parse_json for streaming tool arguments (#8208)
Signed-off-by: Douwe Osinga <douwe@squareup.com>
Co-authored-by: Douwe Osinga <douwe@squareup.com>
2026-03-30 15:09:03 +00:00
Adrian Cole 764760edfb feat: add copilot-acp provider (#8154)
Signed-off-by: Adrian Cole <adrian@tetrate.io>
2026-03-30 14:15:11 +00:00
dependabot[bot] d9b69ef735 chore(deps): bump path-to-regexp from 8.3.0 to 8.4.0 in /evals/open-model-gym/mcp-harness (#8178)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-30 14:02:55 +00:00
Alex Hancock 074f8312b0 fix: add NODE_AUTH_TOKEN and always-auth (#8163) 2026-03-30 13:30:56 +00:00
Lifei Zhou 73b542c388 fix: i18n compile on windows (#8202) 2026-03-30 12:07:29 +00:00
BestCodes 0469af7f3b remove name from blog post (#8157)
Signed-off-by: The-Best-Codes <106822363+The-Best-Codes@users.noreply.github.com>
2026-03-30 03:43:18 +00:00
BestCodes 5825821591 fix: use overflow: clip to not disrupt sticky ToC (#8158)
Signed-off-by: The-Best-Codes <106822363+The-Best-Codes@users.noreply.github.com>
2026-03-29 06:31:17 +00:00
dependabot[bot] 6b20f2c4e9 chore(deps): bump path-to-regexp from 0.1.12 to 0.1.13 in /documentation (#8161)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-29 06:29:04 +00:00
dependabot[bot] 400ee0964c chore(deps): bump node-forge from 1.3.2 to 1.4.0 in /documentation (#8145)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-29 06:28:35 +00:00
Alex Hancock dfa93fe948 refactor: goose-acp-server -> goose binary for TUI (#8155) 2026-03-27 21:12:11 +00:00
BestCodes ae83fd2adc fix "View as Markdown" feature not working (#8160)
Signed-off-by: The-Best-Codes <106822363+The-Best-Codes@users.noreply.github.com>
2026-03-27 19:45:34 +00:00
Alex Hancock 7368f74e74 feat(tui): UI improvements for messages, tool calls, text entry, etc (#8156) 2026-03-27 19:45:12 +00:00
jh-block a6765fbcd9 feat(desktop): add i18n infrastructure with react-intl (#8105) 2026-03-27 18:39:50 +00:00
Alex Hancock d596113e72 fix(tui): ordering of messages (#8144) 2026-03-27 13:38:08 +00:00
Lifei Zhou 98bab02aa5 fix: extension command with quotes in cli (#8150) 2026-03-27 12:37:26 +00:00
Jack Amadeo 88c06ab5dc chore(aaif): Use Azure Artifact Signing for Windows (#8116)
Signed-off-by: Douwe Osinga <douwe@squareup.com>
Co-authored-by: Douwe Osinga <douwe@squareup.com>
2026-03-27 11:36:27 +00:00
Jack Amadeo 376e94e47a chore(aaif): Switch macOS code signing (#8076) 2026-03-27 11:36:19 +00:00
dorien-koelemeijer 6d25161b19 Remove unused tool call json in logs (#8147) 2026-03-27 03:09:14 +00:00
Alex Hancock 0a1f773e7d feat(tui): tab expand tool calls cleanly (#8136)
Co-authored-by: Douwe Osinga <douwe@squareup.com>
2026-03-26 21:04:57 -04:00
jeffa-block 907c661f3e fix: replace panics with user-friendly errors in CLI session builder (#7901) 2026-03-26 21:23:07 +00:00
jeffa-block 143a269b18 fix: read GOOSE_CONTEXT_LIMIT from config.yaml, not just env vars (#7900) 2026-03-26 21:23:05 +00:00
jeffa-block abdeaee0ff fix: deliver truncation notice as separate content block (#7899) 2026-03-26 21:23:03 +00:00
jeffa-block 9a226421a1 fix: use platform-appropriate commands in developer extension instructions (#7898) 2026-03-26 21:23:01 +00:00