@herbertgao/pi-extensions 2026.9.5 → 2026.9.6

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 (38) hide show
  1. package/README.md +3 -15
  2. package/node_modules/@herbertgao/sol-pi/docs/compatibility.md +1 -1
  3. package/node_modules/@herbertgao/sol-pi/package.json +1 -1
  4. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/index.ts +0 -5
  5. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/state.ts +3 -1
  6. package/package.json +2 -7
  7. package/examples/pi-footer.json +0 -275
  8. package/node_modules/@czottmann/pi-automode/CHANGELOG.md +0 -70
  9. package/node_modules/@czottmann/pi-automode/LICENSE.md +0 -21
  10. package/node_modules/@czottmann/pi-automode/README.md +0 -215
  11. package/node_modules/@czottmann/pi-automode/docs/GLOSSARY.md +0 -39
  12. package/node_modules/@czottmann/pi-automode/docs/adr/ADR-001-permission-precedence-and-trust-boundaries.md +0 -46
  13. package/node_modules/@czottmann/pi-automode/docs/adr/ADR-002-global-config-in-extension-data-directory.md +0 -60
  14. package/node_modules/@czottmann/pi-automode/docs/adr/INDEX.md +0 -6
  15. package/node_modules/@czottmann/pi-automode/docs/automode-classifier-flow.md +0 -428
  16. package/node_modules/@czottmann/pi-automode/docs/configuration.md +0 -171
  17. package/node_modules/@czottmann/pi-automode/docs/defaults.md +0 -178
  18. package/node_modules/@czottmann/pi-automode/docs/diagnostics.md +0 -90
  19. package/node_modules/@czottmann/pi-automode/docs/observability-logging.md +0 -160
  20. package/node_modules/@czottmann/pi-automode/examples/automode.local.json +0 -44
  21. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/bash.ts +0 -692
  22. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/classifier.ts +0 -852
  23. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/config.ts +0 -904
  24. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/constants.ts +0 -228
  25. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/extension.ts +0 -954
  26. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/hard-deny.ts +0 -429
  27. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/log.ts +0 -173
  28. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/model-selector.ts +0 -113
  29. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/model.ts +0 -13
  30. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/paths.ts +0 -297
  31. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/permissions.ts +0 -623
  32. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/state.ts +0 -102
  33. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/transcript.ts +0 -236
  34. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/types.ts +0 -205
  35. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/utils.ts +0 -54
  36. package/node_modules/@czottmann/pi-automode/extensions/auto-mode.ts +0 -26
  37. package/node_modules/@czottmann/pi-automode/package.json +0 -61
  38. package/node_modules/@czottmann/pi-automode/skills/automode-diagnostics/SKILL.md +0 -63
