@greppleai/grip 0.1.4 → 0.1.5
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.
- package/CHANGELOG.md +31 -0
- package/README.md +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +3 -1
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/grip-agent.d.ts.map +1 -1
- package/dist/core/grip-agent.js +4 -2
- package/dist/core/grip-agent.js.map +1 -1
- package/dist/core/sandbox/lima.d.ts.map +1 -1
- package/dist/core/sandbox/lima.js +6 -6
- package/dist/core/sandbox/lima.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +18 -7
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +26 -18
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +220 -192
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +68 -6
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/utils/grip-user-agent.d.ts.map +1 -1
- package/dist/utils/grip-user-agent.js +1 -1
- package/dist/utils/grip-user-agent.js.map +1 -1
- package/docs/keybindings.md +3 -1
- package/docs/providers.md +3 -1
- package/docs/sandbox.md +1 -1
- package/docs/usage.md +37 -1
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +12 -12
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grip-user-agent.d.ts","sourceRoot":"","sources":["../../src/utils/grip-user-agent.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGxD","sourcesContent":["export function getGripUserAgent(version: string): string {\n\tconst runtime = process.versions.bun ? `bun/${process.versions.bun}` : `node/${process.version}`;\n\treturn `
|
|
1
|
+
{"version":3,"file":"grip-user-agent.d.ts","sourceRoot":"","sources":["../../src/utils/grip-user-agent.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGxD","sourcesContent":["export function getGripUserAgent(version: string): string {\n\tconst runtime = process.versions.bun ? `bun/${process.versions.bun}` : `node/${process.version}`;\n\treturn `grip/${version} (${process.platform}; ${runtime}; ${process.arch})`;\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export function getGripUserAgent(version) {
|
|
2
2
|
const runtime = process.versions.bun ? `bun/${process.versions.bun}` : `node/${process.version}`;
|
|
3
|
-
return `
|
|
3
|
+
return `grip/${version} (${process.platform}; ${runtime}; ${process.arch})`;
|
|
4
4
|
}
|
|
5
5
|
//# sourceMappingURL=grip-user-agent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grip-user-agent.js","sourceRoot":"","sources":["../../src/utils/grip-user-agent.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAU;IACzD,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,OAAO,EAAE,CAAC;IACjG,OAAO,
|
|
1
|
+
{"version":3,"file":"grip-user-agent.js","sourceRoot":"","sources":["../../src/utils/grip-user-agent.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAU;IACzD,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,OAAO,EAAE,CAAC;IACjG,OAAO,QAAQ,OAAO,KAAK,OAAO,CAAC,QAAQ,KAAK,OAAO,KAAK,OAAO,CAAC,IAAI,GAAG,CAAC;AAAA,CAC5E","sourcesContent":["export function getGripUserAgent(version: string): string {\n\tconst runtime = process.versions.bun ? `bun/${process.versions.bun}` : `node/${process.version}`;\n\treturn `grip/${version} (${process.platform}; ${runtime}; ${process.arch})`;\n}\n"]}
|
package/docs/keybindings.md
CHANGED
|
@@ -140,12 +140,14 @@ This routing remains configurable through the ordinary action bindings. For exam
|
|
|
140
140
|
|
|
141
141
|
| Keybinding id | Default | Description |
|
|
142
142
|
|--------|---------|-------------|
|
|
143
|
-
| `app.model.select` | `ctrl+l` | Open model selector |
|
|
143
|
+
| `app.model.select` | `ctrl+l` | Open provider-first model selector |
|
|
144
144
|
| `app.model.cycleForward` | `ctrl+p` | Cycle to next model |
|
|
145
145
|
| `app.model.cycleBackward` | `shift+ctrl+p` | Cycle to previous model |
|
|
146
146
|
| `app.thinking.cycle` | `shift+tab` | Cycle thinking level |
|
|
147
147
|
| `app.thinking.toggle` | `ctrl+t` | Collapse or expand thinking blocks |
|
|
148
148
|
|
|
149
|
+
The model selector uses `tui.select.up` / `down`, `tui.select.pageUp` / `pageDown`, `tui.select.confirm`, and `tui.select.cancel`. `tui.input.tab` switches scoped/all models when a scope exists. Its hints follow these bindings. See [Model Selection](usage.md#model-selection) for navigation and restoring `app.model.select` after disabling a picker extension.
|
|
150
|
+
|
|
149
151
|
### Display and Message Queue
|
|
150
152
|
|
|
151
153
|
| Keybinding id | Default | Description |
|
package/docs/providers.md
CHANGED
|
@@ -59,7 +59,7 @@ grip
|
|
|
59
59
|
| Cloudflare AI Gateway | `CLOUDFLARE_API_KEY` (+ `CLOUDFLARE_ACCOUNT_ID`, `CLOUDFLARE_GATEWAY_ID`) | `cloudflare-ai-gateway` |
|
|
60
60
|
| Cloudflare Workers AI | `CLOUDFLARE_API_KEY` (+ `CLOUDFLARE_ACCOUNT_ID`) | `cloudflare-workers-ai` |
|
|
61
61
|
| xAI | `XAI_API_KEY` | `xai` |
|
|
62
|
-
| OpenRouter | `OPENROUTER_API_KEY` | `openrouter` |
|
|
62
|
+
| OpenRouter | `OPENROUTER_API_KEY` or `/login` → browser sign-in | `openrouter` |
|
|
63
63
|
| Vercel AI Gateway | `AI_GATEWAY_API_KEY` | `vercel-ai-gateway` |
|
|
64
64
|
| ZAI | `ZAI_API_KEY` | `zai` |
|
|
65
65
|
| OpenCode Zen | `OPENCODE_API_KEY` | `opencode` |
|
|
@@ -75,6 +75,8 @@ grip
|
|
|
75
75
|
| Xiaomi MiMo Token Plan (Amsterdam) | `XIAOMI_TOKEN_PLAN_AMS_API_KEY` | `xiaomi-token-plan-ams` |
|
|
76
76
|
| Xiaomi MiMo Token Plan (Singapore) | `XIAOMI_TOKEN_PLAN_SGP_API_KEY` | `xiaomi-token-plan-sgp` |
|
|
77
77
|
|
|
78
|
+
OpenRouter browser sign-in (`/login` → Sign in (subscriptions or OpenRouter credits) → OpenRouter) uses PKCE to request a durable API key on your OpenRouter account. Requests are billed to your OpenRouter credits; this is **not** a subscription login and OpenRouter does not issue a refresh token. Grip stores the resulting key in `auth.json` as an API key. If it is revoked, sign in again. You can still paste an existing API key or set `OPENROUTER_API_KEY` instead.
|
|
79
|
+
|
|
78
80
|
Reference for environment variables and `auth.json` keys: [`const envMap`](../../ai/src/env-api-keys.ts) in `packages/ai/src/env-api-keys.ts`.
|
|
79
81
|
|
|
80
82
|
#### Auth File
|
package/docs/sandbox.md
CHANGED
|
@@ -69,7 +69,7 @@ The default Lima template name contains `docker-rootful`; it is a Lima VM templa
|
|
|
69
69
|
|
|
70
70
|
### Guest Grip during development
|
|
71
71
|
|
|
72
|
-
A new managed VM installs an exact-version Linux Grip release using the checksummed repository installer, when those release assets are published.
|
|
72
|
+
A new managed VM installs an exact-version Linux Grip release using the checksummed repository installer, when those release assets are published. An existing named per-session VM without Grip installs the latest published release using the same installer; an existing installation is left alone. In development, `GRIP_SANDBOX_GUEST_BINARY` installs the local Linux build instead, including in existing VMs. To test local code, cross-compile a Linux binary matching the guest architecture and opt in:
|
|
73
73
|
|
|
74
74
|
```bash
|
|
75
75
|
NODE_OPTIONS=--import=tsx ./scripts/build-binaries.sh --skip-install --platform linux-x64
|
package/docs/usage.md
CHANGED
|
@@ -37,7 +37,7 @@ Type `/` in the editor to open command completion. Extensions can register custo
|
|
|
37
37
|
| Command | Description |
|
|
38
38
|
|---------|-------------|
|
|
39
39
|
| `/login`, `/logout` | Manage OAuth or API-key credentials |
|
|
40
|
-
| `/model` |
|
|
40
|
+
| `/model [reference or query]` | Choose a provider and model, select an exact reference, or search across providers |
|
|
41
41
|
| `/scoped-models` | Enable/disable models for Ctrl+P cycling |
|
|
42
42
|
| `/settings` | Thinking level, theme, message delivery, transport |
|
|
43
43
|
| `/resume` | Pick from previous sessions |
|
|
@@ -61,6 +61,42 @@ Type `/` in the editor to open command completion. Extensions can register custo
|
|
|
61
61
|
|
|
62
62
|
`/hooks` and `/sandbox` are user-only interactive commands hidden from model-visible command catalogs. `/sandbox` shows or clears the current backend, attaches a sandbox daemon, and manages local Docker sandbox containers; see [Workspace Sandbox](sandbox.md).
|
|
63
63
|
|
|
64
|
+
## Model Selection
|
|
65
|
+
|
|
66
|
+
Open `/model` or use `app.model.select` (Ctrl+L by default). The native picker **always starts with providers**, even when only one provider is available; it never skips straight to models.
|
|
67
|
+
|
|
68
|
+
- Type to filter providers by display name or ID. Each row shows its ID, model count in the active scope, and a check mark for the current provider.
|
|
69
|
+
- Use Up/Down or PageUp/PageDown to navigate. Enter opens the highlighted provider without changing the model or saved default.
|
|
70
|
+
- In a provider, type to filter models by ID or readable name. Rows identify the provider, the current model has a check mark, and the highlighted model's readable name appears below the list. Enter selects the model and saves the primary model default.
|
|
71
|
+
- Escape from models returns to providers and restores the previous provider filter and highlight. Reentering a provider starts with an empty model filter. Escape at the provider screen cancels without changing the model or default.
|
|
72
|
+
- A nonempty filter edit selects the best match. Clearing a filter retains the selection's position where possible. Confirming an empty result does nothing.
|
|
73
|
+
|
|
74
|
+
These are the default keys; selector hints follow your [keybindings](keybindings.md), including confirmation and cancellation.
|
|
75
|
+
|
|
76
|
+
### Scoped and All Models
|
|
77
|
+
|
|
78
|
+
If a model scope exists (configured with `/scoped-models`, `enabledModels`, or `--models`), the picker starts in **scoped** mode. Tab switches between scoped and all available models. Provider counts and membership reflect the active mode; a provider with no scoped models is absent until you switch to all.
|
|
79
|
+
|
|
80
|
+
Switching scope in provider-first navigation returns to the provider screen and clears the filter. Models within a provider retain configured scoped order. In all mode, the current model comes first, followed by provider/model ID order. Providers are sorted by display name and ID. This is deterministic ordering, not newest-release ordering. Opening the picker refreshes the registry, including `models.json`; availability reflects configured authentication, not a live credential check.
|
|
81
|
+
|
|
82
|
+
Model cycling (Ctrl+P / Shift+Ctrl+P) and `/scoped-models` configuration are unchanged. Choosing a model from all mode does not add it to your scope.
|
|
83
|
+
|
|
84
|
+
### Direct References and Cross-provider Search
|
|
85
|
+
|
|
86
|
+
- `/model provider/model-id` selects an exact available reference directly, without opening the picker. Exact matching respects the active model scope when one exists.
|
|
87
|
+
- If the argument does not match an exact reference, `/model <query>` opens a model search across providers in the active scope. For example, `/model son` can find matching Sonnet models from multiple providers. Use Tab to include all available models when scoped mode is active.
|
|
88
|
+
- In this cross-provider search, Tab keeps the query and search view; Escape cancels directly rather than opening providers. Clearing the query keeps the cross-provider model list. Bare `/model` always uses the provider-first flow.
|
|
89
|
+
|
|
90
|
+
The `/compress-detection-model` picker uses the same provider-first navigation, but choosing a detector changes only its configuration, not the primary session model or primary default.
|
|
91
|
+
|
|
92
|
+
### Migrating from provider-model-picker
|
|
93
|
+
|
|
94
|
+
The native flow needs no extension, `/pm` command, or additional shortcut. Grip does not automatically disable your extension or rewrite personal configuration.
|
|
95
|
+
|
|
96
|
+
1. Disable **every load source** for `provider-model-picker`. Use `grip config` to disable its resource in the applicable global or project scope, including auto-discovered local extensions. Remove any explicit `-e` / `--extension` launch argument or configured extension entry that still loads it. For a package, disable only the picker resource if you need its other resources; see [package filtering](packages.md#package-filtering). Removing an explicit entry alone is insufficient if the same extension is also auto-discovered.
|
|
97
|
+
2. In `~/.grip/agent/keybindings.json`, check whether `app.model.select` was unbound with `[]`. Remove that override to inherit Ctrl+L, or merge `"app.model.select": "ctrl+l"` (or your preferred key) into the existing object. Keep unrelated bindings. Review any old extension shortcut overrides before removing them; do not unbind unrelated tree actions to free this key.
|
|
98
|
+
3. Run `/reload`, or restart if you changed launch arguments. Verify `/model` and your configured model-selection shortcut both open Providers. `/pm` was extension-provided and is not a native command; use `/model` instead.
|
|
99
|
+
|
|
64
100
|
## Message Queue
|
|
65
101
|
|
|
66
102
|
You can submit messages while the agent is still working:
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@greppleai/grip",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@greppleai/grip",
|
|
9
|
-
"version": "0.1.
|
|
9
|
+
"version": "0.1.5",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@greppleai/grip-agent-core": "^0.1.
|
|
13
|
-
"@greppleai/grip-ai": "^0.1.
|
|
14
|
-
"@greppleai/grip-tui": "^0.1.
|
|
12
|
+
"@greppleai/grip-agent-core": "^0.1.5",
|
|
13
|
+
"@greppleai/grip-ai": "^0.1.5",
|
|
14
|
+
"@greppleai/grip-tui": "^0.1.5",
|
|
15
15
|
"@silvia-odwyer/photon-node": "0.3.4",
|
|
16
16
|
"chalk": "5.6.2",
|
|
17
17
|
"cross-spawn": "7.0.6",
|
|
@@ -502,11 +502,11 @@
|
|
|
502
502
|
"hasInstallScript": true
|
|
503
503
|
},
|
|
504
504
|
"node_modules/@greppleai/grip-agent-core": {
|
|
505
|
-
"version": "0.1.
|
|
506
|
-
"resolved": "https://registry.npmjs.org/@greppleai/grip-agent-core/-/grip-agent-core-0.1.
|
|
505
|
+
"version": "0.1.5",
|
|
506
|
+
"resolved": "https://registry.npmjs.org/@greppleai/grip-agent-core/-/grip-agent-core-0.1.5.tgz",
|
|
507
507
|
"license": "MIT",
|
|
508
508
|
"dependencies": {
|
|
509
|
-
"@greppleai/grip-ai": "^0.1.
|
|
509
|
+
"@greppleai/grip-ai": "^0.1.5",
|
|
510
510
|
"ignore": "7.0.5",
|
|
511
511
|
"typebox": "1.3.7",
|
|
512
512
|
"yaml": "2.9.0"
|
|
@@ -516,8 +516,8 @@
|
|
|
516
516
|
}
|
|
517
517
|
},
|
|
518
518
|
"node_modules/@greppleai/grip-ai": {
|
|
519
|
-
"version": "0.1.
|
|
520
|
-
"resolved": "https://registry.npmjs.org/@greppleai/grip-ai/-/grip-ai-0.1.
|
|
519
|
+
"version": "0.1.5",
|
|
520
|
+
"resolved": "https://registry.npmjs.org/@greppleai/grip-ai/-/grip-ai-0.1.5.tgz",
|
|
521
521
|
"license": "MIT",
|
|
522
522
|
"dependencies": {
|
|
523
523
|
"@anthropic-ai/sdk": "0.124.0",
|
|
@@ -540,8 +540,8 @@
|
|
|
540
540
|
}
|
|
541
541
|
},
|
|
542
542
|
"node_modules/@greppleai/grip-tui": {
|
|
543
|
-
"version": "0.1.
|
|
544
|
-
"resolved": "https://registry.npmjs.org/@greppleai/grip-tui/-/grip-tui-0.1.
|
|
543
|
+
"version": "0.1.5",
|
|
544
|
+
"resolved": "https://registry.npmjs.org/@greppleai/grip-tui/-/grip-tui-0.1.5.tgz",
|
|
545
545
|
"license": "MIT",
|
|
546
546
|
"dependencies": {
|
|
547
547
|
"get-east-asian-width": "1.6.0",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@greppleai/grip",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "Coding agent CLI with read, bash, edit, write tools and session management",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"gripConfig": {
|
|
@@ -38,9 +38,9 @@
|
|
|
38
38
|
"prepublishOnly": "npm run clean && npm run build && npm run shrinkwrap"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@greppleai/grip-agent-core": "^0.1.
|
|
42
|
-
"@greppleai/grip-ai": "^0.1.
|
|
43
|
-
"@greppleai/grip-tui": "^0.1.
|
|
41
|
+
"@greppleai/grip-agent-core": "^0.1.5",
|
|
42
|
+
"@greppleai/grip-ai": "^0.1.5",
|
|
43
|
+
"@greppleai/grip-tui": "^0.1.5",
|
|
44
44
|
"@silvia-odwyer/photon-node": "0.3.4",
|
|
45
45
|
"chalk": "5.6.2",
|
|
46
46
|
"cross-spawn": "7.0.6",
|