@earendil-works/pi-coding-agent 0.79.0 → 0.79.1

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 (106) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +10 -8
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +2 -4
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/cli/project-trust.d.ts +10 -0
  7. package/dist/cli/project-trust.d.ts.map +1 -0
  8. package/dist/cli/project-trust.js +48 -0
  9. package/dist/cli/project-trust.js.map +1 -0
  10. package/dist/cli/startup-ui.d.ts +7 -0
  11. package/dist/cli/startup-ui.d.ts.map +1 -0
  12. package/dist/cli/startup-ui.js +59 -0
  13. package/dist/cli/startup-ui.js.map +1 -0
  14. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  15. package/dist/core/agent-session-runtime.js +3 -1
  16. package/dist/core/agent-session-runtime.js.map +1 -1
  17. package/dist/core/agent-session.d.ts +1 -0
  18. package/dist/core/agent-session.d.ts.map +1 -1
  19. package/dist/core/agent-session.js +6 -0
  20. package/dist/core/agent-session.js.map +1 -1
  21. package/dist/core/experimental.d.ts +2 -0
  22. package/dist/core/experimental.d.ts.map +1 -0
  23. package/dist/core/experimental.js +4 -0
  24. package/dist/core/experimental.js.map +1 -0
  25. package/dist/core/extensions/runner.d.ts +1 -0
  26. package/dist/core/extensions/runner.d.ts.map +1 -1
  27. package/dist/core/extensions/runner.js +6 -0
  28. package/dist/core/extensions/runner.js.map +1 -1
  29. package/dist/core/extensions/types.d.ts +3 -0
  30. package/dist/core/extensions/types.d.ts.map +1 -1
  31. package/dist/core/extensions/types.js.map +1 -1
  32. package/dist/core/index.d.ts +1 -0
  33. package/dist/core/index.d.ts.map +1 -1
  34. package/dist/core/index.js +1 -0
  35. package/dist/core/index.js.map +1 -1
  36. package/dist/core/project-trust.d.ts +15 -0
  37. package/dist/core/project-trust.d.ts.map +1 -0
  38. package/dist/core/project-trust.js +58 -0
  39. package/dist/core/project-trust.js.map +1 -0
  40. package/dist/core/prompt-templates.d.ts +2 -1
  41. package/dist/core/prompt-templates.d.ts.map +1 -1
  42. package/dist/core/prompt-templates.js +24 -26
  43. package/dist/core/prompt-templates.js.map +1 -1
  44. package/dist/core/resource-loader.d.ts +1 -1
  45. package/dist/core/resource-loader.d.ts.map +1 -1
  46. package/dist/core/resource-loader.js +25 -25
  47. package/dist/core/resource-loader.js.map +1 -1
  48. package/dist/core/settings-manager.d.ts +4 -0
  49. package/dist/core/settings-manager.d.ts.map +1 -1
  50. package/dist/core/settings-manager.js +9 -0
  51. package/dist/core/settings-manager.js.map +1 -1
  52. package/dist/core/trust-manager.d.ts +21 -0
  53. package/dist/core/trust-manager.d.ts.map +1 -1
  54. package/dist/core/trust-manager.js +68 -14
  55. package/dist/core/trust-manager.js.map +1 -1
  56. package/dist/index.d.ts +2 -2
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +1 -1
  59. package/dist/index.js.map +1 -1
  60. package/dist/main.d.ts.map +1 -1
  61. package/dist/main.js +16 -176
  62. package/dist/main.js.map +1 -1
  63. package/dist/migrations.d.ts.map +1 -1
  64. package/dist/migrations.js +39 -34
  65. package/dist/migrations.js.map +1 -1
  66. package/dist/modes/interactive/components/login-dialog.d.ts +1 -0
  67. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  68. package/dist/modes/interactive/components/login-dialog.js +7 -1
  69. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  70. package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
  71. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  72. package/dist/modes/interactive/components/settings-selector.js +20 -0
  73. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  74. package/dist/modes/interactive/components/trust-selector.d.ts +6 -3
  75. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
  76. package/dist/modes/interactive/components/trust-selector.js +23 -18
  77. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  78. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  79. package/dist/modes/interactive/interactive-mode.js +19 -9
  80. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  81. package/dist/package-manager-cli.d.ts +6 -2
  82. package/dist/package-manager-cli.d.ts.map +1 -1
  83. package/dist/package-manager-cli.js +58 -11
  84. package/dist/package-manager-cli.js.map +1 -1
  85. package/dist/utils/changelog.d.ts +1 -0
  86. package/dist/utils/changelog.d.ts.map +1 -1
  87. package/dist/utils/changelog.js +78 -0
  88. package/dist/utils/changelog.js.map +1 -1
  89. package/docs/extensions.md +11 -3
  90. package/docs/models.md +4 -3
  91. package/docs/packages.md +0 -2
  92. package/docs/prompt-templates.md +8 -1
  93. package/docs/security.md +6 -8
  94. package/docs/settings.md +7 -4
  95. package/docs/usage.md +12 -7
  96. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  97. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  98. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  99. package/examples/extensions/gondolin/package-lock.json +2 -2
  100. package/examples/extensions/gondolin/package.json +1 -1
  101. package/examples/extensions/sandbox/package-lock.json +2 -2
  102. package/examples/extensions/sandbox/package.json +1 -1
  103. package/examples/extensions/with-deps/package-lock.json +2 -2
  104. package/examples/extensions/with-deps/package.json +1 -1
  105. package/npm-shrinkwrap.json +12 -12
  106. package/package.json +4 -4