package/README.md CHANGED
@@ -32,7 +32,6 @@ The package bundles 6 active `@herbertgao/*` child packages—`pi-bark`, `pi-cc-
32
32
  - `pi-lens@4.1.3`
33
33
  - `pi-web-access@0.27.0`
34
34
  - `remote-pi@0.7.0`
35
- - `@czottmann/pi-automode@1.15.0`
36
35
 
37
36
  Pi loads their extensions and skills through `node_modules/` paths inside one package root. The upstream companions are pinned and bundled, not forked or renamed.
38
37
 
@@ -42,7 +41,7 @@ Pi loads their extensions and skills through `node_modules/` paths inside one pa
42
41
 
43
42
  `@narumitw/pi-caffeinate@0.49.7` uses the host platform's sleep inhibitor during each Pi agent run. On macOS, `/caffeinate sleep` keeps the system awake while allowing the display to sleep; `/caffeinate display` also keeps the display awake. It releases the inhibitor when the run or session ends.
44
43
 
45
- `@herbertgao/resume-from@0.2.0` keeps Claude Code sessions associated with their original repository when the active transcript later moves into a nested cwd. `@herbertgao/sol-pi@0.1.0` adds opt-in Action Fusion, ObservationPack, Evidence-Preserving Reducer, and Online Context Compact; see its [configuration guide](../sol-pi/docs/configuration.md). `pi-lens@4.1.3` expands language routing and bounds retained diagnostic facts across multi-root sessions. `pi-automode@1.15.0` preserves dynamic providers on legacy registries. `pi-web-access@0.27.0` adds configurable fetch deadlines and answer models plus isolated GitHub clone runtimes. Preferred Thinking 1.0.1 preserves an explicit subagent `--thinking` choice. Deprecated `@tifan/pi-titlebar-spinner` is no longer bundled; Rename remains the single owner of Herdr tab naming.
44
+ `@herbertgao/resume-from@0.2.0` keeps Claude Code sessions associated with their original repository when the active transcript later moves into a nested cwd. `@herbertgao/sol-pi@0.1.0` adds opt-in Action Fusion, ObservationPack, Evidence-Preserving Reducer, and Online Context Compact; see its [configuration guide](../sol-pi/docs/configuration.md). `pi-lens@4.1.3` expands language routing and bounds retained diagnostic facts across multi-root sessions. `pi-web-access@0.27.0` adds configurable fetch deadlines and answer models plus isolated GitHub clone runtimes. Preferred Thinking 1.0.1 preserves an explicit subagent `--thinking` choice. Deprecated `@tifan/pi-titlebar-spinner` is no longer bundled; Rename remains the single owner of Herdr tab naming.
46
45
 
47
46
  `pi-stash` is no longer bundled: `/btw` already preserves the main editor draft while handling side questions outside the main conversation. Prior `@herbertgao/pi-stash` releases remain available but are no longer maintained here.
48
47
 
@@ -52,18 +51,9 @@ If `pi-footer` was installed separately before upgrading to an aggregate release
52
51
  pi remove npm:pi-footer@0.5.1
53
52
  ```
54
53
 
55
- ### Recommended footer
54
+ ### Footer
56
55
 
57
- `pi-footer` is enabled by the aggregate. To use the recommended compact layout for MCP, Auto mode, LSP, Ponytail, Remote Pi, and Subagents, copy the bundled example to Pi's user config directory:
58
-
59
- ```bash
60
- agent_dir="${PI_CODING_AGENT_DIR:-$HOME/.pi/agent}"
61
- mkdir -p "$agent_dir/extensions"
62
- cp "$agent_dir/npm/node_modules/@herbertgao/pi-extensions/examples/pi-footer.json" \
63
- "$agent_dir/extensions/pi-footer.json"
64
- ```
65
-
66
- The same copy is linked here as [`examples/pi-footer.json`](examples/pi-footer.json). The example preserves the native path, Git branch, session, token/context, model, and thinking information. It uses a gray `•` separator and shows Remote Pi/Subagents only when those extensions publish status. Restart Pi or run `/reload` after copying. Existing config is intentionally never overwritten automatically.
56
+ `pi-footer` is enabled by the aggregate. It preserves the native path, Git branch, session, token/context, model, and thinking information. Configure it in `$PI_CODING_AGENT_DIR/extensions/pi-footer.json`; use `/footer` for interactive changes. Only one footer-replacement extension should be enabled at a time.
67
57
 
68
58
  For the intended compact status text, merge these optional companion settings into existing files rather than replacing the files:
69
59
 
@@ -84,8 +74,6 @@ For the intended compact status text, merge these optional companion settings in
84
74
  }
85
75
  ```
86
76
 
87
- The copy command replaces an existing `pi-footer.json`; review or back it up first. Only one footer-replacement extension should be enabled at a time. Use `/footer` for interactive changes.
88
-
89
77
  Pi 0.84.1 or newer should use native `fullscreen` TUI mode.
90
78
 
91
79
  ### Hindsight memory server
@@ -21,7 +21,7 @@ Action Fusion decodes `file://` targets with Node's `fileURLToPath()` before res
21
21
 
