@letta-ai/letta-code 0.27.8 → 0.27.10
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/README.md +2 -2
- package/dist/app-server-client.js +387 -0
- package/dist/app-server-client.js.map +10 -0
- package/dist/types/app-server-client.d.ts +99 -0
- package/dist/types/app-server-client.d.ts.map +1 -0
- package/dist/types/types/app-server-protocol.d.ts +3 -0
- package/dist/types/types/app-server-protocol.d.ts.map +1 -0
- package/dist/types/types/protocol.d.ts.map +1 -0
- package/dist/types/types/protocol_v2.d.ts +2277 -0
- package/dist/types/types/protocol_v2.d.ts.map +1 -0
- package/letta.js +33889 -30137
- package/package.json +11 -2
- package/scripts/check-test-coverage.cjs +1 -1
- package/scripts/run-unit-tests.cjs +1 -1
- package/skills/{creating-extensions → creating-mods}/SKILL.md +30 -30
- package/skills/{creating-extensions → creating-mods}/references/architecture.md +9 -9
- package/skills/{creating-extensions → creating-mods}/references/commands.md +10 -10
- package/skills/{creating-extensions → creating-mods}/references/events.md +16 -14
- package/skills/{creating-extensions → creating-mods}/references/permissions.md +3 -3
- package/skills/{creating-extensions → creating-mods}/references/plan-mode.md +10 -8
- package/skills/{creating-extensions → creating-mods}/references/providers.md +7 -7
- package/skills/{creating-extensions → creating-mods}/references/tools.md +22 -3
- package/skills/{creating-extensions → creating-mods}/references/ui.md +6 -4
- package/skills/customizing-commands/SKILL.md +18 -18
- package/skills/customizing-statusline/SKILL.md +11 -11
- package/skills/customizing-statusline/references/api.md +9 -12
- package/skills/customizing-statusline/references/examples.md +3 -5
- package/skills/customizing-statusline/references/migration.md +2 -3
- package/skills/editing-letta-code-desktop-preferences/SKILL.md +67 -0
- package/skills/image-generation/SKILL.md +30 -16
- package/skills/modifying-the-harness/SKILL.md +21 -2
- package/skills/modifying-the-harness/scripts/add_permission.py +2 -1
- package/skills/modifying-the-harness/scripts/show_config.py +4 -3
- package/vendor/ink-text-input/build/index.js +5 -3
- package/dist/types/protocol.d.ts.map +0 -1
- /package/dist/types/{protocol.d.ts → types/protocol.d.ts} +0 -0
|
@@ -1,36 +1,36 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: customizing-commands
|
|
3
|
-
description: Creates, edits, and enables Letta Code
|
|
3
|
+
description: Creates, edits, and enables Letta Code mod-provided slash commands. Use when the user asks to add a custom /command, slash command, command shortcut, scoped conversation-backed command, or command-driven panel behavior.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Customizing Commands
|
|
7
7
|
|
|
8
|
-
Use this as the command-specific entrypoint for local
|
|
8
|
+
Use this as the command-specific entrypoint for local mod slash commands. For broader mod work, recipes live in `../creating-mods/references/commands.md`, `../creating-mods/references/architecture.md`, `../creating-mods/references/ui.md`, and `../creating-mods/references/plan-mode.md`.
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
Mod files live in:
|
|
11
11
|
|
|
12
12
|
```text
|
|
13
|
-
~/.letta/
|
|
13
|
+
~/.letta/mods/
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
Use a focused file name, e.g. `~/.letta/
|
|
16
|
+
Use a focused file name, e.g. `~/.letta/mods/review.ts` or `~/.letta/mods/commands.ts`.
|
|
17
17
|
|
|
18
18
|
## First decide whether a command is right
|
|
19
19
|
|
|
20
20
|
| User wants | Build |
|
|
21
21
|
| --- | --- |
|
|
22
|
-
| `/foo` sends a prompt or shows local output |
|
|
23
|
-
| `/foo` starts a reusable agent workflow | Skill + thin
|
|
24
|
-
| Agent/model should autonomously call the capability |
|
|
25
|
-
| Command shows transient progress/results |
|
|
22
|
+
| `/foo` sends a prompt or shows local output | Mod command |
|
|
23
|
+
| `/foo` starts a reusable agent workflow | Skill + thin mod command |
|
|
24
|
+
| Agent/model should autonomously call the capability | Mod tool, not a command |
|
|
25
|
+
| Command shows transient progress/results | Mod command + panel |
|
|
26
26
|
| Command needs model output while the main agent is busy | `runWhenBusy: true` command + forked `ctx.conversation` |
|
|
27
27
|
|
|
28
|
-
If the command is a durable workflow like `/goal`, put the workflow instructions in a skill and keep the
|
|
28
|
+
If the command is a durable workflow like `/goal`, put the workflow instructions in a skill and keep the mod command as a small launcher/prompt.
|
|
29
29
|
|
|
30
30
|
## Workflow
|
|
31
31
|
|
|
32
|
-
1. Inspect `~/.letta/
|
|
33
|
-
2. Preserve unrelated
|
|
32
|
+
1. Inspect `~/.letta/mods/` for related command files.
|
|
33
|
+
2. Preserve unrelated mod code; create a focused new file if merging is messy.
|
|
34
34
|
3. Register with `letta.commands.register()` and guard with `letta.capabilities.commands`.
|
|
35
35
|
4. Return the unregister function, or a disposer that calls it plus any timer/panel cleanup.
|
|
36
36
|
5. Tell the user the exact file path changed and to run `/reload`.
|
|
@@ -62,7 +62,7 @@ export default function activate(letta) {
|
|
|
62
62
|
## Command result types
|
|
63
63
|
|
|
64
64
|
```ts
|
|
65
|
-
type
|
|
65
|
+
type ModCommandResult =
|
|
66
66
|
| { type: "prompt"; content: string; systemReminder?: boolean }
|
|
67
67
|
| { type: "output"; output: string; success?: boolean }
|
|
68
68
|
| { type: "handled" };
|
|
@@ -80,11 +80,11 @@ type ExtensionCommandResult =
|
|
|
80
80
|
- `runWhenBusy: true` commands must not return `prompt` while the main agent is busy; use scoped conversation helpers/panels and return `handled`.
|
|
81
81
|
- `showInTranscript: false` commands should usually return `handled`, not `prompt`.
|
|
82
82
|
- Do not import Letta Code app internals.
|
|
83
|
-
- Do not do surprising side effects on startup;
|
|
83
|
+
- Do not do surprising side effects on startup; mods activate on app start and `/reload`.
|
|
84
84
|
|
|
85
85
|
## More recipes
|
|
86
86
|
|
|
87
|
-
- Simple output command, panel command, busy-safe conversation command: `../creating-
|
|
88
|
-
- Complex command architecture, state, cleanup: `../creating-
|
|
89
|
-
- Panel/status UI patterns: `../creating-
|
|
90
|
-
- Worked plan-mode command/tool composition: `../creating-
|
|
87
|
+
- Simple output command, panel command, busy-safe conversation command: `../creating-mods/references/commands.md`
|
|
88
|
+
- Complex command architecture, state, cleanup: `../creating-mods/references/architecture.md`
|
|
89
|
+
- Panel/status UI patterns: `../creating-mods/references/ui.md`
|
|
90
|
+
- Worked plan-mode command/tool composition: `../creating-mods/references/plan-mode.md`
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: customizing-statusline
|
|
3
|
-
description: Creates, edits, and migrates Letta Code statusline
|
|
3
|
+
description: Creates, edits, and migrates Letta Code statusline mods. Use when handling the /statusline command or continuing work started by /statusline.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Customizing Statusline
|
|
7
7
|
|
|
8
|
-
Use this skill to create or update the global Letta Code statusline
|
|
8
|
+
Use this skill to create or update the global Letta Code statusline mod:
|
|
9
9
|
|
|
10
10
|
```text
|
|
11
|
-
~/.letta/
|
|
11
|
+
~/.letta/mods/statusline.tsx
|
|
12
12
|
```
|
|
13
13
|
|
|
14
14
|
The statusline is a full-row idle renderer. Host UI can still temporarily preempt it for safety confirmations and transient hints.
|
|
@@ -18,7 +18,7 @@ The statusline is a full-row idle renderer. Host UI can still temporarily preemp
|
|
|
18
18
|
```text
|
|
19
19
|
safety preemption
|
|
20
20
|
else transient host hint
|
|
21
|
-
else custom statusline
|
|
21
|
+
else custom statusline mod
|
|
22
22
|
else built-in default statusline
|
|
23
23
|
```
|
|
24
24
|
|
|
@@ -26,14 +26,14 @@ A custom statusline owns the whole idle row. Do not preserve legacy left/right s
|
|
|
26
26
|
|
|
27
27
|
## Workflow
|
|
28
28
|
|
|
29
|
-
1. Check whether `~/.letta/
|
|
29
|
+
1. Check whether `~/.letta/mods/statusline.tsx` exists.
|
|
30
30
|
2. If it exists, read it before editing and preserve unrelated code.
|
|
31
31
|
3. If it does not exist, start from the built-in default template or synthesize a focused starter for the user's request.
|
|
32
32
|
4. If the user asks to migrate, import a `.sh` file, or match a shell prompt, read `references/migration.md`.
|
|
33
33
|
5. If API details or concrete patterns are needed, read `references/api.md` and `references/examples.md`.
|
|
34
|
-
6. If the request combines statusline work with commands, tools, events, panels, or stateful
|
|
34
|
+
6. If the request combines statusline work with commands, tools, events, panels, or stateful mod behavior, also use `creating-mods` and its `references/architecture.md`.
|
|
35
35
|
7. Guard statusline-specific behavior with `letta.capabilities.ui.customStatuslineRenderer` when writing new files.
|
|
36
|
-
8. Edit `~/.letta/
|
|
36
|
+
8. Edit `~/.letta/mods/statusline.tsx`.
|
|
37
37
|
9. Summarize the absolute file path changed and tell the user to run `/reload` unless the command can reload automatically.
|
|
38
38
|
|
|
39
39
|
## Bare `/statusline` behavior
|
|
@@ -52,8 +52,8 @@ Keep this conversational. Do not build a menu UI unless the product command expl
|
|
|
52
52
|
|
|
53
53
|
## Rules
|
|
54
54
|
|
|
55
|
-
- Global-only for now. Do not create project
|
|
56
|
-
- Keep the
|
|
55
|
+
- Global-only for now. Do not create project mods.
|
|
56
|
+
- Keep the mod single-file for MVP.
|
|
57
57
|
- Do not assume extra npm packages are available.
|
|
58
58
|
- Do not use relative multi-file imports yet.
|
|
59
59
|
- Keep renderers synchronous. Do not shell, fetch, or await inside render.
|
|
@@ -61,11 +61,11 @@ Keep this conversational. Do not build a menu UI unless the product command expl
|
|
|
61
61
|
- Use `letta.ui.setStatus` for data and `setStatuslineRenderer` for drawing that data.
|
|
62
62
|
- Guard optional APIs with `letta.capabilities.ui.statusValues` and `letta.capabilities.ui.customStatuslineRenderer` in new files.
|
|
63
63
|
- Return a disposer that clears timers/subscriptions.
|
|
64
|
-
- Preserve existing
|
|
64
|
+
- Preserve existing mod code unless the user asks to reset.
|
|
65
65
|
- Do not delete legacy command statusline files or settings unless the user explicitly asks.
|
|
66
66
|
|
|
67
67
|
## Useful references
|
|
68
68
|
|
|
69
|
-
- `references/api.md` -
|
|
69
|
+
- `references/api.md` - mod API, render context, lifecycle rules
|
|
70
70
|
- `references/examples.md` - common statusline patterns
|
|
71
71
|
- `references/migration.md` - legacy command `.sh` and PS1 migration
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
# Statusline
|
|
1
|
+
# Statusline Mod API
|
|
2
2
|
|
|
3
|
-
Use this reference when creating or editing `~/.letta/
|
|
3
|
+
Use this reference when creating or editing `~/.letta/mods/statusline.tsx`.
|
|
4
4
|
|
|
5
5
|
## Location
|
|
6
6
|
|
|
7
7
|
```text
|
|
8
|
-
~/.letta/
|
|
8
|
+
~/.letta/mods/statusline.tsx
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
This is a trusted, user-owned global
|
|
11
|
+
This is a trusted, user-owned global mod file. Project mods are intentionally unsupported for now.
|
|
12
12
|
|
|
13
13
|
## Activation
|
|
14
14
|
|
|
@@ -28,8 +28,6 @@ export default function activate(letta) {
|
|
|
28
28
|
## API
|
|
29
29
|
|
|
30
30
|
```ts
|
|
31
|
-
letta.getContext(): StatuslineRenderContext
|
|
32
|
-
|
|
33
31
|
letta.capabilities.ui.statusValues: boolean
|
|
34
32
|
letta.capabilities.ui.customStatuslineRenderer: boolean
|
|
35
33
|
|
|
@@ -59,7 +57,7 @@ letta.ui.setStatuslineRenderer((context) => {
|
|
|
59
57
|
|
|
60
58
|
## Async state pattern
|
|
61
59
|
|
|
62
|
-
Use Node/Bun APIs directly from the trusted
|
|
60
|
+
Use Node/Bun APIs directly from the trusted mod file. Do not assume helper methods like `letta.shell` exist.
|
|
63
61
|
|
|
64
62
|
```tsx
|
|
65
63
|
import { execFile } from "node:child_process";
|
|
@@ -72,9 +70,8 @@ export default function activate(letta) {
|
|
|
72
70
|
|
|
73
71
|
const update = async () => {
|
|
74
72
|
try {
|
|
75
|
-
const context = letta.getContext();
|
|
76
73
|
const { stdout } = await execFileAsync("git", ["branch", "--show-current"], {
|
|
77
|
-
cwd:
|
|
74
|
+
cwd: process.cwd(),
|
|
78
75
|
});
|
|
79
76
|
if (letta.capabilities.ui.statusValues) {
|
|
80
77
|
letta.ui.setStatus("branch", stdout.trim());
|
|
@@ -117,7 +114,7 @@ Common fields:
|
|
|
117
114
|
|
|
118
115
|
```ts
|
|
119
116
|
context.components // Display components such as Text, Box, Spacer
|
|
120
|
-
context.statuses // evaluated
|
|
117
|
+
context.statuses // evaluated mod status strings
|
|
121
118
|
context.app.version
|
|
122
119
|
context.workspace.cwd
|
|
123
120
|
context.workspace.currentDir
|
|
@@ -159,10 +156,10 @@ return (
|
|
|
159
156
|
|
|
160
157
|
## Reload behavior
|
|
161
158
|
|
|
162
|
-
After editing `~/.letta/
|
|
159
|
+
After editing `~/.letta/mods/statusline.tsx`, tell the user to run:
|
|
163
160
|
|
|
164
161
|
```text
|
|
165
162
|
/reload
|
|
166
163
|
```
|
|
167
164
|
|
|
168
|
-
The runtime tracks
|
|
165
|
+
The runtime tracks mod loading separately from “no custom statusline,” so a custom statusline should not flash back to the built-in default during reload.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Statusline Examples
|
|
2
2
|
|
|
3
|
-
Use these as patterns, not mandatory templates. Keep the final
|
|
3
|
+
Use these as patterns, not mandatory templates. Keep the final mod focused on the user's request.
|
|
4
4
|
|
|
5
5
|
## Agent and model
|
|
6
6
|
|
|
@@ -28,9 +28,8 @@ export default function activate(letta) {
|
|
|
28
28
|
|
|
29
29
|
const update = async () => {
|
|
30
30
|
try {
|
|
31
|
-
const context = letta.getContext();
|
|
32
31
|
const { stdout } = await execFileAsync("git", ["branch", "--show-current"], {
|
|
33
|
-
cwd:
|
|
32
|
+
cwd: process.cwd(),
|
|
34
33
|
});
|
|
35
34
|
letta.ui.setStatus("branch", stdout.trim());
|
|
36
35
|
} catch {
|
|
@@ -85,11 +84,10 @@ export default function activate(letta) {
|
|
|
85
84
|
|
|
86
85
|
const update = async () => {
|
|
87
86
|
try {
|
|
88
|
-
const context = letta.getContext();
|
|
89
87
|
const { stdout } = await execFileAsync(
|
|
90
88
|
"gh",
|
|
91
89
|
["pr", "view", "--json", "number,title", "--jq", "\"#\\(.number) \\(.title)\""],
|
|
92
|
-
{ cwd:
|
|
90
|
+
{ cwd: process.cwd() },
|
|
93
91
|
);
|
|
94
92
|
const pr = stdout.trim();
|
|
95
93
|
pr ? letta.ui.setStatus("pr", pr) : letta.ui.clearStatus("pr");
|
|
@@ -39,7 +39,7 @@ Look for either shape:
|
|
|
39
39
|
When migrating:
|
|
40
40
|
|
|
41
41
|
- Preserve old config and referenced files unless the user explicitly asks to delete them.
|
|
42
|
-
- If `command` references a `.sh` file, read it before writing the new
|
|
42
|
+
- If `command` references a `.sh` file, read it before writing the new mod.
|
|
43
43
|
- Translate polling (`refreshIntervalMs`) to `setInterval`.
|
|
44
44
|
- Translate direct command output into cached status plus synchronous rendering.
|
|
45
45
|
- If the command output used `\x1e` to split left/right output, convert it to internal full-row layout with `Box`; do not create a new left/right API.
|
|
@@ -60,9 +60,8 @@ import { promisify } from "node:util";
|
|
|
60
60
|
const execFileAsync = promisify(execFile);
|
|
61
61
|
|
|
62
62
|
const update = async () => {
|
|
63
|
-
const context = letta.getContext();
|
|
64
63
|
const { stdout } = await execFileAsync("git", ["branch", "--show-current"], {
|
|
65
|
-
cwd:
|
|
64
|
+
cwd: process.cwd(),
|
|
66
65
|
});
|
|
67
66
|
letta.ui.setStatus("branch", stdout.trim());
|
|
68
67
|
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: editing-letta-code-desktop-preferences
|
|
3
|
+
description: Edits Letta Code Desktop (LCD) preferences by safely reading and updating ~/.letta/desktop_preferences.json. Use only when the user asks to change current Desktop/LCD settings such as theme, default working directory, remote access preference, or remote environment name via the preferences JSON.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Editing Letta Code Desktop Preferences
|
|
7
|
+
|
|
8
|
+
Use this skill only to edit the active Letta Code Desktop preferences JSON file. Do not use it for Desktop product-code changes, Electron IPC work, UI changes, or general Letta Cloud Desktop implementation tasks.
|
|
9
|
+
|
|
10
|
+
## Preferences file
|
|
11
|
+
|
|
12
|
+
The Desktop preferences file is:
|
|
13
|
+
|
|
14
|
+
```text
|
|
15
|
+
~/.letta/desktop_preferences.json
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Known preference keys:
|
|
19
|
+
|
|
20
|
+
- `defaultWorkingDirectory`: default folder for new local sessions.
|
|
21
|
+
- `theme`: `auto`, `light`, or `dark`.
|
|
22
|
+
- `allowRemoteAccess`: boolean for whether remote access should be enabled in preferences.
|
|
23
|
+
- `remoteEnvName`: environment name shown for remote access.
|
|
24
|
+
|
|
25
|
+
## Workflow
|
|
26
|
+
|
|
27
|
+
1. Read the existing JSON first.
|
|
28
|
+
2. Preserve unknown keys.
|
|
29
|
+
3. Merge only the requested preference updates.
|
|
30
|
+
4. Write pretty JSON with a trailing newline.
|
|
31
|
+
5. Do not edit token, provider, secret, agent, conversation, memory, or unrelated state files.
|
|
32
|
+
6. Tell the user that the change applies live only if their Desktop build watches preference-file changes; otherwise they should reload/restart Desktop or use Preferences → General.
|
|
33
|
+
|
|
34
|
+
## Safe edit command
|
|
35
|
+
|
|
36
|
+
Use a merge-style edit like this, changing only the requested keys:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
node - <<'NODE'
|
|
40
|
+
const fs = require('fs');
|
|
41
|
+
const os = require('os');
|
|
42
|
+
const path = require('path');
|
|
43
|
+
|
|
44
|
+
const file = path.join(os.homedir(), '.letta', 'desktop_preferences.json');
|
|
45
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
46
|
+
|
|
47
|
+
const current = fs.existsSync(file)
|
|
48
|
+
? JSON.parse(fs.readFileSync(file, 'utf8'))
|
|
49
|
+
: {};
|
|
50
|
+
|
|
51
|
+
const next = {
|
|
52
|
+
...current,
|
|
53
|
+
// Example update. Replace this with the user's requested setting.
|
|
54
|
+
theme: 'dark',
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
fs.writeFileSync(file, JSON.stringify(next, null, 2) + '\n');
|
|
58
|
+
NODE
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Validation
|
|
62
|
+
|
|
63
|
+
After editing, read the file back or parse it to confirm valid JSON:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
node -e "JSON.parse(require('fs').readFileSync(require('os').homedir() + '/.letta/desktop_preferences.json', 'utf8')); console.log('desktop_preferences.json is valid')"
|
|
67
|
+
```
|
|
@@ -6,40 +6,50 @@ description: Generate images from text prompts (and optionally edit/remix input
|
|
|
6
6
|
# Image Generation
|
|
7
7
|
|
|
8
8
|
Generate images via Letta's hosted endpoint `POST /v1/images/generations`. The API
|
|
9
|
-
usually returns base64 image bytes,
|
|
10
|
-
before replying.
|
|
9
|
+
usually returns base64 image bytes, but some providers return signed image URLs;
|
|
10
|
+
save either form to a local image file before replying.
|
|
11
11
|
|
|
12
12
|
## Example
|
|
13
13
|
|
|
14
14
|
Generate the image, save it locally, then show it inline:
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
|
-
|
|
17
|
+
base_url="${LETTA_BASE_URL%/}"
|
|
18
|
+
|
|
19
|
+
curl -sS -X POST "$base_url/v1/images/generations" \
|
|
18
20
|
-H "Authorization: Bearer $LETTA_API_KEY" \
|
|
19
21
|
-H "Content-Type: application/json" \
|
|
20
22
|
-d '{"provider":"gemini","prompt":"a friendly robot mascot waving, flat vector logo, mint green background","n":1}' \
|
|
21
23
|
> image-response.json
|
|
22
24
|
|
|
23
25
|
python3 - <<'PY'
|
|
24
|
-
import base64, json
|
|
26
|
+
import base64, json, urllib.request
|
|
25
27
|
|
|
26
28
|
with open("image-response.json") as f:
|
|
27
29
|
response = json.load(f)
|
|
28
30
|
|
|
31
|
+
image = response["images"][0]
|
|
32
|
+
if image.get("b64_json"):
|
|
33
|
+
data = base64.b64decode(image["b64_json"])
|
|
34
|
+
else:
|
|
35
|
+
data = urllib.request.urlopen(image["url"]).read()
|
|
36
|
+
|
|
29
37
|
with open("robot-mascot.png", "wb") as f:
|
|
30
|
-
f.write(
|
|
38
|
+
f.write(data)
|
|
31
39
|
|
|
32
40
|
print("saved robot-mascot.png; credits:", response["billing"]["credits_charged"])
|
|
33
41
|
PY
|
|
34
42
|
```
|
|
35
43
|
|
|
36
|
-
In Bash tools launched by Letta Code, the
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
44
|
+
In Bash tools launched by Letta Code, use the runtime-provided
|
|
45
|
+
`LETTA_BASE_URL` and `LETTA_API_KEY` together for Letta API calls. Build URLs
|
|
46
|
+
relative to `${LETTA_BASE_URL%/}` and send `Authorization: Bearer $LETTA_API_KEY`.
|
|
47
|
+
Do not hardcode `https://api.letta.com`: Desktop and remote runtimes may provide
|
|
48
|
+
a proxy base URL, and the credential may only be valid through that URL. If
|
|
49
|
+
either variable is missing, the user needs to authenticate with Letta Cloud (or
|
|
40
50
|
provide a Letta API key); do **not** ask for an OpenAI/Gemini provider key. This
|
|
41
51
|
endpoint also does not use `/connect` BYOK providers — the only `provider` values
|
|
42
|
-
supported here are `gemini
|
|
52
|
+
supported here are `flux`, `gemini`, and `openai`.
|
|
43
53
|
|
|
44
54
|
Then **show the image to the user** by embedding the saved file in your reply:
|
|
45
55
|
|
|
@@ -59,7 +69,7 @@ embed each on its own line. Also tell the user the `credits_charged`.
|
|
|
59
69
|
|
|
60
70
|
| Field | Type | Notes |
|
|
61
71
|
|-------|------|-------|
|
|
62
|
-
| `provider` | `"gemini"` \| `"openai"` | Required. |
|
|
72
|
+
| `provider` | `"flux"` \| `"gemini"` \| `"openai"` | Required. |
|
|
63
73
|
| `prompt` | string | Required, 1–32000 chars. |
|
|
64
74
|
| `model` | string | Optional; defaults per provider (below). |
|
|
65
75
|
| `n` | int 1–4 | Optional, default 1. Request variations in one call. |
|
|
@@ -71,10 +81,13 @@ embed each on its own line. Also tell the user the `credits_charged`.
|
|
|
71
81
|
|
|
72
82
|
| Provider | Default model | Use for |
|
|
73
83
|
|----------|---------------|---------|
|
|
74
|
-
| `
|
|
84
|
+
| `flux` | `flux-2-pro` | Default for normal text-to-image. High-quality general image generation; commonly returns signed URLs. |
|
|
85
|
+
| `gemini` | `gemini-3-pro-image` | Strong prompt adherence, image editing/remix. |
|
|
75
86
|
| `openai` | `gpt-image-2` | Photoreal output, explicit `size`/`quality`/`output_format`. |
|
|
76
87
|
|
|
77
|
-
Default to `
|
|
88
|
+
Default to `flux` for normal text-to-image requests. Use `gemini` when the user
|
|
89
|
+
provides input images or wants image editing/remix. Use `openai` when the user
|
|
90
|
+
wants photoreal output or a specific size/quality.
|
|
78
91
|
|
|
79
92
|
## Response
|
|
80
93
|
|
|
@@ -88,8 +101,9 @@ Default to `gemini` unless the user wants photoreal or a specific size/quality.
|
|
|
88
101
|
```
|
|
89
102
|
|
|
90
103
|
Each `images[]` entry has either `b64_json` or `url`, plus `mime_type`. Gemini
|
|
91
|
-
always returns `b64_json`.
|
|
92
|
-
local image file
|
|
104
|
+
always returns `b64_json`. Flux commonly returns a signed `url`; download it to
|
|
105
|
+
your local image file immediately because signed URLs expire. If OpenAI returns a
|
|
106
|
+
`url`, download that URL instead of base64-decoding.
|
|
93
107
|
|
|
94
108
|
## Editing / remixing images
|
|
95
109
|
|
|
@@ -107,4 +121,4 @@ DATA_URL="data:image/png;base64,$(base64 < input.png | tr -d '\n')"
|
|
|
107
121
|
`credits_charged`.
|
|
108
122
|
- **Errors**: `402` = insufficient credits (`credits_required` in body); `400`/`500`
|
|
109
123
|
return `{ "message": "..." }` — surface it to the user.
|
|
110
|
-
- Only `gemini
|
|
124
|
+
- Only `flux`, `gemini`, and `openai` are supported here.
|
|
@@ -75,6 +75,14 @@ Load the `letta-api-client` skill for richer SDK examples.
|
|
|
75
75
|
## 1. Change permissions
|
|
76
76
|
|
|
77
77
|
Permissions decide which tool calls are allowed, denied, or require approval.
|
|
78
|
+
Use `alwaysAsk` when a rule should request human approval even in
|
|
79
|
+
`unrestricted`/yolo mode.
|
|
80
|
+
|
|
81
|
+
Settings `ask` rules request approval in normal permission modes, but they do
|
|
82
|
+
not override `unrestricted`/yolo mode. For a mod tool that must pause for human
|
|
83
|
+
approval even in unrestricted mode, set `approvalPolicy: "alwaysAsk"` in the
|
|
84
|
+
tool registration. For broader dynamic policy, use a mod permission overlay or
|
|
85
|
+
a blocking hook.
|
|
78
86
|
|
|
79
87
|
### Rule syntax
|
|
80
88
|
|
|
@@ -91,6 +99,15 @@ python3 <skill-dir>/scripts/add_permission.py \
|
|
|
91
99
|
--scope user
|
|
92
100
|
```
|
|
93
101
|
|
|
102
|
+
Force approval even in yolo mode:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
python3 <skill-dir>/scripts/add_permission.py \
|
|
106
|
+
--rule "Bash(git push:*)" \
|
|
107
|
+
--type alwaysAsk \
|
|
108
|
+
--scope user
|
|
109
|
+
```
|
|
110
|
+
|
|
94
111
|
### Edit directly
|
|
95
112
|
|
|
96
113
|
```json
|
|
@@ -98,7 +115,8 @@ python3 <skill-dir>/scripts/add_permission.py \
|
|
|
98
115
|
"permissions": {
|
|
99
116
|
"allow": ["Bash(npm:*)", "Read(src/**)"],
|
|
100
117
|
"deny": ["Bash(rm -rf:*)"],
|
|
101
|
-
"ask": []
|
|
118
|
+
"ask": [],
|
|
119
|
+
"alwaysAsk": ["Bash(git push:*)"]
|
|
102
120
|
}
|
|
103
121
|
}
|
|
104
122
|
```
|
|
@@ -215,6 +233,7 @@ Find your own entry by matching `agentId === $LETTA_AGENT_ID`, then edit the fie
|
|
|
215
233
|
|------|----------------|
|
|
216
234
|
| Auto-approve curl | `add_permission.py --rule "Bash(curl:*)" --type allow --scope user` |
|
|
217
235
|
| Block `rm -rf` | Add `"Bash(rm -rf:*)"` to `permissions.deny`, or add a `PreToolUse` hook |
|
|
236
|
+
| Always ask before git push | `add_permission.py --rule "Bash(git push:*)" --type alwaysAsk --scope user` |
|
|
218
237
|
| Log all Bash calls | `add_hook.py --event PreToolUse --matcher Bash --type command --command '...' --scope user` |
|
|
219
238
|
| Auto-format after edits | `add_hook.py --event PostToolUse --matcher "Edit|Write" --type command --command '...' --scope project` |
|
|
220
239
|
| Gate edits with LLM | `add_hook.py --event PreToolUse --matcher "Edit|Write" --type prompt --prompt '...' --scope user` |
|
|
@@ -237,7 +256,7 @@ Find your own entry by matching `agentId === $LETTA_AGENT_ID`, then edit the fie
|
|
|
237
256
|
|
|
238
257
|
| Script | Purpose |
|
|
239
258
|
|--------|---------|
|
|
240
|
-
| `scripts/add_permission.py` | Add an allow/deny/ask rule to any scope |
|
|
259
|
+
| `scripts/add_permission.py` | Add an allow/deny/ask/alwaysAsk rule to any scope |
|
|
241
260
|
| `scripts/add_hook.py` | Add a command or prompt hook to any event |
|
|
242
261
|
| `scripts/show_config.py` | Show merged permissions, hooks, and per-agent settings across all scopes |
|
|
243
262
|
|
|
@@ -5,6 +5,7 @@ Add a permission rule to Letta Code settings.
|
|
|
5
5
|
Usage:
|
|
6
6
|
python3 add_permission.py --rule "Bash(npm run:*)" --type allow --scope user
|
|
7
7
|
python3 add_permission.py --rule "Read(src/**)" --type allow --scope project
|
|
8
|
+
python3 add_permission.py --rule "Bash(git push:*)" --type alwaysAsk --scope user
|
|
8
9
|
"""
|
|
9
10
|
|
|
10
11
|
import argparse
|
|
@@ -99,7 +100,7 @@ def main():
|
|
|
99
100
|
parser.add_argument(
|
|
100
101
|
"--type",
|
|
101
102
|
required=True,
|
|
102
|
-
choices=["allow", "deny", "ask"],
|
|
103
|
+
choices=["allow", "deny", "ask", "alwaysAsk"],
|
|
103
104
|
help="Type of permission rule",
|
|
104
105
|
)
|
|
105
106
|
parser.add_argument(
|
|
@@ -40,10 +40,11 @@ def format_permissions(
|
|
|
40
40
|
all_settings: list[tuple[str, dict]], as_json: bool
|
|
41
41
|
) -> dict | None:
|
|
42
42
|
"""Collect permissions from all scopes with sources."""
|
|
43
|
-
|
|
43
|
+
rule_types = ["allow", "deny", "ask", "alwaysAsk"]
|
|
44
|
+
rules: dict[str, list[tuple[str, str]]] = {rule_type: [] for rule_type in rule_types}
|
|
44
45
|
for scope, settings in all_settings:
|
|
45
46
|
perms = settings.get("permissions", {})
|
|
46
|
-
for rule_type in
|
|
47
|
+
for rule_type in rule_types:
|
|
47
48
|
for rule in perms.get(rule_type, []):
|
|
48
49
|
rules[rule_type].append((rule, scope))
|
|
49
50
|
|
|
@@ -59,7 +60,7 @@ def format_permissions(
|
|
|
59
60
|
if total == 0:
|
|
60
61
|
print(" (none)")
|
|
61
62
|
else:
|
|
62
|
-
for rule_type in
|
|
63
|
+
for rule_type in rule_types:
|
|
63
64
|
if rules[rule_type]:
|
|
64
65
|
print(f"\n {rule_type.upper()}:")
|
|
65
66
|
for rule, scope in rules[rule_type]:
|
|
@@ -13,7 +13,7 @@ const CURSOR_SENTINEL = '\u{10FFFD}';
|
|
|
13
13
|
* Determines if the input should be treated as a control sequence (not inserted as text).
|
|
14
14
|
* This centralizes escape sequence filtering to prevent garbage characters from being inserted.
|
|
15
15
|
*/
|
|
16
|
-
function isControlSequence(input, key) {
|
|
16
|
+
export function isControlSequence(input, key) {
|
|
17
17
|
// Pasted content is handled separately
|
|
18
18
|
if (key?.isPasted) return true;
|
|
19
19
|
|
|
@@ -31,8 +31,10 @@ function isControlSequence(input, key) {
|
|
|
31
31
|
// The handled ones are: ctrl+a, ctrl+e, ctrl+k, ctrl+u, ctrl+y (see useInput below)
|
|
32
32
|
if (key.ctrl && input && /^[a-z]$/i.test(input) && !['a', 'e', 'k', 'u', 'y'].includes(input.toLowerCase())) return true;
|
|
33
33
|
|
|
34
|
-
// Option
|
|
35
|
-
|
|
34
|
+
// Meta/Option shortcuts are handled by parent components and should not
|
|
35
|
+
// also mutate focused text inputs. This covers terminal-specific encodings
|
|
36
|
+
// like Ghostty CSI-u (input='p', meta=true) and WezTerm ESC+p.
|
|
37
|
+
if (key.meta && input) return true;
|
|
36
38
|
|
|
37
39
|
// Filter specific escape sequences that would insert garbage, but allow plain ESC through
|
|
38
40
|
// CSI sequences (ESC[...), Option+Delete (ESC + DEL), and other multi-char escape sequences
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/types/protocol.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|