@greppleai/grip 0.0.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/CHANGELOG.md +93 -0
  2. package/README.md +13 -7
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js +4 -2
  5. package/dist/bun/cli.js.map +1 -1
  6. package/dist/bun/embedded-assets.d.ts +3 -0
  7. package/dist/bun/embedded-assets.d.ts.map +1 -0
  8. package/dist/bun/embedded-assets.js +52 -0
  9. package/dist/bun/embedded-assets.js.map +1 -0
  10. package/dist/cli/args.d.ts.map +1 -1
  11. package/dist/cli/args.js +1 -0
  12. package/dist/cli/args.js.map +1 -1
  13. package/dist/config.d.ts.map +1 -1
  14. package/dist/config.js +3 -3
  15. package/dist/config.js.map +1 -1
  16. package/dist/core/agent-session.d.ts.map +1 -1
  17. package/dist/core/agent-session.js +17 -2
  18. package/dist/core/agent-session.js.map +1 -1
  19. package/dist/core/remote-workspace-protocol/contract.d.ts +13 -4
  20. package/dist/core/remote-workspace-protocol/contract.d.ts.map +1 -1
  21. package/dist/core/remote-workspace-protocol/contract.js +17 -1
  22. package/dist/core/remote-workspace-protocol/contract.js.map +1 -1
  23. package/dist/core/remote-workspace-protocol/guest-shared-client.d.ts +16 -0
  24. package/dist/core/remote-workspace-protocol/guest-shared-client.d.ts.map +1 -0
  25. package/dist/core/remote-workspace-protocol/guest-shared-client.js +54 -0
  26. package/dist/core/remote-workspace-protocol/guest-shared-client.js.map +1 -0
  27. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.d.ts +23 -0
  28. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.d.ts.map +1 -0
  29. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js +112 -0
  30. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js.map +1 -0
  31. package/dist/core/remote-workspace-protocol/guest-shared-uplink.d.ts +30 -0
  32. package/dist/core/remote-workspace-protocol/guest-shared-uplink.d.ts.map +1 -0
  33. package/dist/core/remote-workspace-protocol/guest-shared-uplink.js +243 -0
  34. package/dist/core/remote-workspace-protocol/guest-shared-uplink.js.map +1 -0
  35. package/dist/core/remote-workspace-protocol/lima-owner-directory.d.ts +3 -0
  36. package/dist/core/remote-workspace-protocol/lima-owner-directory.d.ts.map +1 -0
  37. package/dist/core/remote-workspace-protocol/lima-owner-directory.js +31 -0
  38. package/dist/core/remote-workspace-protocol/lima-owner-directory.js.map +1 -0
  39. package/dist/core/remote-workspace-protocol/lima-owner-lock.d.ts +9 -0
  40. package/dist/core/remote-workspace-protocol/lima-owner-lock.d.ts.map +1 -0
  41. package/dist/core/remote-workspace-protocol/lima-owner-lock.js +89 -0
  42. package/dist/core/remote-workspace-protocol/lima-owner-lock.js.map +1 -0
  43. package/dist/core/remote-workspace-protocol/session.d.ts +2 -0
  44. package/dist/core/remote-workspace-protocol/session.d.ts.map +1 -1
  45. package/dist/core/remote-workspace-protocol/session.js +3 -0
  46. package/dist/core/remote-workspace-protocol/session.js.map +1 -1
  47. package/dist/core/remote-workspace-protocol/shared-transport.d.ts +71 -0
  48. package/dist/core/remote-workspace-protocol/shared-transport.d.ts.map +1 -0
  49. package/dist/core/remote-workspace-protocol/shared-transport.js +68 -0
  50. package/dist/core/remote-workspace-protocol/shared-transport.js.map +1 -0
  51. package/dist/core/sandbox/command.d.ts +2 -4
  52. package/dist/core/sandbox/command.d.ts.map +1 -1
  53. package/dist/core/sandbox/command.js +24 -46
  54. package/dist/core/sandbox/command.js.map +1 -1
  55. package/dist/core/sandbox/config.d.ts +91 -0
  56. package/dist/core/sandbox/config.d.ts.map +1 -0
  57. package/dist/core/sandbox/config.js +88 -0
  58. package/dist/core/sandbox/config.js.map +1 -0
  59. package/dist/core/sandbox/lima-guest-binary.d.ts +11 -0
  60. package/dist/core/sandbox/lima-guest-binary.d.ts.map +1 -0
  61. package/dist/core/sandbox/lima-guest-binary.js +140 -0
  62. package/dist/core/sandbox/lima-guest-binary.js.map +1 -0
  63. package/dist/core/sandbox/lima.d.ts +22 -3
  64. package/dist/core/sandbox/lima.d.ts.map +1 -1
  65. package/dist/core/sandbox/lima.js +434 -42
  66. package/dist/core/sandbox/lima.js.map +1 -1
  67. package/dist/core/sandbox/shared-lima-roots.d.ts +11 -0
  68. package/dist/core/sandbox/shared-lima-roots.d.ts.map +1 -0
  69. package/dist/core/sandbox/shared-lima-roots.js +25 -0
  70. package/dist/core/sandbox/shared-lima-roots.js.map +1 -0
  71. package/dist/core/sandbox/update-shared-guest-binary.d.ts +8 -0
  72. package/dist/core/sandbox/update-shared-guest-binary.d.ts.map +1 -0
  73. package/dist/core/sandbox/update-shared-guest-binary.js +100 -0
  74. package/dist/core/sandbox/update-shared-guest-binary.js.map +1 -0
  75. package/dist/core/settings-manager.d.ts +1 -5
  76. package/dist/core/settings-manager.d.ts.map +1 -1
  77. package/dist/core/settings-manager.js.map +1 -1
  78. package/dist/core/tools/bash.d.ts.map +1 -1
  79. package/dist/core/tools/bash.js +25 -14
  80. package/dist/core/tools/bash.js.map +1 -1
  81. package/dist/core/tools/file-mutation-queue.d.ts +2 -0
  82. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  83. package/dist/core/tools/file-mutation-queue.js +9 -0
  84. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  85. package/dist/core/tools/operations.d.ts +13 -2
  86. package/dist/core/tools/operations.d.ts.map +1 -1
  87. package/dist/core/tools/operations.js +132 -36
  88. package/dist/core/tools/operations.js.map +1 -1
  89. package/dist/daemon/activity-budget.d.ts +10 -0
  90. package/dist/daemon/activity-budget.d.ts.map +1 -0
  91. package/dist/daemon/activity-budget.js +34 -0
  92. package/dist/daemon/activity-budget.js.map +1 -0
  93. package/dist/daemon/config.d.ts +2 -0
  94. package/dist/daemon/config.d.ts.map +1 -1
  95. package/dist/daemon/config.js +15 -0
  96. package/dist/daemon/config.js.map +1 -1
  97. package/dist/daemon/outbound-budget.d.ts +10 -0
  98. package/dist/daemon/outbound-budget.d.ts.map +1 -0
  99. package/dist/daemon/outbound-budget.js +30 -0
  100. package/dist/daemon/outbound-budget.js.map +1 -0
  101. package/dist/daemon/security.d.ts.map +1 -1
  102. package/dist/daemon/security.js +3 -1
  103. package/dist/daemon/security.js.map +1 -1
  104. package/dist/daemon/server.d.ts.map +1 -1
  105. package/dist/daemon/server.js +104 -24
  106. package/dist/daemon/server.js.map +1 -1
  107. package/dist/daemon/shared-connection.d.ts +33 -0
  108. package/dist/daemon/shared-connection.d.ts.map +1 -0
  109. package/dist/daemon/shared-connection.js +271 -0
  110. package/dist/daemon/shared-connection.js.map +1 -0
  111. package/dist/daemon/shared-revision.d.ts +5 -0
  112. package/dist/daemon/shared-revision.d.ts.map +1 -0
  113. package/dist/daemon/shared-revision.js +61 -0
  114. package/dist/daemon/shared-revision.js.map +1 -0
  115. package/dist/daemon/shared-roots.d.ts +9 -0
  116. package/dist/daemon/shared-roots.d.ts.map +1 -0
  117. package/dist/daemon/shared-roots.js +33 -0
  118. package/dist/daemon/shared-roots.js.map +1 -0
  119. package/dist/daemon/workspace-runtime.d.ts +1 -1
  120. package/dist/daemon/workspace-runtime.d.ts.map +1 -1
  121. package/dist/daemon/workspace-runtime.js +42 -10
  122. package/dist/daemon/workspace-runtime.js.map +1 -1
  123. package/dist/main.d.ts.map +1 -1
  124. package/dist/main.js +5 -3
  125. package/dist/main.js.map +1 -1
  126. package/dist/modes/interactive/components/assistant-message.d.ts +1 -0
  127. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  128. package/dist/modes/interactive/components/assistant-message.js +13 -3
  129. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  130. package/dist/modes/interactive/components/branch-summary-message.d.ts +4 -3
  131. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  132. package/dist/modes/interactive/components/branch-summary-message.js +5 -4
  133. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  134. package/dist/modes/interactive/components/compaction-summary-message.d.ts +4 -3
  135. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  136. package/dist/modes/interactive/components/compaction-summary-message.js +5 -4
  137. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  138. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  139. package/dist/modes/interactive/components/custom-message.js +4 -3
  140. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  141. package/dist/modes/interactive/components/hook-execution.d.ts.map +1 -1
  142. package/dist/modes/interactive/components/hook-execution.js +3 -2
  143. package/dist/modes/interactive/components/hook-execution.js.map +1 -1
  144. package/dist/modes/interactive/components/message-card.d.ts +9 -0
  145. package/dist/modes/interactive/components/message-card.d.ts.map +1 -0
  146. package/dist/modes/interactive/components/message-card.js +24 -0
  147. package/dist/modes/interactive/components/message-card.js.map +1 -0
  148. package/dist/modes/interactive/components/skill-invocation-message.d.ts +4 -3
  149. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  150. package/dist/modes/interactive/components/skill-invocation-message.js +5 -4
  151. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  152. package/dist/modes/interactive/components/tool-execution.d.ts +1 -1
  153. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  154. package/dist/modes/interactive/components/tool-execution.js +27 -21
  155. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  156. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  157. package/dist/modes/interactive/components/user-message.js +3 -2
  158. package/dist/modes/interactive/components/user-message.js.map +1 -1
  159. package/dist/modes/interactive/interactive-mode.d.ts +0 -3
  160. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  161. package/dist/modes/interactive/interactive-mode.js +55 -44
  162. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  163. package/dist/modes/interactive/theme/theme.d.ts +3 -0
  164. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  165. package/dist/modes/interactive/theme/theme.js +10 -0
  166. package/dist/modes/interactive/theme/theme.js.map +1 -1
  167. package/dist/utils/clipboard-native.d.ts.map +1 -1
  168. package/dist/utils/clipboard-native.js +1 -1
  169. package/dist/utils/clipboard-native.js.map +1 -1
  170. package/dist/utils/image-resize.d.ts.map +1 -1
  171. package/dist/utils/image-resize.js +5 -0
  172. package/dist/utils/image-resize.js.map +1 -1
  173. package/dist/utils/photon.d.ts.map +1 -1
  174. package/dist/utils/photon.js +1 -0
  175. package/dist/utils/photon.js.map +1 -1
  176. package/docs/daemon.md +6 -4
  177. package/docs/docs.json +1 -1
  178. package/docs/index.md +8 -12
  179. package/docs/packages.md +3 -3
  180. package/docs/quickstart.md +11 -19
  181. package/docs/sandbox.md +40 -117
  182. package/docs/settings.md +12 -11
  183. package/docs/termux.md +1 -18
  184. package/docs/usage.md +2 -2
  185. package/examples/README.md +0 -2
  186. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  187. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  188. package/examples/extensions/sandbox/package.json +1 -1
  189. package/examples/extensions/with-deps/package.json +1 -1
  190. package/npm-shrinkwrap.json +12 -12
  191. package/package.json +5 -6
  192. package/dist/core/sandbox/docker.d.ts +0 -169
  193. package/dist/core/sandbox/docker.d.ts.map +0 -1
  194. package/dist/core/sandbox/docker.js +0 -633
  195. package/dist/core/sandbox/docker.js.map +0 -1
  196. package/examples/sandbox-docker/Dockerfile +0 -274
  197. package/examples/sandbox-docker/README.md +0 -88