22
22
  The queue covers only fused operations registered by this SoL-Pi instance. External processes, direct built-in-tool calls outside the replacement, and unrelated extensions are not globally locked. SoL-Pi hashes the target immediately before launching `then_run` and skips the command if it observes an intervening content change.
23
23
 
24
- When another extension already owns `write`, Action Fusion leaves that tool in place and only registers its `edit` replacement. When `pi-automode` exposes `automode_inspect`, Action Fusion registers neither mutation replacement: nested `then_run` cannot re-enter Pi's public `tool_call` permission pipeline, so disabling the fusion is the safe fallback.
24
+ When another extension already owns `write`, Action Fusion leaves that tool in place and only registers its `edit` replacement.
25
25
 
26
26
  ## ObservationPack
27
27
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@herbertgao/sol-pi",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Token-efficient context and tool extensions for Pi, maintained from NVlabs/SoL-Pi.",
5
5
  "keywords": [
6
6
  "pi-package",
@@ -80,11 +80,6 @@ export function createActionFusionExtension(options: ActionFusionOptions = {}):
80
80
  const baseWrite = memoizeByCwd((cwd: string) => createWriteToolDefinition(cwd, options.writeOptions));
81
81
 
82
82
  return (pi: ExtensionAPI) => {
83
- // then_run executes Bash inside the mutation tool, so it cannot pass through
84
- // Pi's public tool_call permission handlers. Leave it to automode instead of
85
- // creating a nested shell escape hatch.
86
- if (hasExternalToolOwner(pi, "automode_inspect")) return;
87
-
88
83
  const editTemplate = baseEdit(process.cwd());
89
84
  const writeTemplate = baseWrite(process.cwd());
90
85
 
@@ -180,7 +180,9 @@ export function recordCompaction(
180
180
  return {
181
181
  ...state,
182
182
  epoch: state.epoch + 1,
183
- plan: [],
183
+ // Keep the plan so the post-compaction rebuild does not reclassify
184
+ // already-completed steps as a new boundary.
185
+ plan: [...state.plan],
184
186
  pendingProgress: [],
185
187
  lastContextTokens: null,
186
188
  positiveContextDeltaTotal: 0,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@herbertgao/pi-extensions",
3
- "version": "2026.9.5",
3
+ "version": "2026.9.6",
4
4
  "description": "Aggregate installer for HerbertGao-maintained Pi extensions.",
5
5
  "keywords": [
6
6
  "extensions",
@@ -20,7 +20,6 @@
20
20
  "directory": "packages/pi-extensions"
21
21
  },
22
22
  "files": [
23
- "examples/pi-footer.json",
24
23
  "README.md",
25
24
  "LICENSE",
26
25
  "THIRD_PARTY_NOTICES.md"
@@ -37,7 +36,6 @@
37
36
  "dependencies": {
38
37
  "@ast-grep/cli": "^0.45.0",
39
38
  "@ast-grep/napi": "^0.45.0",
40
- "@czottmann/pi-automode": "1.16.0",
41
39
  "@dietrichgebert/ponytail": "4.10.0",
42
40
  "@earendil-works/pi-coding-agent": "^0.84.4",
43
41
  "@earendil-works/pi-tui": "^0.84.4",
@@ -45,7 +43,7 @@
45
43
  "@herbertgao/pi-cc-extensions": "0.9.2",
46
44
  "@herbertgao/pi-subagents": "0.17.1",
47
45
  "@herbertgao/resume-from": "0.2.0",
48
- "@herbertgao/sol-pi": "0.2.0",
46
+ "@herbertgao/sol-pi": "0.3.0",
49
47
  "@juicesharp/rpiv-ask-user-question": "2.10.1",
50
48
  "@juicesharp/rpiv-config": "^2.10.1",
51
49
  "@luxusai/pi-hindsight": "0.12.0",
@@ -112,7 +110,6 @@
112
110
  "web-tree-sitter": "0.25.10"
113
111
  },
114
112
  "bundledDependencies": [
115
- "@czottmann/pi-automode",
116
113
  "@dietrichgebert/ponytail",
117
114
  "@herbertgao/pi-bark",
118
115
  "@herbertgao/pi-cc-extensions",
@@ -167,7 +164,6 @@
167
164
  "./node_modules/pi-web-access/index.ts",
168
165
  "./node_modules/pi-antigravity/src/index.ts",
169
166
  "./node_modules/remote-pi/dist/index.js",
170
- "./node_modules/@czottmann/pi-automode/extensions/auto-mode.ts",
171
167
  "./node_modules/pi-footer/src/index.ts"
172
168
  ],
173
169
  "themes": [
@@ -175,7 +171,6 @@
175
171
  "./node_modules/@herbertgao/pi-cc-extensions/themes/cc-light.json"
176
172
  ],
177
173
  "skills": [
178
- "./node_modules/@czottmann/pi-automode/skills",
179
174
  "./node_modules/@dietrichgebert/ponytail/skills",
180
175
  "./node_modules/@luxusai/pi-hindsight/skills",
181
176
  "./node_modules/pi-mcp-adapter/skills",
@@ -1,275 +0,0 @@
1
- {
2
- "version": 1,
3
- "enabled": true,
4
- "preset": "pi-footer",
5
- "lines": [
6
- [
7
- {
8
- "id": "core-cwd",
9
- "type": "cwd",
10
- "enabled": true,
11
- "options": {
12
- "raw": true,
13
- "fg": "pi:dim",
14
- "cwdDisplayStyle": "full-home"
15
- }
16
- },
17
- {
18
- "id": "core-branch",
19
- "type": "git-branch",
20
- "enabled": true,
21
- "options": {
22
- "raw": true,
23
- "fg": "pi:dim",
24
- "hideWhenEmpty": true,
25
- "gitBranchDisplayStyle": "round-brackets"
26
- }
27
- },
28
- {
29
- "id": "core-session",
30
- "type": "session-name",
31
- "enabled": true,
32
- "options": {
33
- "raw": true,
34
- "fg": "pi:dim",
35
- "hideWhenEmpty": true
36
- }
37
- }
38
- ],
39
- [
40
- {
41
- "id": "core-tokens",
42
- "type": "tokens",
43
- "enabled": true,
44
- "options": {
45
- "raw": true,
46
- "fg": "pi:dim",
47
- "tokenFormatStyle": "compact"
48
- }
49
- },
50
- {
51
- "id": "core-cache-read",
52
- "type": "cache-read",
53
- "enabled": true,
54
- "options": {
55
- "icon": "R",
56
- "fg": "pi:dim",
57
- "tokenFormatStyle": "compact",
58
- "hideWhenZero": true
59
- }
60
- },
61
- {
62
- "id": "core-cache-write",
63
- "type": "cache-write",
64
- "enabled": true,
65
- "options": {
66
- "icon": "W",
67
- "fg": "pi:dim",
68
- "tokenFormatStyle": "compact",
69
- "hideWhenZero": true
70
- }
71
- },
72
- {
73
- "id": "core-cache-hit",
74
- "type": "cache-hit-rate",
75
- "enabled": true,
76
- "options": {
77
- "icon": "CH",
78
- "fg": "pi:dim",
79
- "hideWhenZero": true,
80
- "cacheHitSource": "turn"
81
- }
82
- },
83
- {
84
- "id": "core-cost",
85
- "type": "cost",
86
- "enabled": true,
87
- "options": {
88
- "raw": true,
89
- "fg": "pi:dim",
90
- "costFormatStyle": "compact",
91
- "showSubscription": true
92
- }
93
- },
94
- {
95
- "id": "core-context",
96
- "type": "context",
97
- "enabled": true,
98
- "options": {
99
- "raw": true,
100
- "fg": "pi:dim",
101
- "contextConditionalColors": true,
102
- "warningFg": "pi:warning",
103
- "dangerFg": "pi:error"
104
- }
105
- },
106
- {
107
- "id": "core-context-slash",
108
- "type": "separator",
109
- "enabled": true,
110
- "options": {
111
- "separator": "custom",
112
- "text": "/",
113
- "fg": "pi:dim"
114
- }
115
- },
116
- {
117
- "id": "core-context-window",
118
- "type": "context-window",
119
- "enabled": true,
120
- "options": {
121
- "raw": true,
122
- "fg": "pi:dim",
123
- "contextConditionalColors": true,
124
- "warningFg": "pi:warning",
125
- "dangerFg": "pi:error",
126
- "tokenFormatStyle": "compact"
127
- }
128
- },
129
- {
130
- "id": "core-flex",
131
- "type": "flex-separator",
132
- "enabled": true,
133
- "options": {}
134
- },
135
- {
136
- "id": "core-model",
137
- "type": "model",
138
- "enabled": true,
139
- "options": {
140
- "raw": true,
141
- "fg": "pi:dim"
142
- }
143
- },
144
- {
145
- "id": "core-thinking",
146
- "type": "thinking-level",
147
- "enabled": true,
148
- "options": {
149
- "raw": true,
150
- "fg": "pi:dim",
151
- "hideWhenEmpty": true
152
- }
153
- }
154
- ],
155
- [
156
- {
157
- "id": "status-mcp",
158
- "type": "external-status",
159
- "enabled": true,
160
- "options": {
161
- "externalStatusKey": "mcp",
162
- "icon": "🔌 ",
163
- "hideWhenEmpty": true
164
- }
165
- },
166
- {
167
- "id": "status-auto",
168
- "type": "external-status",
169
- "enabled": true,
170
- "options": {
171
- "externalStatusKey": "pi-automode",
172
- "icon": "🤖 Auto ",
173
- "trimValue": 2,
174
- "preserveTrimStyles": true,
175
- "hideWhenEmpty": true
176
- }
177
- }
178
- ],
179
- [
180
- {
181
- "id": "status-lsp",
182
- "type": "external-status",
183
- "enabled": true,
184
- "options": {
185
- "externalStatusKey": "pi-lens-lsp",
186
- "icon": "🧩 LSP ",
187
- "trimValue": 4,
188
- "preserveTrimStyles": true,
189
- "hideWhenEmpty": true
190
- }
191
- },
192
- {
193
- "id": "status-ponytail",
194
- "type": "external-status",
195
- "enabled": true,
196
- "options": {
197
- "externalStatusKey": "ponytail",
198
- "trimValue": 2,
199
- "preserveTrimStyles": false,
200
- "hideWhenEmpty": true
201
- }
202
- }
203
- ],
204
- [
205
- {
206
- "id": "status-remote-session",
207
- "type": "external-status",
208
- "enabled": true,
209
- "options": {
210
- "externalStatusKey": "remote-pi:session",
211
- "hideWhenEmpty": true
212
- }
213
- },
214
- {
215
- "id": "status-remote-relay",
216
- "type": "external-status",
217
- "enabled": true,
218
- "options": {
219
- "externalStatusKey": "remote-pi:relay",
220
- "hideWhenEmpty": true
221
- }
222
- },
223
- {
224
- "id": "status-remote-peer",
225
- "type": "external-status",
226
- "enabled": true,
227
- "options": {
228
- "externalStatusKey": "remote-pi:peer-active",
229
- "hideWhenEmpty": true
230
- }
231
- },
232
- {
233
- "id": "status-subagents",
234
- "type": "external-status",
235
- "enabled": true,
236
- "options": {
237
- "externalStatusKey": "subagents",
238
- "icon": "👥 ",
239
- "hideWhenEmpty": true
240
- }
241
- }
242
- ]
243
- ],
244
- "separator": "dot",
245
- "separatorFg": "brightBlack",
246
- "separatorBg": "default",
247
- "iconMode": "text",
248
- "minimalist": false,
249
- "terminal": {
250
- "widthMode": "full",
251
- "colorLevel": "ansi256"
252
- },
253
- "extensionStatusRow": {
254
- "hiddenKeys": [
255
- "mcp",
256
- "pi-automode",
257
- "pi-lens-lsp",
258
- "ponytail",
259
- "remote-pi:peer-active",
260
- "remote-pi:relay",
261
- "remote-pi:session",
262
- "subagents"
263
- ],
264
- "knownKeys": [
265
- "mcp",
266
- "pi-automode",
267
- "pi-lens-lsp",
268
- "ponytail",
269
- "remote-pi:peer-active",
270
- "remote-pi:relay",
271
- "remote-pi:session",
272
- "subagents"
273
- ]
274
- }
275
- }
@@ -1,70 +0,0 @@
1
- # Changelog
2
-
3
- All notable changes to this project are documented in this file.
4
-
5
- ## [Unreleased]
6
-
7
- ## [1.16.0] - 2026-09-07
8
-
9
- ## New features
10
-
11
- - **[Bounded existing-file authorization](docs/defaults.md#soft_deny)** — Allow user authorization for pre-existing local-file changes that names task, worktree, path scope, and allowed operation. (#32)
12
-
13
- ## Bug fixes
14
-
15
- - **OpenCode classifier routing** — Add OpenCode session headers to every classifier completion path. Preserve Pi's header precedence and exact host matching. (#35)
16
- - **OMP 18 project trust compatibility** — Treat runtimes without `isProjectTrusted()` as untrusted. Prevent startup and configuration commands from throwing. (#34)
17
-
18
- ## [1.15.0] - 2026-08-28
19
-
20
- ## Bug fixes
21
-
22
- - **OMP 18 classifier compatibility** — Support OMP 18 model registries that lack `complete()` and `getProvider()`. Load the legacy completion API only for these registries. Keep current Pi on its runtime registry path so extension-registered providers remain available. Thanks, @NarryG! (#29)
23
-
24
- ## [1.14.0] - 2026-08-27
25
-
26
- ## Bug fixes
27
-
28
- - **Classifier stream timeout** — Apply `classifierTimeoutMs` to the full response stream. Provider behavior cannot keep classifier calls pending after the deadline. Parent cancellation remains active. Reject values above the Node.js timer limit. (#30)
29
- - **OS temp-directory deletes** — Stop hard-denying recursive-delete subtrees under `os.tmpdir()` and `/tmp`. On macOS these resolve into `/private/tmp` and `/private/var/folders`, which matched the `/private` system root and blocked every temp cleanup. Deleting a temp root itself stays blocked. (#31)
30
- - **Validated temp-root declarations** — Derive the exempt temp roots only from launcher-declared values that stay safe: reject values such as `/`, empty strings, aliases of `HOME`, `/`, or a system root, and ancestors of `HOME`. Without validation, a malformed `TMPDIR` could disable deterministic denials for protected targets, and a broad `permissions.allow` rule could then allow the action without classifier review. Recompute candidates when the effective tmpdir changes. (#31)
31
-
32
- ## [1.13.0] - 2026-08-25
33
-
34
- ## New features
35
-
36
- - **Bash AST analysis** — Replace handwritten shell parsing with `unbash`. Permission and hard-deny checks now inspect command structure, nested commands, wrappers, redirects, and malformed input. Bash allow rules require complete structural coverage and fail closed when analysis is unsafe. (#26)
37
- - **Extension-owned global config** — Store global settings at `~/.pi/agent/extensions/pi-automode/config.json`. Migrate the legacy file automatically, preserve a safe fallback after migration errors, and report conflicts through notifications and diagnostics. (#27)
38
-
39
- ## Bug fixes
40
-
41
- - **Conservative permission rules** — Malformed deny and ask patterns block actions. Malformed patterns do not expand allow rules. Permission checks examine each Bash subcommand and normalize whitespace. Path checks resolve symlinks and normalize `file://` and Windows paths. (#22)
42
- - **Recursive deletion hard-deny** — Detect uppercase flags and GNU abbreviations for recursive `rm`, including commands behind `command`, `exec`, and `env`. Parse the `--` delimiter and shell tilde expansion. Protect Linux and macOS system roots without blocking active-home subdirectories, `/opt`, or `/srv`. (#23)
43
- - **Global Pi safety-control paths** — Hard-deny direct writes and edits to `~/.pi/agent/extensions/`, `~/.pi/agent/settings.json`, and `~/.pi/agent/settings/`. Resolve case variants and symlink targets before matching. (#24)
44
- - **Case-insensitive protected paths** — Match protected paths without case distinctions and normalize Unicode spellings. This closes path bypasses on case-insensitive filesystems. (#25)
45
-
46
- ## [1.12.0] - 2026-08-23
47
-
48
- ## New features
49
-
50
- - **Deterministic permission allows** — Add user-owned `permissions.allow` patterns that skip classifier review after deterministic checks pass. Accepted ask rules still require classifier review. Thank you, @sergeykonkin! (#14)
51
- - **Configurable classifier request timeout** — new `autoMode.classifierTimeoutMs` setting. The default is 20000 ms. The timeout applies to each classifier request. The fast stage and the detailed stage each have their own budget. A request that exceeds the timeout is aborted. Auto mode fails closed and blocks the action.
52
- - **Read-only agent diagnostics** — Add `automode_inspect` tool for status, configuration, defaults, and recent denial metadata. Thank you, @blalor! (#11)
53
-
54
- ## Bug fixes
55
-
56
- - **Reject invalid config values** — Invalid boolean and log config values (e.g. `enabled: 0`, `log.enabled: 1`) are now rejected at merge time instead of being applied with diagnostics only. (#20)
57
- - **Preserve defaults for malformed rule lists** — A malformed `hard_deny` entry like `[42]` no longer strips all built-in hard-deny rules. Malformed entries are rejected and defaults preserved conservatively. (#21)
58
- - **Runtime classifier providers** — Dispatch classifier calls through Pi's runtime model registry so providers registered with `pi.registerProvider()` work immediately. Preserve normalized reasoning and header-only authentication on the temporary simple-completion bridge. (#15)
59
- - **Bounded wildcard matching** — Replace regex-based permission and denied-path globs with a linear-time matcher. Reject oversized patterns and fail closed for oversized runtime inputs. (#19)
60
- - **Complete classifier action input** — Send the exact current tool input to both classifier stages in a dedicated message. Block the action if it cannot fit without truncation. (#17)
61
- - **Path policy normalization** — Use Pi-compatible resolution for file-tool paths, including file URLs, `@` and tilde aliases, and read fallback names. Enforce denied paths across omitted and recursive search scopes and both sides of symlink aliases. (#18)
62
- - **Project config trust gate** — Ignore `.pi/automode.local.json` and `.pi/automode.json` until Pi trusts the project. Apply the trust gate during startup and config reloads. (#16)
63
- - **In-memory observability logs** — Write logs to an extension-owned directory (`~/.pi/agent/extensions/pi-automode/logs/`) instead of the launching project directory. Thanks, @HerbertGao! (#13)
64
-
65
- [Unreleased]: https://github.com/czottmann/pi-automode/compare/v1.16.0...HEAD
66
- [1.16.0]: https://github.com/czottmann/pi-automode/compare/v1.15.0...v1.16.0
67
- [1.15.0]: https://github.com/czottmann/pi-automode/compare/v1.14.0...v1.15.0
68
- [1.14.0]: https://github.com/czottmann/pi-automode/compare/v1.13.0...v1.14.0
69
- [1.13.0]: https://github.com/czottmann/pi-automode/compare/v1.12.0...v1.13.0
70
- [1.12.0]: https://github.com/czottmann/pi-automode/compare/v1.11.0...v1.12.0
@@ -1,21 +0,0 @@
1
- # MIT License
2
-
3
- Copyright (c) 2026 Carlo Zottmann
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.