@psnext/slingcli 3.0.20260810-3 → 3.0.20260811-2
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/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/codec.js +4 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/testing/conformance.js +19 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +12 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/deepseek.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/project-trust.js +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/system-prompt.js +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.js +3 -3
- package/node_modules/@earendil-works/pi-coding-agent/docs/compaction.md +9 -9
- package/node_modules/@earendil-works/pi-coding-agent/docs/containerization.md +8 -8
- package/node_modules/@earendil-works/pi-coding-agent/docs/custom-provider.md +20 -12
- package/node_modules/@earendil-works/pi-coding-agent/docs/development.md +71 -0
- package/node_modules/@earendil-works/pi-coding-agent/docs/docs.json +14 -1
- package/node_modules/@earendil-works/pi-coding-agent/docs/environment-variables.md +9 -9
- package/node_modules/@earendil-works/pi-coding-agent/docs/extensions.md +53 -26
- package/node_modules/@earendil-works/pi-coding-agent/docs/index.md +10 -9
- package/node_modules/@earendil-works/pi-coding-agent/docs/json.md +21 -16
- package/node_modules/@earendil-works/pi-coding-agent/docs/keybindings.md +46 -14
- package/node_modules/@earendil-works/pi-coding-agent/docs/llama-cpp.md +3 -3
- package/node_modules/@earendil-works/pi-coding-agent/docs/mcp.md +2 -2
- package/node_modules/@earendil-works/pi-coding-agent/docs/models.md +25 -4
- package/node_modules/@earendil-works/pi-coding-agent/docs/packages.md +13 -13
- package/node_modules/@earendil-works/pi-coding-agent/docs/prompt-templates.md +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/docs/providers.md +317 -0
- package/node_modules/@earendil-works/pi-coding-agent/docs/quickstart.md +11 -9
- package/node_modules/@earendil-works/pi-coding-agent/docs/rpc.md +15 -13
- package/node_modules/@earendil-works/pi-coding-agent/docs/sdk.md +33 -14
- package/node_modules/@earendil-works/pi-coding-agent/docs/security.md +5 -5
- package/node_modules/@earendil-works/pi-coding-agent/docs/session-format.md +3 -1
- package/node_modules/@earendil-works/pi-coding-agent/docs/sessions.md +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/docs/settings.md +6 -2
- package/node_modules/@earendil-works/pi-coding-agent/docs/shell-aliases.md +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/docs/skills.md +5 -5
- package/node_modules/@earendil-works/pi-coding-agent/docs/terminal-setup.md +3 -3
- package/node_modules/@earendil-works/pi-coding-agent/docs/termux.md +5 -5
- package/node_modules/@earendil-works/pi-coding-agent/docs/themes.md +7 -5
- package/node_modules/@earendil-works/pi-coding-agent/docs/tmux.md +3 -3
- package/node_modules/@earendil-works/pi-coding-agent/docs/usage.md +17 -10
- package/node_modules/@earendil-works/pi-coding-agent/docs/windows.md +1 -1
- package/package.json +2 -2
- package/slingshot/index.js +9 -7
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
>
|
|
1
|
+
> sling can help you use the SDK. Ask it to build an integration for your use case.
|
|
2
2
|
|
|
3
3
|
# SDK
|
|
4
4
|
|
|
5
|
-
The SDK provides programmatic access to
|
|
5
|
+
The SDK provides programmatic access to sling's agent capabilities. Use it to embed sling in other applications, build custom interfaces, or integrate with automated workflows.
|
|
6
6
|
|
|
7
7
|
**Example use cases:**
|
|
8
8
|
- Build a custom UI (web, desktop, mobile)
|
|
@@ -337,23 +337,23 @@ const { session } = await createAgentSession({
|
|
|
337
337
|
cwd: process.cwd(), // default
|
|
338
338
|
|
|
339
339
|
// Global config directory
|
|
340
|
-
agentDir: "~/.
|
|
340
|
+
agentDir: "~/.sling/agent", // default (expands ~)
|
|
341
341
|
});
|
|
342
342
|
```
|
|
343
343
|
|
|
344
344
|
`cwd` is used by `DefaultResourceLoader` for:
|
|
345
|
-
- Project extensions (`.
|
|
345
|
+
- Project extensions (`.sling/extensions/`)
|
|
346
346
|
- Project skills:
|
|
347
|
-
- `.
|
|
347
|
+
- `.sling/skills/`
|
|
348
348
|
- `.agents/skills/` in `cwd` and ancestor directories (up to git repo root, or filesystem root when not in a repo)
|
|
349
|
-
- Project prompts (`.
|
|
349
|
+
- Project prompts (`.sling/prompts/`)
|
|
350
350
|
- Context files (`AGENTS.md` walking up from cwd)
|
|
351
351
|
- Session directory naming
|
|
352
352
|
|
|
353
353
|
`agentDir` is used by `DefaultResourceLoader` for:
|
|
354
354
|
- Global extensions (`extensions/`)
|
|
355
355
|
- Global skills:
|
|
356
|
-
- `skills/` under `agentDir` (for example `~/.
|
|
356
|
+
- `skills/` under `agentDir` (for example `~/.sling/agent/skills/`)
|
|
357
357
|
- `~/.agents/skills/`
|
|
358
358
|
- Global prompts (`prompts/`)
|
|
359
359
|
- Global context file (`AGENTS.md`)
|
|
@@ -442,7 +442,7 @@ Authentication resolution priority (handled by `ModelRuntime`):
|
|
|
442
442
|
import { InMemoryCredentialStore } from "@earendil-works/pi-ai";
|
|
443
443
|
import { createAgentSession, ModelRuntime } from "@earendil-works/pi-coding-agent";
|
|
444
444
|
|
|
445
|
-
// Default: uses ~/.
|
|
445
|
+
// Default: uses ~/.sling/agent/auth.json and ~/.sling/agent/models.json
|
|
446
446
|
const modelRuntime = await ModelRuntime.create();
|
|
447
447
|
|
|
448
448
|
// Provider-owned auth methods and current status
|
|
@@ -452,7 +452,7 @@ for (const provider of modelRuntime.getProviders()) {
|
|
|
452
452
|
}
|
|
453
453
|
|
|
454
454
|
// Runtime API key override (not persisted to disk)
|
|
455
|
-
modelRuntime.setRuntimeApiKey("anthropic", "sk-my-temp-key");
|
|
455
|
+
await modelRuntime.setRuntimeApiKey("anthropic", "sk-my-temp-key");
|
|
456
456
|
|
|
457
457
|
// Custom credential and model locations
|
|
458
458
|
const customRuntime = await ModelRuntime.create({
|
|
@@ -469,6 +469,24 @@ const { session } = await createAgentSession({
|
|
|
469
469
|
});
|
|
470
470
|
```
|
|
471
471
|
|
|
472
|
+
`login()`, `logout()`, `setRuntimeApiKey()`, and `removeRuntimeApiKey()` resolve after the affected provider's cached/built-in catalog, composition, and availability snapshot are locally consistent. They do not wait for remote catalog freshness. If credentials were committed but local synchronization fails, they reject with the exported `CredentialSynchronizationError`; inspect its `providerId`, `operation`, `credential`, and `cause` fields instead of retrying the credential mutation blindly.
|
|
473
|
+
|
|
474
|
+
Public model/auth operations and `ModelRuntime.create({ signal })` accept optional abort signals and are unbounded when omitted. SDK applications own deadline policy for remote catalog freshness:
|
|
475
|
+
|
|
476
|
+
```typescript
|
|
477
|
+
const signal = AbortSignal.timeout(15_000);
|
|
478
|
+
const result = await modelRuntime.refresh({
|
|
479
|
+
providers: ["anthropic"],
|
|
480
|
+
signal,
|
|
481
|
+
});
|
|
482
|
+
if (result.aborted) console.warn("Catalog refresh timed out; using cached models");
|
|
483
|
+
for (const [providerId, error] of result.errors) {
|
|
484
|
+
console.warn(`Could not refresh ${providerId}:`, error);
|
|
485
|
+
}
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
A failed or timed-out network refresh does not undo a successful credential operation. `refresh()` starts a new provider generation, so it does not wait behind an older stalled refresh and stale generations cannot publish afterward.
|
|
489
|
+
|
|
472
490
|
> See [examples/sdk/09-api-keys-and-oauth.ts](../examples/sdk/09-api-keys-and-oauth.ts)
|
|
473
491
|
|
|
474
492
|
### System Prompt
|
|
@@ -498,7 +516,7 @@ Specify which built-in tools to enable:
|
|
|
498
516
|
- `noTools: "builtin"` disables default built-ins while keeping extension and custom tools enabled
|
|
499
517
|
- `excludeTools` disables specific built-in, extension, or custom tool names after any `tools` allowlist is applied
|
|
500
518
|
|
|
501
|
-
The `edit` tool returns `details.diff` for
|
|
519
|
+
The `edit` tool returns `details.diff` for sling's TUI display and `details.patch` as a standard unified patch for SDK consumers.
|
|
502
520
|
|
|
503
521
|
```typescript
|
|
504
522
|
import { createAgentSession } from "@earendil-works/pi-coding-agent";
|
|
@@ -580,7 +598,7 @@ If you pass `tools`, include each custom or extension tool name you want enabled
|
|
|
580
598
|
|
|
581
599
|
### Extensions
|
|
582
600
|
|
|
583
|
-
Extensions are loaded by the `ResourceLoader`. `DefaultResourceLoader` discovers extensions from `~/.
|
|
601
|
+
Extensions are loaded by the `ResourceLoader`. `DefaultResourceLoader` discovers extensions from `~/.sling/agent/extensions/`, `.sling/extensions/`, and settings.json extension sources.
|
|
584
602
|
|
|
585
603
|
```typescript
|
|
586
604
|
import { createAgentSession, DefaultResourceLoader } from "@earendil-works/pi-coding-agent";
|
|
@@ -859,8 +877,8 @@ const { session } = await createAgentSession({
|
|
|
859
877
|
**Project-specific settings:**
|
|
860
878
|
|
|
861
879
|
Settings load from two locations and merge:
|
|
862
|
-
1. Global: `~/.
|
|
863
|
-
2. Project: `<cwd>/.
|
|
880
|
+
1. Global: `~/.sling/agent/settings.json`
|
|
881
|
+
2. Project: `<cwd>/.sling/settings.json`
|
|
864
882
|
|
|
865
883
|
Project overrides global. Nested objects merge keys. Setters modify global settings by default.
|
|
866
884
|
|
|
@@ -938,7 +956,7 @@ const modelRuntime = await ModelRuntime.create({
|
|
|
938
956
|
modelsPath: "/custom/agent/models.json",
|
|
939
957
|
});
|
|
940
958
|
if (process.env.MY_KEY) {
|
|
941
|
-
modelRuntime.setRuntimeApiKey("anthropic", process.env.MY_KEY);
|
|
959
|
+
await modelRuntime.setRuntimeApiKey("anthropic", process.env.MY_KEY);
|
|
942
960
|
}
|
|
943
961
|
|
|
944
962
|
// Inline tool
|
|
@@ -1144,6 +1162,7 @@ AgentSessionRuntime
|
|
|
1144
1162
|
// Auth and Models
|
|
1145
1163
|
ModelRuntime // implements pi-ai Models and owns credential storage
|
|
1146
1164
|
ModelRegistry // synchronous extension compatibility facade
|
|
1165
|
+
CredentialSynchronizationError
|
|
1147
1166
|
resolveCliModel
|
|
1148
1167
|
resolveModelScopeWithDiagnostics
|
|
1149
1168
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# Security
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Pi is a local coding agent. It runs with the permissions of the user account that starts it, and it treats files writable by that user as inside the same local trust boundary.
|
|
4
4
|
|
|
5
5
|
## Project Trust
|
|
6
6
|
|
|
7
7
|
Project trust controls whether sling loads project-local settings, resources, packages, and extensions. It is not a sandbox and it does not restrict what the model can ask tools to do after you start working in a directory.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Pi considers a project to have resources that require trust when it finds any of these from the current working directory:
|
|
10
10
|
|
|
11
11
|
- `.sling/settings.json`
|
|
12
12
|
- `.sling/extensions`, `.sling/skills`, `.sling/prompts`, or `.sling/themes`
|
|
@@ -24,17 +24,17 @@ Trusting a project allows sling to load project resources that require trust, in
|
|
|
24
24
|
- missing project packages configured through project settings
|
|
25
25
|
- project-local extensions and project package-managed extensions
|
|
26
26
|
|
|
27
|
-
Declining trust skips protected resources. `AGENTS.md` and `CLAUDE.md`
|
|
27
|
+
Declining trust skips protected resources. Context files such as `AGENTS.override.md`, `AGENTS.md`, and `CLAUDE.md` are loaded regardless of project trust unless context loading is disabled. Before trust is resolved, sling only loads context files, user/global extensions, and CLI `-e` extensions. User/global and CLI extensions can handle the `project_trust` event; the first extension that returns a yes/no decision owns the decision.
|
|
28
28
|
|
|
29
29
|
Non-interactive modes (`-p`, `--mode json`, and `--mode rpc`) do not show a trust prompt. Without an applicable saved trust decision, `defaultProjectTrust: "ask"` and `"never"` ignore such resources, while `"always"` trusts them. Use `--approve`/`-a` or `--no-approve`/`-na` to override project trust for one run.
|
|
30
30
|
|
|
31
31
|
## No Built-in Sandbox
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
Pi does not include a built-in sandbox. Built-in tools can read files, write files, edit files, and run shell commands with the permissions of the sling process. Extensions are TypeScript modules that run with the same permissions. Package installs, shell commands, language servers, test commands, and other developer tools behave as ordinary local processes.
|
|
34
34
|
|
|
35
35
|
This is intentional. sling is designed to operate on local source trees, invoke project toolchains, and integrate with the user's existing development environment. A partial in-process sandbox would be easy to misunderstand as a security boundary while still depending on the host shell, filesystem, package managers, credentials, and extension code. Real isolation needs to come from the operating system or a virtualization/container boundary.
|
|
36
36
|
|
|
37
|
-
Project trust is only an input-loading guard. It prevents a repository from silently changing sling's settings or extensions before you approve it. It does not make untrusted code, untrusted prompts, or untrusted model output safe. Prompt injection from repository files, comments, documentation, context files, or build output is expected local-agent risk and cannot be reliably prevented by
|
|
37
|
+
Project trust is only an input-loading guard. It prevents a repository from silently changing sling's settings or extensions before you approve it. It does not make untrusted code, untrusted prompts, or untrusted model output safe. Prompt injection from repository files, comments, documentation, context files, or build output is expected local-agent risk and cannot be reliably prevented by pi.
|
|
38
38
|
|
|
39
39
|
## Running Untrusted or Unmonitored Work
|
|
40
40
|
|
|
@@ -14,7 +14,7 @@ Where `<path>` is the working directory with `/` replaced by `-`.
|
|
|
14
14
|
|
|
15
15
|
Sessions can be removed by deleting their `.jsonl` files under `~/.sling/agent/sessions/`.
|
|
16
16
|
|
|
17
|
-
sling also supports deleting sessions interactively from `/resume` (select a session and press `Ctrl+D`, then confirm). When available,
|
|
17
|
+
sling also supports deleting sessions interactively from `/resume` (select a session and press `Ctrl+D`, then confirm). When available, pslingi uses the `trash` CLI to avoid permanent deletion.
|
|
18
18
|
|
|
19
19
|
## Session Version
|
|
20
20
|
|
|
@@ -117,6 +117,8 @@ interface Usage {
|
|
|
117
117
|
}
|
|
118
118
|
```
|
|
119
119
|
|
|
120
|
+
The exported pi-ai `StopReason` type also includes `"pending"`, but that value is reserved for partial messages in streaming events. Terminal `done`/`error` messages replace it with a completion reason before sling persists the assistant message, so `"pending"` should never appear in session JSONL.
|
|
121
|
+
|
|
120
122
|
### Extended Message Types (from pi-coding-agent)
|
|
121
123
|
|
|
122
124
|
```typescript
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Sessions
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Pi saves conversations as sessions so you can continue work, branch from earlier turns, and revisit previous paths.
|
|
4
4
|
|
|
5
5
|
## Session Storage
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Settings
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Pi uses JSON settings files with project settings overriding global settings.
|
|
4
4
|
|
|
5
5
|
| Location | Scope |
|
|
6
6
|
|----------|-------|
|
|
@@ -65,6 +65,9 @@ Use `/trust` in interactive mode to save a project trust decision for future ses
|
|
|
65
65
|
| `outputPad` | number | `1` | Horizontal padding for user messages, assistant messages, and thinking (0 or 1) |
|
|
66
66
|
| `autocompleteMaxVisible` | number | `5` | Max visible items in autocomplete dropdown (3-20) |
|
|
67
67
|
| `showHardwareCursor` | boolean | `false` | Show the terminal cursor while TUI positions it for IME support |
|
|
68
|
+
| `tuiMode` | string | `"regular"` | Interactive TUI mode: `"regular"` or experimental `"fullscreen"`. Changes from `/settings` apply immediately; `--tui-mode` overrides this setting at startup |
|
|
69
|
+
| `fullscreenExitOutput` | string | `"transcript"` | Fullscreen exit output: `"transcript"` prints the final transcript and resume hint, while `"resume-hint"` restores the previous screen and prints only the resume hint. Has no effect in regular TUI mode |
|
|
70
|
+
| `fullscreenScrollbar` | string | `"auto"` | Fullscreen transcript scrollbar: `"auto"` shows it temporarily while scrolling, `"always"` reserves the rightmost column and keeps it visible, and `"hidden"` hides it. Has no effect in regular TUI mode |
|
|
68
71
|
|
|
69
72
|
For VS Code, include `--wait` so sling resumes after the editor exits:
|
|
70
73
|
|
|
@@ -178,7 +181,7 @@ Keep `retry.provider.maxRetries` at `0` unless provider-level retries are explic
|
|
|
178
181
|
| `terminal.showImages` | boolean | `true` | Show images in terminal (if supported) |
|
|
179
182
|
| `terminal.imageWidthCells` | number | `60` | Preferred inline image width in terminal cells |
|
|
180
183
|
| `terminal.clearOnShrink` | boolean | `false` | Clear empty rows when content shrinks (can cause flicker) |
|
|
181
|
-
| `images.autoResize` | boolean | `true` | Resize images to 2000x2000 max |
|
|
184
|
+
| `images.autoResize` | boolean | `true` | Resize images to 2000x2000 max. Applies to `@file` attachments, `read`, and images returned by tools |
|
|
182
185
|
| `images.blockImages` | boolean | `false` | Block all images from being sent to LLM |
|
|
183
186
|
|
|
184
187
|
### Shell
|
|
@@ -226,6 +229,7 @@ When multiple sources specify a session directory, precedence is `--session-dir`
|
|
|
226
229
|
| Setting | Type | Default | Description |
|
|
227
230
|
|---------|------|---------|-------------|
|
|
228
231
|
| `markdown.codeBlockIndent` | string | `" "` | Indentation for code blocks |
|
|
232
|
+
| `markdown.mermaid` | string | `"streaming"` | Mermaid rendering mode: `"off"`, `"final"`, or `"streaming"` |
|
|
229
233
|
|
|
230
234
|
### Resources
|
|
231
235
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Shell Aliases
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Pi runs bash in non-interactive mode (`bash -c`), which doesn't expand aliases by default.
|
|
4
4
|
|
|
5
5
|
To enable your shell aliases, add to `~/.sling/agent/settings.json`:
|
|
6
6
|
|
|
@@ -21,7 +21,7 @@ sling implements the [Agent Skills standard](https://agentskills.io/specificatio
|
|
|
21
21
|
|
|
22
22
|
> **Security:** Skills can instruct the model to perform any action and may include executable code the model invokes. Review skill content before use.
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
Pi loads skills from:
|
|
25
25
|
|
|
26
26
|
- Global:
|
|
27
27
|
- `~/.sling/agent/skills/`
|
|
@@ -29,7 +29,7 @@ sling loads skills from:
|
|
|
29
29
|
- Project (only after the project is trusted):
|
|
30
30
|
- `.sling/skills/`
|
|
31
31
|
- `.agents/skills/` in `cwd` and ancestor directories (up to git repo root, or filesystem root when not in a repo)
|
|
32
|
-
- Packages: `skills/` directories or `
|
|
32
|
+
- Packages: `skills/` directories or `pi.skills` entries in `package.json`
|
|
33
33
|
- Settings: `skills` array with files or directories
|
|
34
34
|
- CLI: `--skill <path>` (repeatable, additive even with `--no-skills`)
|
|
35
35
|
|
|
@@ -154,7 +154,7 @@ Per the [Agent Skills specification](https://agentskills.io/specification#frontm
|
|
|
154
154
|
- Lowercase letters, numbers, hyphens only
|
|
155
155
|
- No leading/trailing hyphens
|
|
156
156
|
- No consecutive hyphens
|
|
157
|
-
|
|
157
|
+
Pi does not require the name to match the parent directory. The Agent Skills standard does, but that requirement is suboptimal for shared skill directories used by multiple tools.
|
|
158
158
|
|
|
159
159
|
Valid: `pdf-processing`, `data-analysis`, `code-review`
|
|
160
160
|
Invalid: `PDF-Processing`, `-pdf`, `pdf--processing`
|
|
@@ -175,7 +175,7 @@ description: Helps with PDFs.
|
|
|
175
175
|
|
|
176
176
|
## Validation
|
|
177
177
|
|
|
178
|
-
|
|
178
|
+
Pi validates skills against the Agent Skills standard. Most issues produce warnings but still load the skill:
|
|
179
179
|
|
|
180
180
|
- Name exceeds 64 characters or contains invalid characters
|
|
181
181
|
- Name starts/ends with hyphen or has consecutive hyphens
|
|
@@ -228,4 +228,4 @@ cd /path/to/brave-search && npm install
|
|
|
228
228
|
## Skill Repositories
|
|
229
229
|
|
|
230
230
|
- [Anthropic Skills](https://github.com/anthropics/skills) - Document processing (docx, pdf, pptx, xlsx), web development
|
|
231
|
-
- [
|
|
231
|
+
- [sling Skills](https://github.com/badlogic/pi-skills) - Web search, browser automation, Google APIs, transcription
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Terminal Setup
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Pi uses the [Kitty keyboard protocol](https://sw.kovidgoyal.net/kitty/keyboard-protocol/) for reliable modifier key detection. Most modern terminals support this protocol, but some require configuration.
|
|
4
4
|
|
|
5
5
|
## Kitty, iTerm2
|
|
6
6
|
|
|
@@ -8,7 +8,7 @@ Work out of the box.
|
|
|
8
8
|
|
|
9
9
|
## Apple Terminal
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Pi enables enhanced key reporting when available. If Terminal.app still sends plain Return for `Shift+Enter`, sling uses a local macOS modifier fallback to treat that Return as `Shift+Enter`.
|
|
12
12
|
|
|
13
13
|
This fallback only works when sling runs on the same Mac as Terminal.app. It cannot detect the local keyboard over remote SSH.
|
|
14
14
|
|
|
@@ -30,7 +30,7 @@ That mapping sends a raw linefeed byte. Inside sling, that is indistinguishable
|
|
|
30
30
|
|
|
31
31
|
If Claude Code 2.x or newer is the only reason you added that mapping, you can remove it, unless you want to use Claude Code in tmux, where it still requires that Ghostty mapping.
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
Pi binds `Ctrl+J` as a default newline alias, so `Shift+Enter` keeps working in tmux via that remap without extra sling configuration.
|
|
34
34
|
|
|
35
35
|
## WezTerm
|
|
36
36
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Termux (Android) Setup
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Pi runs on Android via [Termux](https://termux.dev/), a terminal emulator and Linux environment for Android.
|
|
4
4
|
|
|
5
5
|
## Prerequisites
|
|
6
6
|
|
|
@@ -16,14 +16,14 @@ pkg update && pkg upgrade
|
|
|
16
16
|
# Install dependencies
|
|
17
17
|
pkg install nodejs termux-api git
|
|
18
18
|
|
|
19
|
-
# Install
|
|
20
|
-
npm install -g --ignore-scripts @
|
|
19
|
+
# Install pi
|
|
20
|
+
npm install -g --ignore-scripts @earendil-works/pi-coding-agent
|
|
21
21
|
|
|
22
22
|
# Create config directory
|
|
23
23
|
mkdir -p ~/.sling/agent
|
|
24
24
|
|
|
25
|
-
# Run
|
|
26
|
-
|
|
25
|
+
# Run pi
|
|
26
|
+
pi
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
## Clipboard Support
|
|
@@ -16,7 +16,7 @@ Themes are JSON files that define colors for the TUI.
|
|
|
16
16
|
|
|
17
17
|
## Locations
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
Pi loads themes from:
|
|
20
20
|
|
|
21
21
|
- Built-in: `dark`, `light`
|
|
22
22
|
- Global: `~/.sling/agent/themes/*.json`
|
|
@@ -71,6 +71,7 @@ vim ~/.sling/agent/themes/my-theme.json
|
|
|
71
71
|
"text": "",
|
|
72
72
|
"thinkingText": "secondary",
|
|
73
73
|
"selectedBg": "#2d2d30",
|
|
74
|
+
"scrollbarThumb": "#555566",
|
|
74
75
|
"userMessageBg": "#2d2d30",
|
|
75
76
|
"userMessageText": "",
|
|
76
77
|
"customMessageBg": "#2d2d30",
|
|
@@ -140,13 +141,13 @@ vim ~/.sling/agent/themes/my-theme.json
|
|
|
140
141
|
|
|
141
142
|
- `name` is required, must be unique, and must not contain `/`.
|
|
142
143
|
- `vars` is optional. Define reusable colors here, then reference them in `colors`.
|
|
143
|
-
- `colors` must define all 51 required tokens. `thinkingMax` is optional and falls back to `thinkingXhigh`.
|
|
144
|
+
- `colors` must define all 51 required tokens. `thinkingMax` is optional and falls back to `thinkingXhigh`; `scrollbarThumb` is optional and falls back to `selectedBg`.
|
|
144
145
|
|
|
145
146
|
The `$schema` field enables editor auto-completion and validation.
|
|
146
147
|
|
|
147
148
|
## Color Tokens
|
|
148
149
|
|
|
149
|
-
Every theme must define all 51 required color tokens. `thinkingMax`
|
|
150
|
+
Every theme must define all 51 required color tokens. `thinkingMax` and `scrollbarThumb` are optional for compatibility with existing themes; when omitted, they use `thinkingXhigh` and `selectedBg`, respectively.
|
|
150
151
|
|
|
151
152
|
### Core UI (11 colors)
|
|
152
153
|
|
|
@@ -164,11 +165,12 @@ Every theme must define all 51 required color tokens. `thinkingMax` is optional
|
|
|
164
165
|
| `text` | Default text (usually `""`) |
|
|
165
166
|
| `thinkingText` | Thinking block text |
|
|
166
167
|
|
|
167
|
-
### Backgrounds & Content (11
|
|
168
|
+
### Backgrounds & Content (11 required, 1 optional)
|
|
168
169
|
|
|
169
170
|
| Token | Purpose |
|
|
170
171
|
|-------|---------|
|
|
171
172
|
| `selectedBg` | Selected line background |
|
|
173
|
+
| `scrollbarThumb` | Fullscreen scrollbar thumb background; optional, falls back to `selectedBg` |
|
|
172
174
|
| `userMessageBg` | User message background |
|
|
173
175
|
| `userMessageText` | User message text |
|
|
174
176
|
| `customMessageBg` | Extension message background |
|
|
@@ -270,7 +272,7 @@ Four formats are supported:
|
|
|
270
272
|
|
|
271
273
|
### Terminal Compatibility
|
|
272
274
|
|
|
273
|
-
|
|
275
|
+
Pi uses 24-bit RGB colors. Most modern terminals support this (iTerm2, Kitty, WezTerm, Windows Terminal, VS Code). For older terminals with only 256-color support, sling falls back to the nearest approximation.
|
|
274
276
|
|
|
275
277
|
Check truecolor support:
|
|
276
278
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# tmux Setup
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Pi works inside tmux, but tmux strips modifier information from certain keys by default. Without configuration, `Shift+Enter` and `Ctrl+Enter` are usually indistinguishable from plain `Enter`.
|
|
4
4
|
|
|
5
5
|
## Recommended Configuration
|
|
6
6
|
|
|
@@ -18,7 +18,7 @@ tmux kill-server
|
|
|
18
18
|
tmux
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
Pi requests extended key reporting automatically when Kitty keyboard protocol is not available. With `extended-keys-format csi-u`, tmux forwards modified keys in CSI-u format, which is the most reliable configuration. The `extended-keys-format` option requires tmux 3.5 or later.
|
|
22
22
|
|
|
23
23
|
## Why `csi-u` Is Recommended
|
|
24
24
|
|
|
@@ -40,7 +40,7 @@ With `extended-keys-format csi-u`, the same keys are forwarded as:
|
|
|
40
40
|
- `Ctrl+D` → `\x1b[100;5u`
|
|
41
41
|
- `Ctrl+Enter` → `\x1b[13;5u`
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
Pi supports both formats, but `csi-u` is the recommended tmux setup.
|
|
44
44
|
|
|
45
45
|
## What This Fixes
|
|
46
46
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Using
|
|
1
|
+
# Using Pi
|
|
2
2
|
|
|
3
3
|
This page collects day-to-day usage details that do not fit on the quickstart page.
|
|
4
4
|
|
|
@@ -103,6 +103,8 @@ sling loads `AGENTS.md` or `CLAUDE.md` at startup from:
|
|
|
103
103
|
- parent directories, walking up from the current working directory
|
|
104
104
|
- the current directory
|
|
105
105
|
|
|
106
|
+
If a directory contains `AGENTS.override.md`, sling loads it instead of `AGENTS.md` or `CLAUDE.md` from that directory. Context files from other directories still layer normally.
|
|
107
|
+
|
|
106
108
|
Use context files for project conventions, commands, safety rules, and preferences. Disable loading with `--no-context-files` or `-nc`.
|
|
107
109
|
|
|
108
110
|
### System Prompt Files
|
|
@@ -124,7 +126,7 @@ Non-interactive modes (`-p`, `--mode json`, and `--mode rpc`) do not show a trus
|
|
|
124
126
|
|
|
125
127
|
If no extension or saved decision applies, `defaultProjectTrust` controls the fallback behavior. Set it to `"ask"`, `"always"`, or `"never"` in `~/.sling/agent/settings.json`, or change it with `/settings`.
|
|
126
128
|
|
|
127
|
-
`sling config` and package commands use the same project trust flow, except `sling
|
|
129
|
+
`sling config` and package commands use the same project trust flow, except `sling` never prompts. Pass `--approve` to trust project-local settings for one command or `--no-approve` to ignore them.
|
|
128
130
|
|
|
129
131
|
Use `/trust` in interactive mode to save a project trust decision for future sessions, including trust for the immediate parent folder. It writes `~/.sling/agent/trust.json` only; the current session is not reloaded, so restart sling for changes to take effect.
|
|
130
132
|
|
|
@@ -149,9 +151,9 @@ sling [options] [@files...] [messages...]
|
|
|
149
151
|
sling install <source> [-l] # Install package, -l for project-local
|
|
150
152
|
sling remove <source> [-l] # Remove package
|
|
151
153
|
sling uninstall <source> [-l] # Alias for remove
|
|
152
|
-
sling update [source|self|
|
|
154
|
+
sling update [source|self|pi] # Update sling only, or one package source
|
|
153
155
|
sling update --all # Update sling and packages; reconcile pinned git refs
|
|
154
|
-
|
|
156
|
+
pslingi update --extensions # Update packages only; reconcile pinned git refs
|
|
155
157
|
sling update --models # Refresh model catalogs only
|
|
156
158
|
sling update --self # Update sling only
|
|
157
159
|
sling update --extension <src> # Update one package
|
|
@@ -159,7 +161,7 @@ sling list # List installed packages
|
|
|
159
161
|
sling config # Enable/disable package resources
|
|
160
162
|
```
|
|
161
163
|
|
|
162
|
-
These commands manage sling packages and `sling update` can update the sling CLI installation. To uninstall sling itself, see [Quickstart](quickstart.md#uninstall). `sling
|
|
164
|
+
These commands manage sling packages and `sling update` can update the sling CLI installation. To uninstall sling itself, see [Quickstart](quickstart.md#uninstall). `sling` and project package commands accept `--approve`/`--no-approve` to trust or ignore project-local settings for one command. `sling update` never prompts for project trust.
|
|
163
165
|
|
|
164
166
|
See [sling Packages](packages.md) for package sources and security notes.
|
|
165
167
|
|
|
@@ -239,12 +241,17 @@ sling --no-extensions -e ./my-extension.ts
|
|
|
239
241
|
|--------|-------------|
|
|
240
242
|
| `--system-prompt <text>` | Replace default prompt; context files and skills are still appended |
|
|
241
243
|
| `--append-system-prompt <text>` | Append to system prompt |
|
|
244
|
+
| `--tui-mode <mode>` | TUI mode: `regular` (default) or experimental `fullscreen` |
|
|
242
245
|
| `--verbose` | Force verbose startup |
|
|
243
246
|
| `-a`, `--approve` | Trust project-local files for this run |
|
|
244
247
|
| `-na`, `--no-approve` | Ignore project-local files for this run |
|
|
245
248
|
| `-h`, `--help` | Show help |
|
|
246
249
|
| `-v`, `--version` | Show version |
|
|
247
250
|
|
|
251
|
+
In `fullscreen` mode, the transcript scrolls inside the terminal viewport while queued messages, working status, extension widgets, editor, and footer remain fixed at the bottom. Mouse/trackpad input scrolls the region under the pointer; keyboard viewport actions always remain available. Inline images work in terminals that support the Kitty graphics protocol, including Kitty and Ghostty. In iTerm2 they render as text placeholders because its inline-image protocol cannot delete or crop placements during application-owned scrolling. In `regular` mode, sling uses the main screen and terminal-owned scrollback, and iTerm2 inline images continue to render normally.
|
|
252
|
+
|
|
253
|
+
Set **TUI mode** in `/settings` to switch between `regular` and `fullscreen` immediately and choose the default for future sessions. **Fullscreen exit output** controls whether exiting fullscreen prints the final transcript or restores the previous screen and prints only the session resume hint.
|
|
254
|
+
|
|
248
255
|
### File Arguments
|
|
249
256
|
|
|
250
257
|
Prefix files with `@` to include them in the message:
|
|
@@ -268,19 +275,19 @@ sling -p "Summarize this codebase"
|
|
|
268
275
|
cat README.md | sling -p "Summarize this text"
|
|
269
276
|
|
|
270
277
|
# Named one-shot session
|
|
271
|
-
|
|
278
|
+
slingpi --name "release audit" -p "Audit this repository"
|
|
272
279
|
|
|
273
280
|
# Different model
|
|
274
|
-
sling --provider
|
|
281
|
+
sling --provider openai --model gpt-4o "Help me refactor"
|
|
275
282
|
|
|
276
283
|
# Model with provider prefix
|
|
277
|
-
sling --model
|
|
284
|
+
sling --model openai/gpt-4o "Help me refactor"
|
|
278
285
|
|
|
279
286
|
# Model with thinking level shorthand
|
|
280
|
-
sling --model sonnet
|
|
287
|
+
sling --model sonnet:high "Solve this complex problem"
|
|
281
288
|
|
|
282
289
|
# Limit model cycling
|
|
283
|
-
sling --models "claude-*,gpt
|
|
290
|
+
sling --models "claude-*,gpt-4o"
|
|
284
291
|
|
|
285
292
|
# Read-only mode
|
|
286
293
|
sling --tools read,grep,find,ls -p "Review the code"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@psnext/slingcli",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.20260811-2",
|
|
4
4
|
"description": "Connects Sling CLI to Publicis Sapient Slingshot enterprise LLM gateway. Bundles the pi coding-agent runtime.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"type": "git",
|
|
30
30
|
"url": "git+https://pscode.lioncloud.net/psaiproducts/slingcli.git"
|
|
31
31
|
},
|
|
32
|
-
"slingVersion": "3.0.
|
|
32
|
+
"slingVersion": "3.0.20260811-2",
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@earendil-works/pi-tui": "file:../.sling-pack/earendil-works-pi-tui-0.84.1.tgz",
|
|
35
35
|
"@earendil-works/pi-ai": "file:../.sling-pack/earendil-works-pi-ai-0.84.1.tgz",
|