@@ -339,7 +339,7 @@ exit (Ctrl+C, Ctrl+D, SIGHUP, SIGTERM)
339
339
 
340
340
  #### project_trust
341
341
 
342
- Fired before pi decides whether to trust a project with trust inputs (`.pi`, `AGENTS.md`/`CLAUDE.md`, or `.agents/skills`). It runs during startup and when session replacement (for example `/resume`) enters a cwd whose trust has not been resolved in the current process. Only user/global extensions and CLI `-e` extensions participate; project-local extensions are not loaded until after trust is resolved.
342
+ Fired before pi decides whether to trust a project with dynamic configs (`.pi` or `.agents/skills`). It runs during startup and when session replacement (for example `/resume`) enters a cwd whose trust has not been resolved in the current process. Only user/global extensions and CLI `-e` extensions participate; project-local extensions are not loaded until after trust is resolved.
343
343
 
344
344
  ```typescript
345
345
  pi.on("project_trust", async (event, ctx) => {
@@ -352,7 +352,7 @@ pi.on("project_trust", async (event, ctx) => {
352
352
  });
353
353
  ```
354
354
 
355
- A `project_trust` handler must return `{ trusted: "yes" | "no" | "undecided" }`. A user/global or CLI extension that returns `"yes"` or `"no"` owns the decision; the first yes/no decision wins and suppresses the built-in trust prompt. Use `remember: true` to persist a yes/no decision; otherwise it applies only to the current process. Return `"undecided"` to let later handlers or the built-in trust flow decide. Check `ctx.hasUI` before prompting. If no handler returns yes/no, normal trust resolution continues, including the built-in trust prompt when UI is available.
355
+ A `project_trust` handler must return `{ trusted: "yes" | "no" | "undecided" }`. A user/global or CLI extension that returns `"yes"` or `"no"` owns the decision; the first yes/no decision wins and suppresses the built-in trust prompt. Use `remember: true` to persist a yes/no decision; otherwise it applies only to the current process. Return `"undecided"` to let later handlers or the built-in trust flow decide. Check `ctx.hasUI` before prompting. If no handler returns yes/no, normal trust resolution continues: saved `trust.json` decisions apply first, then `defaultProjectTrust` controls whether pi asks, trusts, or declines by default.
356
356
 
357
357
  ### Resource Events
358
358
 
