pi-fabric 0.25.1 → 0.25.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.
@@ -1,4 +1,4 @@
1
- import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
1
+ import { type ExtensionContext } from "@earendil-works/pi-coding-agent";
2
2
  import type { FabricApprovalConfig } from "../config.js";
3
3
  import type { ResolvedFabricAction } from "./action-registry.js";
4
4
  export declare class ApprovalController {
@@ -1 +1 @@
1
- {"version":3,"file":"approval-controller.d.ts","sourceRoot":"","sources":["../../src/core/approval-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AASjE,qBAAa,kBAAkB;;IAK3B,QAAQ,CAAC,MAAM,EAAE,oBAAoB;IACrC,QAAQ,CAAC,OAAO,EAAE,gBAAgB;gBADzB,MAAM,EAAE,oBAAoB,EAC5B,OAAO,EAAE,gBAAgB;IAG9B,OAAO,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;CA4B3D"}
1
+ {"version":3,"file":"approval-controller.d.ts","sourceRoot":"","sources":["../../src/core/approval-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,iCAAiC,CAAC;AAQzC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAajE,qBAAa,kBAAkB;;IAK3B,QAAQ,CAAC,MAAM,EAAE,oBAAoB;IACrC,QAAQ,CAAC,OAAO,EAAE,gBAAgB;gBADzB,MAAM,EAAE,oBAAoB,EAC5B,OAAO,EAAE,gBAAgB;IAG9B,OAAO,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;CA2G3D"}
@@ -1,9 +1,12 @@
1
+ import { DynamicBorder, getSelectListTheme, } from "@earendil-works/pi-coding-agent";
2
+ import { Container, SelectList, Spacer, Text, } from "@earendil-works/pi-tui";
1
3
  const inheritedRisks = () => {
2
4
  const allowed = new Set(["read", "write", "execute", "network", "agent"]);
3
5
  return (process.env.PI_FABRIC_GRANTED_RISKS ?? "")
4
6
  .split(",")
5
7
  .filter((risk) => allowed.has(risk));
6
8
  };
9
+ const allowLabel = (risk) => `Allow ${risk} access`;
7
10
  export class ApprovalController {
8
11
  config;
9
12
  context;
@@ -36,10 +39,65 @@ export class ApprovalController {
36
39
  if (!this.context.hasUI) {
37
40
  throw new Error(`${action.ref} requires approval, but no interactive UI is available`);
38
41
  }
39
- const approved = await this.context.ui.confirm("Pi Fabric permission", `${action.ref} requests ${action.risk} access. Allow this access for the current Fabric execution?`);
40
- if (!approved)
42
+ const notification = `Fabric permission requested: ${action.ref} needs ${action.risk} access`;
43
+ this.context.ui.notify(notification, "warning");
44
+ const choice = this.context.mode === "tui"
45
+ ? await this.#requestTuiApproval(action)
46
+ : await this.#requestDialogApproval(action);
47
+ if (choice !== "allow") {
48
+ this.context.ui.notify(`Denied ${action.risk} access for ${action.ref}`, "warning");
41
49
  throw new Error(`User denied ${action.risk} access for ${action.ref}`);
50
+ }
42
51
  this.#approvedRisks.add(action.risk);
52
+ this.context.ui.notify(`Allowed ${action.risk} access for the current Fabric execution`, "info");
53
+ }
54
+ async #requestDialogApproval(action) {
55
+ const allowed = allowLabel(action.risk);
56
+ const picked = await this.context.ui.select(`Pi Fabric permission · ${action.ref} requests ${action.risk} access. ${action.description}`, [allowed, "Deny"]);
57
+ return picked === allowed ? "allow" : "deny";
58
+ }
59
+ async #requestTuiApproval(action) {
60
+ const choice = await this.context.ui.custom((tui, theme, _keybindings, done) => {
61
+ const container = new Container();
62
+ container.addChild(new DynamicBorder((text) => theme.fg("warning", text)));
63
+ container.addChild(new Spacer(1));
64
+ container.addChild(new Text(theme.fg("warning", theme.bold("🛡 Pi Fabric permission request")), 1, 0));
65
+ container.addChild(new Spacer(1));
66
+ container.addChild(new Text(theme.fg("text", `${action.ref} requests ${action.risk} access.`), 1, 0));
67
+ container.addChild(new Text(theme.fg("muted", action.description), 1, 0));
68
+ container.addChild(new Spacer(1));
69
+ container.addChild(new Text(theme.fg("dim", "Approval applies to this risk class for the current Fabric execution."), 1, 0));
70
+ container.addChild(new Spacer(1));
71
+ const items = [
72
+ {
73
+ value: "allow",
74
+ label: allowLabel(action.risk),
75
+ description: "Continue this Fabric execution",
76
+ },
77
+ {
78
+ value: "deny",
79
+ label: "Deny",
80
+ description: "Block the requested action",
81
+ },
82
+ ];
83
+ const list = new SelectList(items, items.length, getSelectListTheme());
84
+ list.onSelect = (item) => done(item.value);
85
+ list.onCancel = () => done("deny");
86
+ container.addChild(list);
87
+ container.addChild(new Spacer(1));
88
+ container.addChild(new Text(theme.fg("dim", "↑↓ navigate · enter select · esc deny"), 1, 0));
89
+ container.addChild(new Spacer(1));
90
+ container.addChild(new DynamicBorder((text) => theme.fg("warning", text)));
91
+ return {
92
+ render: (width) => container.render(width),
93
+ invalidate: () => container.invalidate(),
94
+ handleInput: (data) => {
95
+ list.handleInput(data);
96
+ tui.requestRender();
97
+ },
98
+ };
99
+ });
100
+ return choice ?? "deny";
43
101
  }
44
102
  }
45
103
  //# sourceMappingURL=approval-controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"approval-controller.js","sourceRoot":"","sources":["../../src/core/approval-controller.ts"],"names":[],"mappings":"AAKA,MAAM,cAAc,GAAG,GAAiB,EAAE;IACxC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAa,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IACtF,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,EAAE,CAAC;SAC/C,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,CAAC,IAAI,EAAsB,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAkB,CAAC,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,OAAO,kBAAkB;IAKlB;IACA;IALF,cAAc,GAAG,IAAI,GAAG,CAAa,cAAc,EAAE,CAAC,CAAC;IACvD,iBAAiB,GAAG,IAAI,GAAG,EAA6B,CAAC;IAElE,YACW,MAA4B,EAC5B,OAAyB;QADzB,WAAM,GAAN,MAAM,CAAsB;QAC5B,YAAO,GAAP,OAAO,CAAkB;IACjC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,MAA4B;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,OAAO;QACrE,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,4BAA4B,MAAM,CAAC,IAAI,SAAS,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC;QACjB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,MAA4B;QACjD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,wDAAwD,CAAC,CAAC;QACzF,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAC5C,sBAAsB,EACtB,GAAG,MAAM,CAAC,GAAG,aAAa,MAAM,CAAC,IAAI,8DAA8D,CACpG,CAAC;QACF,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,MAAM,CAAC,IAAI,eAAe,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QACtF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;CACF"}
1
+ {"version":3,"file":"approval-controller.js","sourceRoot":"","sources":["../../src/core/approval-controller.ts"],"names":[],"mappings":"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"}
@@ -209,7 +209,7 @@ Fabric risk classes are `read`, `write`, `execute`, `network`, and `agent`; appr
209
209
  - Captured tools default to the conservative `execute` risk because Pi tool definitions do not declare effects. Add exact tool-name overrides under `capture.risks`.
210
210
  - Set `capture.hideFromModel` to `false` to index non-core extension tools without hiding them.
211
211
  - `capture.keepVisible` names stay in both Fabric and Pi's direct registry, except that Pi core names are always Fabric-owned in full code mode.
212
- - An `ask` policy is fail-closed in headless modes without interactive UI.
212
+ - An `ask` policy emits a warning notification and opens an explicit **Allow access** / **Deny** permission prompt. The TUI uses an inline wizard; RPC clients receive the equivalent `select` dialog. Escape, dismissal, and unavailable interactive UI all fail closed.
213
213
  - Approval is cached by risk class for one `fabric_exec` execution.
214
214
 
215
215
  ## Subagents
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-fabric",
3
- "version": "0.25.1",
3
+ "version": "0.25.2",
4
4
  "description": "A programmable tool and agent runtime for Pi",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",