package/docs/daemon.md CHANGED
@@ -2,12 +2,12 @@
2
2
 
3
3
  `grip --daemon` starts Grip as a remote workspace runtime. A normal local Grip process remains the orchestrator: it owns provider credentials, model calls, prompts, sessions, compaction, extensions, subagents, RPC, and UI. The daemon owns one configured workspace and executes canonical workspace tools, primitive project-resource operations, streamed file transfers, optional process execution, and optional colocated LSP.
4
4
 
5
- Grip integrates the daemon into `@greppleai/grip`; start it with `grip --daemon`. Verify package availability before installing from a registry; a local packaged build can be used instead.
5
+ Grip includes the daemon in the single-file executable; install a published, checksummed binary using [Quickstart](quickstart.md#install) or use a locally built executable. The daemon needs no npm installation on its host.
6
6
 
7
7
  ## Start a daemon
8
8
 
9
9
  ```bash
10
- npm install -g --ignore-scripts @greppleai/grip
10
+ # Install the verified Grip binary first (see Quickstart).
11
11
  GRIP_DAEMON_TOKEN='long-random-token' \
12
12
  grip --daemon --daemon-cwd /workspace --daemon-host 127.0.0.1 --daemon-port 8787
13
13
  ```
@@ -31,12 +31,15 @@ Use `GRIP_REMOTE_TOKEN` on the client. Do not put tokens in query strings or URL
31
31
 
32
32
  ## Topology and trust boundary
33
33
 
34
- One daemon process serves one workspace root and one trust domain. The daemon is an authenticated remote-code-execution service: anyone with the bearer token can use every advertised daemon capability.
34
+ In ordinary v1 mode, each daemon connection exposes a single workspace root; all clients of a daemon still share its OS-user trust domain. The daemon is an authenticated remote-code-execution service: anyone with the bearer token can use every advertised daemon capability. The separately negotiated v2 shared-Lima mode binds a workspace root per channel, but does **not** provide hostile-client isolation.
35
35
 
36
36
  Application-layer confinement prevents protocol paths and symlinks from escaping the configured workspace and optional temporary root for file tools, resource reads, file transfers, temporary outputs, subprocess working directories, and LSP paths. `GRIP_DAEMON_TEMP_ROOT` is opt-in and should point only to disposable storage inside an OS sandbox; it is unset by default. This is not an operating-system sandbox. If process execution is enabled, commands can access anything the daemon OS user can access. Run the daemon as a dedicated unprivileged user, in a container, VM, or equivalent sandbox for hostile repositories.
37
37
 
38
38
  The daemon refuses root and insecure non-loopback deployment by default. Non-loopback HTTP requires explicit override and should only be used behind a trusted TLS terminator. Prefer TLS for direct non-local use.
39
39
 
40
+
41
+ The shared Lima workflow uses a **separately negotiated v2** protocol, not a reinterpretation of the v1 single-root handshake. Each local TUI opens its own authenticated WebSocket and binds a workspace channel under the guest daemon's fixed parent mount. The daemon starts with `--daemon-shared-parent`; ordinary `--remote` still creates a v1 connection. Shared transfers are not advertised (ordinary v1 transfers remain available), and guest process execution is enabled for trusted clients only. See [sandbox.md](sandbox.md#direct-shared-lima-attachment) for attachment and stop policy.
42
+
40
43
  ## Configuration
41
44
 
42
45
  Common options:
@@ -74,7 +77,6 @@ File uploads/downloads and artifact reads use bounded streamed transfer messages
74
77
 
75
78
  A local daemon smoke-test image lives at `packages/coding-agent/examples/daemon-docker` and starts the packaged `grip --daemon` command inside the container.
76
79
 
77
- The sandbox base image used by `/sandbox start` lives at `packages/coding-agent/examples/sandbox-docker`. It builds from local release artifacts, expects the host workspace to be mounted at `/workspace`, and receives `GRIP_DAEMON_TOKEN` from the sandbox launcher environment. See [Docker Sandbox](sandbox.md) for the hidden `/sandbox` command, configuration precedence, auto-switch behavior, and security limits.
78
80
 
79
81
  ```bash
80
82
  docker build -f packages/coding-agent/examples/daemon-docker/Dockerfile -t grip-remote-daemon-test .
package/docs/docs.json CHANGED
@@ -40,7 +40,7 @@
40
40
  "path": "daemon.md"
41
41
  },
42
42
  {
43
- "title": "Docker Sandbox",
43
+ "title": "Lima Sandbox",
44
44
  "path": "sandbox.md"
45
45
  },
46
46
  {
package/docs/index.md CHANGED
@@ -4,23 +4,19 @@ Grip is a minimal terminal coding harness. It is designed to stay small at the c
4
4
 
5
5
  ## Quick start
6
6
 
7
- When the package is available in your registry, install Grip with npm:
7
+ Install the single compiled executable from a published Grip release:
8
8
 
9
9
  ```bash
10
- npm install -g --ignore-scripts @greppleai/grip
10
+ # macOS/Linux
11
+ curl -fsSL https://raw.githubusercontent.com/greppleai/grip/main/install.sh | sh
11
12
  ```
12
13
 
13
- `--ignore-scripts` disables dependency lifecycle scripts during install. Grip does not require install scripts for normal npm installs. This repository rename does not verify publication or ownership of the new npm scope.
14
-
15
- The former installer at `https://pi.dev/install.sh` belongs to the old Pi distribution; it is not a verified Grip installation method. Do not replace the hostname with a guessed endpoint.
16
-
17
- To uninstall Grip itself after an npm install, use:
18
-
19
- ```bash
20
- npm uninstall -g @greppleai/grip
14
+ ```powershell
15
+ # Windows PowerShell
16
+ irm https://raw.githubusercontent.com/greppleai/grip/main/install.ps1 | iex
21
17
  ```
22
18
 
23
- For pnpm, Yarn, or Bun installs, use the matching global remove command: `pnpm remove -g @greppleai/grip`, `yarn global remove @greppleai/grip`, or `bun uninstall -g @greppleai/grip`.
19
+ These commands require the scripts and checksummed release binaries to have been published. They do **not** install the Grip CLI through npm. See [Quickstart](quickstart.md) for pinning versions, PATH, and uninstall instructions; the old Pi installer at `https://pi.dev/install.sh` is unrelated.
24
20
 
25
21
  Then run it in a project directory:
26
22
 
@@ -41,7 +37,7 @@ For the full first-run flow, see [Quickstart](quickstart.md). Upgrading from the
41
37
  - [Settings](settings.md) - global and project settings.
42
38
  - [Language Server Protocol](lsp.md) - configure spawned servers, attached endpoints, host connections, and remote-backend path mappings.
43
39
  - [Remote Daemon](daemon.md) - run `grip --daemon` as a confined remote workspace runtime.
44
- - [Docker Sandbox](sandbox.md) - hidden user-only `/sandbox` command for Docker-backed workspace execution.
40
+ - [Lima Sandbox](sandbox.md) - hidden user-only `/sandbox` command for Lima VM workspace execution.
45
41
  - [Keybindings](keybindings.md) - default shortcuts and custom keybindings.
46
42
  - [Sessions](sessions.md) - session management, branching, and tree navigation.
47
43
  - [Compaction](compaction.md) - context compaction and branch summarization.
package/docs/packages.md CHANGED
@@ -28,10 +28,10 @@ grip install ./relative/path/to/package
28
28
 
29
29
  grip remove npm:@foo/bar
30
30
  grip list # show installed packages from settings
31
- grip update # update Grip, update packages, and reconcile pinned git refs
31
+ grip update # update packages; for a compiled CLI rerun the verified installer
32
32
  grip update --extensions # update packages and reconcile pinned git refs only
33
- grip update --self # update Grip only
34
- grip update --self --force # reinstall Grip even if current
33
+ grip update --self # npm-managed CLI only; compiled binary cannot replace itself
34
+ grip update --self --force # npm-managed CLI only
35
35
  grip update npm:@foo/bar # update one package
36
36
  grip update --extension npm:@foo/bar
37
37
  ```
@@ -4,33 +4,25 @@ This page gets you from install to a useful first Grip session.
4
4
 
5
5
  ## Install
6
6
 
7
- When available in your registry, Grip is distributed as an npm package:
7
+ Install the single compiled binary from a published [Grip GitHub release](https://github.com/greppleai/grip/releases) (no npm required):
8
8
 
9
9
  ```bash
10
- npm install -g --ignore-scripts @greppleai/grip
10
+ # macOS/Linux; inspect the script before running
11
+ curl -fsSL https://raw.githubusercontent.com/greppleai/grip/main/install.sh | sh
11
12
  ```
12
13
 
13
- `--ignore-scripts` disables dependency lifecycle scripts during install. Grip does not require install scripts for normal npm installs. The new npm scope's publication and ownership have not been verified by this repository rename.
14
-
15
- ### Uninstall
16
-
17
- Use the package manager that installed Grip:
18
-
19
- ```bash
20
- # npm install -g
21
- npm uninstall -g @greppleai/grip
14
+ ```powershell
15
+ # Windows PowerShell
16
+ irm https://raw.githubusercontent.com/greppleai/grip/main/install.ps1 | iex
17
+ ```
22
18
 
23
- # pnpm
24
- pnpm remove -g @greppleai/grip
19
+ The installers download a platform-specific executable and verify its published SHA-256 before placing it in your user PATH. Linux binaries target glibc (not Alpine/musl); macOS and Windows native functionality still requires platform validation. Set `GRIP_VERSION=vX.Y.Z` to pin a release or `GRIP_INSTALL_DIR` to select a destination; rerun to update. Open a new shell and confirm that `command -v grip` (PowerShell: `Get-Command grip.exe`) resolves to the installed binary; an older npm executable earlier in PATH can shadow it, and is never removed automatically. The scripts and release assets must be published first. A compiled binary may extract embedded resources into a private temporary directory at runtime, without installing Node or Bun.
25
20
 
26
- # Yarn
27
- yarn global remove @greppleai/grip
21
+ Alternatively, install `@greppleai/grip` with `npm install -g @greppleai/grip` when you need a Node installation. Each release also publishes `@greppleai/grip-ai`, `@greppleai/grip-agent-core`, and `@greppleai/grip-tui` for extension and SDK development.
28
22
 
29
- # Bun
30
- bun uninstall -g @greppleai/grip
31
- ```
23
+ ### Uninstall
32
24
 
33
- Uninstalling Grip leaves settings, credentials, sessions, and installed Grip packages in `~/.grip/agent/`. For migrating an older Pi installation, see [Migrating to Grip](migrating-to-grip.md). The old Pi curl installer is not a verified Grip installation method.
25
+ For the binary installer, delete `~/.local/bin/grip` on macOS/Linux, or `%LOCALAPPDATA%\Programs\Grip\bin\grip.exe` on Windows (or the path set with `GRIP_INSTALL_DIR`). Remove the optional PATH entry from your shell profile or Windows user PATH if you no longer need it. For an npm installation, run `npm uninstall -g @greppleai/grip` instead. Uninstalling Grip leaves settings, credentials, sessions, and installed Grip packages in `~/.grip/agent/`. For migrating an older Pi installation, see [Migrating to Grip](migrating-to-grip.md). The old Pi installer is not a Grip installation method.
34
26
 
35
27
  Then start Grip in the project directory you want it to work on:
36
28
 
package/docs/sandbox.md CHANGED
@@ -1,97 +1,52 @@
1
1
  # Workspace Sandbox
2
2
 
3
- `/sandbox` is the single interactive command for workspace tool backends. It can show or clear the active backend, attach an existing sandbox daemon, or manage a Docker container or Lima VM. Sandbox connections are session-local: a new session starts on its underlying backend, returning to an earlier session reconnects its remembered sandbox while Grip remains running, and multiple session sandboxes may coexist. Local Grip remains the orchestrator: provider credentials, model calls, session history, extensions, RPC, and UI stay in the local process; subagent workspace tools inherit the parent session's active sandbox.
3
+ `/sandbox` is the user-only interactive command for workspace tool backends. It can show or clear the active backend, attach an existing sandbox daemon, or manage a Lima VM. Connections are session-local: switching back to an earlier session reconnects its remembered sandbox while Grip remains running. Local Grip retains provider credentials, model calls, session history, extensions, RPC, and UI; subagent workspace tools inherit the active backend.
4
4
 
5
- The command is user-only. It is shown in interactive slash-command completion, but it is not exposed through RPC `get_commands`, extension-visible command catalogs, system prompts, tool definitions, prompt templates, skills, or rules. This only hides the Grip operator command from LLM-visible catalogs; it does not prevent a model with host shell access from invoking Docker or Lima directly.
5
+ The command appears in slash-command completion but not in model-visible catalogs, system prompts, tool definitions, templates, skills, or rules. This is not a permission boundary: a model with host shell access may still invoke Lima directly.
6
6
 
7
7
  ## Commands
8
8
 
9
- Type these commands in interactive mode:
10
-
11
9
  ```text
12
10
  /sandbox [status]
13
11
  /sandbox clear
14
12
  /sandbox --attach <ws://url>
15
- /sandbox start [--runtime docker|lima] [--image <image>] [--name <lima-instance>] [--template <lima-template>]
16
- /sandbox list [--runtime docker|lima]
17
- /sandbox stop [sandbox]
13
+ /sandbox start [--name <lima-instance>] [--template <lima-template>] [--update]
14
+ /sandbox list
15
+ /sandbox stop [vm]
18
16
  ```
19
17
 
20
- - `/sandbox` and `/sandbox status` show the active workspace tool backend.
21
- - `/sandbox clear` disconnects the active deferred or sandbox backend without stopping a managed container or VM.
22
- - `/sandbox --attach` connects to an already-running sandbox daemon without starting or managing its container. Set `GRIP_REMOTE_TOKEN` when the daemon requires authentication. The daemon workspace root must match `--remote-cwd` in deferred mode, or `sandbox.workspaceMountPath` (default `/workspace`) otherwise.
23
- - `/sandbox start` launches a Docker container by default. With `--runtime lima`, it creates a Lima VM from `template:docker-rootful`, mounts the current working directory read-write at `/workspace`, starts `grip --daemon` inside the VM, and switches workspace tools and project resource loading to that daemon. Use `--template` to override the Lima template for a new VM. Passing `--name` implies `--runtime lima` when no runtime is specified; without `--name`, runtime selection is unchanged. `--name` creates the named instance if missing, starts it if stopped, or reuses it if running. Existing instances must already have a writable `/workspace` mount mapping to the current directory. Explicitly named VMs remain running after `/sandbox stop` or graceful Grip shutdown; only their Grip daemon is stopped, regardless of `sandbox.cleanup`.
24
- - `/sandbox list` lists sandboxes for the current workspace. Use `/sandbox list --runtime lima` to list matching Lima instances that can be reused by name.
25
- - `/sandbox stop` stops the active Grip-owned sandbox. For a daemon connected with `--attach`, it only detaches and restores the previous tool backend. Explicitly named Lima VMs remain running, but their Grip daemon is stopped. With an id or name, it uses the active runtime, or `sandbox.runtime` when no sandbox is active. Ambiguous cases require an explicit target.
26
-
27
- Example:
18
+ - `/sandbox status` shows the active workspace tool backend. `/sandbox clear` disconnects it without stopping a VM.
19
+ - `/sandbox --attach` connects to an already-running daemon without managing its lifecycle. Set `GRIP_REMOTE_TOKEN` if required. The daemon workspace root must match `--remote-cwd` in deferred mode, or `sandbox.workspaceMountPath` otherwise.
20
+ - `/sandbox start` creates a per-session Lima VM with the current working directory mounted read/write at `/workspace`. `--template` overrides the VM template for a new instance. `--name` creates an absent VM, resumes a stopped per-session VM, or attaches to a running VM after guest-mode inspection. A running VM with a verified shared guest-state marker uses the direct shared-daemon protocol; a VM without it follows the per-session path.
21
+ - `/sandbox start --name <running-shared-VM> --update` updates a verified shared guest and reconnects this TUI. It stages and validates the replacement first, stops its supervised daemon (disconnecting every attached client), atomically replaces the executable, and restarts the same service. It cannot be combined with `--template`; legacy, stopped, or unverifiable VMs are refused without disconnecting anyone.
22
+ - `/sandbox list` shows Lima instances mounting the current workspace. A shared VM mounting a parent might not appear from a child workspace; attach by exact name instead.
23
+ - `/sandbox stop` stops only tracked per-session daemons and process-owned VMs. For a shared named VM or an attached daemon it detaches the current session only. A matching name or mount does not establish ownership; named per-session VMs remain running after daemon stop. Grip never stops another client's shared guest or VM.
28
24
 
29
25
  ```text
30
- GRIP_REMOTE_TOKEN=... grip
31
- /sandbox --attach ws://127.0.0.1:8787/grip/workspace
32
- /sandbox stop
33
-
34
- /sandbox start --image grip-sandbox:local
26
+ /sandbox start
27
+ /sandbox start --template template:alpine
35
28
  /sandbox list
36
-
37
- /sandbox start --runtime lima
38
- /sandbox start --runtime lima --template template:alpine
39
- /sandbox list --runtime lima
40
29
  /sandbox stop
41
-
42
30
  /sandbox start --name my-dev
31
+ /sandbox start --name my-dev --update
43
32
  /sandbox stop
44
33
  ```
45
34
 
46
- When start succeeds, Grip shows the sandbox name/id, the host-to-sandbox workspace mount, a redacted daemon endpoint, and a status line that workspace tools/resources now route through the sandbox daemon.
47
-
48
- ## Workspace mount and daemon endpoint
49
-
50
- Defaults:
51
-
52
- | Setting | Default |
53
- | --- | --- |
54
- | Host workspace | current working directory |
55
- | Container workspace | `/workspace` |
56
- | Daemon command | `grip --daemon` |
57
- | Docker network mode | `bridge` |
58
- | Daemon preferred bind and endpoint | `127.0.0.1:8787` |
59
- | Daemon token | generated per start |
60
- | Lima binary | `limactl` |
61
- | Lima template | `template:docker-rootful` |
62
-
63
- The mounted workspace is read/write. Any process in the container can modify files in the mounted host directory. Paths reported by the daemon use the container workspace root (`/workspace`), while local Grip keeps session and UI state on the host. The container uses Docker bridge networking and publishes only the authenticated daemon port to the configured host bind address (`127.0.0.1` by default), so sandbox processes cannot directly access host loopback services. Grip uses the configured daemon port when available and otherwise selects an available host port, allowing separate sessions to keep concurrent sandbox containers. The default image also configures `/tmp` as an additional confined temporary root, so workspace tools can use disposable scratch files without exposing another host mount.
35
+ A successful start shows the VM name/id, host-to-guest workspace mount, redacted daemon endpoint, and backend status. Workspace tools and resources then route through the guest daemon. Sandbox bash calls receive the current `GRIP_SESSION_ID`, `GRIP_SESSION_FILE`, `GRIP_PROVIDER`, `GRIP_MODEL`, and `GRIP_REASONING_LEVEL` metadata for the active session; other host environment variables are not forwarded automatically.
64
36
 
65
- Sandbox bash calls receive the current `GRIP_SESSION_ID`, `GRIP_SESSION_FILE`, `GRIP_PROVIDER`, `GRIP_MODEL`, and `GRIP_REASONING_LEVEL` values per invocation. This metadata follows the active session rather than the daemon process environment; other host environment variables are not forwarded automatically.
37
+ ## Configuration
66
38
 
67
- `/sandbox start` uses a fresh bearer token for every daemon. Docker receives it through the container environment. Lima generates it inside the guest and returns it directly to the host launcher. Grip keeps the token in memory and uses it to connect to the daemon. Tokens are not put in Docker or Lima command arguments, image layers, container or instance names, labels, URLs, or user-facing status. Status, list output, and errors redact secrets.
39
+ The mounted workspace is writable. The daemon normally binds through a host loopback forward on port `8787`; newly created VMs select an available port if necessary. New per-session daemons use fresh bearer tokens. Running shared guests retain their existing token, retrieved by each local TUI via Lima access. Grip keeps tokens in memory and redacts them from displayed output. Tokens are not stored in session files, so sandbox backends are not restored after Grip exits.
68
40
 
69
- ## Image and configuration
70
-
71
- The configured default image is `ghcr.io/greppleai/grip-sandbox:latest`, but its publication has not been verified. Until it is available, build a reviewed local image below or configure a verified compatible replacement; do not assume the default image can be pulled. The local example image uses integrated `grip --daemon` from `@greppleai/grip`. There is no separate Grip daemon package or binary.
72
-
73
- When a sandbox daemon connects, Grip also loads `~/.grip/AGENTS.md` from the daemon user's home directory as user-scoped context. This is separate from the orchestrator's global instructions and lets custom Docker images or Lima users define instructions that apply only inside the sandbox. Create or update the file inside the sandbox, then run `/reload` to refresh context.
74
- Configuration precedence for a start is:
75
-
76
- 1. command flags: `/sandbox start --runtime <runtime>`, `--image <image>`, `--name <lima-instance>`, and `--template <lima-template>`;
77
- 2. environment variables: `GRIP_SANDBOX_*`;
78
- 3. project settings in `.grip/settings.json`;
79
- 4. global settings in `~/.grip/agent/settings.json`;
80
- 5. defaults.
81
-
82
- Sandbox settings:
41
+ Start precedence: command `--template`, then `GRIP_SANDBOX_*` environment variables, project `.grip/settings.json`, global `~/.grip/agent/settings.json`, then defaults. Available settings:
83
42
 
84
43
  ```json
85
44
  {
86
45
  "sandbox": {
87
- "runtime": "docker",
88
- "image": "grip-sandbox:local",
89
- "dockerBinary": "docker",
90
46
  "limaBinary": "limactl",
91
47
  "limaTemplate": "template:docker-rootful",
92
48
  "limaInstanceNamePrefix": "grip-sandbox",
93
49
  "workspaceMountPath": "/workspace",
94
- "containerNamePrefix": "grip-sandbox",
95
50
  "daemonPort": 8787,
96
51
  "daemonHostBind": "127.0.0.1",
97
52
  "cleanup": "stop"
@@ -99,83 +54,51 @@ Sandbox settings:
99
54
  }
100
55
  ```
101
56
 
102
- Environment overrides:
103
-
104
- | Variable | Setting |
57
+ | Environment variable | Setting |
105
58
  | --- | --- |
106
- | `GRIP_SANDBOX_RUNTIME` | `sandbox.runtime` (`docker` or `lima`) |
107
- | `GRIP_SANDBOX_IMAGE` | `sandbox.image` |
108
- | `GRIP_SANDBOX_DOCKER` | `sandbox.dockerBinary` |
109
59
  | `GRIP_SANDBOX_LIMA` | `sandbox.limaBinary` |
110
60
  | `GRIP_SANDBOX_LIMA_TEMPLATE` | `sandbox.limaTemplate` |
111
61
  | `GRIP_SANDBOX_LIMA_INSTANCE_PREFIX` | `sandbox.limaInstanceNamePrefix` |
112
62
  | `GRIP_SANDBOX_WORKSPACE_MOUNT` | `sandbox.workspaceMountPath` |
113
- | `GRIP_SANDBOX_CONTAINER_PREFIX` | `sandbox.containerNamePrefix` |
114
63
  | `GRIP_SANDBOX_DAEMON_PORT` | `sandbox.daemonPort` |
115
64
  | `GRIP_SANDBOX_DAEMON_HOST_BIND` | `sandbox.daemonHostBind` |
116
65
  | `GRIP_SANDBOX_CLEANUP` | `sandbox.cleanup` (`stop` or `remove`) |
66
+ | `GRIP_SANDBOX_GUEST_BINARY` | Explicit local Linux ELF guest executable for development |
117
67
 
118
- ## Base image
119
-
120
- Build the local base image from repository release artifacts:
68
+ The default Lima template name contains `docker-rootful`; it is a Lima VM template choice, not a Docker-container sandbox runtime. Change `sandbox.limaTemplate` or use `--template` to select a different Lima template.
121
69
 
122
- ```bash
123
- npm run release:local -- --out /tmp/grip-local-release --force
124
- docker build \
125
- -f packages/coding-agent/examples/sandbox-docker/Dockerfile \
126
- -t grip-sandbox:local \
127
- /tmp/grip-local-release
128
- ```
129
-
130
- Then use it for one start:
131
-
132
- ```text
133
- /sandbox start --image grip-sandbox:local
134
- ```
70
+ ### Guest Grip during development
135
71
 
136
- Or make it the default:
72
+ A new managed VM installs an exact-version Linux Grip release using the checksummed repository installer, when those release assets are published. Existing named VMs must already provide Grip. To test local code, cross-compile a Linux binary matching the guest architecture and opt in:
137
73
 
138
74
  ```bash
139
- GRIP_SANDBOX_IMAGE=grip-sandbox:local grip
75
+ NODE_OPTIONS=--import=tsx ./scripts/build-binaries.sh --skip-install --platform linux-x64
76
+ GRIP_SANDBOX_GUEST_BINARY="$PWD/packages/coding-agent/binaries/grip-linux-x64" ./grip-test.sh
77
+ # In Grip: /sandbox start --name my-dev --update
140
78
  ```
141
79
 
142
- See [`../examples/sandbox-docker/README.md`](../examples/sandbox-docker/README.md) for image build inputs and manual `docker run` commands.
80
+ For ARM64 use `--platform linux-arm64` and `grip-linux-arm64`. The ELF is validated, copied via `limactl copy` only when safe, checked against its SHA-256 and version, and installed at `~/.local/bin/grip`. An identical installation is reused. Normal attachment never replaces the running shared guest's binary. Explicit `--update` uses `GRIP_SANDBOX_GUEST_BINARY` when set; a source/tsx development session requires it rather than silently installing a release. Otherwise the update downloads the checksummed Linux release matching the Grip version that issued the command. The shared systemd unit must already run `~/.local/bin/grip`; other service binary paths require manual reconciliation. Downloads and validation complete before client disconnection. An uncertain install or restart leaves the VM for inspection. The guest needs `sha256sum` and `/proc`.
143
81
 
144
- ## Sandbox identity, list, and stop
82
+ ## Direct shared Lima attachment
145
83
 
146
- Grip labels sandbox containers and filters list/stop operations by those labels, not by name alone. Labels include sandbox ownership, workspace hash, workspace mount target, daemon port, owner uid when available, Grip version, and a session id. Labels do not contain tokens.
84
+ In each host workspace run `/sandbox start --name <running-shared-VM>`. The VM must already have a fixed writable parent mount, matching loopback forward, exact-version guest Grip, and a verified `~/.cache/grip/shared-lima` guest-state directory. Its systemd user manager must be running with linger enabled so Grip can start or reuse a supervised shared daemon. This command does not provision a new shared VM or convert a legacy one: a running VM without the shared marker takes the per-session path.
147
85
 
148
- Docker container names use the configured prefix plus a sanitized workspace name, workspace hash, and per-start session suffix. Managed Lima names use `sandbox.limaInstanceNamePrefix` with the same workspace/session identity and a random suffix. Daemon ports are allocated per start, preferring `sandbox.daemonPort` and falling back to an available host port. `/sandbox list --runtime lima` reports Lima instances whose writable `/workspace` mount maps to the current host workspace; their names can be passed back to `/sandbox start --runtime lima --name <name>`. Explicitly named VMs are left running by `/sandbox stop`, whether newly created or reused, while Grip stops or removes automatically named VMs according to `sandbox.cleanup`.
86
+ Each TUI obtains the guest credential through local Lima access and opens its own authenticated v2 WebSocket workspace channel. Parent-root clients can access their children; shared file writes and edits use revision preconditions, but shell writes can still race. Transfers are unavailable in shared mode. `/sandbox stop` and `/sandbox clear` detach only the current TUI; neither stops the shared daemon or VM. Coordinate all clients and independently verify ownership before any manual guest or VM shutdown.
149
87
 
150
- Stopping the active sandbox clears the current session's remote tool backend and returns it to the previous non-sandbox backend or local tool execution. If Grip was started in deferred remote mode, stop leaves that session's deferred backend unconfigured. Switching sessions disconnects the old live client without stopping its managed sandbox; returning to that session reconnects it from memory. On graceful Grip shutdown, Docker containers and automatically named Lima instances started by that Grip process are stopped or removed according to `sandbox.cleanup`; explicitly named Lima VMs remain running with their Grip daemon stopped. Tokens are never persisted to session files, so sandboxes are not restored after Grip exits.
88
+ Grip probes guest mode under the named owner lock before any legacy setup. A missing marker follows the per-session path; unreadable, symlinked, or ambiguous state refuses attachment. A stopped shared VM with a mismatched mount is not automatically resumed. Per-session start and stop check for shared guest state before rotating or killing a legacy daemon. Noncooperating programs may ignore these locks; a VM name alone proves nothing.
151
89
 
152
- ## Security boundaries
90
+ Shared startup requires guest `systemd-run --user`, `systemctl --user`, and `loginctl ... Linger=yes` already enabled by an operator. Grip launches one transient `grip-shared-lima-PORT.service` with `Restart=no`; it does not automatically restart failed units or retry uncertain operations. The unit reads its private 0600 token file without passing credentials in service arguments. Grip verifies its MainPID against a boot-ID/process-start-time-bound PID record before reuse. Missing manager, mismatched process identity, or uncertain guest state require manual reconciliation; guest shutdown remains explicit.
153
91
 
154
- Docker and Lima sandbox modes are not complete security sandboxes.
92
+ ## Lifecycle and security
155
93
 
156
- - The current working directory is mounted read/write into the container or VM.
157
- - Subagents inherit the active workspace backend. Sandboxed subagents reject host cwd overrides, do not load host project context or extensions, treat custom system prompts as literal text, and cannot continue an older run after the parent backend changes.
158
- - Sandbox processes can read, write, delete, or chmod files in that mount as the guest user.
159
- - Files created by the default image are owned by uid `1000` unless Docker/user policy changes it.
160
- - `/tmp` is writable container-local scratch storage and is removed with the container; it is not mounted from the host by default.
161
- - The daemon token authorizes high-privilege workspace tool access for the mounted workspace.
162
- - Anyone with Docker access on the host may inspect containers, images, mounts, labels, ports, and environment depending on host policy.
163
- - Override Docker images and Lima templates are trusted code. A malicious image or template can run arbitrary processes against the mounted workspace.
164
- - Docker socket mounts, privileged mode, broad host volumes, or extra credentials can further break the intended boundary.
165
- - Bridge networking prevents direct host-loopback access, but the container may still reach external networks and host services deliberately exposed beyond loopback.
166
- - Reused Lima instances retain their existing filesystem, software, credentials, and network access; only reuse instances you trust.
167
- - Hidden command behavior only keeps `/sandbox` out of LLM-visible Grip catalogs. It is not an OS, Docker, or VM permission boundary.
94
+ Automatically named, process-owned VMs follow `sandbox.cleanup` on graceful Grip shutdown, subject to stopped-VM uncertainty. Tracked per-session named Lima daemons stop without stopping their VMs. A failed readiness check leaves uncertain guest state for manual reconciliation. Shared guest daemons and VMs remain running. Session switches reconnect remembered channels while the process remains running.
168
95
 
169
- Use trusted images, avoid mounting the Docker socket, avoid privileged containers, keep `sandbox.daemonHostBind` loopback-only unless you add a separate trusted network/TLS boundary, and do not place secrets in the mounted workspace unless the sandbox image should access them.
96
+ Lima VMs are not complete security sandboxes. The workspace is mounted read/write and guest processes can modify it as the guest user. Subagents inherit the active workspace backend, reject host cwd overrides, and do not load host project context or extensions. The daemon token grants privileged workspace tool access. Reused VMs retain their own software, credentials, filesystem, and network access; use only trusted instances and Lima templates. Keep `sandbox.daemonHostBind` loopback-only unless you provide a separate trusted network/TLS boundary, and do not store secrets in the mounted workspace unless the guest should read them.
170
97
 
171
98
  ## Troubleshooting
172
99
 
173
- - Docker missing: install Docker or set `GRIP_SANDBOX_DOCKER` / `sandbox.dockerBinary` to the correct executable.
174
- - Lima missing: install Lima or set `GRIP_SANDBOX_LIMA` / `sandbox.limaBinary`. Newly created Lima VMs, including explicitly named ones, provision the current `@greppleai/grip` version through npm when `grip` is missing; reused instances must already provide a compatible `grip` command. Provisioning requires an apt-based guest and package availability.
175
- - Permission denied connecting to Docker: add the user to the appropriate Docker group, start Docker Desktop, or run Grip where Docker is accessible. Treat Docker group membership as host-level administrative power.
176
- - Image pull/build failure: verify the image name, registry authentication, network access, and local build command. For local images, build with the local release directory as context; do not use `--skip-install` for the sandbox Dockerfile.
177
- - Port conflict: Grip prefers the configured daemon port (default `8787`) and automatically selects an available port when it is occupied. A remaining bind failure can indicate an invalid `sandbox.daemonHostBind`, exhausted local resources, or a race with another process.
178
- - Start succeeds but daemon activation fails: the container or VM may still be running. Use the runtime-specific `/sandbox list` and `/sandbox stop <id-or-name>` commands to clean it up.
179
- - `/sandbox list` is empty: Docker listing only includes Grip-labeled containers; Lima listing only includes instances with the current workspace mounted at `/workspace`. Check that you selected the intended runtime and workspace.
180
- - `/sandbox stop` says no sandbox was found: pass the listed id or name, or switch to the workspace that owns the sandbox.
181
- - Already stopped: stop is idempotent for matching containers and reports already-stopped containers cleanly.
100
+ - Lima missing: install Lima or configure `GRIP_SANDBOX_LIMA` / `sandbox.limaBinary`. New managed VMs require the published exact-version guest installer; reused VMs must provide a matching binary.
101
+ - Port conflict: a newly created VM selects an available port; a running shared VM requires its configured forward to match exactly.
102
+ - Activation failure: inspect VM and daemon state before retrying; do not stop an unverified VM or other shared clients.
103
+ - Empty `/sandbox list`: only instances mounting the current workspace appear. An ancestor-mounted shared VM may not appear from a child directory; attach by name.
104
+ - `/sandbox stop` not found: use the listed id or name, or switch to the owning workspace. Stopped or uncertain VMs require manual reconciliation before removal.
package/docs/settings.md CHANGED
@@ -189,30 +189,31 @@ Keep `retry.provider.maxRetries` at `0` unless provider-level retries are explic
189
189
 
190
190
  Global and project `tools` settings merge per tool name, so a project can override `tools.websearch.baseUrl` while keeping a global `tools.websearch.apiKey`. Environment variables remain supported for `websearch`; explicit settings take precedence. Firecrawl uses `POST /v2/search` with web results only.
191
191
 
192
- ### Docker Sandbox
192
+ ### Lima Sandbox
193
193
 
194
194
  | Setting | Type | Default | Description |
195
195
  |---------|------|---------|-------------|
196
- | `sandbox.image` | string | `"ghcr.io/greppleai/grip-sandbox:latest"` (not yet verified as published) | Docker image used by `/sandbox start`; override with a reviewed available image until the Grip image is published |
197
- | `sandbox.dockerBinary` | string | `"docker"` | Docker executable |
198
- | `sandbox.workspaceMountPath` | string | `"/workspace"` | Container path for the mounted current workspace |
199
- | `sandbox.containerNamePrefix` | string | `"grip-sandbox"` | Prefix for generated container names |
200
- | `sandbox.daemonPort` | number | `8787` | Preferred loopback-published daemon port; an available port is selected when occupied |
201
- | `sandbox.daemonHostBind` | string | `"127.0.0.1"` | Host address used to publish the container daemon port |
202
- | `sandbox.cleanup` | string | `"stop"` | Stop behavior: `"stop"` or `"remove"` |
196
+ | `sandbox.limaBinary` | string | `"limactl"` | Lima executable |
197
+ | `sandbox.limaTemplate` | string | `"template:docker-rootful"` | Template used to create a managed VM |
198
+ | `sandbox.limaInstanceNamePrefix` | string | `"grip-sandbox"` | Generated VM name prefix |
199
+ | `sandbox.workspaceMountPath` | string | `"/workspace"` | Guest path for the mounted current workspace |
200
+ | `sandbox.daemonPort` | number | `8787` | Preferred loopback-forwarded daemon port; an available port is selected when occupied for new VMs |
201
+ | `sandbox.daemonHostBind` | string | `"127.0.0.1"` | Host bind for the daemon forward |
202
+ | `sandbox.cleanup` | string | `"stop"` | Stop behavior: `"stop"` or `"remove"` for owned VMs |
203
203
 
204
204
  ```json
205
205
  {
206
206
  "sandbox": {
207
- "image": "grip-sandbox:local",
207
+ "limaBinary": "limactl",
208
208
  "cleanup": "remove"
209
209
  }
210
210
  }
211
211
  ```
212
212
 
213
- Precedence for sandbox starts is command flag, then `GRIP_SANDBOX_*` environment variables, then project settings, then global settings, then defaults. See [Docker Sandbox](sandbox.md) for command syntax, environment variable names, and security notes. The default image above is an upstream Pi artifact; no Grip image location has been verified.
213
+ Precedence for sandbox starts is `--template`, `GRIP_SANDBOX_*` environment variables, project settings, global settings, then defaults. See [Lima Sandbox](sandbox.md) for command syntax, environment variables, and security notes.
214
214
 
215
- ### Sessions
215
+
216
+ For a running shared Lima VM, `/sandbox start --name` uses `sandbox.workspaceMountPath`, `sandbox.daemonHostBind`, `sandbox.daemonPort` and `sandbox.limaBinary` to verify its fixed writable parent mount and loopback forward before attaching. `sandbox.cleanup` does not authorize stopping or deleting the shared VM. Auth, config and sessions remain on the host; same-user agents share the default host directory unless each selects a distinct `GRIP_CODING_AGENT_DIR`. Shared writes and edits use revision preconditions, but shell writes can still race. Shared transfers are unavailable; guest process execution requires trusted clients. See [sandbox.md](sandbox.md#direct-shared-lima-attachment).
216
217
 
217
218
  | Setting | Type | Default | Description |
218
219
  |---------|------|---------|-------------|
package/docs/termux.md CHANGED
@@ -9,24 +9,7 @@ Grip runs on Android via [Termux](https://termux.dev/), a terminal emulator and
9
9
 
10
10
  ## Installation
11
11
 
12
- When `@greppleai/grip` is available in your registry:
13
-
14
- ```bash
15
- # Update packages
16
- pkg update && pkg upgrade
17
-
18
- # Install dependencies
19
- pkg install nodejs termux-api git
20
-
21
- # Install Grip
22
- npm install -g --ignore-scripts @greppleai/grip
23
-
24
- # Create config directory
25
- mkdir -p ~/.grip/agent
26
-
27
- # Run Grip
28
- grip
29
- ```
12
+ The single-file release installers support **macOS, Linux, and Windows**, not Android/Termux. Do not run the Linux installer here: its native modules and system ABI are not Android builds. There is currently no supported Grip binary or npm release for Termux. A source checkout and Termux-specific build would need separate validation before documenting an installation procedure.
30
13
 
31
14
  ## Clipboard Support
32
15
 
package/docs/usage.md CHANGED
@@ -139,13 +139,13 @@ grip remove <source> [-l] # Remove package
139
139
  grip uninstall <source> [-l] # Alias for remove
140
140
  grip update [source|self|grip] # Update Grip and packages; reconcile pinned git refs
141
141
  grip update --extensions # Update packages only; reconcile pinned git refs
142
- grip update --self # Update Grip only
142
+ grip update --self # npm-managed installs only; for binary installs rerun the verified installer
143
143
  grip update --extension <src> # Update one package
144
144
  grip list # List installed packages
145
145
  grip config # Enable/disable package resources
146
146
  ```
147
147
 
148
- These commands manage Grip packages, not the Grip CLI installation. To uninstall Grip itself, see [Quickstart](quickstart.md#uninstall).
148
+ These commands manage Grip packages; the compiled binary itself updates by rerunning the [verified installer](quickstart.md#install), not `grip update --self`. To uninstall Grip itself, see [Quickstart](quickstart.md#uninstall).
149
149
 
150
150
  See [Grip Packages](packages.md) for package sources and security notes.
151
151
 
@@ -18,8 +18,6 @@ Example extensions demonstrating:
18
18
  - External integrations (SSH, file watchers, system theme sync)
19
19
  - Custom providers (Anthropic with custom streaming, GitLab Duo)
20
20
 
21
- ### [sandbox-docker/](sandbox-docker/)
22
- Base Docker image for `/sandbox start`. Builds from local release artifacts and runs the packaged `grip --daemon` command with `/workspace` as the mounted workspace.
23
21
 
24
22
  ### [remote-session-server/](remote-session-server/)
25
23
  Hono-based remote session storage server. It uses static bearer auth and stores sessions as JSONL files for debugging the remote session protocol end-to-end.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "grip-extension-custom-provider-anthropic",
3
3
  "private": true,
4
- "version": "0.0.1",
4
+ "version": "0.1.3",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "grip-extension-custom-provider-gitlab-duo",
3
3
  "private": true,
4
- "version": "0.0.1",
4
+ "version": "0.1.3",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "grip-extension-sandbox",
3
3
  "private": true,
4
- "version": "0.0.1",
4
+ "version": "0.1.3",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "grip-extension-with-deps",
3
3
  "private": true,
4
- "version": "0.0.1",
4
+ "version": "0.1.3",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",