@@ -892,6 +892,12 @@ Current run mode: `"tui"`, `"rpc"`, `"json"`, or `"print"`. Use `ctx.mode === "t
892
892
 
893
893
  Current working directory.
894
894
 
895
+ ### ctx.isProjectTrusted()
896
+
897
+ Returns whether project-local trust is active for the current session context. This includes temporary trust decisions and CLI trust overrides, not just saved decisions in the global trust store.
898
+
899
+ Use this before reading project-local extension configuration that should only be honored for trusted projects.
900
+
895
901
  ### ctx.sessionManager
896
902
 
897
903
  Read-only access to session state. See [Session Format](session-format.md) for the full SessionManager API and entry types.
@@ -2275,6 +2281,7 @@ ctx.ui.pasteToEditor("pasted content");
2275
2281
 
2276
2282
  // Stack custom autocomplete behavior on top of the built-in provider
2277
2283
  ctx.ui.addAutocompleteProvider((current) => ({
2284
+ triggerCharacters: ["#"],
2278
2285
  async getSuggestions(lines, line, col, options) {
2279
2286
  const beforeCursor = (lines[line] ?? "").slice(0, col);
2280
2287
  const match = beforeCursor.match(/(?:^|[ \t])#([^\s#]*)$/);
@@ -2323,7 +2330,7 @@ Custom working-indicator frames are rendered verbatim. If you want colors, add t
2323
2330
 
2324
2331
  ### Autocomplete Providers
2325
2332
 
2326
- Use `ctx.ui.addAutocompleteProvider()` to stack custom autocomplete logic on top of the built-in slash-command and path provider.
2333
+ Use `ctx.ui.addAutocompleteProvider()` to stack custom autocomplete logic on top of the built-in slash-command and path provider. Set `triggerCharacters` for custom natural triggers such as `$`.
2327
2334
 
2328
2335
  Typical pattern:
2329
2336
 
@@ -2335,6 +2342,7 @@ Typical pattern:
2335
2342
  ```typescript
