@cmetech/otto 1.0.8 → 1.0.9
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/dist/cli-args.d.ts +2 -0
- package/dist/cli-args.js +6 -0
- package/dist/cli.js +27 -0
- package/dist/help-text.js +15 -0
- package/dist/onboarding.d.ts +19 -0
- package/dist/onboarding.js +133 -1
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/otto/commands/release-notes/_data.js +155 -0
- package/dist/resources/extensions/otto/commands/release-notes/command.js +114 -0
- package/dist/resources/extensions/otto/extension-manifest.json +1 -1
- package/dist/resources/extensions/otto/index.js +3 -0
- package/dist/seed-defaults.d.ts +50 -0
- package/dist/seed-defaults.js +226 -0
- package/package.json +8 -7
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +3 -3
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +3 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +17 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +89 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js +105 -67
- package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resolve-config-value.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resolve-config-value.js +20 -2
- package/packages/pi-coding-agent/dist/core/resolve-config-value.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +25 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +41 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/package.json +2 -2
- package/packages/pi-coding-agent/src/core/agent-session.ts +3 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +90 -1
- package/packages/pi-coding-agent/src/core/package-manager.ts +131 -64
- package/packages/pi-coding-agent/src/core/resolve-config-value.ts +20 -2
- package/packages/pi-coding-agent/src/core/settings-manager.ts +56 -0
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/extensions/otto/commands/release-notes/_data.ts +171 -0
- package/src/resources/extensions/otto/commands/release-notes/command.ts +141 -0
- package/src/resources/extensions/otto/extension-manifest.json +1 -1
- package/src/resources/extensions/otto/index.ts +4 -0
|
@@ -80,6 +80,8 @@ export declare class ExtensionRunner {
|
|
|
80
80
|
private shutdownHandler;
|
|
81
81
|
private shortcutDiagnostics;
|
|
82
82
|
private commandDiagnostics;
|
|
83
|
+
/** Case-insensitive substring patterns matched against ext.path. ui.notify is dropped for matches. */
|
|
84
|
+
private quietExtensionPatterns;
|
|
83
85
|
constructor(extensions: Extension[], runtime: ExtensionRuntime, cwd: string, sessionManager: SessionManager, modelRegistry: ModelRegistry);
|
|
84
86
|
private currentCwd;
|
|
85
87
|
/**
|
|
@@ -134,6 +136,21 @@ export declare class ExtensionRunner {
|
|
|
134
136
|
createContext(): ExtensionContext;
|
|
135
137
|
private createEventContext;
|
|
136
138
|
private isShutdownGuardedEvent;
|
|
139
|
+
/**
|
|
140
|
+
* Replace the quiet-extensions allowlist. Each entry is a case-insensitive
|
|
141
|
+
* substring matched against the extension's filesystem path. Matching
|
|
142
|
+
* extensions have their `ui.notify` calls silently dropped AND their
|
|
143
|
+
* `console.log/warn/error/info` calls silently dropped while the handler
|
|
144
|
+
* is on the stack — useful for muting noisy session_start banners
|
|
145
|
+
* (piolium uses ui.notify; pi-notion uses console.log).
|
|
146
|
+
*
|
|
147
|
+
* Console filtering uses AsyncLocalStorage so other extensions running
|
|
148
|
+
* concurrently are unaffected — output is only suppressed when the call
|
|
149
|
+
* originates inside a quiet extension's handler async context.
|
|
150
|
+
*/
|
|
151
|
+
setQuietExtensions(patterns: readonly string[]): void;
|
|
152
|
+
private isQuietExtension;
|
|
153
|
+
private withSilencedNotify;
|
|
137
154
|
createCommandContext(): ExtensionCommandContext;
|
|
138
155
|
private isSessionBeforeEvent;
|
|
139
156
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/runner.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAS,MAAM,aAAa,CAAC;AACvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAa,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EACX,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,2BAA2B,EAC3B,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,aAAa,EACb,mBAAmB,EACnB,0BAA0B,EAC1B,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,WAAW,EAEX,YAAY,EAGZ,SAAS,EACT,gBAAgB,EAChB,uBAAuB,EACvB,8BAA8B,EAC9B,gBAAgB,EAChB,uBAAuB,EACvB,cAAc,EACd,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EAEtB,0BAA0B,EAC1B,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,eAAe,EACf,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,qBAAqB,EACrB,YAAY,EACZ,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,MAAM,YAAY,CAAC;AAmDpB,2DAA2D;AAC3D,UAAU,8BAA8B;IACvC,QAAQ,CAAC,EAAE,WAAW,CAAC,2BAA2B,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,KAAK,eAAe,GAAG,OAAO,CAC7B,cAAc,EACZ,aAAa,GACb,eAAe,GACf,aAAa,GACb,YAAY,GACZ,0BAA0B,GAC1B,qBAAqB,GACrB,sBAAsB,GACtB,UAAU,CACZ,CAAC;AAaF,KAAK,gBAAgB,CAAC,MAAM,SAAS,eAAe,IAAI,MAAM,SAAS;IAAE,IAAI,EAAE,uBAAuB,CAAA;CAAE,GACrG,yBAAyB,GAAG,SAAS,GACrC,MAAM,SAAS;IAAE,IAAI,EAAE,qBAAqB,CAAA;CAAE,GAC7C,uBAAuB,GAAG,SAAS,GACnC,MAAM,SAAS;IAAE,IAAI,EAAE,wBAAwB,CAAA;CAAE,GAChD,0BAA0B,GAAG,SAAS,GACtC,MAAM,SAAS;IAAE,IAAI,EAAE,qBAAqB,CAAA;CAAE,GAC7C,uBAAuB,GAAG,SAAS,GACnC,SAAS,CAAC;AAEhB,MAAM,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;AAErE,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,CAAC,EAAE;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,CAAC,cAAc,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,WAAW,CAAC;CAC1B,KAAK,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAEtC,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAE/E,MAAM,MAAM,mBAAmB,GAAG,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,KACzG,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAErC,MAAM,MAAM,oBAAoB,GAAG,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAE5F,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC;AA0EzC,qBAAa,eAAe;IAC3B,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,cAAc,CAA0C;IAChE,OAAO,CAAC,QAAQ,CAAiD;IACjE,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,oBAAoB,CAA8B;IAC1D,OAAO,CAAC,iBAAiB,CAAmD;IAC5E,OAAO,CAAC,SAAS,CAAgD;IACjE,OAAO,CAAC,iBAAiB,CAA0B;IACnD,OAAO,CAAC,gCAAgC,CAAmD;IAC3F,OAAO,CAAC,iBAAiB,CAEvB;IACF,OAAO,CAAC,WAAW,CAEjB;IACF,OAAO,CAAC,mBAAmB,CAEzB;IACF,OAAO,CAAC,oBAAoB,CAE1B;IACF,OAAO,CAAC,aAAa,CAEnB;IACF,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,mBAAmB,CAA4B;IACvD,OAAO,CAAC,kBAAkB,CAA4B;IACtD,sGAAsG;IACtG,OAAO,CAAC,sBAAsB,CAAgB;gBAG7C,UAAU,EAAE,SAAS,EAAE,EACvB,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,cAAc,EAC9B,aAAa,EAAE,aAAa;IAc7B,OAAO,CAAC,UAAU;IAIlB;;;;;OAKG;YACW,yBAAyB;IAiFvC;;;;;OAKG;IACH,iBAAiB,CAChB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAC9E,MAAM,IAAI;IAwBb,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,uBAAuB,GAAG,IAAI;IA2ClF,kBAAkB,CAAC,OAAO,CAAC,EAAE,8BAA8B,GAAG,IAAI;IAmBlE,YAAY,CAAC,SAAS,CAAC,EAAE,kBAAkB,GAAG,IAAI;IAIlD,YAAY,IAAI,kBAAkB;IAIlC,KAAK,IAAI,OAAO;IAIhB,iBAAiB,IAAI,MAAM,EAAE;IAI7B,uFAAuF;IACvF,qBAAqB,IAAI,cAAc,EAAE;IAYzC,qEAAqE;IACrE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,GAAG,SAAS;IAU7E,QAAQ,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC;IAYtC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;IAIzD,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC;IAI9C,YAAY,CAAC,oBAAoB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,iBAAiB,CAAC;IA6C9F,sBAAsB,IAAI,kBAAkB,EAAE;IAI9C,OAAO,CAAC,QAAQ,EAAE,sBAAsB,GAAG,MAAM,IAAI;IAKrD,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAMtC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAUvC,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAUnE,qBAAqB,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,iBAAiB,EAAE;IAoDlE,qBAAqB,IAAI,kBAAkB,EAAE;IAI7C,8BAA8B,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,iBAAiB,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAU9F,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAkBvD;;;OAGG;IACH,QAAQ,IAAI,IAAI;IAIhB;;;OAGG;IACH,aAAa,IAAI,gBAAgB;IAsBjC,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,sBAAsB;IAI9B;;;;;;;;;;;OAWG;IACH,kBAAkB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAOrD,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,kBAAkB;IAU1B,oBAAoB,IAAI,uBAAuB;IAY/C,OAAO,CAAC,oBAAoB;IAS5B;;;;;;;;;;;;;OAaG;YACW,cAAc;IAyCtB,IAAI,CAAC,MAAM,SAAS,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAetF,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAkBlF,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAc5E,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBhE,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAc5E,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAa9D,yBAAyB,CAC9B,OAAO,EAAE,OAAO,EAChB,KAAK,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GACpD,OAAO,CAAC,OAAO,CAAC;IAeb,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,sBAAsB,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC;IAehH,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAepG,oBAAoB,CACzB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EAAE,GAAG,SAAS,EAClC,YAAY,EAAE,MAAM,GAClB,OAAO,CAAC,8BAA8B,GAAG,SAAS,CAAC;IA+BhD,qBAAqB,CAC1B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,sBAAsB,CAAC,QAAQ,CAAC,GACtC,OAAO,CAAC;QACV,UAAU,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,aAAa,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC3D,WAAW,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,aAAa,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC5D,UAAU,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,aAAa,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC3D,CAAC;IAoBF,oEAAoE;IAC9D,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,SAAS,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAmC3G,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvD,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvE,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQnE,gBAAgB,CACrB,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GACpC,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC;IAuBzC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3D,cAAc,CACnB,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,GAClC,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAiBvC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvD,YAAY,CACjB,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAyBrC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/D,gBAAgB,CACrB,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GACpC,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC;IAiBzC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvE,mBAAmB,CACxB,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,GACvC,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC;IAiB5C,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3E,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvE,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjE,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAOnE;AAED,iEAAiE;AACjE,YAAY,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Extension runner - executes extensions and manages their lifecycle.
|
|
3
3
|
*/
|
|
4
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
4
5
|
import { COMMAND_NAMESPACE } from "../../config.js";
|
|
5
6
|
import { theme } from "../../modes/interactive/theme/theme.js";
|
|
6
7
|
// Keybindings for these actions cannot be overridden by extensions
|
|
@@ -74,6 +75,51 @@ const noOpUIContext = {
|
|
|
74
75
|
getToolsExpanded: () => false,
|
|
75
76
|
setToolsExpanded: () => { },
|
|
76
77
|
};
|
|
78
|
+
// Async context flag: true when the current async stack originates inside a
|
|
79
|
+
// quiet extension's handler invocation. Read by the patched console methods to
|
|
80
|
+
// decide whether to suppress output. Empty store = normal logging behaviour.
|
|
81
|
+
const quietExtensionContext = new AsyncLocalStorage();
|
|
82
|
+
let quietConsolePatchInstalled = false;
|
|
83
|
+
/**
|
|
84
|
+
* Patch `console.log/warn/error/info` to no-op when the current async context
|
|
85
|
+
* is flagged as "quiet". Installed once on first `setQuietExtensions(non-empty)`
|
|
86
|
+
* call so users who never configure quietExtensions pay zero overhead.
|
|
87
|
+
*
|
|
88
|
+
* The check is `quietExtensionContext.getStore() === true` — for any code path
|
|
89
|
+
* that wasn't dispatched inside `quietExtensionContext.run(true, …)` the store
|
|
90
|
+
* is undefined and console behaves exactly as before. This isolates the
|
|
91
|
+
* suppression to the quiet handler's own async work without affecting
|
|
92
|
+
* concurrent non-quiet handlers.
|
|
93
|
+
*/
|
|
94
|
+
function installQuietConsolePatch() {
|
|
95
|
+
if (quietConsolePatchInstalled)
|
|
96
|
+
return;
|
|
97
|
+
quietConsolePatchInstalled = true;
|
|
98
|
+
const realLog = console.log.bind(console);
|
|
99
|
+
const realWarn = console.warn.bind(console);
|
|
100
|
+
const realError = console.error.bind(console);
|
|
101
|
+
const realInfo = console.info.bind(console);
|
|
102
|
+
console.log = (...args) => {
|
|
103
|
+
if (quietExtensionContext.getStore() === true)
|
|
104
|
+
return;
|
|
105
|
+
realLog(...args);
|
|
106
|
+
};
|
|
107
|
+
console.warn = (...args) => {
|
|
108
|
+
if (quietExtensionContext.getStore() === true)
|
|
109
|
+
return;
|
|
110
|
+
realWarn(...args);
|
|
111
|
+
};
|
|
112
|
+
console.error = (...args) => {
|
|
113
|
+
if (quietExtensionContext.getStore() === true)
|
|
114
|
+
return;
|
|
115
|
+
realError(...args);
|
|
116
|
+
};
|
|
117
|
+
console.info = (...args) => {
|
|
118
|
+
if (quietExtensionContext.getStore() === true)
|
|
119
|
+
return;
|
|
120
|
+
realInfo(...args);
|
|
121
|
+
};
|
|
122
|
+
}
|
|
77
123
|
export class ExtensionRunner {
|
|
78
124
|
constructor(extensions, runtime, cwd, sessionManager, modelRegistry) {
|
|
79
125
|
this.errorListeners = new Set();
|
|
@@ -104,6 +150,8 @@ export class ExtensionRunner {
|
|
|
104
150
|
this.shutdownHandler = () => { };
|
|
105
151
|
this.shortcutDiagnostics = [];
|
|
106
152
|
this.commandDiagnostics = [];
|
|
153
|
+
/** Case-insensitive substring patterns matched against ext.path. ui.notify is dropped for matches. */
|
|
154
|
+
this.quietExtensionPatterns = [];
|
|
107
155
|
this.extensions = extensions;
|
|
108
156
|
this.runtime = runtime;
|
|
109
157
|
this.uiContext = noOpUIContext;
|
|
@@ -519,6 +567,39 @@ export class ExtensionRunner {
|
|
|
519
567
|
isShutdownGuardedEvent(eventType) {
|
|
520
568
|
return eventType === "agent_end" || eventType === "stop" || eventType === "session_end";
|
|
521
569
|
}
|
|
570
|
+
/**
|
|
571
|
+
* Replace the quiet-extensions allowlist. Each entry is a case-insensitive
|
|
572
|
+
* substring matched against the extension's filesystem path. Matching
|
|
573
|
+
* extensions have their `ui.notify` calls silently dropped AND their
|
|
574
|
+
* `console.log/warn/error/info` calls silently dropped while the handler
|
|
575
|
+
* is on the stack — useful for muting noisy session_start banners
|
|
576
|
+
* (piolium uses ui.notify; pi-notion uses console.log).
|
|
577
|
+
*
|
|
578
|
+
* Console filtering uses AsyncLocalStorage so other extensions running
|
|
579
|
+
* concurrently are unaffected — output is only suppressed when the call
|
|
580
|
+
* originates inside a quiet extension's handler async context.
|
|
581
|
+
*/
|
|
582
|
+
setQuietExtensions(patterns) {
|
|
583
|
+
this.quietExtensionPatterns = patterns.map((p) => p.toLowerCase()).filter((p) => p.length > 0);
|
|
584
|
+
if (this.quietExtensionPatterns.length > 0) {
|
|
585
|
+
installQuietConsolePatch();
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
isQuietExtension(ext) {
|
|
589
|
+
if (this.quietExtensionPatterns.length === 0)
|
|
590
|
+
return false;
|
|
591
|
+
const path = ext.path.toLowerCase();
|
|
592
|
+
return this.quietExtensionPatterns.some((p) => path.includes(p));
|
|
593
|
+
}
|
|
594
|
+
withSilencedNotify(base) {
|
|
595
|
+
// Wraps the shared ui context so notify() is a no-op while every other
|
|
596
|
+
// method (select/confirm/input/setStatus/setWidget/…) keeps working.
|
|
597
|
+
const silencedUi = {
|
|
598
|
+
...base.ui,
|
|
599
|
+
notify: () => undefined,
|
|
600
|
+
};
|
|
601
|
+
return { ...base, ui: silencedUi };
|
|
602
|
+
}
|
|
522
603
|
createCommandContext() {
|
|
523
604
|
return {
|
|
524
605
|
...this.createContext(),
|
|
@@ -558,10 +639,17 @@ export class ExtensionRunner {
|
|
|
558
639
|
const handlers = ext.handlers.get(eventType);
|
|
559
640
|
if (!handlers || handlers.length === 0)
|
|
560
641
|
continue;
|
|
642
|
+
const isQuiet = this.isQuietExtension(ext);
|
|
643
|
+
const extCtx = isQuiet ? this.withSilencedNotify(ctx) : ctx;
|
|
561
644
|
for (const handler of handlers) {
|
|
562
645
|
try {
|
|
563
646
|
const event = getEvent();
|
|
564
|
-
|
|
647
|
+
// Run quiet extensions inside an AsyncLocalStorage scope so
|
|
648
|
+
// the patched console methods can suppress their output
|
|
649
|
+
// without affecting non-quiet extensions running concurrently.
|
|
650
|
+
const handlerResult = isQuiet
|
|
651
|
+
? await quietExtensionContext.run(true, () => handler(event, extCtx))
|
|
652
|
+
: await handler(event, extCtx);
|
|
565
653
|
const action = processResult(handlerResult, ext.path);
|
|
566
654
|
if (action.done)
|
|
567
655
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/core/extensions/runner.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Extension runner - executes extensions and manages their lifecycle.\n */\n\nimport type { AgentMessage } from \"@otto/pi-agent-core\";\nimport type { ImageContent, Model } from \"@otto/pi-ai\";\nimport type { KeyId } from \"@otto/pi-tui\";\nimport { COMMAND_NAMESPACE } from \"../../config.js\";\nimport { type Theme, theme } from \"../../modes/interactive/theme/theme.js\";\nimport type { ResourceDiagnostic } from \"../diagnostics.js\";\nimport type { KeyAction, KeybindingsConfig } from \"../keybindings.js\";\nimport type { ModelRegistry } from \"../model-registry.js\";\nimport type { SessionManager } from \"../session-manager.js\";\nimport type {\n\tAdjustToolSetEvent,\n\tAdjustToolSetResult,\n\tBeforeAgentStartEvent,\n\tBeforeAgentStartEventResult,\n\tBeforeCommitEvent,\n\tBeforeCommitEventResult,\n\tBeforeModelSelectEvent,\n\tBeforeModelSelectResult,\n\tBeforePrEvent,\n\tBeforePrEventResult,\n\tBeforeProviderRequestEvent,\n\tBeforePushEvent,\n\tBeforePushEventResult,\n\tBeforeVerifyEvent,\n\tBeforeVerifyEventResult,\n\tBudgetThresholdEvent,\n\tBudgetThresholdEventResult,\n\tCommitEvent,\n\tCompactOptions,\n\tContextEvent,\n\tContextEventResult,\n\tContextUsage,\n\tExtension,\n\tExtensionActions,\n\tExtensionCommandContext,\n\tExtensionCommandContextActions,\n\tExtensionContext,\n\tExtensionContextActions,\n\tExtensionError,\n\tExtensionEvent,\n\tExtensionFlag,\n\tExtensionRuntime,\n\tExtensionShortcut,\n\tExtensionUIContext,\n\tInputEvent,\n\tInputEventResult,\n\tInputSource,\n\tMessageRenderer,\n\tMilestoneEndEvent,\n\tMilestoneStartEvent,\n\tNotificationEvent,\n\tPrOpenedEvent,\n\tPushEvent,\n\tRegisteredCommand,\n\tRegisteredTool,\n\tResourcesDiscoverEvent,\n\tResourcesDiscoverResult,\n\tSessionBeforeCompactResult,\n\tSessionBeforeForkResult,\n\tSessionBeforeSwitchResult,\n\tSessionBeforeTreeResult,\n\tSessionEndEvent,\n\tStopEvent,\n\tToolCallEvent,\n\tToolCallEventResult,\n\tToolResultEvent,\n\tToolResultEventResult,\n\tUnitEndEvent,\n\tUnitStartEvent,\n\tUserBashEvent,\n\tUserBashEventResult,\n\tVerifyFailure,\n\tVerifyResultEvent,\n} from \"./types.js\";\n\n// Keybindings for these actions cannot be overridden by extensions\nconst RESERVED_ACTIONS_FOR_EXTENSION_CONFLICTS: ReadonlyArray<KeyAction> = [\n\t\"interrupt\",\n\t\"clear\",\n\t\"exit\",\n\t\"suspend\",\n\t\"cycleThinkingLevel\",\n\t\"cycleModelForward\",\n\t\"cycleModelBackward\",\n\t\"selectModel\",\n\t\"expandTools\",\n\t\"toggleThinking\",\n\t\"externalEditor\",\n\t\"followUp\",\n\t\"submit\",\n\t\"selectConfirm\",\n\t\"selectCancel\",\n\t\"copy\",\n\t\"deleteToLineEnd\",\n];\n\ntype BuiltInKeyBindings = Partial<Record<KeyId, { action: KeyAction; restrictOverride: boolean }>>;\n\nconst buildBuiltinKeybindings = (effectiveKeybindings: Required<KeybindingsConfig>): BuiltInKeyBindings => {\n\tconst builtinKeybindings = {} as BuiltInKeyBindings;\n\tfor (const [action, keys] of Object.entries(effectiveKeybindings)) {\n\t\tconst keyAction = action as KeyAction;\n\t\tconst keyList = Array.isArray(keys) ? keys : [keys];\n\t\tconst restrictOverride = RESERVED_ACTIONS_FOR_EXTENSION_CONFLICTS.includes(keyAction);\n\t\tfor (const key of keyList) {\n\t\t\tconst normalizedKey = key.toLowerCase() as KeyId;\n\t\t\tbuiltinKeybindings[normalizedKey] = {\n\t\t\t\taction: keyAction,\n\t\t\t\trestrictOverride: restrictOverride,\n\t\t\t};\n\t\t}\n\t}\n\treturn builtinKeybindings;\n};\n\nconst PROTECTED_EXTENSION_COMMANDS = new Set([COMMAND_NAMESPACE]);\n\nfunction isProtectedCommandOwner(commandName: string, extensionPath: string): boolean {\n\tif (!PROTECTED_EXTENSION_COMMANDS.has(commandName)) return false;\n\tconst normalized = extensionPath.replace(/\\\\/g, \"/\");\n\treturn /\\/extensions\\/workflow\\/(?:index\\.[cm]?[jt]s|dist\\/.*)$/.test(normalized)\n\t\t|| /\\/extensions\\/workflow\\/?$/.test(normalized);\n}\n\n/** Combined result from all before_agent_start handlers */\ninterface BeforeAgentStartCombinedResult {\n\tmessages?: NonNullable<BeforeAgentStartEventResult[\"message\"]>[];\n\tsystemPrompt?: string;\n}\n\n/**\n * Events handled by the generic emit() method.\n * Events with dedicated emitXxx() methods are excluded for stronger type safety.\n */\ntype RunnerEmitEvent = Exclude<\n\tExtensionEvent,\n\t| ToolCallEvent\n\t| ToolResultEvent\n\t| UserBashEvent\n\t| ContextEvent\n\t| BeforeProviderRequestEvent\n\t| BeforeAgentStartEvent\n\t| ResourcesDiscoverEvent\n\t| InputEvent\n>;\n\ntype SessionBeforeEvent = Extract<\n\tRunnerEmitEvent,\n\t{ type: \"session_before_switch\" | \"session_before_fork\" | \"session_before_compact\" | \"session_before_tree\" }\n>;\n\ntype SessionBeforeEventResult =\n\t| SessionBeforeSwitchResult\n\t| SessionBeforeForkResult\n\t| SessionBeforeCompactResult\n\t| SessionBeforeTreeResult;\n\ntype RunnerEmitResult<TEvent extends RunnerEmitEvent> = TEvent extends { type: \"session_before_switch\" }\n\t? SessionBeforeSwitchResult | undefined\n\t: TEvent extends { type: \"session_before_fork\" }\n\t\t? SessionBeforeForkResult | undefined\n\t\t: TEvent extends { type: \"session_before_compact\" }\n\t\t\t? SessionBeforeCompactResult | undefined\n\t\t\t: TEvent extends { type: \"session_before_tree\" }\n\t\t\t\t? SessionBeforeTreeResult | undefined\n\t\t\t\t: undefined;\n\nexport type ExtensionErrorListener = (error: ExtensionError) => void;\n\nexport type NewSessionHandler = (options?: {\n\tparentSession?: string;\n\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t/** Explicit workspace root for the new session/tool runtime. */\n\tworkspaceRoot?: string;\n\t/** See ExtensionCommandContext.newSession for docs (#3731). */\n\tabortSignal?: AbortSignal;\n}) => Promise<{ cancelled: boolean }>;\n\nexport type ForkHandler = (entryId: string) => Promise<{ cancelled: boolean }>;\n\nexport type NavigateTreeHandler = (\n\ttargetId: string,\n\toptions?: { summarize?: boolean; customInstructions?: string; replaceInstructions?: boolean; label?: string },\n) => Promise<{ cancelled: boolean }>;\n\nexport type SwitchSessionHandler = (sessionPath: string) => Promise<{ cancelled: boolean }>;\n\nexport type ReloadHandler = () => Promise<void>;\n\nexport type ShutdownHandler = () => void;\n\n\nconst noOpUIContext: ExtensionUIContext = {\n\tselect: async () => undefined,\n\tconfirm: async () => false,\n\tinput: async () => undefined,\n\tnotify: () => {},\n\tonTerminalInput: () => () => {},\n\tsetStatus: () => {},\n\tsetWorkingMessage: () => {},\n\tsetWidget: () => {},\n\tsetFooter: () => {},\n\tsetHeader: () => {},\n\tsetTitle: () => {},\n\tcustom: async () => undefined as never,\n\tpasteToEditor: () => {},\n\tsetEditorText: () => {},\n\tgetEditorText: () => \"\",\n\teditor: async () => undefined,\n\tsetEditorComponent: () => {},\n\tget theme() {\n\t\treturn theme;\n\t},\n\tgetAllThemes: () => [],\n\tgetTheme: () => undefined,\n\tsetTheme: (_theme: string | Theme) => ({ success: false, error: \"UI not available\" }),\n\tgetToolsExpanded: () => false,\n\tsetToolsExpanded: () => {},\n};\n\nexport class ExtensionRunner {\n\tprivate extensions: Extension[];\n\tprivate runtime: ExtensionRuntime;\n\tprivate uiContext: ExtensionUIContext;\n\tprivate cwd: string;\n\tprivate sessionManager: SessionManager;\n\tprivate modelRegistry: ModelRegistry;\n\tprivate errorListeners: Set<ExtensionErrorListener> = new Set();\n\tprivate getModel: () => Model<any> | undefined = () => undefined;\n\tprivate isIdleFn: () => boolean = () => true;\n\tprivate waitForIdleFn: () => Promise<void> = async () => {};\n\tprivate abortFn: () => void = () => {};\n\tprivate hasPendingMessagesFn: () => boolean = () => false;\n\tprivate getContextUsageFn: () => ContextUsage | undefined = () => undefined;\n\tprivate compactFn: (options?: CompactOptions) => void = () => {};\n\tprivate getSystemPromptFn: () => string = () => \"\";\n\tprivate setCompactionThresholdOverrideFn: (percent: number | undefined) => void = () => {};\n\tprivate newSessionHandler: NewSessionHandler = async () => {\n\t\tthrow new Error(\"Command context not yet bound: newSession is unavailable during early lifecycle\");\n\t};\n\tprivate forkHandler: ForkHandler = async () => {\n\t\tthrow new Error(\"Command context not yet bound: fork is unavailable during early lifecycle\");\n\t};\n\tprivate navigateTreeHandler: NavigateTreeHandler = async () => {\n\t\tthrow new Error(\"Command context not yet bound: navigateTree is unavailable during early lifecycle\");\n\t};\n\tprivate switchSessionHandler: SwitchSessionHandler = async () => {\n\t\tthrow new Error(\"Command context not yet bound: switchSession is unavailable during early lifecycle\");\n\t};\n\tprivate reloadHandler: ReloadHandler = async () => {\n\t\tthrow new Error(\"Command context not yet bound: reload is unavailable during early lifecycle\");\n\t};\n\tprivate shutdownHandler: ShutdownHandler = () => {};\n\tprivate shortcutDiagnostics: ResourceDiagnostic[] = [];\n\tprivate commandDiagnostics: ResourceDiagnostic[] = [];\n\n\tconstructor(\n\t\textensions: Extension[],\n\t\truntime: ExtensionRuntime,\n\t\tcwd: string,\n\t\tsessionManager: SessionManager,\n\t\tmodelRegistry: ModelRegistry,\n\t) {\n\t\tthis.extensions = extensions;\n\t\tthis.runtime = runtime;\n\t\tthis.uiContext = noOpUIContext;\n\t\tthis.cwd = cwd;\n\t\tthis.sessionManager = sessionManager;\n\t\tthis.modelRegistry = modelRegistry;\n\t\t// Bind emit methods into the shared runtime so createExtensionAPI can delegate to them.\n\t\tthis.runtime.emitBeforeModelSelect = (event) => this.emitBeforeModelSelect(event);\n\t\tthis.runtime.emitAdjustToolSet = (event) => this.emitAdjustToolSet(event);\n\t\tthis.runtime.emitExtensionEvent = (event) => this.emitExtensionEventDynamic(event);\n\t}\n\n\tprivate currentCwd(): string {\n\t\treturn this.cwd;\n\t}\n\n\t/**\n\t * Dispatch an ExtensionEvent by type. Used by extensions to emit the\n\t * post-plan Layer 2 events (git lifecycle, verify, budget, milestone,\n\t * unit, notification, stop, session_end) without a bespoke method per\n\t * type. Returns the handler chain's aggregate result where meaningful.\n\t */\n\tprivate async emitExtensionEventDynamic(event: ExtensionEvent): Promise<unknown> {\n\t\tswitch (event.type) {\n\t\t\tcase \"notification\":\n\t\t\t\treturn this.emitNotification({ kind: event.kind, message: event.message, details: event.details });\n\t\t\tcase \"stop\":\n\t\t\t\treturn this.emitStop({ reason: event.reason, lastMessage: event.lastMessage });\n\t\t\tcase \"session_end\":\n\t\t\t\treturn this.emitSessionEnd({ reason: event.reason, sessionFile: event.sessionFile });\n\t\t\tcase \"before_commit\":\n\t\t\t\treturn this.emitBeforeCommit({\n\t\t\t\t\tmessage: event.message,\n\t\t\t\t\tfiles: event.files,\n\t\t\t\t\tcwd: event.cwd,\n\t\t\t\t\tauthor: event.author,\n\t\t\t\t});\n\t\t\tcase \"commit\":\n\t\t\t\treturn this.emitCommit({ sha: event.sha, message: event.message, files: event.files, cwd: event.cwd });\n\t\t\tcase \"before_push\":\n\t\t\t\treturn this.emitBeforePush({ remote: event.remote, branch: event.branch, cwd: event.cwd });\n\t\t\tcase \"push\":\n\t\t\t\treturn this.emitPush({ remote: event.remote, branch: event.branch, cwd: event.cwd });\n\t\t\tcase \"before_pr\":\n\t\t\t\treturn this.emitBeforePr({\n\t\t\t\t\tbranch: event.branch,\n\t\t\t\t\ttargetBranch: event.targetBranch,\n\t\t\t\t\ttitle: event.title,\n\t\t\t\t\tbody: event.body,\n\t\t\t\t\tcwd: event.cwd,\n\t\t\t\t});\n\t\t\tcase \"pr_opened\":\n\t\t\t\treturn this.emitPrOpened({\n\t\t\t\t\turl: event.url,\n\t\t\t\t\tbranch: event.branch,\n\t\t\t\t\ttargetBranch: event.targetBranch,\n\t\t\t\t\tcwd: event.cwd,\n\t\t\t\t});\n\t\t\tcase \"before_verify\":\n\t\t\t\treturn this.emitBeforeVerify({ unitType: event.unitType, unitId: event.unitId, cwd: event.cwd });\n\t\t\tcase \"verify_result\":\n\t\t\t\treturn this.emitVerifyResult({\n\t\t\t\t\tpassed: event.passed,\n\t\t\t\t\tfailures: event.failures,\n\t\t\t\t\tunitType: event.unitType,\n\t\t\t\t\tunitId: event.unitId,\n\t\t\t\t\tcwd: event.cwd,\n\t\t\t\t});\n\t\t\tcase \"budget_threshold\":\n\t\t\t\treturn this.emitBudgetThreshold({\n\t\t\t\t\tfraction: event.fraction,\n\t\t\t\t\tspent: event.spent,\n\t\t\t\t\tlimit: event.limit,\n\t\t\t\t\tcurrency: event.currency,\n\t\t\t\t});\n\t\t\tcase \"milestone_start\":\n\t\t\t\treturn this.emitMilestoneStart({ milestoneId: event.milestoneId, title: event.title, cwd: event.cwd });\n\t\t\tcase \"milestone_end\":\n\t\t\t\treturn this.emitMilestoneEnd({\n\t\t\t\t\tmilestoneId: event.milestoneId,\n\t\t\t\t\tstatus: event.status,\n\t\t\t\t\tcwd: event.cwd,\n\t\t\t\t});\n\t\t\tcase \"unit_start\":\n\t\t\t\treturn this.emitUnitStart({\n\t\t\t\t\tunitType: event.unitType,\n\t\t\t\t\tunitId: event.unitId,\n\t\t\t\t\tmilestoneId: event.milestoneId,\n\t\t\t\t\tcwd: event.cwd,\n\t\t\t\t});\n\t\t\tcase \"unit_end\":\n\t\t\t\treturn this.emitUnitEnd({\n\t\t\t\t\tunitType: event.unitType,\n\t\t\t\t\tunitId: event.unitId,\n\t\t\t\t\tmilestoneId: event.milestoneId,\n\t\t\t\t\tstatus: event.status,\n\t\t\t\t\tcwd: event.cwd,\n\t\t\t\t});\n\t\t\tdefault:\n\t\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Install a synthetic \"extension\" that only provides event handlers.\n\t * Used by the Layer 0 hooks-runner to bridge shell hooks onto the\n\t * extension event bus without requiring a full extension module. The\n\t * returned disposer removes the synthetic extension.\n\t */\n\tinstallHookBridge(\n\t\tpath: string,\n\t\thandlers: Map<string, Array<(event: unknown, ctx: unknown) => Promise<unknown>>>,\n\t): () => void {\n\t\tconst synthetic: Extension = {\n\t\t\tpath,\n\t\t\tresolvedPath: path,\n\t\t\thandlers: handlers as unknown as Extension[\"handlers\"],\n\t\t\ttools: new Map(),\n\t\t\tmessageRenderers: new Map(),\n\t\t\tcommands: new Map(),\n\t\t\tflags: new Map(),\n\t\t\tshortcuts: new Map(),\n\t\t\tlifecycleHooks: {\n\t\t\t\tbeforeInstall: [],\n\t\t\t\tafterInstall: [],\n\t\t\t\tbeforeRemove: [],\n\t\t\t\tafterRemove: [],\n\t\t\t},\n\t\t};\n\t\tthis.extensions.push(synthetic);\n\t\treturn () => {\n\t\t\tconst index = this.extensions.indexOf(synthetic);\n\t\t\tif (index >= 0) this.extensions.splice(index, 1);\n\t\t};\n\t}\n\n\tbindCore(actions: ExtensionActions, contextActions: ExtensionContextActions): void {\n\t\t// Copy actions into the shared runtime (all extension APIs reference this)\n\t\tthis.runtime.sendMessage = actions.sendMessage;\n\t\tthis.runtime.sendUserMessage = actions.sendUserMessage;\n\t\tthis.runtime.retryLastTurn = actions.retryLastTurn;\n\t\tthis.runtime.appendEntry = actions.appendEntry;\n\t\tthis.runtime.setSessionName = actions.setSessionName;\n\t\tthis.runtime.getSessionName = actions.getSessionName;\n\t\tthis.runtime.setLabel = actions.setLabel;\n\t\tthis.runtime.getActiveTools = actions.getActiveTools;\n\t\tthis.runtime.getAllTools = actions.getAllTools;\n\t\tthis.runtime.setActiveTools = actions.setActiveTools;\n\t\tthis.runtime.getVisibleSkills = actions.getVisibleSkills;\n\t\tthis.runtime.setVisibleSkills = actions.setVisibleSkills;\n\t\tthis.runtime.refreshTools = actions.refreshTools;\n\t\tthis.runtime.getCommands = actions.getCommands;\n\t\tthis.runtime.setModel = actions.setModel;\n\t\tthis.runtime.getThinkingLevel = actions.getThinkingLevel;\n\t\tthis.runtime.setThinkingLevel = actions.setThinkingLevel;\n\n\t\t// Context actions (required)\n\t\tthis.getModel = contextActions.getModel;\n\t\tthis.isIdleFn = contextActions.isIdle;\n\t\tthis.abortFn = contextActions.abort;\n\t\tthis.hasPendingMessagesFn = contextActions.hasPendingMessages;\n\t\tthis.shutdownHandler = contextActions.shutdown;\n\t\tthis.getContextUsageFn = contextActions.getContextUsage;\n\t\tthis.compactFn = contextActions.compact;\n\t\tthis.getSystemPromptFn = contextActions.getSystemPrompt;\n\t\tthis.setCompactionThresholdOverrideFn = contextActions.setCompactionThresholdOverride;\n\n\t\t// Flush provider registrations queued during extension loading\n\t\tfor (const { name, config } of this.runtime.pendingProviderRegistrations) {\n\t\t\tthis.modelRegistry.registerProvider(name, config);\n\t\t}\n\t\tthis.runtime.pendingProviderRegistrations = [];\n\n\t\t// From this point on, provider registration/unregistration takes effect immediately\n\t\t// without requiring a /reload.\n\t\tthis.runtime.registerProvider = (name, config) => this.modelRegistry.registerProvider(name, config);\n\t\tthis.runtime.unregisterProvider = (name) => this.modelRegistry.unregisterProvider(name);\n\t}\n\n\tbindCommandContext(actions?: ExtensionCommandContextActions): void {\n\t\tif (actions) {\n\t\t\tthis.waitForIdleFn = actions.waitForIdle;\n\t\t\tthis.newSessionHandler = actions.newSession;\n\t\t\tthis.forkHandler = actions.fork;\n\t\t\tthis.navigateTreeHandler = actions.navigateTree;\n\t\t\tthis.switchSessionHandler = actions.switchSession;\n\t\t\tthis.reloadHandler = actions.reload;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.waitForIdleFn = async () => {};\n\t\tthis.newSessionHandler = async () => ({ cancelled: false });\n\t\tthis.forkHandler = async () => ({ cancelled: false });\n\t\tthis.navigateTreeHandler = async () => ({ cancelled: false });\n\t\tthis.switchSessionHandler = async () => ({ cancelled: false });\n\t\tthis.reloadHandler = async () => {};\n\t}\n\n\tsetUIContext(uiContext?: ExtensionUIContext): void {\n\t\tthis.uiContext = uiContext ?? noOpUIContext;\n\t}\n\n\tgetUIContext(): ExtensionUIContext {\n\t\treturn this.uiContext;\n\t}\n\n\thasUI(): boolean {\n\t\treturn this.uiContext !== noOpUIContext;\n\t}\n\n\tgetExtensionPaths(): string[] {\n\t\treturn this.extensions.map((e) => e.path);\n\t}\n\n\t/** Get all registered tools from all extensions (first registration per name wins). */\n\tgetAllRegisteredTools(): RegisteredTool[] {\n\t\tconst toolsByName = new Map<string, RegisteredTool>();\n\t\tfor (const ext of this.extensions) {\n\t\t\tfor (const tool of ext.tools.values()) {\n\t\t\t\tif (!toolsByName.has(tool.definition.name)) {\n\t\t\t\t\ttoolsByName.set(tool.definition.name, tool);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn Array.from(toolsByName.values());\n\t}\n\n\t/** Get a tool definition by name. Returns undefined if not found. */\n\tgetToolDefinition(toolName: string): RegisteredTool[\"definition\"] | undefined {\n\t\tfor (const ext of this.extensions) {\n\t\t\tconst tool = ext.tools.get(toolName);\n\t\t\tif (tool) {\n\t\t\t\treturn tool.definition;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tgetFlags(): Map<string, ExtensionFlag> {\n\t\tconst allFlags = new Map<string, ExtensionFlag>();\n\t\tfor (const ext of this.extensions) {\n\t\t\tfor (const [name, flag] of ext.flags) {\n\t\t\t\tif (!allFlags.has(name)) {\n\t\t\t\t\tallFlags.set(name, flag);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn allFlags;\n\t}\n\n\tsetFlagValue(name: string, value: boolean | string): void {\n\t\tthis.runtime.flagValues.set(name, value);\n\t}\n\n\tgetFlagValues(): Map<string, boolean | string> {\n\t\treturn new Map(this.runtime.flagValues);\n\t}\n\n\tgetShortcuts(effectiveKeybindings: Required<KeybindingsConfig>): Map<KeyId, ExtensionShortcut> {\n\t\tthis.shortcutDiagnostics = [];\n\t\tconst builtinKeybindings = buildBuiltinKeybindings(effectiveKeybindings);\n\t\tconst extensionShortcuts = new Map<KeyId, ExtensionShortcut>();\n\n\t\tconst addDiagnostic = (message: string, extensionPath: string) => {\n\t\t\tthis.shortcutDiagnostics.push({ type: \"warning\", message, path: extensionPath });\n\t\t\tif (!this.hasUI()) {\n\t\t\t\tconsole.warn(message);\n\t\t\t}\n\t\t};\n\n\t\tfor (const ext of this.extensions) {\n\t\t\tfor (const [key, shortcut] of ext.shortcuts) {\n\t\t\t\tconst normalizedKey = key.toLowerCase() as KeyId;\n\n\t\t\t\tconst builtInKeybinding = builtinKeybindings[normalizedKey];\n\t\t\t\tif (builtInKeybinding?.restrictOverride === true) {\n\t\t\t\t\taddDiagnostic(\n\t\t\t\t\t\t`Extension shortcut '${key}' from ${shortcut.extensionPath} conflicts with built-in shortcut. Skipping.`,\n\t\t\t\t\t\tshortcut.extensionPath,\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (builtInKeybinding?.restrictOverride === false) {\n\t\t\t\t\taddDiagnostic(\n\t\t\t\t\t\t`Extension shortcut conflict: '${key}' is built-in shortcut for ${builtInKeybinding.action} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,\n\t\t\t\t\t\tshortcut.extensionPath,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst existingExtensionShortcut = extensionShortcuts.get(normalizedKey);\n\t\t\t\tif (existingExtensionShortcut) {\n\t\t\t\t\taddDiagnostic(\n\t\t\t\t\t\t`Extension shortcut conflict: '${key}' registered by both ${existingExtensionShortcut.extensionPath} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,\n\t\t\t\t\t\tshortcut.extensionPath,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\textensionShortcuts.set(normalizedKey, shortcut);\n\t\t\t}\n\t\t}\n\t\treturn extensionShortcuts;\n\t}\n\n\tgetShortcutDiagnostics(): ResourceDiagnostic[] {\n\t\treturn this.shortcutDiagnostics;\n\t}\n\n\tonError(listener: ExtensionErrorListener): () => void {\n\t\tthis.errorListeners.add(listener);\n\t\treturn () => this.errorListeners.delete(listener);\n\t}\n\n\temitError(error: ExtensionError): void {\n\t\tfor (const listener of this.errorListeners) {\n\t\t\tlistener(error);\n\t\t}\n\t}\n\n\thasHandlers(eventType: string): boolean {\n\t\tfor (const ext of this.extensions) {\n\t\t\tconst handlers = ext.handlers.get(eventType);\n\t\t\tif (handlers && handlers.length > 0) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tgetMessageRenderer(customType: string): MessageRenderer | undefined {\n\t\tfor (const ext of this.extensions) {\n\t\t\tconst renderer = ext.messageRenderers.get(customType);\n\t\t\tif (renderer) {\n\t\t\t\treturn renderer;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tgetRegisteredCommands(reserved?: Set<string>): RegisteredCommand[] {\n\t\tthis.commandDiagnostics = [];\n\n\t\tconst commands: RegisteredCommand[] = [];\n\t\tconst commandOwners = new Map<string, string>();\n\t\tconst protectedOwners = new Map<string, string>();\n\t\tfor (const ext of this.extensions) {\n\t\t\tfor (const command of ext.commands.values()) {\n\t\t\t\tif (isProtectedCommandOwner(command.name, ext.path)) {\n\t\t\t\t\tprotectedOwners.set(command.name, ext.path);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const ext of this.extensions) {\n\t\t\tfor (const command of ext.commands.values()) {\n\t\t\t\tif (reserved?.has(command.name)) {\n\t\t\t\t\tconst message = `Extension command '${command.name}' from ${ext.path} conflicts with built-in commands. Skipping.`;\n\t\t\t\t\tthis.commandDiagnostics.push({ type: \"warning\", message, path: ext.path });\n\t\t\t\t\tif (!this.hasUI()) {\n\t\t\t\t\t\tconsole.warn(message);\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst protectedOwner = protectedOwners.get(command.name);\n\t\t\t\tif (protectedOwner && protectedOwner !== ext.path) {\n\t\t\t\t\tconst message = `Extension command '${command.name}' from ${ext.path} conflicts with protected command owner ${protectedOwner}. Skipping.`;\n\t\t\t\t\tthis.commandDiagnostics.push({ type: \"warning\", message, path: ext.path });\n\t\t\t\t\tif (!this.hasUI()) {\n\t\t\t\t\t\tconsole.warn(message);\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst existingOwner = commandOwners.get(command.name);\n\t\t\t\tif (existingOwner) {\n\t\t\t\t\tconst message = `Extension command '${command.name}' from ${ext.path} conflicts with ${existingOwner}. Skipping.`;\n\t\t\t\t\tthis.commandDiagnostics.push({ type: \"warning\", message, path: ext.path });\n\t\t\t\t\tif (!this.hasUI()) {\n\t\t\t\t\t\tconsole.warn(message);\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tcommandOwners.set(command.name, ext.path);\n\t\t\t\tcommands.push(command);\n\t\t\t}\n\t\t}\n\t\treturn commands;\n\t}\n\n\tgetCommandDiagnostics(): ResourceDiagnostic[] {\n\t\treturn this.commandDiagnostics;\n\t}\n\n\tgetRegisteredCommandsWithPaths(): Array<{ command: RegisteredCommand; extensionPath: string }> {\n\t\tconst result: Array<{ command: RegisteredCommand; extensionPath: string }> = [];\n\t\tfor (const ext of this.extensions) {\n\t\t\tfor (const command of ext.commands.values()) {\n\t\t\t\tresult.push({ command, extensionPath: ext.path });\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tgetCommand(name: string): RegisteredCommand | undefined {\n\t\tlet protectedCommand: RegisteredCommand | undefined;\n\t\tfor (const ext of this.extensions) {\n\t\t\tconst command = ext.commands.get(name);\n\t\t\tif (command) {\n\t\t\t\tif (isProtectedCommandOwner(name, ext.path)) {\n\t\t\t\t\tprotectedCommand = command;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (PROTECTED_EXTENSION_COMMANDS.has(name)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\treturn command;\n\t\t\t}\n\t\t}\n\t\treturn protectedCommand;\n\t}\n\n\t/**\n\t * Request a graceful shutdown. Called by extension tools and event handlers.\n\t * The actual shutdown behavior is provided by the mode via bindExtensions().\n\t */\n\tshutdown(): void {\n\t\tthis.shutdownHandler();\n\t}\n\n\t/**\n\t * Create an ExtensionContext for use in event handlers and tool execution.\n\t * Context values are resolved at call time, so changes via bindCore/bindUI are reflected.\n\t */\n\tcreateContext(): ExtensionContext {\n\t\tconst getModel = this.getModel;\n\t\treturn {\n\t\t\tui: this.uiContext,\n\t\t\thasUI: this.hasUI(),\n\t\t\tcwd: this.currentCwd(),\n\t\t\tsessionManager: this.sessionManager,\n\t\t\tmodelRegistry: this.modelRegistry,\n\t\t\tget model() {\n\t\t\t\treturn getModel();\n\t\t\t},\n\t\t\tisIdle: () => this.isIdleFn(),\n\t\t\tabort: () => this.abortFn(),\n\t\t\thasPendingMessages: () => this.hasPendingMessagesFn(),\n\t\t\tshutdown: () => this.shutdownHandler(),\n\t\t\tgetContextUsage: () => this.getContextUsageFn(),\n\t\t\tcompact: (options) => this.compactFn(options),\n\t\t\tgetSystemPrompt: () => this.getSystemPromptFn(),\n\t\t\tsetCompactionThresholdOverride: (percent) => this.setCompactionThresholdOverrideFn(percent),\n\t\t};\n\t}\n\n\tprivate createEventContext(eventType: string): ExtensionContext {\n\t\treturn {\n\t\t\t...this.createContext(),\n\t\t\tshutdown: () => {\n\t\t\t\tthrow new Error(`Extension event '${eventType}' cannot request TUI shutdown`);\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate isShutdownGuardedEvent(eventType: string): boolean {\n\t\treturn eventType === \"agent_end\" || eventType === \"stop\" || eventType === \"session_end\";\n\t}\n\n\tcreateCommandContext(): ExtensionCommandContext {\n\t\treturn {\n\t\t\t...this.createContext(),\n\t\t\twaitForIdle: () => this.waitForIdleFn(),\n\t\t\tnewSession: (options) => this.newSessionHandler(options),\n\t\t\tfork: (entryId) => this.forkHandler(entryId),\n\t\t\tnavigateTree: (targetId, options) => this.navigateTreeHandler(targetId, options),\n\t\t\tswitchSession: (sessionPath) => this.switchSessionHandler(sessionPath),\n\t\t\treload: () => this.reloadHandler(),\n\t\t};\n\t}\n\n\tprivate isSessionBeforeEvent(event: RunnerEmitEvent): event is SessionBeforeEvent {\n\t\treturn (\n\t\t\tevent.type === \"session_before_switch\" ||\n\t\t\tevent.type === \"session_before_fork\" ||\n\t\t\tevent.type === \"session_before_compact\" ||\n\t\t\tevent.type === \"session_before_tree\"\n\t\t);\n\t}\n\n\t/**\n\t * Shared handler invocation loop.\n\t *\n\t * Iterates every handler registered for `eventType` across all extensions,\n\t * calling each inside a try/catch that emits an ExtensionError on failure.\n\t *\n\t * `getEvent` builds the event object for each handler call — callers that\n\t * mutate state between calls (e.g. context, before_provider_request) supply\n\t * a function; callers with a fixed event can pass a constant.\n\t *\n\t * `processResult` receives each handler's return value and the owning\n\t * extension's path. It returns `{ done: true }` to short-circuit\n\t * or `{ done: false }` to keep iterating.\n\t */\n\tprivate async invokeHandlers(\n\t\teventType: string,\n\t\tgetEvent: () => unknown,\n\t\tprocessResult: (handlerResult: unknown, extensionPath: string) => { done: boolean },\n\t): Promise<void> {\n\t\tconst ctx = this.isShutdownGuardedEvent(eventType)\n\t\t\t? this.createEventContext(eventType)\n\t\t\t: this.createContext();\n\n\t\tfor (const ext of this.extensions) {\n\t\t\tconst handlers = ext.handlers.get(eventType);\n\t\t\tif (!handlers || handlers.length === 0) continue;\n\n\t\t\tfor (const handler of handlers) {\n\t\t\t\ttry {\n\t\t\t\t\tconst event = getEvent();\n\t\t\t\t\tconst handlerResult = await handler(event, ctx);\n\t\t\t\t\tconst action = processResult(handlerResult, ext.path);\n\t\t\t\t\tif (action.done) return;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\t\tconst stack = err instanceof Error ? err.stack : undefined;\n\t\t\t\t\tthis.emitError({\n\t\t\t\t\t\textensionPath: ext.path,\n\t\t\t\t\t\tevent: eventType,\n\t\t\t\t\t\terror: message,\n\t\t\t\t\t\tstack,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync emit<TEvent extends RunnerEmitEvent>(event: TEvent): Promise<RunnerEmitResult<TEvent>> {\n\t\tlet result: SessionBeforeEventResult | undefined;\n\t\tconst isSessionBefore = this.isSessionBeforeEvent(event);\n\n\t\tawait this.invokeHandlers(event.type, () => event, (handlerResult) => {\n\t\t\tif (isSessionBefore && handlerResult) {\n\t\t\t\tresult = handlerResult as SessionBeforeEventResult;\n\t\t\t\tif (result.cancel) return { done: true };\n\t\t\t}\n\t\t\treturn { done: false };\n\t\t});\n\n\t\treturn result as RunnerEmitResult<TEvent>;\n\t}\n\n\tasync emitToolResult(event: ToolResultEvent): Promise<ToolResultEventResult | undefined> {\n\t\tconst currentEvent: ToolResultEvent = { ...event };\n\t\tlet modified = false;\n\n\t\tawait this.invokeHandlers(\"tool_result\", () => currentEvent, (handlerResult) => {\n\t\t\tconst r = handlerResult as ToolResultEventResult | undefined;\n\t\t\tif (!r) return { done: false };\n\n\t\t\tif (r.content !== undefined) { currentEvent.content = r.content; modified = true; }\n\t\t\tif (r.details !== undefined) { currentEvent.details = r.details; modified = true; }\n\t\t\tif (r.isError !== undefined) { currentEvent.isError = r.isError; modified = true; }\n\t\t\treturn { done: false };\n\t\t});\n\n\t\tif (!modified) return undefined;\n\t\treturn { content: currentEvent.content, details: currentEvent.details, isError: currentEvent.isError };\n\t}\n\n\tasync emitToolCall(event: ToolCallEvent): Promise<ToolCallEventResult | undefined> {\n\t\tlet result: ToolCallEventResult | undefined;\n\n\t\tawait this.invokeHandlers(\"tool_call\", () => event, (handlerResult) => {\n\t\t\tif (handlerResult) {\n\t\t\t\tresult = handlerResult as ToolCallEventResult;\n\t\t\t\tif (result.block) return { done: true };\n\t\t\t}\n\t\t\treturn { done: false };\n\t\t});\n\n\t\treturn result;\n\t}\n\n\tasync emitBashTransform(command: string, cwd: string): Promise<string> {\n\t\tif (!this.hasHandlers(\"bash_transform\")) return command;\n\n\t\tlet current = command;\n\t\tawait this.invokeHandlers(\n\t\t\t\"bash_transform\",\n\t\t\t() => ({ type: \"bash_transform\" as const, command: current, cwd }),\n\t\t\t(handlerResult) => {\n\t\t\t\tconst result = handlerResult as import(\"./types.js\").BashTransformEventResult | undefined;\n\t\t\t\tif (result?.command && result.command.trim()) {\n\t\t\t\t\tcurrent = result.command;\n\t\t\t\t}\n\t\t\t\treturn { done: false }; // chain all handlers\n\t\t\t},\n\t\t);\n\t\treturn current;\n\t}\n\n\tasync emitUserBash(event: UserBashEvent): Promise<UserBashEventResult | undefined> {\n\t\tlet result: UserBashEventResult | undefined;\n\n\t\tawait this.invokeHandlers(\"user_bash\", () => event, (handlerResult) => {\n\t\t\tif (handlerResult) {\n\t\t\t\tresult = handlerResult as UserBashEventResult;\n\t\t\t\treturn { done: true };\n\t\t\t}\n\t\t\treturn { done: false };\n\t\t});\n\n\t\treturn result;\n\t}\n\n\tasync emitContext(messages: AgentMessage[]): Promise<AgentMessage[]> {\n\t\tlet currentMessages = structuredClone(messages);\n\n\t\tawait this.invokeHandlers(\"context\", () => ({ type: \"context\", messages: currentMessages } satisfies ContextEvent), (handlerResult) => {\n\t\t\tif (handlerResult && (handlerResult as ContextEventResult).messages) {\n\t\t\t\tcurrentMessages = (handlerResult as ContextEventResult).messages!;\n\t\t\t}\n\t\t\treturn { done: false };\n\t\t});\n\n\t\treturn currentMessages;\n\t}\n\n\tasync emitBeforeProviderRequest(\n\t\tpayload: unknown,\n\t\tmodel?: { provider: string; id: string; api?: string },\n\t): Promise<unknown> {\n\t\tlet currentPayload = payload;\n\n\t\tawait this.invokeHandlers(\"before_provider_request\", () => ({\n\t\t\ttype: \"before_provider_request\",\n\t\t\tpayload: currentPayload,\n\t\t\tmodel,\n\t\t} satisfies BeforeProviderRequestEvent), (handlerResult) => {\n\t\t\tif (handlerResult !== undefined) currentPayload = handlerResult;\n\t\t\treturn { done: false };\n\t\t});\n\n\t\treturn currentPayload;\n\t}\n\n\tasync emitBeforeModelSelect(event: Omit<BeforeModelSelectEvent, \"type\">): Promise<BeforeModelSelectResult | undefined> {\n\t\tlet result: BeforeModelSelectResult | undefined;\n\t\tawait this.invokeHandlers(\"before_model_select\", () => ({\n\t\t\ttype: \"before_model_select\" as const,\n\t\t\t...event,\n\t\t} satisfies BeforeModelSelectEvent), (handlerResult) => {\n\t\t\tif (handlerResult) {\n\t\t\t\tresult = handlerResult as BeforeModelSelectResult;\n\t\t\t\treturn { done: true }; // first override wins\n\t\t\t}\n\t\t\treturn { done: false };\n\t\t});\n\t\treturn result;\n\t}\n\n\tasync emitAdjustToolSet(event: Omit<AdjustToolSetEvent, \"type\">): Promise<AdjustToolSetResult | undefined> {\n\t\tlet result: AdjustToolSetResult | undefined;\n\t\tawait this.invokeHandlers(\"adjust_tool_set\", () => ({\n\t\t\ttype: \"adjust_tool_set\" as const,\n\t\t\t...event,\n\t\t} satisfies AdjustToolSetEvent), (handlerResult) => {\n\t\t\tif (handlerResult) {\n\t\t\t\tresult = handlerResult as AdjustToolSetResult;\n\t\t\t\treturn { done: true }; // first override wins\n\t\t\t}\n\t\t\treturn { done: false };\n\t\t});\n\t\treturn result;\n\t}\n\n\tasync emitBeforeAgentStart(\n\t\tprompt: string,\n\t\timages: ImageContent[] | undefined,\n\t\tsystemPrompt: string,\n\t): Promise<BeforeAgentStartCombinedResult | undefined> {\n\t\tconst messages: NonNullable<BeforeAgentStartEventResult[\"message\"]>[] = [];\n\t\tlet currentSystemPrompt = systemPrompt;\n\t\tlet systemPromptModified = false;\n\n\t\tawait this.invokeHandlers(\"before_agent_start\", () => ({\n\t\t\ttype: \"before_agent_start\",\n\t\t\tprompt,\n\t\t\timages,\n\t\t\tsystemPrompt: currentSystemPrompt,\n\t\t} satisfies BeforeAgentStartEvent), (handlerResult) => {\n\t\t\tif (handlerResult) {\n\t\t\t\tconst r = handlerResult as BeforeAgentStartEventResult;\n\t\t\t\tif (r.message) messages.push(r.message);\n\t\t\t\tif (r.systemPrompt !== undefined) {\n\t\t\t\t\tcurrentSystemPrompt = r.systemPrompt;\n\t\t\t\t\tsystemPromptModified = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { done: false };\n\t\t});\n\n\t\tif (messages.length > 0 || systemPromptModified) {\n\t\t\treturn {\n\t\t\t\tmessages: messages.length > 0 ? messages : undefined,\n\t\t\t\tsystemPrompt: systemPromptModified ? currentSystemPrompt : undefined,\n\t\t\t};\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tasync emitResourcesDiscover(\n\t\tcwd: string,\n\t\treason: ResourcesDiscoverEvent[\"reason\"],\n\t): Promise<{\n\t\tskillPaths: Array<{ path: string; extensionPath: string }>;\n\t\tpromptPaths: Array<{ path: string; extensionPath: string }>;\n\t\tthemePaths: Array<{ path: string; extensionPath: string }>;\n\t}> {\n\t\tconst skillPaths: Array<{ path: string; extensionPath: string }> = [];\n\t\tconst promptPaths: Array<{ path: string; extensionPath: string }> = [];\n\t\tconst themePaths: Array<{ path: string; extensionPath: string }> = [];\n\n\t\tawait this.invokeHandlers(\"resources_discover\", () => ({\n\t\t\ttype: \"resources_discover\",\n\t\t\tcwd,\n\t\t\treason,\n\t\t} satisfies ResourcesDiscoverEvent), (handlerResult, extensionPath) => {\n\t\t\tconst r = handlerResult as ResourcesDiscoverResult | undefined;\n\t\t\tif (r?.skillPaths?.length) skillPaths.push(...r.skillPaths.map((path) => ({ path, extensionPath })));\n\t\t\tif (r?.promptPaths?.length) promptPaths.push(...r.promptPaths.map((path) => ({ path, extensionPath })));\n\t\t\tif (r?.themePaths?.length) themePaths.push(...r.themePaths.map((path) => ({ path, extensionPath })));\n\t\t\treturn { done: false };\n\t\t});\n\n\t\treturn { skillPaths, promptPaths, themePaths };\n\t}\n\n\t/** Emit input event. Transforms chain, \"handled\" short-circuits. */\n\tasync emitInput(text: string, images: ImageContent[] | undefined, source: InputSource): Promise<InputEventResult> {\n\t\tlet currentText = text;\n\t\tlet currentImages = images;\n\t\tlet handled: InputEventResult | undefined;\n\n\t\tawait this.invokeHandlers(\"input\", () => ({\n\t\t\ttype: \"input\",\n\t\t\ttext: currentText,\n\t\t\timages: currentImages,\n\t\t\tsource,\n\t\t} satisfies InputEvent), (handlerResult) => {\n\t\t\tconst r = handlerResult as InputEventResult | undefined;\n\t\t\tif (r?.action === \"handled\") {\n\t\t\t\thandled = r;\n\t\t\t\treturn { done: true };\n\t\t\t}\n\t\t\tif (r?.action === \"transform\") {\n\t\t\t\tcurrentText = r.text;\n\t\t\t\tcurrentImages = r.images ?? currentImages;\n\t\t\t}\n\t\t\treturn { done: false };\n\t\t});\n\n\t\tif (handled) return handled;\n\t\treturn currentText !== text || currentImages !== images\n\t\t\t? { action: \"transform\", text: currentText, images: currentImages }\n\t\t\t: { action: \"continue\" };\n\t}\n\n\t// =========================================================================\n\t// Layer 2 event emitters (notification, stop, session_end, git, verify,\n\t// budget, milestone / unit). Fire-and-observe except where a handler result\n\t// can veto or rewrite the pending action.\n\t// =========================================================================\n\n\tasync emitStop(event: Omit<StopEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"stop\",\n\t\t\t() => ({ type: \"stop\" as const, ...event } satisfies StopEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n\n\tasync emitNotification(event: Omit<NotificationEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"notification\",\n\t\t\t() => ({ type: \"notification\" as const, ...event } satisfies NotificationEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n\n\tasync emitSessionEnd(event: Omit<SessionEndEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"session_end\",\n\t\t\t() => ({ type: \"session_end\" as const, ...event } satisfies SessionEndEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n\n\tasync emitBeforeCommit(\n\t\tevent: Omit<BeforeCommitEvent, \"type\">,\n\t): Promise<BeforeCommitEventResult | undefined> {\n\t\tlet result: BeforeCommitEventResult | undefined;\n\t\tlet message = event.message;\n\t\tawait this.invokeHandlers(\n\t\t\t\"before_commit\",\n\t\t\t() => ({ type: \"before_commit\" as const, ...event, message } satisfies BeforeCommitEvent),\n\t\t\t(handlerResult) => {\n\t\t\t\tconst r = handlerResult as BeforeCommitEventResult | undefined;\n\t\t\t\tif (!r) return { done: false };\n\t\t\t\tif (r.cancel) {\n\t\t\t\t\tresult = { cancel: true, reason: r.reason };\n\t\t\t\t\treturn { done: true };\n\t\t\t\t}\n\t\t\t\tif (r.message !== undefined) {\n\t\t\t\t\tmessage = r.message;\n\t\t\t\t\tresult = { ...(result ?? {}), message };\n\t\t\t\t}\n\t\t\t\treturn { done: false };\n\t\t\t},\n\t\t);\n\t\treturn result;\n\t}\n\n\tasync emitCommit(event: Omit<CommitEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"commit\",\n\t\t\t() => ({ type: \"commit\" as const, ...event } satisfies CommitEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n\n\tasync emitBeforePush(\n\t\tevent: Omit<BeforePushEvent, \"type\">,\n\t): Promise<BeforePushEventResult | undefined> {\n\t\tlet result: BeforePushEventResult | undefined;\n\t\tawait this.invokeHandlers(\n\t\t\t\"before_push\",\n\t\t\t() => ({ type: \"before_push\" as const, ...event } satisfies BeforePushEvent),\n\t\t\t(handlerResult) => {\n\t\t\t\tconst r = handlerResult as BeforePushEventResult | undefined;\n\t\t\t\tif (r?.cancel) {\n\t\t\t\t\tresult = r;\n\t\t\t\t\treturn { done: true };\n\t\t\t\t}\n\t\t\t\treturn { done: false };\n\t\t\t},\n\t\t);\n\t\treturn result;\n\t}\n\n\tasync emitPush(event: Omit<PushEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"push\",\n\t\t\t() => ({ type: \"push\" as const, ...event } satisfies PushEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n\n\tasync emitBeforePr(\n\t\tevent: Omit<BeforePrEvent, \"type\">,\n\t): Promise<BeforePrEventResult | undefined> {\n\t\tlet result: BeforePrEventResult | undefined;\n\t\tlet title = event.title;\n\t\tlet body = event.body;\n\t\tawait this.invokeHandlers(\n\t\t\t\"before_pr\",\n\t\t\t() => ({ type: \"before_pr\" as const, ...event, title, body } satisfies BeforePrEvent),\n\t\t\t(handlerResult) => {\n\t\t\t\tconst r = handlerResult as BeforePrEventResult | undefined;\n\t\t\t\tif (!r) return { done: false };\n\t\t\t\tif (r.cancel) {\n\t\t\t\t\tresult = { cancel: true, reason: r.reason };\n\t\t\t\t\treturn { done: true };\n\t\t\t\t}\n\t\t\t\tif (r.title !== undefined) title = r.title;\n\t\t\t\tif (r.body !== undefined) body = r.body;\n\t\t\t\tif (r.title !== undefined || r.body !== undefined) {\n\t\t\t\t\tresult = { ...(result ?? {}), title, body };\n\t\t\t\t}\n\t\t\t\treturn { done: false };\n\t\t\t},\n\t\t);\n\t\treturn result;\n\t}\n\n\tasync emitPrOpened(event: Omit<PrOpenedEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"pr_opened\",\n\t\t\t() => ({ type: \"pr_opened\" as const, ...event } satisfies PrOpenedEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n\n\tasync emitBeforeVerify(\n\t\tevent: Omit<BeforeVerifyEvent, \"type\">,\n\t): Promise<BeforeVerifyEventResult | undefined> {\n\t\tlet result: BeforeVerifyEventResult | undefined;\n\t\tawait this.invokeHandlers(\n\t\t\t\"before_verify\",\n\t\t\t() => ({ type: \"before_verify\" as const, ...event } satisfies BeforeVerifyEvent),\n\t\t\t(handlerResult) => {\n\t\t\t\tconst r = handlerResult as BeforeVerifyEventResult | undefined;\n\t\t\t\tif (r?.cancel) {\n\t\t\t\t\tresult = r;\n\t\t\t\t\treturn { done: true };\n\t\t\t\t}\n\t\t\t\treturn { done: false };\n\t\t\t},\n\t\t);\n\t\treturn result;\n\t}\n\n\tasync emitVerifyResult(event: Omit<VerifyResultEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"verify_result\",\n\t\t\t() => ({ type: \"verify_result\" as const, ...event } satisfies VerifyResultEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n\n\tasync emitBudgetThreshold(\n\t\tevent: Omit<BudgetThresholdEvent, \"type\">,\n\t): Promise<BudgetThresholdEventResult | undefined> {\n\t\tlet result: BudgetThresholdEventResult | undefined;\n\t\tawait this.invokeHandlers(\n\t\t\t\"budget_threshold\",\n\t\t\t() => ({ type: \"budget_threshold\" as const, ...event } satisfies BudgetThresholdEvent),\n\t\t\t(handlerResult) => {\n\t\t\t\tconst r = handlerResult as BudgetThresholdEventResult | undefined;\n\t\t\t\tif (r?.action) {\n\t\t\t\t\tresult = r;\n\t\t\t\t\treturn { done: true };\n\t\t\t\t}\n\t\t\t\treturn { done: false };\n\t\t\t},\n\t\t);\n\t\treturn result;\n\t}\n\n\tasync emitMilestoneStart(event: Omit<MilestoneStartEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"milestone_start\",\n\t\t\t() => ({ type: \"milestone_start\" as const, ...event } satisfies MilestoneStartEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n\n\tasync emitMilestoneEnd(event: Omit<MilestoneEndEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"milestone_end\",\n\t\t\t() => ({ type: \"milestone_end\" as const, ...event } satisfies MilestoneEndEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n\n\tasync emitUnitStart(event: Omit<UnitStartEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"unit_start\",\n\t\t\t() => ({ type: \"unit_start\" as const, ...event } satisfies UnitStartEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n\n\tasync emitUnitEnd(event: Omit<UnitEndEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"unit_end\",\n\t\t\t() => ({ type: \"unit_end\" as const, ...event } satisfies UnitEndEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n}\n\n/** Helper re-export for callers wiring verification failures. */\nexport type { VerifyFailure };\n"]}
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/core/extensions/runner.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Extension runner - executes extensions and manages their lifecycle.\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { AgentMessage } from \"@otto/pi-agent-core\";\nimport type { ImageContent, Model } from \"@otto/pi-ai\";\nimport type { KeyId } from \"@otto/pi-tui\";\nimport { COMMAND_NAMESPACE } from \"../../config.js\";\nimport { type Theme, theme } from \"../../modes/interactive/theme/theme.js\";\nimport type { ResourceDiagnostic } from \"../diagnostics.js\";\nimport type { KeyAction, KeybindingsConfig } from \"../keybindings.js\";\nimport type { ModelRegistry } from \"../model-registry.js\";\nimport type { SessionManager } from \"../session-manager.js\";\nimport type {\n\tAdjustToolSetEvent,\n\tAdjustToolSetResult,\n\tBeforeAgentStartEvent,\n\tBeforeAgentStartEventResult,\n\tBeforeCommitEvent,\n\tBeforeCommitEventResult,\n\tBeforeModelSelectEvent,\n\tBeforeModelSelectResult,\n\tBeforePrEvent,\n\tBeforePrEventResult,\n\tBeforeProviderRequestEvent,\n\tBeforePushEvent,\n\tBeforePushEventResult,\n\tBeforeVerifyEvent,\n\tBeforeVerifyEventResult,\n\tBudgetThresholdEvent,\n\tBudgetThresholdEventResult,\n\tCommitEvent,\n\tCompactOptions,\n\tContextEvent,\n\tContextEventResult,\n\tContextUsage,\n\tExtension,\n\tExtensionActions,\n\tExtensionCommandContext,\n\tExtensionCommandContextActions,\n\tExtensionContext,\n\tExtensionContextActions,\n\tExtensionError,\n\tExtensionEvent,\n\tExtensionFlag,\n\tExtensionRuntime,\n\tExtensionShortcut,\n\tExtensionUIContext,\n\tInputEvent,\n\tInputEventResult,\n\tInputSource,\n\tMessageRenderer,\n\tMilestoneEndEvent,\n\tMilestoneStartEvent,\n\tNotificationEvent,\n\tPrOpenedEvent,\n\tPushEvent,\n\tRegisteredCommand,\n\tRegisteredTool,\n\tResourcesDiscoverEvent,\n\tResourcesDiscoverResult,\n\tSessionBeforeCompactResult,\n\tSessionBeforeForkResult,\n\tSessionBeforeSwitchResult,\n\tSessionBeforeTreeResult,\n\tSessionEndEvent,\n\tStopEvent,\n\tToolCallEvent,\n\tToolCallEventResult,\n\tToolResultEvent,\n\tToolResultEventResult,\n\tUnitEndEvent,\n\tUnitStartEvent,\n\tUserBashEvent,\n\tUserBashEventResult,\n\tVerifyFailure,\n\tVerifyResultEvent,\n} from \"./types.js\";\n\n// Keybindings for these actions cannot be overridden by extensions\nconst RESERVED_ACTIONS_FOR_EXTENSION_CONFLICTS: ReadonlyArray<KeyAction> = [\n\t\"interrupt\",\n\t\"clear\",\n\t\"exit\",\n\t\"suspend\",\n\t\"cycleThinkingLevel\",\n\t\"cycleModelForward\",\n\t\"cycleModelBackward\",\n\t\"selectModel\",\n\t\"expandTools\",\n\t\"toggleThinking\",\n\t\"externalEditor\",\n\t\"followUp\",\n\t\"submit\",\n\t\"selectConfirm\",\n\t\"selectCancel\",\n\t\"copy\",\n\t\"deleteToLineEnd\",\n];\n\ntype BuiltInKeyBindings = Partial<Record<KeyId, { action: KeyAction; restrictOverride: boolean }>>;\n\nconst buildBuiltinKeybindings = (effectiveKeybindings: Required<KeybindingsConfig>): BuiltInKeyBindings => {\n\tconst builtinKeybindings = {} as BuiltInKeyBindings;\n\tfor (const [action, keys] of Object.entries(effectiveKeybindings)) {\n\t\tconst keyAction = action as KeyAction;\n\t\tconst keyList = Array.isArray(keys) ? keys : [keys];\n\t\tconst restrictOverride = RESERVED_ACTIONS_FOR_EXTENSION_CONFLICTS.includes(keyAction);\n\t\tfor (const key of keyList) {\n\t\t\tconst normalizedKey = key.toLowerCase() as KeyId;\n\t\t\tbuiltinKeybindings[normalizedKey] = {\n\t\t\t\taction: keyAction,\n\t\t\t\trestrictOverride: restrictOverride,\n\t\t\t};\n\t\t}\n\t}\n\treturn builtinKeybindings;\n};\n\nconst PROTECTED_EXTENSION_COMMANDS = new Set([COMMAND_NAMESPACE]);\n\nfunction isProtectedCommandOwner(commandName: string, extensionPath: string): boolean {\n\tif (!PROTECTED_EXTENSION_COMMANDS.has(commandName)) return false;\n\tconst normalized = extensionPath.replace(/\\\\/g, \"/\");\n\treturn /\\/extensions\\/workflow\\/(?:index\\.[cm]?[jt]s|dist\\/.*)$/.test(normalized)\n\t\t|| /\\/extensions\\/workflow\\/?$/.test(normalized);\n}\n\n/** Combined result from all before_agent_start handlers */\ninterface BeforeAgentStartCombinedResult {\n\tmessages?: NonNullable<BeforeAgentStartEventResult[\"message\"]>[];\n\tsystemPrompt?: string;\n}\n\n/**\n * Events handled by the generic emit() method.\n * Events with dedicated emitXxx() methods are excluded for stronger type safety.\n */\ntype RunnerEmitEvent = Exclude<\n\tExtensionEvent,\n\t| ToolCallEvent\n\t| ToolResultEvent\n\t| UserBashEvent\n\t| ContextEvent\n\t| BeforeProviderRequestEvent\n\t| BeforeAgentStartEvent\n\t| ResourcesDiscoverEvent\n\t| InputEvent\n>;\n\ntype SessionBeforeEvent = Extract<\n\tRunnerEmitEvent,\n\t{ type: \"session_before_switch\" | \"session_before_fork\" | \"session_before_compact\" | \"session_before_tree\" }\n>;\n\ntype SessionBeforeEventResult =\n\t| SessionBeforeSwitchResult\n\t| SessionBeforeForkResult\n\t| SessionBeforeCompactResult\n\t| SessionBeforeTreeResult;\n\ntype RunnerEmitResult<TEvent extends RunnerEmitEvent> = TEvent extends { type: \"session_before_switch\" }\n\t? SessionBeforeSwitchResult | undefined\n\t: TEvent extends { type: \"session_before_fork\" }\n\t\t? SessionBeforeForkResult | undefined\n\t\t: TEvent extends { type: \"session_before_compact\" }\n\t\t\t? SessionBeforeCompactResult | undefined\n\t\t\t: TEvent extends { type: \"session_before_tree\" }\n\t\t\t\t? SessionBeforeTreeResult | undefined\n\t\t\t\t: undefined;\n\nexport type ExtensionErrorListener = (error: ExtensionError) => void;\n\nexport type NewSessionHandler = (options?: {\n\tparentSession?: string;\n\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t/** Explicit workspace root for the new session/tool runtime. */\n\tworkspaceRoot?: string;\n\t/** See ExtensionCommandContext.newSession for docs (#3731). */\n\tabortSignal?: AbortSignal;\n}) => Promise<{ cancelled: boolean }>;\n\nexport type ForkHandler = (entryId: string) => Promise<{ cancelled: boolean }>;\n\nexport type NavigateTreeHandler = (\n\ttargetId: string,\n\toptions?: { summarize?: boolean; customInstructions?: string; replaceInstructions?: boolean; label?: string },\n) => Promise<{ cancelled: boolean }>;\n\nexport type SwitchSessionHandler = (sessionPath: string) => Promise<{ cancelled: boolean }>;\n\nexport type ReloadHandler = () => Promise<void>;\n\nexport type ShutdownHandler = () => void;\n\n\nconst noOpUIContext: ExtensionUIContext = {\n\tselect: async () => undefined,\n\tconfirm: async () => false,\n\tinput: async () => undefined,\n\tnotify: () => {},\n\tonTerminalInput: () => () => {},\n\tsetStatus: () => {},\n\tsetWorkingMessage: () => {},\n\tsetWidget: () => {},\n\tsetFooter: () => {},\n\tsetHeader: () => {},\n\tsetTitle: () => {},\n\tcustom: async () => undefined as never,\n\tpasteToEditor: () => {},\n\tsetEditorText: () => {},\n\tgetEditorText: () => \"\",\n\teditor: async () => undefined,\n\tsetEditorComponent: () => {},\n\tget theme() {\n\t\treturn theme;\n\t},\n\tgetAllThemes: () => [],\n\tgetTheme: () => undefined,\n\tsetTheme: (_theme: string | Theme) => ({ success: false, error: \"UI not available\" }),\n\tgetToolsExpanded: () => false,\n\tsetToolsExpanded: () => {},\n};\n\n// Async context flag: true when the current async stack originates inside a\n// quiet extension's handler invocation. Read by the patched console methods to\n// decide whether to suppress output. Empty store = normal logging behaviour.\nconst quietExtensionContext = new AsyncLocalStorage<boolean>();\n\nlet quietConsolePatchInstalled = false;\n\n/**\n * Patch `console.log/warn/error/info` to no-op when the current async context\n * is flagged as \"quiet\". Installed once on first `setQuietExtensions(non-empty)`\n * call so users who never configure quietExtensions pay zero overhead.\n *\n * The check is `quietExtensionContext.getStore() === true` — for any code path\n * that wasn't dispatched inside `quietExtensionContext.run(true, …)` the store\n * is undefined and console behaves exactly as before. This isolates the\n * suppression to the quiet handler's own async work without affecting\n * concurrent non-quiet handlers.\n */\nfunction installQuietConsolePatch(): void {\n\tif (quietConsolePatchInstalled) return;\n\tquietConsolePatchInstalled = true;\n\tconst realLog = console.log.bind(console);\n\tconst realWarn = console.warn.bind(console);\n\tconst realError = console.error.bind(console);\n\tconst realInfo = console.info.bind(console);\n\tconsole.log = (...args: unknown[]): void => {\n\t\tif (quietExtensionContext.getStore() === true) return;\n\t\trealLog(...args);\n\t};\n\tconsole.warn = (...args: unknown[]): void => {\n\t\tif (quietExtensionContext.getStore() === true) return;\n\t\trealWarn(...args);\n\t};\n\tconsole.error = (...args: unknown[]): void => {\n\t\tif (quietExtensionContext.getStore() === true) return;\n\t\trealError(...args);\n\t};\n\tconsole.info = (...args: unknown[]): void => {\n\t\tif (quietExtensionContext.getStore() === true) return;\n\t\trealInfo(...args);\n\t};\n}\n\nexport class ExtensionRunner {\n\tprivate extensions: Extension[];\n\tprivate runtime: ExtensionRuntime;\n\tprivate uiContext: ExtensionUIContext;\n\tprivate cwd: string;\n\tprivate sessionManager: SessionManager;\n\tprivate modelRegistry: ModelRegistry;\n\tprivate errorListeners: Set<ExtensionErrorListener> = new Set();\n\tprivate getModel: () => Model<any> | undefined = () => undefined;\n\tprivate isIdleFn: () => boolean = () => true;\n\tprivate waitForIdleFn: () => Promise<void> = async () => {};\n\tprivate abortFn: () => void = () => {};\n\tprivate hasPendingMessagesFn: () => boolean = () => false;\n\tprivate getContextUsageFn: () => ContextUsage | undefined = () => undefined;\n\tprivate compactFn: (options?: CompactOptions) => void = () => {};\n\tprivate getSystemPromptFn: () => string = () => \"\";\n\tprivate setCompactionThresholdOverrideFn: (percent: number | undefined) => void = () => {};\n\tprivate newSessionHandler: NewSessionHandler = async () => {\n\t\tthrow new Error(\"Command context not yet bound: newSession is unavailable during early lifecycle\");\n\t};\n\tprivate forkHandler: ForkHandler = async () => {\n\t\tthrow new Error(\"Command context not yet bound: fork is unavailable during early lifecycle\");\n\t};\n\tprivate navigateTreeHandler: NavigateTreeHandler = async () => {\n\t\tthrow new Error(\"Command context not yet bound: navigateTree is unavailable during early lifecycle\");\n\t};\n\tprivate switchSessionHandler: SwitchSessionHandler = async () => {\n\t\tthrow new Error(\"Command context not yet bound: switchSession is unavailable during early lifecycle\");\n\t};\n\tprivate reloadHandler: ReloadHandler = async () => {\n\t\tthrow new Error(\"Command context not yet bound: reload is unavailable during early lifecycle\");\n\t};\n\tprivate shutdownHandler: ShutdownHandler = () => {};\n\tprivate shortcutDiagnostics: ResourceDiagnostic[] = [];\n\tprivate commandDiagnostics: ResourceDiagnostic[] = [];\n\t/** Case-insensitive substring patterns matched against ext.path. ui.notify is dropped for matches. */\n\tprivate quietExtensionPatterns: string[] = [];\n\n\tconstructor(\n\t\textensions: Extension[],\n\t\truntime: ExtensionRuntime,\n\t\tcwd: string,\n\t\tsessionManager: SessionManager,\n\t\tmodelRegistry: ModelRegistry,\n\t) {\n\t\tthis.extensions = extensions;\n\t\tthis.runtime = runtime;\n\t\tthis.uiContext = noOpUIContext;\n\t\tthis.cwd = cwd;\n\t\tthis.sessionManager = sessionManager;\n\t\tthis.modelRegistry = modelRegistry;\n\t\t// Bind emit methods into the shared runtime so createExtensionAPI can delegate to them.\n\t\tthis.runtime.emitBeforeModelSelect = (event) => this.emitBeforeModelSelect(event);\n\t\tthis.runtime.emitAdjustToolSet = (event) => this.emitAdjustToolSet(event);\n\t\tthis.runtime.emitExtensionEvent = (event) => this.emitExtensionEventDynamic(event);\n\t}\n\n\tprivate currentCwd(): string {\n\t\treturn this.cwd;\n\t}\n\n\t/**\n\t * Dispatch an ExtensionEvent by type. Used by extensions to emit the\n\t * post-plan Layer 2 events (git lifecycle, verify, budget, milestone,\n\t * unit, notification, stop, session_end) without a bespoke method per\n\t * type. Returns the handler chain's aggregate result where meaningful.\n\t */\n\tprivate async emitExtensionEventDynamic(event: ExtensionEvent): Promise<unknown> {\n\t\tswitch (event.type) {\n\t\t\tcase \"notification\":\n\t\t\t\treturn this.emitNotification({ kind: event.kind, message: event.message, details: event.details });\n\t\t\tcase \"stop\":\n\t\t\t\treturn this.emitStop({ reason: event.reason, lastMessage: event.lastMessage });\n\t\t\tcase \"session_end\":\n\t\t\t\treturn this.emitSessionEnd({ reason: event.reason, sessionFile: event.sessionFile });\n\t\t\tcase \"before_commit\":\n\t\t\t\treturn this.emitBeforeCommit({\n\t\t\t\t\tmessage: event.message,\n\t\t\t\t\tfiles: event.files,\n\t\t\t\t\tcwd: event.cwd,\n\t\t\t\t\tauthor: event.author,\n\t\t\t\t});\n\t\t\tcase \"commit\":\n\t\t\t\treturn this.emitCommit({ sha: event.sha, message: event.message, files: event.files, cwd: event.cwd });\n\t\t\tcase \"before_push\":\n\t\t\t\treturn this.emitBeforePush({ remote: event.remote, branch: event.branch, cwd: event.cwd });\n\t\t\tcase \"push\":\n\t\t\t\treturn this.emitPush({ remote: event.remote, branch: event.branch, cwd: event.cwd });\n\t\t\tcase \"before_pr\":\n\t\t\t\treturn this.emitBeforePr({\n\t\t\t\t\tbranch: event.branch,\n\t\t\t\t\ttargetBranch: event.targetBranch,\n\t\t\t\t\ttitle: event.title,\n\t\t\t\t\tbody: event.body,\n\t\t\t\t\tcwd: event.cwd,\n\t\t\t\t});\n\t\t\tcase \"pr_opened\":\n\t\t\t\treturn this.emitPrOpened({\n\t\t\t\t\turl: event.url,\n\t\t\t\t\tbranch: event.branch,\n\t\t\t\t\ttargetBranch: event.targetBranch,\n\t\t\t\t\tcwd: event.cwd,\n\t\t\t\t});\n\t\t\tcase \"before_verify\":\n\t\t\t\treturn this.emitBeforeVerify({ unitType: event.unitType, unitId: event.unitId, cwd: event.cwd });\n\t\t\tcase \"verify_result\":\n\t\t\t\treturn this.emitVerifyResult({\n\t\t\t\t\tpassed: event.passed,\n\t\t\t\t\tfailures: event.failures,\n\t\t\t\t\tunitType: event.unitType,\n\t\t\t\t\tunitId: event.unitId,\n\t\t\t\t\tcwd: event.cwd,\n\t\t\t\t});\n\t\t\tcase \"budget_threshold\":\n\t\t\t\treturn this.emitBudgetThreshold({\n\t\t\t\t\tfraction: event.fraction,\n\t\t\t\t\tspent: event.spent,\n\t\t\t\t\tlimit: event.limit,\n\t\t\t\t\tcurrency: event.currency,\n\t\t\t\t});\n\t\t\tcase \"milestone_start\":\n\t\t\t\treturn this.emitMilestoneStart({ milestoneId: event.milestoneId, title: event.title, cwd: event.cwd });\n\t\t\tcase \"milestone_end\":\n\t\t\t\treturn this.emitMilestoneEnd({\n\t\t\t\t\tmilestoneId: event.milestoneId,\n\t\t\t\t\tstatus: event.status,\n\t\t\t\t\tcwd: event.cwd,\n\t\t\t\t});\n\t\t\tcase \"unit_start\":\n\t\t\t\treturn this.emitUnitStart({\n\t\t\t\t\tunitType: event.unitType,\n\t\t\t\t\tunitId: event.unitId,\n\t\t\t\t\tmilestoneId: event.milestoneId,\n\t\t\t\t\tcwd: event.cwd,\n\t\t\t\t});\n\t\t\tcase \"unit_end\":\n\t\t\t\treturn this.emitUnitEnd({\n\t\t\t\t\tunitType: event.unitType,\n\t\t\t\t\tunitId: event.unitId,\n\t\t\t\t\tmilestoneId: event.milestoneId,\n\t\t\t\t\tstatus: event.status,\n\t\t\t\t\tcwd: event.cwd,\n\t\t\t\t});\n\t\t\tdefault:\n\t\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Install a synthetic \"extension\" that only provides event handlers.\n\t * Used by the Layer 0 hooks-runner to bridge shell hooks onto the\n\t * extension event bus without requiring a full extension module. The\n\t * returned disposer removes the synthetic extension.\n\t */\n\tinstallHookBridge(\n\t\tpath: string,\n\t\thandlers: Map<string, Array<(event: unknown, ctx: unknown) => Promise<unknown>>>,\n\t): () => void {\n\t\tconst synthetic: Extension = {\n\t\t\tpath,\n\t\t\tresolvedPath: path,\n\t\t\thandlers: handlers as unknown as Extension[\"handlers\"],\n\t\t\ttools: new Map(),\n\t\t\tmessageRenderers: new Map(),\n\t\t\tcommands: new Map(),\n\t\t\tflags: new Map(),\n\t\t\tshortcuts: new Map(),\n\t\t\tlifecycleHooks: {\n\t\t\t\tbeforeInstall: [],\n\t\t\t\tafterInstall: [],\n\t\t\t\tbeforeRemove: [],\n\t\t\t\tafterRemove: [],\n\t\t\t},\n\t\t};\n\t\tthis.extensions.push(synthetic);\n\t\treturn () => {\n\t\t\tconst index = this.extensions.indexOf(synthetic);\n\t\t\tif (index >= 0) this.extensions.splice(index, 1);\n\t\t};\n\t}\n\n\tbindCore(actions: ExtensionActions, contextActions: ExtensionContextActions): void {\n\t\t// Copy actions into the shared runtime (all extension APIs reference this)\n\t\tthis.runtime.sendMessage = actions.sendMessage;\n\t\tthis.runtime.sendUserMessage = actions.sendUserMessage;\n\t\tthis.runtime.retryLastTurn = actions.retryLastTurn;\n\t\tthis.runtime.appendEntry = actions.appendEntry;\n\t\tthis.runtime.setSessionName = actions.setSessionName;\n\t\tthis.runtime.getSessionName = actions.getSessionName;\n\t\tthis.runtime.setLabel = actions.setLabel;\n\t\tthis.runtime.getActiveTools = actions.getActiveTools;\n\t\tthis.runtime.getAllTools = actions.getAllTools;\n\t\tthis.runtime.setActiveTools = actions.setActiveTools;\n\t\tthis.runtime.getVisibleSkills = actions.getVisibleSkills;\n\t\tthis.runtime.setVisibleSkills = actions.setVisibleSkills;\n\t\tthis.runtime.refreshTools = actions.refreshTools;\n\t\tthis.runtime.getCommands = actions.getCommands;\n\t\tthis.runtime.setModel = actions.setModel;\n\t\tthis.runtime.getThinkingLevel = actions.getThinkingLevel;\n\t\tthis.runtime.setThinkingLevel = actions.setThinkingLevel;\n\n\t\t// Context actions (required)\n\t\tthis.getModel = contextActions.getModel;\n\t\tthis.isIdleFn = contextActions.isIdle;\n\t\tthis.abortFn = contextActions.abort;\n\t\tthis.hasPendingMessagesFn = contextActions.hasPendingMessages;\n\t\tthis.shutdownHandler = contextActions.shutdown;\n\t\tthis.getContextUsageFn = contextActions.getContextUsage;\n\t\tthis.compactFn = contextActions.compact;\n\t\tthis.getSystemPromptFn = contextActions.getSystemPrompt;\n\t\tthis.setCompactionThresholdOverrideFn = contextActions.setCompactionThresholdOverride;\n\n\t\t// Flush provider registrations queued during extension loading\n\t\tfor (const { name, config } of this.runtime.pendingProviderRegistrations) {\n\t\t\tthis.modelRegistry.registerProvider(name, config);\n\t\t}\n\t\tthis.runtime.pendingProviderRegistrations = [];\n\n\t\t// From this point on, provider registration/unregistration takes effect immediately\n\t\t// without requiring a /reload.\n\t\tthis.runtime.registerProvider = (name, config) => this.modelRegistry.registerProvider(name, config);\n\t\tthis.runtime.unregisterProvider = (name) => this.modelRegistry.unregisterProvider(name);\n\t}\n\n\tbindCommandContext(actions?: ExtensionCommandContextActions): void {\n\t\tif (actions) {\n\t\t\tthis.waitForIdleFn = actions.waitForIdle;\n\t\t\tthis.newSessionHandler = actions.newSession;\n\t\t\tthis.forkHandler = actions.fork;\n\t\t\tthis.navigateTreeHandler = actions.navigateTree;\n\t\t\tthis.switchSessionHandler = actions.switchSession;\n\t\t\tthis.reloadHandler = actions.reload;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.waitForIdleFn = async () => {};\n\t\tthis.newSessionHandler = async () => ({ cancelled: false });\n\t\tthis.forkHandler = async () => ({ cancelled: false });\n\t\tthis.navigateTreeHandler = async () => ({ cancelled: false });\n\t\tthis.switchSessionHandler = async () => ({ cancelled: false });\n\t\tthis.reloadHandler = async () => {};\n\t}\n\n\tsetUIContext(uiContext?: ExtensionUIContext): void {\n\t\tthis.uiContext = uiContext ?? noOpUIContext;\n\t}\n\n\tgetUIContext(): ExtensionUIContext {\n\t\treturn this.uiContext;\n\t}\n\n\thasUI(): boolean {\n\t\treturn this.uiContext !== noOpUIContext;\n\t}\n\n\tgetExtensionPaths(): string[] {\n\t\treturn this.extensions.map((e) => e.path);\n\t}\n\n\t/** Get all registered tools from all extensions (first registration per name wins). */\n\tgetAllRegisteredTools(): RegisteredTool[] {\n\t\tconst toolsByName = new Map<string, RegisteredTool>();\n\t\tfor (const ext of this.extensions) {\n\t\t\tfor (const tool of ext.tools.values()) {\n\t\t\t\tif (!toolsByName.has(tool.definition.name)) {\n\t\t\t\t\ttoolsByName.set(tool.definition.name, tool);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn Array.from(toolsByName.values());\n\t}\n\n\t/** Get a tool definition by name. Returns undefined if not found. */\n\tgetToolDefinition(toolName: string): RegisteredTool[\"definition\"] | undefined {\n\t\tfor (const ext of this.extensions) {\n\t\t\tconst tool = ext.tools.get(toolName);\n\t\t\tif (tool) {\n\t\t\t\treturn tool.definition;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tgetFlags(): Map<string, ExtensionFlag> {\n\t\tconst allFlags = new Map<string, ExtensionFlag>();\n\t\tfor (const ext of this.extensions) {\n\t\t\tfor (const [name, flag] of ext.flags) {\n\t\t\t\tif (!allFlags.has(name)) {\n\t\t\t\t\tallFlags.set(name, flag);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn allFlags;\n\t}\n\n\tsetFlagValue(name: string, value: boolean | string): void {\n\t\tthis.runtime.flagValues.set(name, value);\n\t}\n\n\tgetFlagValues(): Map<string, boolean | string> {\n\t\treturn new Map(this.runtime.flagValues);\n\t}\n\n\tgetShortcuts(effectiveKeybindings: Required<KeybindingsConfig>): Map<KeyId, ExtensionShortcut> {\n\t\tthis.shortcutDiagnostics = [];\n\t\tconst builtinKeybindings = buildBuiltinKeybindings(effectiveKeybindings);\n\t\tconst extensionShortcuts = new Map<KeyId, ExtensionShortcut>();\n\n\t\tconst addDiagnostic = (message: string, extensionPath: string) => {\n\t\t\tthis.shortcutDiagnostics.push({ type: \"warning\", message, path: extensionPath });\n\t\t\tif (!this.hasUI()) {\n\t\t\t\tconsole.warn(message);\n\t\t\t}\n\t\t};\n\n\t\tfor (const ext of this.extensions) {\n\t\t\tfor (const [key, shortcut] of ext.shortcuts) {\n\t\t\t\tconst normalizedKey = key.toLowerCase() as KeyId;\n\n\t\t\t\tconst builtInKeybinding = builtinKeybindings[normalizedKey];\n\t\t\t\tif (builtInKeybinding?.restrictOverride === true) {\n\t\t\t\t\taddDiagnostic(\n\t\t\t\t\t\t`Extension shortcut '${key}' from ${shortcut.extensionPath} conflicts with built-in shortcut. Skipping.`,\n\t\t\t\t\t\tshortcut.extensionPath,\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (builtInKeybinding?.restrictOverride === false) {\n\t\t\t\t\taddDiagnostic(\n\t\t\t\t\t\t`Extension shortcut conflict: '${key}' is built-in shortcut for ${builtInKeybinding.action} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,\n\t\t\t\t\t\tshortcut.extensionPath,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst existingExtensionShortcut = extensionShortcuts.get(normalizedKey);\n\t\t\t\tif (existingExtensionShortcut) {\n\t\t\t\t\taddDiagnostic(\n\t\t\t\t\t\t`Extension shortcut conflict: '${key}' registered by both ${existingExtensionShortcut.extensionPath} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,\n\t\t\t\t\t\tshortcut.extensionPath,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\textensionShortcuts.set(normalizedKey, shortcut);\n\t\t\t}\n\t\t}\n\t\treturn extensionShortcuts;\n\t}\n\n\tgetShortcutDiagnostics(): ResourceDiagnostic[] {\n\t\treturn this.shortcutDiagnostics;\n\t}\n\n\tonError(listener: ExtensionErrorListener): () => void {\n\t\tthis.errorListeners.add(listener);\n\t\treturn () => this.errorListeners.delete(listener);\n\t}\n\n\temitError(error: ExtensionError): void {\n\t\tfor (const listener of this.errorListeners) {\n\t\t\tlistener(error);\n\t\t}\n\t}\n\n\thasHandlers(eventType: string): boolean {\n\t\tfor (const ext of this.extensions) {\n\t\t\tconst handlers = ext.handlers.get(eventType);\n\t\t\tif (handlers && handlers.length > 0) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tgetMessageRenderer(customType: string): MessageRenderer | undefined {\n\t\tfor (const ext of this.extensions) {\n\t\t\tconst renderer = ext.messageRenderers.get(customType);\n\t\t\tif (renderer) {\n\t\t\t\treturn renderer;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tgetRegisteredCommands(reserved?: Set<string>): RegisteredCommand[] {\n\t\tthis.commandDiagnostics = [];\n\n\t\tconst commands: RegisteredCommand[] = [];\n\t\tconst commandOwners = new Map<string, string>();\n\t\tconst protectedOwners = new Map<string, string>();\n\t\tfor (const ext of this.extensions) {\n\t\t\tfor (const command of ext.commands.values()) {\n\t\t\t\tif (isProtectedCommandOwner(command.name, ext.path)) {\n\t\t\t\t\tprotectedOwners.set(command.name, ext.path);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const ext of this.extensions) {\n\t\t\tfor (const command of ext.commands.values()) {\n\t\t\t\tif (reserved?.has(command.name)) {\n\t\t\t\t\tconst message = `Extension command '${command.name}' from ${ext.path} conflicts with built-in commands. Skipping.`;\n\t\t\t\t\tthis.commandDiagnostics.push({ type: \"warning\", message, path: ext.path });\n\t\t\t\t\tif (!this.hasUI()) {\n\t\t\t\t\t\tconsole.warn(message);\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst protectedOwner = protectedOwners.get(command.name);\n\t\t\t\tif (protectedOwner && protectedOwner !== ext.path) {\n\t\t\t\t\tconst message = `Extension command '${command.name}' from ${ext.path} conflicts with protected command owner ${protectedOwner}. Skipping.`;\n\t\t\t\t\tthis.commandDiagnostics.push({ type: \"warning\", message, path: ext.path });\n\t\t\t\t\tif (!this.hasUI()) {\n\t\t\t\t\t\tconsole.warn(message);\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst existingOwner = commandOwners.get(command.name);\n\t\t\t\tif (existingOwner) {\n\t\t\t\t\tconst message = `Extension command '${command.name}' from ${ext.path} conflicts with ${existingOwner}. Skipping.`;\n\t\t\t\t\tthis.commandDiagnostics.push({ type: \"warning\", message, path: ext.path });\n\t\t\t\t\tif (!this.hasUI()) {\n\t\t\t\t\t\tconsole.warn(message);\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tcommandOwners.set(command.name, ext.path);\n\t\t\t\tcommands.push(command);\n\t\t\t}\n\t\t}\n\t\treturn commands;\n\t}\n\n\tgetCommandDiagnostics(): ResourceDiagnostic[] {\n\t\treturn this.commandDiagnostics;\n\t}\n\n\tgetRegisteredCommandsWithPaths(): Array<{ command: RegisteredCommand; extensionPath: string }> {\n\t\tconst result: Array<{ command: RegisteredCommand; extensionPath: string }> = [];\n\t\tfor (const ext of this.extensions) {\n\t\t\tfor (const command of ext.commands.values()) {\n\t\t\t\tresult.push({ command, extensionPath: ext.path });\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tgetCommand(name: string): RegisteredCommand | undefined {\n\t\tlet protectedCommand: RegisteredCommand | undefined;\n\t\tfor (const ext of this.extensions) {\n\t\t\tconst command = ext.commands.get(name);\n\t\t\tif (command) {\n\t\t\t\tif (isProtectedCommandOwner(name, ext.path)) {\n\t\t\t\t\tprotectedCommand = command;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (PROTECTED_EXTENSION_COMMANDS.has(name)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\treturn command;\n\t\t\t}\n\t\t}\n\t\treturn protectedCommand;\n\t}\n\n\t/**\n\t * Request a graceful shutdown. Called by extension tools and event handlers.\n\t * The actual shutdown behavior is provided by the mode via bindExtensions().\n\t */\n\tshutdown(): void {\n\t\tthis.shutdownHandler();\n\t}\n\n\t/**\n\t * Create an ExtensionContext for use in event handlers and tool execution.\n\t * Context values are resolved at call time, so changes via bindCore/bindUI are reflected.\n\t */\n\tcreateContext(): ExtensionContext {\n\t\tconst getModel = this.getModel;\n\t\treturn {\n\t\t\tui: this.uiContext,\n\t\t\thasUI: this.hasUI(),\n\t\t\tcwd: this.currentCwd(),\n\t\t\tsessionManager: this.sessionManager,\n\t\t\tmodelRegistry: this.modelRegistry,\n\t\t\tget model() {\n\t\t\t\treturn getModel();\n\t\t\t},\n\t\t\tisIdle: () => this.isIdleFn(),\n\t\t\tabort: () => this.abortFn(),\n\t\t\thasPendingMessages: () => this.hasPendingMessagesFn(),\n\t\t\tshutdown: () => this.shutdownHandler(),\n\t\t\tgetContextUsage: () => this.getContextUsageFn(),\n\t\t\tcompact: (options) => this.compactFn(options),\n\t\t\tgetSystemPrompt: () => this.getSystemPromptFn(),\n\t\t\tsetCompactionThresholdOverride: (percent) => this.setCompactionThresholdOverrideFn(percent),\n\t\t};\n\t}\n\n\tprivate createEventContext(eventType: string): ExtensionContext {\n\t\treturn {\n\t\t\t...this.createContext(),\n\t\t\tshutdown: () => {\n\t\t\t\tthrow new Error(`Extension event '${eventType}' cannot request TUI shutdown`);\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate isShutdownGuardedEvent(eventType: string): boolean {\n\t\treturn eventType === \"agent_end\" || eventType === \"stop\" || eventType === \"session_end\";\n\t}\n\n\t/**\n\t * Replace the quiet-extensions allowlist. Each entry is a case-insensitive\n\t * substring matched against the extension's filesystem path. Matching\n\t * extensions have their `ui.notify` calls silently dropped AND their\n\t * `console.log/warn/error/info` calls silently dropped while the handler\n\t * is on the stack — useful for muting noisy session_start banners\n\t * (piolium uses ui.notify; pi-notion uses console.log).\n\t *\n\t * Console filtering uses AsyncLocalStorage so other extensions running\n\t * concurrently are unaffected — output is only suppressed when the call\n\t * originates inside a quiet extension's handler async context.\n\t */\n\tsetQuietExtensions(patterns: readonly string[]): void {\n\t\tthis.quietExtensionPatterns = patterns.map((p) => p.toLowerCase()).filter((p) => p.length > 0);\n\t\tif (this.quietExtensionPatterns.length > 0) {\n\t\t\tinstallQuietConsolePatch();\n\t\t}\n\t}\n\n\tprivate isQuietExtension(ext: Extension): boolean {\n\t\tif (this.quietExtensionPatterns.length === 0) return false;\n\t\tconst path = ext.path.toLowerCase();\n\t\treturn this.quietExtensionPatterns.some((p) => path.includes(p));\n\t}\n\n\tprivate withSilencedNotify(base: ExtensionContext): ExtensionContext {\n\t\t// Wraps the shared ui context so notify() is a no-op while every other\n\t\t// method (select/confirm/input/setStatus/setWidget/…) keeps working.\n\t\tconst silencedUi: ExtensionUIContext = {\n\t\t\t...base.ui,\n\t\t\tnotify: () => undefined,\n\t\t};\n\t\treturn { ...base, ui: silencedUi };\n\t}\n\n\tcreateCommandContext(): ExtensionCommandContext {\n\t\treturn {\n\t\t\t...this.createContext(),\n\t\t\twaitForIdle: () => this.waitForIdleFn(),\n\t\t\tnewSession: (options) => this.newSessionHandler(options),\n\t\t\tfork: (entryId) => this.forkHandler(entryId),\n\t\t\tnavigateTree: (targetId, options) => this.navigateTreeHandler(targetId, options),\n\t\t\tswitchSession: (sessionPath) => this.switchSessionHandler(sessionPath),\n\t\t\treload: () => this.reloadHandler(),\n\t\t};\n\t}\n\n\tprivate isSessionBeforeEvent(event: RunnerEmitEvent): event is SessionBeforeEvent {\n\t\treturn (\n\t\t\tevent.type === \"session_before_switch\" ||\n\t\t\tevent.type === \"session_before_fork\" ||\n\t\t\tevent.type === \"session_before_compact\" ||\n\t\t\tevent.type === \"session_before_tree\"\n\t\t);\n\t}\n\n\t/**\n\t * Shared handler invocation loop.\n\t *\n\t * Iterates every handler registered for `eventType` across all extensions,\n\t * calling each inside a try/catch that emits an ExtensionError on failure.\n\t *\n\t * `getEvent` builds the event object for each handler call — callers that\n\t * mutate state between calls (e.g. context, before_provider_request) supply\n\t * a function; callers with a fixed event can pass a constant.\n\t *\n\t * `processResult` receives each handler's return value and the owning\n\t * extension's path. It returns `{ done: true }` to short-circuit\n\t * or `{ done: false }` to keep iterating.\n\t */\n\tprivate async invokeHandlers(\n\t\teventType: string,\n\t\tgetEvent: () => unknown,\n\t\tprocessResult: (handlerResult: unknown, extensionPath: string) => { done: boolean },\n\t): Promise<void> {\n\t\tconst ctx = this.isShutdownGuardedEvent(eventType)\n\t\t\t? this.createEventContext(eventType)\n\t\t\t: this.createContext();\n\n\t\tfor (const ext of this.extensions) {\n\t\t\tconst handlers = ext.handlers.get(eventType);\n\t\t\tif (!handlers || handlers.length === 0) continue;\n\n\t\t\tconst isQuiet = this.isQuietExtension(ext);\n\t\t\tconst extCtx = isQuiet ? this.withSilencedNotify(ctx) : ctx;\n\n\t\t\tfor (const handler of handlers) {\n\t\t\t\ttry {\n\t\t\t\t\tconst event = getEvent();\n\t\t\t\t\t// Run quiet extensions inside an AsyncLocalStorage scope so\n\t\t\t\t\t// the patched console methods can suppress their output\n\t\t\t\t\t// without affecting non-quiet extensions running concurrently.\n\t\t\t\t\tconst handlerResult = isQuiet\n\t\t\t\t\t\t? await quietExtensionContext.run(true, () => handler(event, extCtx))\n\t\t\t\t\t\t: await handler(event, extCtx);\n\t\t\t\t\tconst action = processResult(handlerResult, ext.path);\n\t\t\t\t\tif (action.done) return;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\t\tconst stack = err instanceof Error ? err.stack : undefined;\n\t\t\t\t\tthis.emitError({\n\t\t\t\t\t\textensionPath: ext.path,\n\t\t\t\t\t\tevent: eventType,\n\t\t\t\t\t\terror: message,\n\t\t\t\t\t\tstack,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync emit<TEvent extends RunnerEmitEvent>(event: TEvent): Promise<RunnerEmitResult<TEvent>> {\n\t\tlet result: SessionBeforeEventResult | undefined;\n\t\tconst isSessionBefore = this.isSessionBeforeEvent(event);\n\n\t\tawait this.invokeHandlers(event.type, () => event, (handlerResult) => {\n\t\t\tif (isSessionBefore && handlerResult) {\n\t\t\t\tresult = handlerResult as SessionBeforeEventResult;\n\t\t\t\tif (result.cancel) return { done: true };\n\t\t\t}\n\t\t\treturn { done: false };\n\t\t});\n\n\t\treturn result as RunnerEmitResult<TEvent>;\n\t}\n\n\tasync emitToolResult(event: ToolResultEvent): Promise<ToolResultEventResult | undefined> {\n\t\tconst currentEvent: ToolResultEvent = { ...event };\n\t\tlet modified = false;\n\n\t\tawait this.invokeHandlers(\"tool_result\", () => currentEvent, (handlerResult) => {\n\t\t\tconst r = handlerResult as ToolResultEventResult | undefined;\n\t\t\tif (!r) return { done: false };\n\n\t\t\tif (r.content !== undefined) { currentEvent.content = r.content; modified = true; }\n\t\t\tif (r.details !== undefined) { currentEvent.details = r.details; modified = true; }\n\t\t\tif (r.isError !== undefined) { currentEvent.isError = r.isError; modified = true; }\n\t\t\treturn { done: false };\n\t\t});\n\n\t\tif (!modified) return undefined;\n\t\treturn { content: currentEvent.content, details: currentEvent.details, isError: currentEvent.isError };\n\t}\n\n\tasync emitToolCall(event: ToolCallEvent): Promise<ToolCallEventResult | undefined> {\n\t\tlet result: ToolCallEventResult | undefined;\n\n\t\tawait this.invokeHandlers(\"tool_call\", () => event, (handlerResult) => {\n\t\t\tif (handlerResult) {\n\t\t\t\tresult = handlerResult as ToolCallEventResult;\n\t\t\t\tif (result.block) return { done: true };\n\t\t\t}\n\t\t\treturn { done: false };\n\t\t});\n\n\t\treturn result;\n\t}\n\n\tasync emitBashTransform(command: string, cwd: string): Promise<string> {\n\t\tif (!this.hasHandlers(\"bash_transform\")) return command;\n\n\t\tlet current = command;\n\t\tawait this.invokeHandlers(\n\t\t\t\"bash_transform\",\n\t\t\t() => ({ type: \"bash_transform\" as const, command: current, cwd }),\n\t\t\t(handlerResult) => {\n\t\t\t\tconst result = handlerResult as import(\"./types.js\").BashTransformEventResult | undefined;\n\t\t\t\tif (result?.command && result.command.trim()) {\n\t\t\t\t\tcurrent = result.command;\n\t\t\t\t}\n\t\t\t\treturn { done: false }; // chain all handlers\n\t\t\t},\n\t\t);\n\t\treturn current;\n\t}\n\n\tasync emitUserBash(event: UserBashEvent): Promise<UserBashEventResult | undefined> {\n\t\tlet result: UserBashEventResult | undefined;\n\n\t\tawait this.invokeHandlers(\"user_bash\", () => event, (handlerResult) => {\n\t\t\tif (handlerResult) {\n\t\t\t\tresult = handlerResult as UserBashEventResult;\n\t\t\t\treturn { done: true };\n\t\t\t}\n\t\t\treturn { done: false };\n\t\t});\n\n\t\treturn result;\n\t}\n\n\tasync emitContext(messages: AgentMessage[]): Promise<AgentMessage[]> {\n\t\tlet currentMessages = structuredClone(messages);\n\n\t\tawait this.invokeHandlers(\"context\", () => ({ type: \"context\", messages: currentMessages } satisfies ContextEvent), (handlerResult) => {\n\t\t\tif (handlerResult && (handlerResult as ContextEventResult).messages) {\n\t\t\t\tcurrentMessages = (handlerResult as ContextEventResult).messages!;\n\t\t\t}\n\t\t\treturn { done: false };\n\t\t});\n\n\t\treturn currentMessages;\n\t}\n\n\tasync emitBeforeProviderRequest(\n\t\tpayload: unknown,\n\t\tmodel?: { provider: string; id: string; api?: string },\n\t): Promise<unknown> {\n\t\tlet currentPayload = payload;\n\n\t\tawait this.invokeHandlers(\"before_provider_request\", () => ({\n\t\t\ttype: \"before_provider_request\",\n\t\t\tpayload: currentPayload,\n\t\t\tmodel,\n\t\t} satisfies BeforeProviderRequestEvent), (handlerResult) => {\n\t\t\tif (handlerResult !== undefined) currentPayload = handlerResult;\n\t\t\treturn { done: false };\n\t\t});\n\n\t\treturn currentPayload;\n\t}\n\n\tasync emitBeforeModelSelect(event: Omit<BeforeModelSelectEvent, \"type\">): Promise<BeforeModelSelectResult | undefined> {\n\t\tlet result: BeforeModelSelectResult | undefined;\n\t\tawait this.invokeHandlers(\"before_model_select\", () => ({\n\t\t\ttype: \"before_model_select\" as const,\n\t\t\t...event,\n\t\t} satisfies BeforeModelSelectEvent), (handlerResult) => {\n\t\t\tif (handlerResult) {\n\t\t\t\tresult = handlerResult as BeforeModelSelectResult;\n\t\t\t\treturn { done: true }; // first override wins\n\t\t\t}\n\t\t\treturn { done: false };\n\t\t});\n\t\treturn result;\n\t}\n\n\tasync emitAdjustToolSet(event: Omit<AdjustToolSetEvent, \"type\">): Promise<AdjustToolSetResult | undefined> {\n\t\tlet result: AdjustToolSetResult | undefined;\n\t\tawait this.invokeHandlers(\"adjust_tool_set\", () => ({\n\t\t\ttype: \"adjust_tool_set\" as const,\n\t\t\t...event,\n\t\t} satisfies AdjustToolSetEvent), (handlerResult) => {\n\t\t\tif (handlerResult) {\n\t\t\t\tresult = handlerResult as AdjustToolSetResult;\n\t\t\t\treturn { done: true }; // first override wins\n\t\t\t}\n\t\t\treturn { done: false };\n\t\t});\n\t\treturn result;\n\t}\n\n\tasync emitBeforeAgentStart(\n\t\tprompt: string,\n\t\timages: ImageContent[] | undefined,\n\t\tsystemPrompt: string,\n\t): Promise<BeforeAgentStartCombinedResult | undefined> {\n\t\tconst messages: NonNullable<BeforeAgentStartEventResult[\"message\"]>[] = [];\n\t\tlet currentSystemPrompt = systemPrompt;\n\t\tlet systemPromptModified = false;\n\n\t\tawait this.invokeHandlers(\"before_agent_start\", () => ({\n\t\t\ttype: \"before_agent_start\",\n\t\t\tprompt,\n\t\t\timages,\n\t\t\tsystemPrompt: currentSystemPrompt,\n\t\t} satisfies BeforeAgentStartEvent), (handlerResult) => {\n\t\t\tif (handlerResult) {\n\t\t\t\tconst r = handlerResult as BeforeAgentStartEventResult;\n\t\t\t\tif (r.message) messages.push(r.message);\n\t\t\t\tif (r.systemPrompt !== undefined) {\n\t\t\t\t\tcurrentSystemPrompt = r.systemPrompt;\n\t\t\t\t\tsystemPromptModified = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { done: false };\n\t\t});\n\n\t\tif (messages.length > 0 || systemPromptModified) {\n\t\t\treturn {\n\t\t\t\tmessages: messages.length > 0 ? messages : undefined,\n\t\t\t\tsystemPrompt: systemPromptModified ? currentSystemPrompt : undefined,\n\t\t\t};\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tasync emitResourcesDiscover(\n\t\tcwd: string,\n\t\treason: ResourcesDiscoverEvent[\"reason\"],\n\t): Promise<{\n\t\tskillPaths: Array<{ path: string; extensionPath: string }>;\n\t\tpromptPaths: Array<{ path: string; extensionPath: string }>;\n\t\tthemePaths: Array<{ path: string; extensionPath: string }>;\n\t}> {\n\t\tconst skillPaths: Array<{ path: string; extensionPath: string }> = [];\n\t\tconst promptPaths: Array<{ path: string; extensionPath: string }> = [];\n\t\tconst themePaths: Array<{ path: string; extensionPath: string }> = [];\n\n\t\tawait this.invokeHandlers(\"resources_discover\", () => ({\n\t\t\ttype: \"resources_discover\",\n\t\t\tcwd,\n\t\t\treason,\n\t\t} satisfies ResourcesDiscoverEvent), (handlerResult, extensionPath) => {\n\t\t\tconst r = handlerResult as ResourcesDiscoverResult | undefined;\n\t\t\tif (r?.skillPaths?.length) skillPaths.push(...r.skillPaths.map((path) => ({ path, extensionPath })));\n\t\t\tif (r?.promptPaths?.length) promptPaths.push(...r.promptPaths.map((path) => ({ path, extensionPath })));\n\t\t\tif (r?.themePaths?.length) themePaths.push(...r.themePaths.map((path) => ({ path, extensionPath })));\n\t\t\treturn { done: false };\n\t\t});\n\n\t\treturn { skillPaths, promptPaths, themePaths };\n\t}\n\n\t/** Emit input event. Transforms chain, \"handled\" short-circuits. */\n\tasync emitInput(text: string, images: ImageContent[] | undefined, source: InputSource): Promise<InputEventResult> {\n\t\tlet currentText = text;\n\t\tlet currentImages = images;\n\t\tlet handled: InputEventResult | undefined;\n\n\t\tawait this.invokeHandlers(\"input\", () => ({\n\t\t\ttype: \"input\",\n\t\t\ttext: currentText,\n\t\t\timages: currentImages,\n\t\t\tsource,\n\t\t} satisfies InputEvent), (handlerResult) => {\n\t\t\tconst r = handlerResult as InputEventResult | undefined;\n\t\t\tif (r?.action === \"handled\") {\n\t\t\t\thandled = r;\n\t\t\t\treturn { done: true };\n\t\t\t}\n\t\t\tif (r?.action === \"transform\") {\n\t\t\t\tcurrentText = r.text;\n\t\t\t\tcurrentImages = r.images ?? currentImages;\n\t\t\t}\n\t\t\treturn { done: false };\n\t\t});\n\n\t\tif (handled) return handled;\n\t\treturn currentText !== text || currentImages !== images\n\t\t\t? { action: \"transform\", text: currentText, images: currentImages }\n\t\t\t: { action: \"continue\" };\n\t}\n\n\t// =========================================================================\n\t// Layer 2 event emitters (notification, stop, session_end, git, verify,\n\t// budget, milestone / unit). Fire-and-observe except where a handler result\n\t// can veto or rewrite the pending action.\n\t// =========================================================================\n\n\tasync emitStop(event: Omit<StopEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"stop\",\n\t\t\t() => ({ type: \"stop\" as const, ...event } satisfies StopEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n\n\tasync emitNotification(event: Omit<NotificationEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"notification\",\n\t\t\t() => ({ type: \"notification\" as const, ...event } satisfies NotificationEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n\n\tasync emitSessionEnd(event: Omit<SessionEndEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"session_end\",\n\t\t\t() => ({ type: \"session_end\" as const, ...event } satisfies SessionEndEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n\n\tasync emitBeforeCommit(\n\t\tevent: Omit<BeforeCommitEvent, \"type\">,\n\t): Promise<BeforeCommitEventResult | undefined> {\n\t\tlet result: BeforeCommitEventResult | undefined;\n\t\tlet message = event.message;\n\t\tawait this.invokeHandlers(\n\t\t\t\"before_commit\",\n\t\t\t() => ({ type: \"before_commit\" as const, ...event, message } satisfies BeforeCommitEvent),\n\t\t\t(handlerResult) => {\n\t\t\t\tconst r = handlerResult as BeforeCommitEventResult | undefined;\n\t\t\t\tif (!r) return { done: false };\n\t\t\t\tif (r.cancel) {\n\t\t\t\t\tresult = { cancel: true, reason: r.reason };\n\t\t\t\t\treturn { done: true };\n\t\t\t\t}\n\t\t\t\tif (r.message !== undefined) {\n\t\t\t\t\tmessage = r.message;\n\t\t\t\t\tresult = { ...(result ?? {}), message };\n\t\t\t\t}\n\t\t\t\treturn { done: false };\n\t\t\t},\n\t\t);\n\t\treturn result;\n\t}\n\n\tasync emitCommit(event: Omit<CommitEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"commit\",\n\t\t\t() => ({ type: \"commit\" as const, ...event } satisfies CommitEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n\n\tasync emitBeforePush(\n\t\tevent: Omit<BeforePushEvent, \"type\">,\n\t): Promise<BeforePushEventResult | undefined> {\n\t\tlet result: BeforePushEventResult | undefined;\n\t\tawait this.invokeHandlers(\n\t\t\t\"before_push\",\n\t\t\t() => ({ type: \"before_push\" as const, ...event } satisfies BeforePushEvent),\n\t\t\t(handlerResult) => {\n\t\t\t\tconst r = handlerResult as BeforePushEventResult | undefined;\n\t\t\t\tif (r?.cancel) {\n\t\t\t\t\tresult = r;\n\t\t\t\t\treturn { done: true };\n\t\t\t\t}\n\t\t\t\treturn { done: false };\n\t\t\t},\n\t\t);\n\t\treturn result;\n\t}\n\n\tasync emitPush(event: Omit<PushEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"push\",\n\t\t\t() => ({ type: \"push\" as const, ...event } satisfies PushEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n\n\tasync emitBeforePr(\n\t\tevent: Omit<BeforePrEvent, \"type\">,\n\t): Promise<BeforePrEventResult | undefined> {\n\t\tlet result: BeforePrEventResult | undefined;\n\t\tlet title = event.title;\n\t\tlet body = event.body;\n\t\tawait this.invokeHandlers(\n\t\t\t\"before_pr\",\n\t\t\t() => ({ type: \"before_pr\" as const, ...event, title, body } satisfies BeforePrEvent),\n\t\t\t(handlerResult) => {\n\t\t\t\tconst r = handlerResult as BeforePrEventResult | undefined;\n\t\t\t\tif (!r) return { done: false };\n\t\t\t\tif (r.cancel) {\n\t\t\t\t\tresult = { cancel: true, reason: r.reason };\n\t\t\t\t\treturn { done: true };\n\t\t\t\t}\n\t\t\t\tif (r.title !== undefined) title = r.title;\n\t\t\t\tif (r.body !== undefined) body = r.body;\n\t\t\t\tif (r.title !== undefined || r.body !== undefined) {\n\t\t\t\t\tresult = { ...(result ?? {}), title, body };\n\t\t\t\t}\n\t\t\t\treturn { done: false };\n\t\t\t},\n\t\t);\n\t\treturn result;\n\t}\n\n\tasync emitPrOpened(event: Omit<PrOpenedEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"pr_opened\",\n\t\t\t() => ({ type: \"pr_opened\" as const, ...event } satisfies PrOpenedEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n\n\tasync emitBeforeVerify(\n\t\tevent: Omit<BeforeVerifyEvent, \"type\">,\n\t): Promise<BeforeVerifyEventResult | undefined> {\n\t\tlet result: BeforeVerifyEventResult | undefined;\n\t\tawait this.invokeHandlers(\n\t\t\t\"before_verify\",\n\t\t\t() => ({ type: \"before_verify\" as const, ...event } satisfies BeforeVerifyEvent),\n\t\t\t(handlerResult) => {\n\t\t\t\tconst r = handlerResult as BeforeVerifyEventResult | undefined;\n\t\t\t\tif (r?.cancel) {\n\t\t\t\t\tresult = r;\n\t\t\t\t\treturn { done: true };\n\t\t\t\t}\n\t\t\t\treturn { done: false };\n\t\t\t},\n\t\t);\n\t\treturn result;\n\t}\n\n\tasync emitVerifyResult(event: Omit<VerifyResultEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"verify_result\",\n\t\t\t() => ({ type: \"verify_result\" as const, ...event } satisfies VerifyResultEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n\n\tasync emitBudgetThreshold(\n\t\tevent: Omit<BudgetThresholdEvent, \"type\">,\n\t): Promise<BudgetThresholdEventResult | undefined> {\n\t\tlet result: BudgetThresholdEventResult | undefined;\n\t\tawait this.invokeHandlers(\n\t\t\t\"budget_threshold\",\n\t\t\t() => ({ type: \"budget_threshold\" as const, ...event } satisfies BudgetThresholdEvent),\n\t\t\t(handlerResult) => {\n\t\t\t\tconst r = handlerResult as BudgetThresholdEventResult | undefined;\n\t\t\t\tif (r?.action) {\n\t\t\t\t\tresult = r;\n\t\t\t\t\treturn { done: true };\n\t\t\t\t}\n\t\t\t\treturn { done: false };\n\t\t\t},\n\t\t);\n\t\treturn result;\n\t}\n\n\tasync emitMilestoneStart(event: Omit<MilestoneStartEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"milestone_start\",\n\t\t\t() => ({ type: \"milestone_start\" as const, ...event } satisfies MilestoneStartEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n\n\tasync emitMilestoneEnd(event: Omit<MilestoneEndEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"milestone_end\",\n\t\t\t() => ({ type: \"milestone_end\" as const, ...event } satisfies MilestoneEndEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n\n\tasync emitUnitStart(event: Omit<UnitStartEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"unit_start\",\n\t\t\t() => ({ type: \"unit_start\" as const, ...event } satisfies UnitStartEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n\n\tasync emitUnitEnd(event: Omit<UnitEndEvent, \"type\">): Promise<void> {\n\t\tawait this.invokeHandlers(\n\t\t\t\"unit_end\",\n\t\t\t() => ({ type: \"unit_end\" as const, ...event } satisfies UnitEndEvent),\n\t\t\t() => ({ done: false }),\n\t\t);\n\t}\n}\n\n/** Helper re-export for callers wiring verification failures. */\nexport type { VerifyFailure };\n"]}
|
|
@@ -83,6 +83,7 @@ export declare class DefaultPackageManager implements PackageManager {
|
|
|
83
83
|
update(source?: string): Promise<void>;
|
|
84
84
|
private updateSourceForScope;
|
|
85
85
|
private resolvePackageSources;
|
|
86
|
+
private resolveOnePackageSource;
|
|
86
87
|
private resolveLocalExtensionSource;
|
|
87
88
|
private installParsedSource;
|
|
88
89
|
private getPackageSourceString;
|
|
@@ -155,6 +156,14 @@ export declare class DefaultPackageManager implements PackageManager {
|
|
|
155
156
|
private addResource;
|
|
156
157
|
private createAccumulator;
|
|
157
158
|
private toResolvedPaths;
|
|
159
|
+
/**
|
|
160
|
+
* Run a child process. When `interactive` is true (the explicit user-facing
|
|
161
|
+
* install/update path), stdio is inherited so npm/git progress shows in the
|
|
162
|
+
* terminal. When false (the default — auto-resolve during launch), stdout
|
|
163
|
+
* and stderr are captured. The captured stderr is appended to the failure
|
|
164
|
+
* error so callers can surface the underlying cause without polluting the
|
|
165
|
+
* TUI during startup.
|
|
166
|
+
*/
|
|
158
167
|
private runCommand;
|
|
159
168
|
private runCommandSync;
|
|
160
169
|
}
|