2336
2343
  pi.on("session_start", (_event, ctx) => {
2337
2344
  ctx.ui.addAutocompleteProvider((current) => ({
2345
+ triggerCharacters: ["#"],
2338
2346
  async getSuggestions(lines, cursorLine, cursorCol, options) {
2339
2347
  const line = lines[cursorLine] ?? "";
2340
2348
  const beforeCursor = line.slice(0, cursorCol);
package/docs/models.md CHANGED
@@ -198,7 +198,7 @@ If your command is slow, expensive, rate-limited, or should keep using a previou
198
198
  | Field | Required | Default | Description |
199
199
  |-------|----------|---------|-------------|
200
200
  | `id` | Yes | — | Model identifier (passed to the API) |
201
- | `name` | No | `id` | Human-readable model label. Used for matching (`--model` patterns) and shown in model details/status text. |
201
+ | `name` | No | `id` | Human-readable model label. Used for matching (`--model` patterns) and shown as secondary model detail text. |
202
202
  | `api` | No | provider's `api` | Override provider's API for this model |
203
203
  | `reasoning` | No | `false` | Supports extended thinking |
204
204
  | `thinkingLevelMap` | No | omitted | Maps pi thinking levels to provider values and marks unsupported levels (see below) |
@@ -209,8 +209,8 @@ If your command is slow, expensive, rate-limited, or should keep using a previou
209
209
  | `compat` | No | provider `compat` | Provider compatibility overrides. Merged with provider-level `compat` when both are set. |
210
210
 
211
211
  Current behavior:
212
- - `/model` and `--list-models` list entries by model `id`.
213
- - The configured `name` is used for model matching and detail/status text.
212
+ - `/model`, `--list-models`, and the interactive footer display entries by model `id`.
213
+ - The configured `name` is used for model matching and secondary model detail text. It does not replace the footer/status-bar model id.
214
214
 
215
215
  ### Thinking Level Map
216
216
 
@@ -320,6 +320,7 @@ Behavior notes:
320
320
  - `modelOverrides` are applied to built-in provider models.
321
321
  - Unknown model IDs are ignored.
322
322
  - You can combine provider-level `baseUrl`/`headers` with `modelOverrides`.
323
+ - Overriding `name` changes model matching and secondary detail text only; the footer and primary model lists continue to show the model `id`.
323
324
  - If `models` is also defined for a provider, custom models are merged after built-in overrides. A custom model with the same `id` replaces the overridden built-in model entry.
324
325
 
325
326
  ## Anthropic Messages Compatibility
package/docs/packages.md CHANGED
@@ -40,8 +40,6 @@ These commands manage pi packages, not the pi CLI installation. To uninstall pi
40
40
 
41
41
  By default, `install` and `remove` write to user settings (`~/.pi/agent/settings.json`). Use `-l` to write to project settings (`.pi/settings.json`) instead. Project settings can be shared with your team, and pi installs any missing packages automatically on startup after the project is trusted.
42
42
 
43
- Project package commands read project settings only when the project is trusted. Use `--approve` to trust project-local files for one command, or `--no-approve` to ignore them for one command.
44
-
45
43
  To try a package without installing it, use `--extension` or `-e`. This installs to a temporary directory for the current run only:
46
44
 
47
45
  ```bash
@@ -64,10 +64,11 @@ Type `/` followed by the template name in the editor. Autocomplete shows availab
64
64
 
65
65
  ## Arguments
66
66
 
67
- Templates support positional arguments and simple slicing:
67
+ Templates support positional arguments, defaults, and simple slicing:
68
68
 
69
69
  - `$1`, `$2`, ... positional args
70
70
  - `$@` or `$ARGUMENTS` for all args joined
71
+ - `${1:-default}` uses arg 1 when present/non-empty, otherwise `default`
71
72
  - `${@:N}` for args from the Nth position (1-indexed)
72
73
  - `${@:N:L}` for `L` args starting at N
73
74
 
@@ -80,6 +81,12 @@ description: Create a component
80
81
  Create a React component named $1 with features: $@
81
82
  ```
82
83
 
84
+ Default values are useful for optional arguments:
85
+
86
+ ```markdown
87
+ Summarize the current state in ${1:-7} bullet points.
88
+ ```
89
+
83
90
  Usage: `/component Button "onClick handler" "disabled support"`
84
91
 
85
92
  ## Loading Rules
package/docs/security.md CHANGED
@@ -4,27 +4,25 @@ Pi is a local coding agent. It runs with the permissions of the user account tha
4
4
 
5
5
  ## Project Trust
6
6
 
7
- Project trust controls whether pi loads project-local inputs. 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.
7
+ Project trust controls whether pi 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 trust inputs when it finds any of these from the current working directory:
10
10
 
11
11
  - `.pi/` in the current directory
12
- - `AGENTS.md` or `CLAUDE.md` in the current directory or an ancestor directory
13
12
  - `.agents/skills` in the current directory or an ancestor directory
14
13
 
15
- When an interactive session starts in a project with trust inputs and no saved decision, pi asks whether to trust the project. Saved decisions are stored per canonical working directory in `~/.pi/agent/trust.json`.
14
+ When an interactive session starts in a project with configs in `.pi` or `.agents/skills` and no saved decision for the current directory or a parent directory, pi follows `defaultProjectTrust` from global settings. The default value is `"ask"`, which asks whether to trust the project when UI is available. Saved decisions are stored by canonical directory in `~/.pi/agent/trust.json`, and the closest saved decision on the current or parent path applies before the global default.
16
15
 
17
- Trusting a project allows pi to load project-local inputs, including:
16
+ Trusting a project allows pi to load trust-gated project inputs, including:
18
17
 
19
- - project instructions from `AGENTS.md` or `CLAUDE.md`
20
18
  - `.pi/settings.json`
21
19
  - `.pi` resources such as extensions, skills, prompt templates, themes, and system prompt files
22
20
  - missing project packages configured through project settings
23
21
  - project-local extensions and project package-managed extensions
24
22
 
25
- Declining trust skips those project-local inputs. Before trust is resolved, pi only loads 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.
23
+ Declining trust skips protected resources. `AGENTS.md` and `CLAUDE.md` context files are loaded regardless of project trust unless context loading is disabled. Before trust is resolved, pi 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.
26
24
 
27
- Non-interactive modes (`-p`, `--mode json`, and `--mode rpc`) do not show a trust prompt. Without a saved trust decision, they ignore project-local inputs unless `--approve`/`-a` is passed. Use `--no-approve`/`-na` to ignore project-local inputs for one run even when the project is trusted.
25
+ 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.
28
26
 
29
27
  ## No Built-in Sandbox
30
28
 
@@ -32,7 +30,7 @@ Pi does not include a built-in sandbox. Built-in tools can read files, write fil
32
30
 
33
31
  This is intentional. Pi 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.
34
32
 
35
- Project trust is only an input-loading guard. It prevents a repository from silently changing pi's instructions, 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, or build output is expected local-agent risk and cannot be reliably prevented by pi.
33
+ Project trust is only an input-loading guard. It prevents a repository from silently changing pi'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.
36
34
 
37
35
  ## Running Untrusted or Unmonitored Work
38
36
 
package/docs/settings.md CHANGED
@@ -11,13 +11,15 @@ Edit directly or use `/settings` for common options.
11
11
 
12
12
  ## Project Trust
13
13
 
14
- On interactive startup, pi asks before trusting a project folder that contains project-local inputs and has no saved decision in `~/.pi/agent/trust.json`. Trusting a project allows pi to read project instructions (`AGENTS.md`/`CLAUDE.md`), load `.pi/settings.json` and `.pi` resources, install missing project packages, and execute project extensions.
14
+ On interactive startup, pi asks before trusting a project folder that contains trust-gated project inputs and has no saved decision for the folder or a parent folder in `~/.pi/agent/trust.json`. Trusting a project allows pi to load `.pi/settings.json` and `.pi` resources, install missing project packages, and execute project extensions.
15
15
 
16
- Non-interactive modes (`-p`, `--mode json`, and `--mode rpc`) do not show a trust prompt. Without a saved trust decision, they ignore project-local inputs unless `--approve`/`-a` is passed. Use `--no-approve`/`-na` to ignore project-local inputs for one run even when the project is trusted.
16
+ Non-interactive modes (`-p`, `--mode json`, and `--mode rpc`) do not show a trust prompt. Without an applicable saved trust decision, they use `defaultProjectTrust` from global settings: `ask` (default) and `never` ignore trust-gated project inputs, while `always` trusts them. Pass `--approve`/`-a` or `--no-approve`/`-na` to override project trust for one run.
17
17
 
18
- `pi config` assumes project trust for that command so you can view and change project resource settings before starting a session. It does not save a trust decision; starting a session in that folder still prompts. Pass `--no-approve` to hide project-local inputs in `pi config`.
18
+ If no extension or saved decision applies, `defaultProjectTrust` controls the fallback behavior. Set it to `"ask"`, `"always"`, or `"never"` in `~/.pi/agent/settings.json`, or change it with `/settings`.
19
19
 
20
- Use `/trust` in interactive mode to save a project trust decision for future sessions. It writes `~/.pi/agent/trust.json` only; the current session is not reloaded, so restart pi for changes to take effect.
20
+ `pi config` and package commands use the same project trust flow. Pass `--approve` to trust project-local settings for one command or `--no-approve` to ignore them.
21
+
22
+ Use `/trust` in interactive mode to save a project trust decision for future sessions, including trust for the immediate parent folder. It writes `~/.pi/agent/trust.json` only; the current session is not reloaded, so restart pi for changes to take effect.
21
23
 
22
24
  ## All Settings
23
25
 
@@ -50,6 +52,7 @@ Use `/trust` in interactive mode to save a project trust decision for future ses
50
52
  |---------|------|---------|-------------|
51
53
  | `theme` | string | `"dark"` | Theme name (`"dark"`, `"light"`, or custom) |
52
54
  | `quietStartup` | boolean | `false` | Hide startup header |
55
+ | `defaultProjectTrust` | string | `"ask"` | Fallback project trust behavior: `"ask"`, `"always"`, or `"never"`. Global setting only |
53
56
  | `collapseChangelog` | boolean | `false` | Show condensed changelog after updates |
54
57
  | `enableInstallTelemetry` | boolean | `true` | Send an anonymous install/update version ping after first install or changelog-detected updates. This does not control update checks |
55
58
  | `doubleEscapeAction` | string | `"tree"` | Action for double-escape: `"tree"`, `"fork"`, or `"none"` |
package/docs/usage.md CHANGED
@@ -96,8 +96,8 @@ See [Sessions](sessions.md) and [Compaction](compaction.md) for details.
96
96
  Pi loads `AGENTS.md` or `CLAUDE.md` at startup from:
97
97
 
98
98
  - `~/.pi/agent/AGENTS.md` for global instructions
99
- - parent directories, walking up from the current working directory when the project is trusted
100
- - the current directory when the project is trusted
99
+ - parent directories, walking up from the current working directory
100
+ - the current directory
101
101
 
102
102
  Use context files for project conventions, commands, safety rules, and preferences. Disable loading with `--no-context-files` or `-nc`.
103
103
 
@@ -112,13 +112,18 @@ Append to the default prompt without replacing it with `APPEND_SYSTEM.md` in eit
112
112
 
113
113
  ### Project Trust
114
114
 
115
- On interactive startup, pi asks before trusting a project folder that contains project-local inputs and has no saved decision in `~/.pi/agent/trust.json`. Trusting a project allows pi to read project instructions (`AGENTS.md`/`CLAUDE.md`), load `.pi/settings.json` and `.pi` resources, install missing project packages, and execute project extensions.
115
+ On interactive startup, pi asks before trusting a project folder that contains project-local extensions or settings and has no saved decision for the folder or a parent folder in `~/.pi/agent/trust.json`. Trusting a project allows pi to load `.pi/settings.json` and `.pi` resources, install missing project packages, and execute project extensions.
116
116
 
117
- Non-interactive modes (`-p`, `--mode json`, and `--mode rpc`) do not show a trust prompt. Without a saved trust decision, they ignore project-local inputs unless `--approve`/`-a` is passed. Use `--no-approve`/`-na` to ignore project-local inputs for one run even when the project is trusted.
117
+ Before the trust decision, pi loads only context files, user/global extensions, and CLI `-e` extensions so they can handle the `project_trust` event. Project-local extensions, project package-managed extensions, and project settings are loaded only after the project is trusted. This split also applies when switching to a session from a different cwd whose trust has not been resolved in the current process.
118
118
 
119
- `pi config` assumes project trust for that command so you can view and change project resource settings before starting a session. It does not save a trust decision; starting a session in that folder still prompts. Pass `--no-approve` to hide project-local inputs in `pi config`.
119
+ Non-interactive modes (`-p`, `--mode json`, and `--mode rpc`) do not show a trust prompt. Without an applicable saved trust decision, they use `defaultProjectTrust` from global settings: `ask` (default) and `never` ignore trust-gated project inputs, while `always` trusts them. Pass `--approve`/`-a` or `--no-approve`/`-na` to override project trust for one run.
120
+
121
+ If no extension or saved decision applies, `defaultProjectTrust` controls the fallback behavior. Set it to `"ask"`, `"always"`, or `"never"` in `~/.pi/agent/settings.json`, or change it with `/settings`.
122
+
123
+ `pi config` and package commands use the same project trust flow. Pass `--approve` to trust project-local settings for one command or `--no-approve` to ignore them.
124
+
125
+ Use `/trust` in interactive mode to save a project trust decision for future sessions, including trust for the immediate parent folder. It writes `~/.pi/agent/trust.json` only; the current session is not reloaded, so restart pi for changes to take effect.
120
126
 
121
- Use `/trust` in interactive mode to save a project trust decision for future sessions. It writes `~/.pi/agent/trust.json` only; the current session is not reloaded, so restart pi for changes to take effect.
122
127
 
123
128
  ## Exporting and Sharing Sessions
124
129
 
@@ -148,7 +153,7 @@ pi list # List installed packages
148
153
  pi config # Enable/disable package resources
149
154
  ```
150
155
 
151
- These commands manage pi packages, not the pi CLI installation. To uninstall pi itself, see [Quickstart](quickstart.md#uninstall). Project package commands accept `--approve`/`--no-approve` to trust or ignore project-local package settings for one command.
156
+ These commands manage pi packages, not the pi CLI installation. To uninstall pi itself, see [Quickstart](quickstart.md#uninstall). `pi config` and project package commands accept `--approve`/`--no-approve` to trust or ignore project-local settings for one command.
152
157
 
153
158
  See [Pi Packages](packages.md) for package sources and security notes.
154
159
 
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider",
3
- "version": "0.79.0",
3
+ "version": "0.79.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-custom-provider",
9
- "version": "0.79.0",
9
+ "version": "0.79.1",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sdk": "^0.52.0"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-anthropic",
3
3
  "private": true,
4
- "version": "0.79.0",
4
+ "version": "0.79.1",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-gitlab-duo",
3
3
  "private": true,
4
- "version": "0.79.0",
4
+ "version": "0.79.1",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-gondolin",
3
- "version": "0.79.0",
3
+ "version": "0.79.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-gondolin",
9
- "version": "0.79.0",
9
+ "version": "0.79.1",
10
10
  "dependencies": {
11
11
  "@earendil-works/gondolin": "0.12.0"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-gondolin",
3
3
  "private": true,
4
- "version": "0.79.0",
4
+ "version": "0.79.1",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
- "version": "1.9.0",
3
+ "version": "1.9.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-sandbox",
9
- "version": "1.9.0",
9
+ "version": "1.9.1",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sandbox-runtime": "^0.0.26"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
3
  "private": true,
4
- "version": "1.9.0",
4
+ "version": "1.9.1",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
- "version": "0.79.0",
3
+ "version": "0.79.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-with-deps",
9
- "version": "0.79.0",
9
+ "version": "0.79.1",
10
10
  "dependencies": {
11
11
  "ms": "^2.1.3"
12
12
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
3
  "private": true,
4
- "version": "0.79.0",
4
+ "version": "0.79.1",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@earendil-works/pi-coding-agent",
3
- "version": "0.79.0",
3
+ "version": "0.79.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@earendil-works/pi-coding-agent",
9
- "version": "0.79.0",
9
+ "version": "0.79.1",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
- "@earendil-works/pi-agent-core": "^0.79.0",
13
- "@earendil-works/pi-ai": "^0.79.0",
14
- "@earendil-works/pi-tui": "^0.79.0",
12
+ "@earendil-works/pi-agent-core": "^0.79.1",
13
+ "@earendil-works/pi-ai": "^0.79.1",
14
+ "@earendil-works/pi-tui": "^0.79.1",
15
15
  "@silvia-odwyer/photon-node": "0.3.4",
16
16
  "chalk": "5.6.2",
17
17
  "cross-spawn": "7.0.6",
@@ -473,11 +473,11 @@
473
473
  }
474
474
  },
475
475
  "node_modules/@earendil-works/pi-agent-core": {
476
- "version": "0.79.0",
477
- "resolved": "https://registry.npmjs.org/@earendil-works/pi-agent-core/-/pi-agent-core-0.79.0.tgz",
476
+ "version": "0.79.1",
477
+ "resolved": "https://registry.npmjs.org/@earendil-works/pi-agent-core/-/pi-agent-core-0.79.1.tgz",
478
478
  "license": "MIT",
479
479
  "dependencies": {
480
- "@earendil-works/pi-ai": "^0.79.0",
480
+ "@earendil-works/pi-ai": "^0.79.1",
481
481
  "ignore": "7.0.5",
482
482
  "typebox": "1.1.38",
483
483
  "yaml": "2.9.0"
@@ -487,8 +487,8 @@
487
487
  }
488
488
  },
489
489
  "node_modules/@earendil-works/pi-ai": {
490
- "version": "0.79.0",
491
- "resolved": "https://registry.npmjs.org/@earendil-works/pi-ai/-/pi-ai-0.79.0.tgz",
490
+ "version": "0.79.1",
491
+ "resolved": "https://registry.npmjs.org/@earendil-works/pi-ai/-/pi-ai-0.79.1.tgz",
492
492
  "license": "MIT",
493
493
  "dependencies": {
494
494
  "@anthropic-ai/sdk": "0.91.1",
@@ -510,8 +510,8 @@
510
510
  }
511
511
  },
512
512
  "node_modules/@earendil-works/pi-tui": {
513
- "version": "0.79.0",
514
- "resolved": "https://registry.npmjs.org/@earendil-works/pi-tui/-/pi-tui-0.79.0.tgz",
513
+ "version": "0.79.1",
514
+ "resolved": "https://registry.npmjs.org/@earendil-works/pi-tui/-/pi-tui-0.79.1.tgz",
515
515
  "license": "MIT",
516
516
  "dependencies": {
517
517
  "get-east-asian-width": "1.6.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@earendil-works/pi-coding-agent",
3
- "version": "0.79.0",
3
+ "version": "0.79.1",
4
4
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "piConfig": {
@@ -36,9 +36,9 @@
36
36
  "prepublishOnly": "npm run clean && npm run build && npm run shrinkwrap"
37
37
  },
38
38
  "dependencies": {
39
- "@earendil-works/pi-agent-core": "^0.79.0",
40
- "@earendil-works/pi-ai": "^0.79.0",
41
- "@earendil-works/pi-tui": "^0.79.0",
39
+ "@earendil-works/pi-agent-core": "^0.79.1",
40
+ "@earendil-works/pi-ai": "^0.79.1",
41
+ "@earendil-works/pi-tui": "^0.79.1",
42
42
  "@silvia-odwyer/photon-node": "0.3.4",
43
43
  "chalk": "5.6.2",
44
44
  "cross-spawn": "7.0.6",