@agimon-ai/doompi-ui 0.0.1-alpha.28 → 0.0.1-alpha.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +18 -6
  2. package/dist/adapters/pi/extension.cjs +1 -1
  3. package/dist/adapters/pi/extension.cjs.map +1 -1
  4. package/dist/adapters/pi/extension.d.cts.map +1 -1
  5. package/dist/adapters/pi/extension.d.mts.map +1 -1
  6. package/dist/adapters/pi/extension.mjs +1 -1
  7. package/dist/adapters/pi/extension.mjs.map +1 -1
  8. package/dist/adapters/pi/toolOverrides.cjs +1 -1
  9. package/dist/adapters/pi/toolOverrides.cjs.map +1 -1
  10. package/dist/adapters/pi/toolOverrides.mjs +1 -1
  11. package/dist/adapters/pi/toolOverrides.mjs.map +1 -1
  12. package/dist/hashlineRendering.cjs +1 -0
  13. package/dist/hashlineRendering.d.cts +2 -0
  14. package/dist/hashlineRendering.d.mts +2 -0
  15. package/dist/hashlineRendering.mjs +1 -0
  16. package/dist/index.cjs +1 -1
  17. package/dist/index.d.cts +2 -2
  18. package/dist/index.d.mts +2 -2
  19. package/dist/index.mjs +1 -1
  20. package/dist/rendering.cjs +1 -1
  21. package/dist/rendering.d.cts +3 -1
  22. package/dist/rendering.d.mts +3 -1
  23. package/dist/rendering.mjs +1 -1
  24. package/dist/toolChrome.cjs +1 -1
  25. package/dist/toolChrome.d.cts +2 -2
  26. package/dist/toolChrome.d.mts +2 -2
  27. package/dist/toolChrome.mjs +1 -1
  28. package/dist/tui/builtinToolRender.cjs +6 -6
  29. package/dist/tui/builtinToolRender.cjs.map +1 -1
  30. package/dist/tui/builtinToolRender.mjs +9 -9
  31. package/dist/tui/builtinToolRender.mjs.map +1 -1
  32. package/dist/tui/codeGutter.d.cts +9 -0
  33. package/dist/tui/codeGutter.d.cts.map +1 -0
  34. package/dist/tui/codeGutter.d.mts +9 -0
  35. package/dist/tui/codeGutter.d.mts.map +1 -0
  36. package/dist/tui/diffRender.d.cts +9 -0
  37. package/dist/tui/diffRender.d.cts.map +1 -0
  38. package/dist/tui/diffRender.d.mts +9 -0
  39. package/dist/tui/diffRender.d.mts.map +1 -0
  40. package/dist/tui/hashlineRendering.cjs +8 -0
  41. package/dist/tui/hashlineRendering.cjs.map +1 -0
  42. package/dist/tui/hashlineRendering.d.cts +21 -0
  43. package/dist/tui/hashlineRendering.d.cts.map +1 -0
  44. package/dist/tui/hashlineRendering.d.mts +21 -0
  45. package/dist/tui/hashlineRendering.d.mts.map +1 -0
  46. package/dist/tui/hashlineRendering.mjs +8 -0
  47. package/dist/tui/hashlineRendering.mjs.map +1 -0
  48. package/dist/tui/toolChrome.cjs +1 -1
  49. package/dist/tui/toolChrome.cjs.map +1 -1
  50. package/dist/tui/toolChrome.d.cts +15 -1
  51. package/dist/tui/toolChrome.d.cts.map +1 -1
  52. package/dist/tui/toolChrome.d.mts +15 -1
  53. package/dist/tui/toolChrome.d.mts.map +1 -1
  54. package/dist/tui/toolChrome.mjs +1 -1
  55. package/dist/tui/toolChrome.mjs.map +1 -1
  56. package/package.json +9 -3
package/README.md CHANGED
@@ -2,7 +2,8 @@
2
2
 
3
3
  DoomPi's shared terminal interface, Leader Space host, theme, overlays, and UI registries.
4
4
 
5
- The [DoomPi distribution](https://www.npmjs.com/package/@agimon-ai/doompi) loads this package as core. Extension authors can depend on its public contracts without adopting the full distribution.
5
+ The [DoomPi distribution](https://www.npmjs.com/package/@agimon-ai/doompi) loads this package as
6
+ core. Extension authors can depend on its public contracts without adopting the full distribution.
6
7
 
7
8
  > **Alpha:** UI and contribution contracts may change between releases.
8
9
 
@@ -31,7 +32,9 @@ DoomPi users should not add it to a layer; the distribution loads it before laye
31
32
  | `/tools` | Opens the current tool and MCP inventory |
32
33
  | `/config` | Opens settings contributed by active extensions |
33
34
 
34
- The registry rejects or diagnoses conflicting Leader contributions instead of silently replacing an existing binding. Diagnostics are recorded through telemetry and shown as TUI warnings when a UI is attached.
35
+ The registry rejects or diagnoses conflicting Leader contributions instead of silently replacing
36
+ an existing binding. Diagnostics are recorded through telemetry and shown as TUI warnings when a
37
+ UI is attached.
35
38
 
36
39
  ## Contribute to Leader Space
37
40
 
@@ -56,19 +59,28 @@ export function reviewPlugin(ctx: Context): void {
56
59
  }
57
60
  ```
58
61
 
59
- Mount this plugin beneath the shared Doom Cordis host. Cordis retracts the registration when either the contributor or UI provider disappears, so reloads cannot retain stale bindings.
62
+ Mount this plugin beneath the shared Doom Cordis host. Cordis retracts the registration when either
63
+ the contributor or UI provider disappears, so reloads cannot retain stale bindings.
60
64
 
61
65
  ## TUI and headless sessions
62
66
 
63
- The editor, header, footer, overlays, Leader menu, and notifications require an interactive TUI. The underlying typed contribution registries can still be installed and queried in headless sessions, but UI-only commands have no panel to render. Provide a tool, RPC, or CLI route when a capability must also work headlessly.
67
+ The editor, header, footer, overlays, Leader menu, and notifications require an interactive TUI.
68
+ The underlying typed contribution registries can still be installed and queried in headless
69
+ sessions, but UI-only commands have no panel to render. Provide a tool, RPC, or CLI route when a
70
+ capability must also work headlessly.
64
71
 
65
72
  ## Theme
66
73
 
67
- The package publishes `@agimon-ai/doompi-ui/themes/doom-pi-dark.json`. DoomPi synchronizes that resource and selects it by default. Set `DOOMPI_THEME` to select another available Pi theme for the UI adapter.
74
+ The package publishes `@agimon-ai/doompi-ui/themes/doom-pi-dark.json`. DoomPi synchronizes that
75
+ resource and selects it by default. Set `DOOMPI_THEME` to select another available Pi theme for the
76
+ UI adapter.
68
77
 
69
78
  ## Public API
70
79
 
71
- Declared exports cover UI state, rendering, tool chrome, header/footer/editor components, configuration and tools overlays, telemetry integration, and theme helpers. Contribution schemas and the direct UI hub service live in extension contracts. Use these exports rather than importing generated `dist` paths.
80
+ Declared exports cover UI state, rendering, tool chrome, header/footer/editor components,
81
+ configuration and tools overlays, telemetry integration, and theme helpers. Contribution schemas
82
+ and the direct UI hub service live in extension contracts. Use these exports rather than importing
83
+ generated `dist` paths.
72
84
 
73
85
  ```ts
74
86
  import { DOOM_UI_HUB_SERVICE } from '@agimon-ai/doompi-extension-contracts/ui-hub';
@@ -1,2 +1,2 @@
1
- const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../../services/leader/leaderRegistry.cjs"),n=require("../../services/hub/uiHub.cjs"),r=require("../../services/state/uiState.cjs"),i=require("../../services/tools/toolInventory.cjs"),a=require("../../tui/configOverlay.cjs"),o=require("../../tui/doomEditor.cjs"),s=require("../../tui/doomFooter.cjs"),c=require("../../tui/doomHeader.cjs"),l=require("../../tui/leaderHints.cjs");require("../../tui/theme.cjs");const u=require("../../tui/toolsOverlay.cjs"),d=require("../telemetry/logSinkTelemetry.cjs"),f=require("./extensionName.cjs"),p=require("./toolOverrides.cjs");let m=require("node:path");m=e.__toESM(m,1);let h=require("@agimon-ai/doompi-extension-contracts/cordis-host"),g=require("@agimon-ai/doompi-extension-contracts/mcp-status"),_=require("@agimon-ai/doompi-extension-contracts/mode"),v=require("@agimon-ai/doompi-extension-contracts/ui-hub");const y=`doom-pi-leader`,b=`belowEditor`,x=`warning`,S=`doom-pi`,C=new Set([`hotkeys`]),w=`@agimon-ai/doompi-ui`;function T(e,t){let n=e.trim().replace(/\s+/g,` `);if(!n)return;let r=n.slice(0,64).trimEnd();return`${S} · ${r} · ${m.default.basename(t)||t}`}function E(e,{pi:h,telemetry:E}){p.registerBuiltinToolUi(h,process.cwd());let D=new r.DoomUiState,O=new t.DoomLeaderRegistry,k=new Set,A,j,M=0,N=!1,P=()=>(0,g.readDoomMcpStatus)(e)?.getSnapshot().servers;h.registerCommand(`tools`,{description:`Browse the tools available in this session`,handler:async(e,t)=>{let n=P(),r=i.buildToolSources({tools:h.getAllTools(),activeTools:h.getActiveTools(),...n?{mcpServers:n}:{},resolveExtensionName:f.extensionName,resolveExtensionToolSource:e=>f.extensionToolSource(h,e)});await u.openToolsOverlay(t,r)}}),h.registerCommand(`config`,{description:`Browse and change the settings extensions contribute`,handler:async(e,t)=>{await a.openConfigOverlay(t,I.config)}});let F=e=>{for(let t of e){let e=t.bindingId?` (${t.bindingId})`:``,n=`Leader contribution from ${t.source}${e}: ${t.message}`;k.has(n)||(k.add(n),E.recordWarning(d.UI_EVENT.leaderContributionRejected,t.message,{"leader.source":t.source,...t.bindingId?{"leader.binding.id":t.bindingId}:{}}),j?.mode===`tui`&&j.ui.notify(n,x))}},I=n.createDoomUiHub({leaderRegistry:O,reportDiagnostics:F});e.provide(v.DOOM_UI_HUB_SERVICE,I),e.inject([_.DOOM_MINOR_MODE_CATALOG_SERVICE],e=>{let t=(0,_.createMinorModeCatalogClient)((0,_.requireMinorModeCatalog)(e)),n=()=>D.setModes(r.projectMinorModeRecords(t.list())),i=t.subscribe(n);return n(),()=>{i(),D.setModes([])}}),h.on(`session_start`,(e,t)=>{j=t,I.setContext(t);let n=++M;if(F(O.flush()),N=t.sessionManager.getEntries().some(e=>e.type===`message`),t.mode!==`tui`)return;for(let e of k)t.ui.notify(e,x);let r=process.env.DOOMPI_THEME||`doom-pi-dark`,i=t.ui.setTheme(r);i.success||(t.ui.notify(`Could not apply Doom Pi theme: ${i.error}`,x),E.recordWarning(d.UI_EVENT.themeApplyFailed,i.error??`Unknown theme error`,{"ui.theme":r})),t.ui.setTitle(`${S} · ${m.default.basename(t.cwd)||t.cwd} · pi/coding`),t.ui.setHeader((e,n)=>new c.DoomHeader(n,t.cwd,void 0,t,()=>e.terminal.rows)),t.ui.setFooter((e,n,r)=>(A=r,new s.DoomFooter(e,n,t,r,I.footer,D))),t.ui.setEditorComponent((e,r,i)=>new o.DoomEditor(e,r,i,D,e=>{if(!e.active){t.ui.setWidget(y,void 0,{placement:b});return}t.ui.setWidget(y,(n,r)=>new l.LeaderHints(r,e,t,A,D.getModes()),{placement:b})},void 0,t.ui.theme,{registry:O,isCommandAvailable:e=>C.has(e)||h.getCommands().some(t=>t.name===e),onLeaderAction:(e,r)=>{if(j!==t||M!==n){t.ui.notify(`Leader action ${r} is unavailable.`,x);return}I.invokeLeaderAction(e,r)},onUnavailableCommand:e=>{E.recordWarning(d.UI_EVENT.leaderCommandUnavailable,`Leader command /${e} is unavailable.`,{"ui.kind":`command`}),t.ui.notify(`Leader command /${e} is unavailable.`,x)},onUnavailableAction:e=>{E.recordWarning(d.UI_EVENT.leaderActionUnavailable,`Leader action ${e} is unavailable.`,{"ui.kind":`action`}),t.ui.notify(`Leader action ${e} is unavailable.`,x)}})),E.recordEvent(d.UI_EVENT.shellInstalled,{"ui.theme":r,"ui.theme.applied":i.success,"ui.leader.group.count":O.getGroup([])?.options.length??0})}),h.on(`input`,(e,t)=>{if(t.mode!==`tui`||e.source!==`interactive`||N)return;N=!0;let n=T(e.text,t.cwd);n&&t.ui.setTitle(n)}),e.effect(()=>async()=>{let e=j;++M,j=void 0,I.setContext(void 0),A=void 0,I.dispose(),D.reset(),e?.mode===`tui`&&e.ui.setWidget(y,void 0,{placement:b}),await E.shutdown()},w)}async function D(e,t=d.createUiTelemetry()){let n=await(0,h.connectDoomCordisHost)(e,w),r=n.root.plugin(E,{pi:e,telemetry:t});try{await r}catch(e){try{await r.dispose()}finally{await n.dispose()}throw e}let i;e.on(`session_shutdown`,()=>i??=(async()=>{try{await r.dispose()}finally{await n.dispose()}})())}exports.doomPiUiExtension=D;
1
+ const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../../services/leader/leaderRegistry.cjs"),n=require("../../services/hub/uiHub.cjs"),r=require("../../services/state/uiState.cjs"),i=require("../../services/tools/toolInventory.cjs"),a=require("../../tui/configOverlay.cjs"),o=require("../../tui/doomEditor.cjs"),s=require("../../tui/doomFooter.cjs"),c=require("../../tui/doomHeader.cjs"),l=require("../../tui/leaderHints.cjs");require("../../tui/theme.cjs");const u=require("../../tui/toolsOverlay.cjs"),d=require("../telemetry/logSinkTelemetry.cjs"),f=require("./extensionName.cjs"),p=require("./toolOverrides.cjs");let m=require("node:path");m=e.__toESM(m,1);let h=require("@agimon-ai/doompi-extension-contracts/cordis-host"),g=require("@agimon-ai/doompi-extension-contracts/mcp-status"),_=require("@agimon-ai/doompi-extension-contracts/mode"),v=require("@agimon-ai/doompi-extension-contracts/ui-hub"),y=require("@agimon-ai/doompi-extension-contracts/tool-overrides");const b=`doom-pi-leader`,x=`belowEditor`,S=`warning`,C=`doom-pi`,w=new Set([`hotkeys`]),T=`@agimon-ai/doompi-ui`;function E(e,t){let n=e.trim().replace(/\s+/g,` `);if(!n)return;let r=n.slice(0,64).trimEnd();return`${C} · ${r} · ${m.default.basename(t)||t}`}function D(e,{pi:h,telemetry:D,hostMode:O}){e.inject([y.DOOM_TOOL_OVERRIDES_SERVICE],e=>{let t=(0,y.requireDoomToolOverrides)(e),n=[],r=e=>{if(O===`composed`)return!0;let r=t.claim({source:T,tools:[e]});return r.granted&&n.push(r),r.granted};try{p.registerBuiltinToolUi(h,process.cwd(),r)}catch(e){for(let e of n)e.dispose();throw e}return()=>{for(let e of n)e.dispose()}});let k=new r.DoomUiState,A=new t.DoomLeaderRegistry,j=new Set,M,N,P=0,F=!1,I=()=>(0,g.readDoomMcpStatus)(e)?.getSnapshot().servers;h.registerCommand(`tools`,{description:`Browse the tools available in this session`,handler:async(e,t)=>{let n=I(),r=i.buildToolSources({tools:h.getAllTools(),activeTools:h.getActiveTools(),...n?{mcpServers:n}:{},resolveExtensionName:f.extensionName,resolveExtensionToolSource:e=>f.extensionToolSource(h,e)});await u.openToolsOverlay(t,r)}}),h.registerCommand(`config`,{description:`Browse and change the settings extensions contribute`,handler:async(e,t)=>{await a.openConfigOverlay(t,R.config)}});let L=e=>{for(let t of e){let e=t.bindingId?` (${t.bindingId})`:``,n=`Leader contribution from ${t.source}${e}: ${t.message}`;j.has(n)||(j.add(n),D.recordWarning(d.UI_EVENT.leaderContributionRejected,t.message,{"leader.source":t.source,...t.bindingId?{"leader.binding.id":t.bindingId}:{}}),N?.mode===`tui`&&N.ui.notify(n,S))}},R=n.createDoomUiHub({leaderRegistry:A,reportDiagnostics:L});e.provide(v.DOOM_UI_HUB_SERVICE,R),e.inject([_.DOOM_MINOR_MODE_CATALOG_SERVICE],e=>{let t=(0,_.createMinorModeCatalogClient)((0,_.requireMinorModeCatalog)(e)),n=()=>k.setModes(r.projectMinorModeRecords(t.list())),i=t.subscribe(n);return n(),()=>{i(),k.setModes([])}}),h.on(`session_start`,(e,t)=>{N=t,R.setContext(t);let n=++P;if(L(A.flush()),F=t.sessionManager.getEntries().some(e=>e.type===`message`),t.mode!==`tui`)return;for(let e of j)t.ui.notify(e,S);let r=process.env.DOOMPI_THEME||`doom-pi-dark`,i=t.ui.setTheme(r);i.success||(t.ui.notify(`Could not apply Doom Pi theme: ${i.error}`,S),D.recordWarning(d.UI_EVENT.themeApplyFailed,i.error??`Unknown theme error`,{"ui.theme":r})),t.ui.setTitle(`${C} · ${m.default.basename(t.cwd)||t.cwd} · pi/coding`),t.ui.setHeader((e,n)=>new c.DoomHeader(n,t.cwd,void 0,t,()=>e.terminal.rows)),t.ui.setFooter((e,n,r)=>(M=r,new s.DoomFooter(e,n,t,r,R.footer,k))),t.ui.setEditorComponent((e,r,i)=>new o.DoomEditor(e,r,i,k,e=>{if(!e.active){t.ui.setWidget(b,void 0,{placement:x});return}t.ui.setWidget(b,(n,r)=>new l.LeaderHints(r,e,t,M,k.getModes()),{placement:x})},void 0,t.ui.theme,{registry:A,isCommandAvailable:e=>w.has(e)||h.getCommands().some(t=>t.name===e),onLeaderAction:(e,r)=>{if(N!==t||P!==n){t.ui.notify(`Leader action ${r} is unavailable.`,S);return}R.invokeLeaderAction(e,r)},onUnavailableCommand:e=>{D.recordWarning(d.UI_EVENT.leaderCommandUnavailable,`Leader command /${e} is unavailable.`,{"ui.kind":`command`}),t.ui.notify(`Leader command /${e} is unavailable.`,S)},onUnavailableAction:e=>{D.recordWarning(d.UI_EVENT.leaderActionUnavailable,`Leader action ${e} is unavailable.`,{"ui.kind":`action`}),t.ui.notify(`Leader action ${e} is unavailable.`,S)}})),D.recordEvent(d.UI_EVENT.shellInstalled,{"ui.theme":r,"ui.theme.applied":i.success,"ui.leader.group.count":A.getGroup([])?.options.length??0})}),h.on(`input`,(e,t)=>{if(t.mode!==`tui`||e.source!==`interactive`||F)return;F=!0;let n=E(e.text,t.cwd);n&&t.ui.setTitle(n)}),e.effect(()=>async()=>{let e=N;++P,N=void 0,R.setContext(void 0),M=void 0,R.dispose(),k.reset(),e?.mode===`tui`&&e.ui.setWidget(b,void 0,{placement:x}),await D.shutdown()},T)}async function O(e,t=d.createUiTelemetry()){let n=await(0,h.connectDoomCordisHost)(e,T),r=n.root.plugin(D,{pi:e,telemetry:t,hostMode:n.runtime.mode});try{await r}catch(e){try{await r.dispose()}finally{await n.dispose()}throw e}let i;e.on(`session_shutdown`,()=>i??=(async()=>{try{await r.dispose()}finally{await n.dispose()}})())}exports.doomPiUiExtension=O;
2
2
  //# sourceMappingURL=extension.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"extension.cjs","names":["path","DoomUiState","DoomLeaderRegistry","readDoomMcpStatus","buildToolSources","extensionName","extensionToolSource","openToolsOverlay","openConfigOverlay","UI_EVENT","createDoomUiHub","DOOM_UI_HUB_SERVICE","DOOM_MINOR_MODE_CATALOG_SERVICE","createMinorModeCatalogClient","requireMinorModeCatalog","projectMinorModeRecords","DoomHeader","DoomFooter","DoomEditor","LeaderHints","createUiTelemetry","connectDoomCordisHost"],"sources":["../../../src/adapters/pi/extension.ts"],"sourcesContent":["import path from 'node:path';\nimport { connectDoomCordisHost } from '@agimon-ai/doompi-extension-contracts/cordis-host';\nimport { readDoomMcpStatus } from '@agimon-ai/doompi-extension-contracts/mcp-status';\nimport {\n DOOM_MINOR_MODE_CATALOG_SERVICE,\n createMinorModeCatalogClient,\n requireMinorModeCatalog,\n} from '@agimon-ai/doompi-extension-contracts/mode';\nimport { DOOM_UI_HUB_SERVICE } from '@agimon-ai/doompi-extension-contracts/ui-hub';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext, ReadonlyFooterDataProvider } from '@earendil-works/pi-coding-agent';\nimport { type DoomLeaderDiagnostic, DoomLeaderRegistry } from '../../services/leader/leaderRegistry.ts';\nimport { createDoomUiHub } from '../../services/hub/uiHub.ts';\nimport { DoomUiState, type LeaderSnapshot, projectMinorModeRecords } from '../../services/state/uiState.ts';\nimport { buildToolSources, type McpServerStatus } from '../../services/tools/toolInventory.ts';\nimport { openConfigOverlay } from '../../tui/configOverlay.ts';\nimport { DoomEditor } from '../../tui/doomEditor.ts';\nimport { DoomFooter } from '../../tui/doomFooter.ts';\nimport { DoomHeader } from '../../tui/doomHeader.ts';\nimport { LeaderHints } from '../../tui/leaderHints.ts';\nimport { DEFAULT_THEME_NAME } from '../../tui/theme.ts';\nimport { openToolsOverlay } from '../../tui/toolsOverlay.ts';\nimport { createUiTelemetry, UI_EVENT, type UiTelemetry } from '../telemetry/logSinkTelemetry.ts';\nimport { extensionName, extensionToolSource } from './extensionName.ts';\nimport { registerBuiltinToolUi } from './toolOverrides.ts';\n\nconst LEADER_WIDGET_KEY = 'doom-pi-leader';\nconst TUI_MODE = 'tui';\nconst WIDGET_PLACEMENT = 'belowEditor';\nconst WARNING_STYLE = 'warning';\nconst THEME_ENVIRONMENT_KEY = 'DOOMPI_THEME';\nconst HOTKEYS_COMMAND = 'hotkeys';\nconst TOOLS_COMMAND = 'tools';\nconst CONFIG_COMMAND = 'config';\nconst SESSION_START_EVENT = 'session_start';\nconst SESSION_MESSAGE_ENTRY = 'message';\nconst INPUT_EVENT = 'input';\nconst INTERACTIVE_INPUT_SOURCE = 'interactive';\nconst SESSION_SHUTDOWN_EVENT = 'session_shutdown';\nconst TITLE_MESSAGE_MAX_LENGTH = 64;\nconst TITLE_PREFIX = 'doom-pi';\nconst BUILTIN_LEADER_COMMANDS = new Set([HOTKEYS_COMMAND]);\nconst PACKAGE_SOURCE = '@agimon-ai/doompi-ui';\n\nfunction createMessageTitle(message: string, cwd: string): string | undefined {\n const normalizedMessage = message.trim().replace(/\\s+/g, ' ');\n if (!normalizedMessage) return undefined;\n const messageTitle = normalizedMessage.slice(0, TITLE_MESSAGE_MAX_LENGTH).trimEnd();\n return `${TITLE_PREFIX} · ${messageTitle} · ${path.basename(cwd) || cwd}`;\n}\n\ninterface UiPluginOptions {\n readonly pi: ExtensionAPI;\n readonly telemetry: UiTelemetry;\n}\n\nfunction doomPiUiPlugin(cordis: Context, { pi, telemetry }: UiPluginOptions): void {\n registerBuiltinToolUi(pi, process.cwd());\n const uiState = new DoomUiState();\n const leaderRegistry = new DoomLeaderRegistry();\n const pendingDiagnostics = new Set<string>();\n let footerData: ReadonlyFooterDataProvider | undefined;\n let activeContext: ExtensionContext | undefined;\n let sessionGeneration = 0;\n let hasSessionMessage = false;\n\n /**\n * Asks the MCP extension what it is currently connected to.\n *\n * No answer is a normal session: `--no-mcp` leaves nobody providing the query,\n * and the panel simply lists MCP tools under the extension that registered them.\n */\n const readMcpServers = (): readonly McpServerStatus[] | undefined => readDoomMcpStatus(cordis)?.getSnapshot().servers;\n\n pi.registerCommand(TOOLS_COMMAND, {\n description: 'Browse the tools available in this session',\n handler: async (_args, ctx) => {\n // Read at open time so a reconnected server or a plan-mode tool swap shows\n // up without restarting the session.\n const mcpServers = readMcpServers();\n const sources = buildToolSources({\n tools: pi.getAllTools(),\n activeTools: pi.getActiveTools(),\n ...(mcpServers ? { mcpServers } : {}),\n resolveExtensionName: extensionName,\n resolveExtensionToolSource: (toolName) => extensionToolSource(pi, toolName),\n });\n await openToolsOverlay(ctx, sources);\n },\n });\n\n pi.registerCommand(CONFIG_COMMAND, {\n description: 'Browse and change the settings extensions contribute',\n handler: async (_args, ctx) => {\n // The registry is passed live rather than snapshotted: a contributor can be\n // fetching or installing something while the panel is open, and that\n // progress is meant to land in it.\n await openConfigOverlay(ctx, hub.config);\n },\n });\n\n const reportDiagnostics = (diagnostics: readonly DoomLeaderDiagnostic[]): void => {\n for (const diagnostic of diagnostics) {\n const binding = diagnostic.bindingId ? ` (${diagnostic.bindingId})` : '';\n const message = `Leader contribution from ${diagnostic.source}${binding}: ${diagnostic.message}`;\n if (pendingDiagnostics.has(message)) continue;\n pendingDiagnostics.add(message);\n // A rejected contribution silently drops another extension's keybindings,\n // and the notice below only reaches a run that has a TUI attached.\n void telemetry.recordWarning(UI_EVENT.leaderContributionRejected, diagnostic.message, {\n 'leader.source': diagnostic.source,\n ...(diagnostic.bindingId ? { 'leader.binding.id': diagnostic.bindingId } : {}),\n });\n if (activeContext?.mode === TUI_MODE) activeContext.ui.notify(message, WARNING_STYLE);\n }\n };\n\n const hub = createDoomUiHub({ leaderRegistry, reportDiagnostics });\n cordis.provide(DOOM_UI_HUB_SERVICE, hub);\n cordis.inject([DOOM_MINOR_MODE_CATALOG_SERVICE], (modeContext) => {\n const catalog = createMinorModeCatalogClient(requireMinorModeCatalog(modeContext));\n const update = (): void => uiState.setModes(projectMinorModeRecords(catalog.list()));\n const dispose = catalog.subscribe(update);\n update();\n return () => {\n dispose();\n uiState.setModes([]);\n };\n });\n\n pi.on(SESSION_START_EVENT, (_event, ctx) => {\n activeContext = ctx;\n hub.setContext(ctx);\n const activeGeneration = ++sessionGeneration;\n reportDiagnostics(leaderRegistry.flush());\n hasSessionMessage = ctx.sessionManager.getEntries().some((entry) => entry.type === SESSION_MESSAGE_ENTRY);\n if (ctx.mode !== TUI_MODE) return;\n for (const message of pendingDiagnostics) ctx.ui.notify(message, WARNING_STYLE);\n\n const themeName = process.env[THEME_ENVIRONMENT_KEY] || DEFAULT_THEME_NAME;\n const themeResult = ctx.ui.setTheme(themeName);\n if (!themeResult.success) {\n ctx.ui.notify(`Could not apply Doom Pi theme: ${themeResult.error}`, WARNING_STYLE);\n void telemetry.recordWarning(UI_EVENT.themeApplyFailed, themeResult.error ?? 'Unknown theme error', {\n 'ui.theme': themeName,\n });\n }\n\n ctx.ui.setTitle(`${TITLE_PREFIX} · ${path.basename(ctx.cwd) || ctx.cwd} · pi/coding`);\n ctx.ui.setHeader((tui, theme) => new DoomHeader(theme, ctx.cwd, undefined, ctx, () => tui.terminal.rows));\n ctx.ui.setFooter((tui, theme, data) => {\n footerData = data;\n return new DoomFooter(tui, theme, ctx, data, hub.footer, uiState);\n });\n ctx.ui.setEditorComponent(\n (tui, editorTheme, keybindings) =>\n new DoomEditor(\n tui,\n editorTheme,\n keybindings,\n uiState,\n (snapshot: LeaderSnapshot) => {\n if (!snapshot.active) {\n ctx.ui.setWidget(LEADER_WIDGET_KEY, undefined, { placement: WIDGET_PLACEMENT });\n return;\n }\n ctx.ui.setWidget(\n LEADER_WIDGET_KEY,\n (_widgetTui, widgetTheme) => new LeaderHints(widgetTheme, snapshot, ctx, footerData, uiState.getModes()),\n { placement: WIDGET_PLACEMENT },\n );\n },\n undefined,\n ctx.ui.theme,\n {\n registry: leaderRegistry,\n isCommandAvailable: (commandName) =>\n BUILTIN_LEADER_COMMANDS.has(commandName) ||\n pi.getCommands().some((command) => command.name === commandName),\n onLeaderAction: (source, action) => {\n if (activeContext !== ctx || sessionGeneration !== activeGeneration) {\n ctx.ui.notify(`Leader action ${action} is unavailable.`, WARNING_STYLE);\n return;\n }\n hub.invokeLeaderAction(source, action);\n },\n onUnavailableCommand: (commandName) => {\n void telemetry.recordWarning(\n UI_EVENT.leaderCommandUnavailable,\n `Leader command /${commandName} is unavailable.`,\n { 'ui.kind': 'command' },\n );\n ctx.ui.notify(`Leader command /${commandName} is unavailable.`, WARNING_STYLE);\n },\n onUnavailableAction: (action) => {\n void telemetry.recordWarning(\n UI_EVENT.leaderActionUnavailable,\n `Leader action ${action} is unavailable.`,\n {\n 'ui.kind': 'action',\n },\n );\n ctx.ui.notify(`Leader action ${action} is unavailable.`, WARNING_STYLE);\n },\n },\n ),\n );\n\n void telemetry.recordEvent(UI_EVENT.shellInstalled, {\n 'ui.theme': themeName,\n 'ui.theme.applied': themeResult.success,\n 'ui.leader.group.count': leaderRegistry.getGroup([])?.options.length ?? 0,\n });\n });\n\n pi.on(INPUT_EVENT, (event, ctx) => {\n if (ctx.mode !== TUI_MODE || event.source !== INTERACTIVE_INPUT_SOURCE || hasSessionMessage) return;\n hasSessionMessage = true;\n const title = createMessageTitle(event.text, ctx.cwd);\n if (title) ctx.ui.setTitle(title);\n });\n\n cordis.effect(\n () => async () => {\n const context = activeContext;\n ++sessionGeneration;\n activeContext = undefined;\n hub.setContext(undefined);\n footerData = undefined;\n hub.dispose();\n uiState.reset();\n if (context?.mode === TUI_MODE) {\n context.ui.setWidget(LEADER_WIDGET_KEY, undefined, { placement: WIDGET_PLACEMENT });\n }\n await telemetry.shutdown();\n },\n PACKAGE_SOURCE,\n );\n}\n\n/** The package's standard Pi factory, mounted under the session Cordis host. */\nexport async function doomPiUiExtension(pi: ExtensionAPI, telemetry: UiTelemetry = createUiTelemetry()): Promise<void> {\n const connection = await connectDoomCordisHost(pi, PACKAGE_SOURCE);\n const fiber = connection.root.plugin(doomPiUiPlugin, { pi, telemetry });\n try {\n await fiber;\n } catch (error) {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n throw error;\n }\n\n let disposal: Promise<void> | undefined;\n pi.on(\n SESSION_SHUTDOWN_EVENT,\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"extension.cjs","names":["path","DOOM_TOOL_OVERRIDES_SERVICE","requireDoomToolOverrides","DoomUiState","DoomLeaderRegistry","readDoomMcpStatus","buildToolSources","extensionName","extensionToolSource","openToolsOverlay","openConfigOverlay","UI_EVENT","createDoomUiHub","DOOM_UI_HUB_SERVICE","DOOM_MINOR_MODE_CATALOG_SERVICE","createMinorModeCatalogClient","requireMinorModeCatalog","projectMinorModeRecords","DoomHeader","DoomFooter","DoomEditor","LeaderHints","createUiTelemetry","connectDoomCordisHost"],"sources":["../../../src/adapters/pi/extension.ts"],"sourcesContent":["import path from 'node:path';\nimport { connectDoomCordisHost, type DoomCordisHostMode } from '@agimon-ai/doompi-extension-contracts/cordis-host';\nimport { readDoomMcpStatus } from '@agimon-ai/doompi-extension-contracts/mcp-status';\nimport {\n DOOM_MINOR_MODE_CATALOG_SERVICE,\n createMinorModeCatalogClient,\n requireMinorModeCatalog,\n} from '@agimon-ai/doompi-extension-contracts/mode';\nimport { DOOM_UI_HUB_SERVICE } from '@agimon-ai/doompi-extension-contracts/ui-hub';\nimport {\n DOOM_TOOL_OVERRIDES_SERVICE,\n type DoomToolOverrideRegistration,\n requireDoomToolOverrides,\n} from '@agimon-ai/doompi-extension-contracts/tool-overrides';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext, ReadonlyFooterDataProvider } from '@earendil-works/pi-coding-agent';\nimport { type DoomLeaderDiagnostic, DoomLeaderRegistry } from '../../services/leader/leaderRegistry.ts';\nimport { createDoomUiHub } from '../../services/hub/uiHub.ts';\nimport { DoomUiState, type LeaderSnapshot, projectMinorModeRecords } from '../../services/state/uiState.ts';\nimport { buildToolSources, type McpServerStatus } from '../../services/tools/toolInventory.ts';\nimport { openConfigOverlay } from '../../tui/configOverlay.ts';\nimport { DoomEditor } from '../../tui/doomEditor.ts';\nimport { DoomFooter } from '../../tui/doomFooter.ts';\nimport { DoomHeader } from '../../tui/doomHeader.ts';\nimport { LeaderHints } from '../../tui/leaderHints.ts';\nimport { DEFAULT_THEME_NAME } from '../../tui/theme.ts';\nimport { openToolsOverlay } from '../../tui/toolsOverlay.ts';\nimport { createUiTelemetry, UI_EVENT, type UiTelemetry } from '../telemetry/logSinkTelemetry.ts';\nimport { extensionName, extensionToolSource } from './extensionName.ts';\nimport { registerBuiltinToolUi } from './toolOverrides.ts';\n\nconst LEADER_WIDGET_KEY = 'doom-pi-leader';\nconst TUI_MODE = 'tui';\nconst WIDGET_PLACEMENT = 'belowEditor';\nconst WARNING_STYLE = 'warning';\nconst THEME_ENVIRONMENT_KEY = 'DOOMPI_THEME';\nconst HOTKEYS_COMMAND = 'hotkeys';\nconst TOOLS_COMMAND = 'tools';\nconst CONFIG_COMMAND = 'config';\nconst SESSION_START_EVENT = 'session_start';\nconst SESSION_MESSAGE_ENTRY = 'message';\nconst INPUT_EVENT = 'input';\nconst INTERACTIVE_INPUT_SOURCE = 'interactive';\nconst SESSION_SHUTDOWN_EVENT = 'session_shutdown';\nconst TITLE_MESSAGE_MAX_LENGTH = 64;\nconst TITLE_PREFIX = 'doom-pi';\nconst BUILTIN_LEADER_COMMANDS = new Set([HOTKEYS_COMMAND]);\nconst PACKAGE_SOURCE = '@agimon-ai/doompi-ui';\n\nfunction createMessageTitle(message: string, cwd: string): string | undefined {\n const normalizedMessage = message.trim().replace(/\\s+/g, ' ');\n if (!normalizedMessage) return undefined;\n const messageTitle = normalizedMessage.slice(0, TITLE_MESSAGE_MAX_LENGTH).trimEnd();\n return `${TITLE_PREFIX} · ${messageTitle} · ${path.basename(cwd) || cwd}`;\n}\n\ninterface UiPluginOptions {\n readonly pi: ExtensionAPI;\n readonly telemetry: UiTelemetry;\n readonly hostMode: DoomCordisHostMode;\n}\n\nfunction doomPiUiPlugin(cordis: Context, { pi, telemetry, hostMode }: UiPluginOptions): void {\n cordis.inject([DOOM_TOOL_OVERRIDES_SERVICE], (overridesContext) => {\n const toolOverrides = requireDoomToolOverrides(overridesContext);\n const registrations: DoomToolOverrideRegistration[] = [];\n const shouldRegister = (tool: string): boolean => {\n if (hostMode === 'composed') return true;\n const registration = toolOverrides.claim({ source: PACKAGE_SOURCE, tools: [tool] });\n if (registration.granted) registrations.push(registration);\n return registration.granted;\n };\n try {\n registerBuiltinToolUi(pi, process.cwd(), shouldRegister);\n } catch (error) {\n for (const registration of registrations) registration.dispose();\n throw error;\n }\n return () => {\n for (const registration of registrations) registration.dispose();\n };\n });\n const uiState = new DoomUiState();\n const leaderRegistry = new DoomLeaderRegistry();\n const pendingDiagnostics = new Set<string>();\n let footerData: ReadonlyFooterDataProvider | undefined;\n let activeContext: ExtensionContext | undefined;\n let sessionGeneration = 0;\n let hasSessionMessage = false;\n\n /**\n * Asks the MCP extension what it is currently connected to.\n *\n * No answer is a normal session: `--no-mcp` leaves nobody providing the query,\n * and the panel simply lists MCP tools under the extension that registered them.\n */\n const readMcpServers = (): readonly McpServerStatus[] | undefined => readDoomMcpStatus(cordis)?.getSnapshot().servers;\n\n pi.registerCommand(TOOLS_COMMAND, {\n description: 'Browse the tools available in this session',\n handler: async (_args, ctx) => {\n // Read at open time so a reconnected server or a plan-mode tool swap shows\n // up without restarting the session.\n const mcpServers = readMcpServers();\n const sources = buildToolSources({\n tools: pi.getAllTools(),\n activeTools: pi.getActiveTools(),\n ...(mcpServers ? { mcpServers } : {}),\n resolveExtensionName: extensionName,\n resolveExtensionToolSource: (toolName) => extensionToolSource(pi, toolName),\n });\n await openToolsOverlay(ctx, sources);\n },\n });\n\n pi.registerCommand(CONFIG_COMMAND, {\n description: 'Browse and change the settings extensions contribute',\n handler: async (_args, ctx) => {\n // The registry is passed live rather than snapshotted: a contributor can be\n // fetching or installing something while the panel is open, and that\n // progress is meant to land in it.\n await openConfigOverlay(ctx, hub.config);\n },\n });\n\n const reportDiagnostics = (diagnostics: readonly DoomLeaderDiagnostic[]): void => {\n for (const diagnostic of diagnostics) {\n const binding = diagnostic.bindingId ? ` (${diagnostic.bindingId})` : '';\n const message = `Leader contribution from ${diagnostic.source}${binding}: ${diagnostic.message}`;\n if (pendingDiagnostics.has(message)) continue;\n pendingDiagnostics.add(message);\n // A rejected contribution silently drops another extension's keybindings,\n // and the notice below only reaches a run that has a TUI attached.\n void telemetry.recordWarning(UI_EVENT.leaderContributionRejected, diagnostic.message, {\n 'leader.source': diagnostic.source,\n ...(diagnostic.bindingId ? { 'leader.binding.id': diagnostic.bindingId } : {}),\n });\n if (activeContext?.mode === TUI_MODE) activeContext.ui.notify(message, WARNING_STYLE);\n }\n };\n\n const hub = createDoomUiHub({ leaderRegistry, reportDiagnostics });\n cordis.provide(DOOM_UI_HUB_SERVICE, hub);\n cordis.inject([DOOM_MINOR_MODE_CATALOG_SERVICE], (modeContext) => {\n const catalog = createMinorModeCatalogClient(requireMinorModeCatalog(modeContext));\n const update = (): void => uiState.setModes(projectMinorModeRecords(catalog.list()));\n const dispose = catalog.subscribe(update);\n update();\n return () => {\n dispose();\n uiState.setModes([]);\n };\n });\n\n pi.on(SESSION_START_EVENT, (_event, ctx) => {\n activeContext = ctx;\n hub.setContext(ctx);\n const activeGeneration = ++sessionGeneration;\n reportDiagnostics(leaderRegistry.flush());\n hasSessionMessage = ctx.sessionManager.getEntries().some((entry) => entry.type === SESSION_MESSAGE_ENTRY);\n if (ctx.mode !== TUI_MODE) return;\n for (const message of pendingDiagnostics) ctx.ui.notify(message, WARNING_STYLE);\n\n const themeName = process.env[THEME_ENVIRONMENT_KEY] || DEFAULT_THEME_NAME;\n const themeResult = ctx.ui.setTheme(themeName);\n if (!themeResult.success) {\n ctx.ui.notify(`Could not apply Doom Pi theme: ${themeResult.error}`, WARNING_STYLE);\n void telemetry.recordWarning(UI_EVENT.themeApplyFailed, themeResult.error ?? 'Unknown theme error', {\n 'ui.theme': themeName,\n });\n }\n\n ctx.ui.setTitle(`${TITLE_PREFIX} · ${path.basename(ctx.cwd) || ctx.cwd} · pi/coding`);\n ctx.ui.setHeader((tui, theme) => new DoomHeader(theme, ctx.cwd, undefined, ctx, () => tui.terminal.rows));\n ctx.ui.setFooter((tui, theme, data) => {\n footerData = data;\n return new DoomFooter(tui, theme, ctx, data, hub.footer, uiState);\n });\n ctx.ui.setEditorComponent(\n (tui, editorTheme, keybindings) =>\n new DoomEditor(\n tui,\n editorTheme,\n keybindings,\n uiState,\n (snapshot: LeaderSnapshot) => {\n if (!snapshot.active) {\n ctx.ui.setWidget(LEADER_WIDGET_KEY, undefined, { placement: WIDGET_PLACEMENT });\n return;\n }\n ctx.ui.setWidget(\n LEADER_WIDGET_KEY,\n (_widgetTui, widgetTheme) => new LeaderHints(widgetTheme, snapshot, ctx, footerData, uiState.getModes()),\n { placement: WIDGET_PLACEMENT },\n );\n },\n undefined,\n ctx.ui.theme,\n {\n registry: leaderRegistry,\n isCommandAvailable: (commandName) =>\n BUILTIN_LEADER_COMMANDS.has(commandName) ||\n pi.getCommands().some((command) => command.name === commandName),\n onLeaderAction: (source, action) => {\n if (activeContext !== ctx || sessionGeneration !== activeGeneration) {\n ctx.ui.notify(`Leader action ${action} is unavailable.`, WARNING_STYLE);\n return;\n }\n hub.invokeLeaderAction(source, action);\n },\n onUnavailableCommand: (commandName) => {\n void telemetry.recordWarning(\n UI_EVENT.leaderCommandUnavailable,\n `Leader command /${commandName} is unavailable.`,\n { 'ui.kind': 'command' },\n );\n ctx.ui.notify(`Leader command /${commandName} is unavailable.`, WARNING_STYLE);\n },\n onUnavailableAction: (action) => {\n void telemetry.recordWarning(\n UI_EVENT.leaderActionUnavailable,\n `Leader action ${action} is unavailable.`,\n {\n 'ui.kind': 'action',\n },\n );\n ctx.ui.notify(`Leader action ${action} is unavailable.`, WARNING_STYLE);\n },\n },\n ),\n );\n\n void telemetry.recordEvent(UI_EVENT.shellInstalled, {\n 'ui.theme': themeName,\n 'ui.theme.applied': themeResult.success,\n 'ui.leader.group.count': leaderRegistry.getGroup([])?.options.length ?? 0,\n });\n });\n\n pi.on(INPUT_EVENT, (event, ctx) => {\n if (ctx.mode !== TUI_MODE || event.source !== INTERACTIVE_INPUT_SOURCE || hasSessionMessage) return;\n hasSessionMessage = true;\n const title = createMessageTitle(event.text, ctx.cwd);\n if (title) ctx.ui.setTitle(title);\n });\n\n cordis.effect(\n () => async () => {\n const context = activeContext;\n ++sessionGeneration;\n activeContext = undefined;\n hub.setContext(undefined);\n footerData = undefined;\n hub.dispose();\n uiState.reset();\n if (context?.mode === TUI_MODE) {\n context.ui.setWidget(LEADER_WIDGET_KEY, undefined, { placement: WIDGET_PLACEMENT });\n }\n await telemetry.shutdown();\n },\n PACKAGE_SOURCE,\n );\n}\n\n/** The package's standard Pi factory, mounted under the session Cordis host. */\nexport async function doomPiUiExtension(pi: ExtensionAPI, telemetry: UiTelemetry = createUiTelemetry()): Promise<void> {\n const connection = await connectDoomCordisHost(pi, PACKAGE_SOURCE);\n const fiber = connection.root.plugin(doomPiUiPlugin, { pi, telemetry, hostMode: connection.runtime.mode });\n try {\n await fiber;\n } catch (error) {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n throw error;\n }\n\n let disposal: Promise<void> | undefined;\n pi.on(\n SESSION_SHUTDOWN_EVENT,\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"extension.d.cts","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"mappings":";;;;iBAiPsB,kBAAkB,IAAI,cAAc,YAAW,cAAoC"}
1
+ {"version":3,"file":"extension.d.cts","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"mappings":";;;;iBAyQsB,kBAAkB,IAAI,cAAc,YAAW,cAAoC"}
@@ -1 +1 @@
1
- {"version":3,"file":"extension.d.mts","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"mappings":";;;;iBAiPsB,kBAAkB,IAAI,cAAc,YAAW,cAAoC"}
1
+ {"version":3,"file":"extension.d.mts","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"mappings":";;;;iBAyQsB,kBAAkB,IAAI,cAAc,YAAW,cAAoC"}
@@ -1,2 +1,2 @@
1
- import{DoomLeaderRegistry as e}from"../../services/leader/leaderRegistry.mjs";import{createDoomUiHub as t}from"../../services/hub/uiHub.mjs";import{DoomUiState as n,projectMinorModeRecords as r}from"../../services/state/uiState.mjs";import{buildToolSources as i}from"../../services/tools/toolInventory.mjs";import{openConfigOverlay as a}from"../../tui/configOverlay.mjs";import{DoomEditor as o}from"../../tui/doomEditor.mjs";import{DoomFooter as s}from"../../tui/doomFooter.mjs";import{DoomHeader as c}from"../../tui/doomHeader.mjs";import{LeaderHints as l}from"../../tui/leaderHints.mjs";import"../../tui/theme.mjs";import{openToolsOverlay as u}from"../../tui/toolsOverlay.mjs";import{UI_EVENT as d,createUiTelemetry as f}from"../telemetry/logSinkTelemetry.mjs";import{extensionName as p,extensionToolSource as m}from"./extensionName.mjs";import{registerBuiltinToolUi as h}from"./toolOverrides.mjs";import g from"node:path";import{connectDoomCordisHost as _}from"@agimon-ai/doompi-extension-contracts/cordis-host";import{readDoomMcpStatus as v}from"@agimon-ai/doompi-extension-contracts/mcp-status";import{DOOM_MINOR_MODE_CATALOG_SERVICE as y,createMinorModeCatalogClient as b,requireMinorModeCatalog as x}from"@agimon-ai/doompi-extension-contracts/mode";import{DOOM_UI_HUB_SERVICE as S}from"@agimon-ai/doompi-extension-contracts/ui-hub";const C=`doom-pi-leader`,w=`belowEditor`,T=`warning`,E=`doom-pi`,D=new Set([`hotkeys`]),O=`@agimon-ai/doompi-ui`;function k(e,t){let n=e.trim().replace(/\s+/g,` `);if(!n)return;let r=n.slice(0,64).trimEnd();return`${E} · ${r} · ${g.basename(t)||t}`}function A(f,{pi:_,telemetry:A}){h(_,process.cwd());let j=new n,M=new e,N=new Set,P,F,I=0,L=!1,R=()=>v(f)?.getSnapshot().servers;_.registerCommand(`tools`,{description:`Browse the tools available in this session`,handler:async(e,t)=>{let n=R(),r=i({tools:_.getAllTools(),activeTools:_.getActiveTools(),...n?{mcpServers:n}:{},resolveExtensionName:p,resolveExtensionToolSource:e=>m(_,e)});await u(t,r)}}),_.registerCommand(`config`,{description:`Browse and change the settings extensions contribute`,handler:async(e,t)=>{await a(t,B.config)}});let z=e=>{for(let t of e){let e=t.bindingId?` (${t.bindingId})`:``,n=`Leader contribution from ${t.source}${e}: ${t.message}`;N.has(n)||(N.add(n),A.recordWarning(d.leaderContributionRejected,t.message,{"leader.source":t.source,...t.bindingId?{"leader.binding.id":t.bindingId}:{}}),F?.mode===`tui`&&F.ui.notify(n,T))}},B=t({leaderRegistry:M,reportDiagnostics:z});f.provide(S,B),f.inject([y],e=>{let t=b(x(e)),n=()=>j.setModes(r(t.list())),i=t.subscribe(n);return n(),()=>{i(),j.setModes([])}}),_.on(`session_start`,(e,t)=>{F=t,B.setContext(t);let n=++I;if(z(M.flush()),L=t.sessionManager.getEntries().some(e=>e.type===`message`),t.mode!==`tui`)return;for(let e of N)t.ui.notify(e,T);let r=process.env.DOOMPI_THEME||`doom-pi-dark`,i=t.ui.setTheme(r);i.success||(t.ui.notify(`Could not apply Doom Pi theme: ${i.error}`,T),A.recordWarning(d.themeApplyFailed,i.error??`Unknown theme error`,{"ui.theme":r})),t.ui.setTitle(`${E} · ${g.basename(t.cwd)||t.cwd} · pi/coding`),t.ui.setHeader((e,n)=>new c(n,t.cwd,void 0,t,()=>e.terminal.rows)),t.ui.setFooter((e,n,r)=>(P=r,new s(e,n,t,r,B.footer,j))),t.ui.setEditorComponent((e,r,i)=>new o(e,r,i,j,e=>{if(!e.active){t.ui.setWidget(C,void 0,{placement:w});return}t.ui.setWidget(C,(n,r)=>new l(r,e,t,P,j.getModes()),{placement:w})},void 0,t.ui.theme,{registry:M,isCommandAvailable:e=>D.has(e)||_.getCommands().some(t=>t.name===e),onLeaderAction:(e,r)=>{if(F!==t||I!==n){t.ui.notify(`Leader action ${r} is unavailable.`,T);return}B.invokeLeaderAction(e,r)},onUnavailableCommand:e=>{A.recordWarning(d.leaderCommandUnavailable,`Leader command /${e} is unavailable.`,{"ui.kind":`command`}),t.ui.notify(`Leader command /${e} is unavailable.`,T)},onUnavailableAction:e=>{A.recordWarning(d.leaderActionUnavailable,`Leader action ${e} is unavailable.`,{"ui.kind":`action`}),t.ui.notify(`Leader action ${e} is unavailable.`,T)}})),A.recordEvent(d.shellInstalled,{"ui.theme":r,"ui.theme.applied":i.success,"ui.leader.group.count":M.getGroup([])?.options.length??0})}),_.on(`input`,(e,t)=>{if(t.mode!==`tui`||e.source!==`interactive`||L)return;L=!0;let n=k(e.text,t.cwd);n&&t.ui.setTitle(n)}),f.effect(()=>async()=>{let e=F;++I,F=void 0,B.setContext(void 0),P=void 0,B.dispose(),j.reset(),e?.mode===`tui`&&e.ui.setWidget(C,void 0,{placement:w}),await A.shutdown()},O)}async function j(e,t=f()){let n=await _(e,O),r=n.root.plugin(A,{pi:e,telemetry:t});try{await r}catch(e){try{await r.dispose()}finally{await n.dispose()}throw e}let i;e.on(`session_shutdown`,()=>i??=(async()=>{try{await r.dispose()}finally{await n.dispose()}})())}export{j as doomPiUiExtension};
1
+ import{DoomLeaderRegistry as e}from"../../services/leader/leaderRegistry.mjs";import{createDoomUiHub as t}from"../../services/hub/uiHub.mjs";import{DoomUiState as n,projectMinorModeRecords as r}from"../../services/state/uiState.mjs";import{buildToolSources as i}from"../../services/tools/toolInventory.mjs";import{openConfigOverlay as a}from"../../tui/configOverlay.mjs";import{DoomEditor as o}from"../../tui/doomEditor.mjs";import{DoomFooter as s}from"../../tui/doomFooter.mjs";import{DoomHeader as c}from"../../tui/doomHeader.mjs";import{LeaderHints as l}from"../../tui/leaderHints.mjs";import"../../tui/theme.mjs";import{openToolsOverlay as u}from"../../tui/toolsOverlay.mjs";import{UI_EVENT as d,createUiTelemetry as f}from"../telemetry/logSinkTelemetry.mjs";import{extensionName as p,extensionToolSource as m}from"./extensionName.mjs";import{registerBuiltinToolUi as h}from"./toolOverrides.mjs";import g from"node:path";import{connectDoomCordisHost as _}from"@agimon-ai/doompi-extension-contracts/cordis-host";import{readDoomMcpStatus as v}from"@agimon-ai/doompi-extension-contracts/mcp-status";import{DOOM_MINOR_MODE_CATALOG_SERVICE as y,createMinorModeCatalogClient as b,requireMinorModeCatalog as x}from"@agimon-ai/doompi-extension-contracts/mode";import{DOOM_UI_HUB_SERVICE as S}from"@agimon-ai/doompi-extension-contracts/ui-hub";import{DOOM_TOOL_OVERRIDES_SERVICE as C,requireDoomToolOverrides as w}from"@agimon-ai/doompi-extension-contracts/tool-overrides";const T=`doom-pi-leader`,E=`belowEditor`,D=`warning`,O=`doom-pi`,k=new Set([`hotkeys`]),A=`@agimon-ai/doompi-ui`;function j(e,t){let n=e.trim().replace(/\s+/g,` `);if(!n)return;let r=n.slice(0,64).trimEnd();return`${O} · ${r} · ${g.basename(t)||t}`}function M(f,{pi:_,telemetry:M,hostMode:N}){f.inject([C],e=>{let t=w(e),n=[],r=e=>{if(N===`composed`)return!0;let r=t.claim({source:A,tools:[e]});return r.granted&&n.push(r),r.granted};try{h(_,process.cwd(),r)}catch(e){for(let e of n)e.dispose();throw e}return()=>{for(let e of n)e.dispose()}});let P=new n,F=new e,I=new Set,L,R,z=0,B=!1,V=()=>v(f)?.getSnapshot().servers;_.registerCommand(`tools`,{description:`Browse the tools available in this session`,handler:async(e,t)=>{let n=V(),r=i({tools:_.getAllTools(),activeTools:_.getActiveTools(),...n?{mcpServers:n}:{},resolveExtensionName:p,resolveExtensionToolSource:e=>m(_,e)});await u(t,r)}}),_.registerCommand(`config`,{description:`Browse and change the settings extensions contribute`,handler:async(e,t)=>{await a(t,U.config)}});let H=e=>{for(let t of e){let e=t.bindingId?` (${t.bindingId})`:``,n=`Leader contribution from ${t.source}${e}: ${t.message}`;I.has(n)||(I.add(n),M.recordWarning(d.leaderContributionRejected,t.message,{"leader.source":t.source,...t.bindingId?{"leader.binding.id":t.bindingId}:{}}),R?.mode===`tui`&&R.ui.notify(n,D))}},U=t({leaderRegistry:F,reportDiagnostics:H});f.provide(S,U),f.inject([y],e=>{let t=b(x(e)),n=()=>P.setModes(r(t.list())),i=t.subscribe(n);return n(),()=>{i(),P.setModes([])}}),_.on(`session_start`,(e,t)=>{R=t,U.setContext(t);let n=++z;if(H(F.flush()),B=t.sessionManager.getEntries().some(e=>e.type===`message`),t.mode!==`tui`)return;for(let e of I)t.ui.notify(e,D);let r=process.env.DOOMPI_THEME||`doom-pi-dark`,i=t.ui.setTheme(r);i.success||(t.ui.notify(`Could not apply Doom Pi theme: ${i.error}`,D),M.recordWarning(d.themeApplyFailed,i.error??`Unknown theme error`,{"ui.theme":r})),t.ui.setTitle(`${O} · ${g.basename(t.cwd)||t.cwd} · pi/coding`),t.ui.setHeader((e,n)=>new c(n,t.cwd,void 0,t,()=>e.terminal.rows)),t.ui.setFooter((e,n,r)=>(L=r,new s(e,n,t,r,U.footer,P))),t.ui.setEditorComponent((e,r,i)=>new o(e,r,i,P,e=>{if(!e.active){t.ui.setWidget(T,void 0,{placement:E});return}t.ui.setWidget(T,(n,r)=>new l(r,e,t,L,P.getModes()),{placement:E})},void 0,t.ui.theme,{registry:F,isCommandAvailable:e=>k.has(e)||_.getCommands().some(t=>t.name===e),onLeaderAction:(e,r)=>{if(R!==t||z!==n){t.ui.notify(`Leader action ${r} is unavailable.`,D);return}U.invokeLeaderAction(e,r)},onUnavailableCommand:e=>{M.recordWarning(d.leaderCommandUnavailable,`Leader command /${e} is unavailable.`,{"ui.kind":`command`}),t.ui.notify(`Leader command /${e} is unavailable.`,D)},onUnavailableAction:e=>{M.recordWarning(d.leaderActionUnavailable,`Leader action ${e} is unavailable.`,{"ui.kind":`action`}),t.ui.notify(`Leader action ${e} is unavailable.`,D)}})),M.recordEvent(d.shellInstalled,{"ui.theme":r,"ui.theme.applied":i.success,"ui.leader.group.count":F.getGroup([])?.options.length??0})}),_.on(`input`,(e,t)=>{if(t.mode!==`tui`||e.source!==`interactive`||B)return;B=!0;let n=j(e.text,t.cwd);n&&t.ui.setTitle(n)}),f.effect(()=>async()=>{let e=R;++z,R=void 0,U.setContext(void 0),L=void 0,U.dispose(),P.reset(),e?.mode===`tui`&&e.ui.setWidget(T,void 0,{placement:E}),await M.shutdown()},A)}async function N(e,t=f()){let n=await _(e,A),r=n.root.plugin(M,{pi:e,telemetry:t,hostMode:n.runtime.mode});try{await r}catch(e){try{await r.dispose()}finally{await n.dispose()}throw e}let i;e.on(`session_shutdown`,()=>i??=(async()=>{try{await r.dispose()}finally{await n.dispose()}})())}export{N as doomPiUiExtension};
2
2
  //# sourceMappingURL=extension.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"extension.mjs","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"sourcesContent":["import path from 'node:path';\nimport { connectDoomCordisHost } from '@agimon-ai/doompi-extension-contracts/cordis-host';\nimport { readDoomMcpStatus } from '@agimon-ai/doompi-extension-contracts/mcp-status';\nimport {\n DOOM_MINOR_MODE_CATALOG_SERVICE,\n createMinorModeCatalogClient,\n requireMinorModeCatalog,\n} from '@agimon-ai/doompi-extension-contracts/mode';\nimport { DOOM_UI_HUB_SERVICE } from '@agimon-ai/doompi-extension-contracts/ui-hub';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext, ReadonlyFooterDataProvider } from '@earendil-works/pi-coding-agent';\nimport { type DoomLeaderDiagnostic, DoomLeaderRegistry } from '../../services/leader/leaderRegistry.ts';\nimport { createDoomUiHub } from '../../services/hub/uiHub.ts';\nimport { DoomUiState, type LeaderSnapshot, projectMinorModeRecords } from '../../services/state/uiState.ts';\nimport { buildToolSources, type McpServerStatus } from '../../services/tools/toolInventory.ts';\nimport { openConfigOverlay } from '../../tui/configOverlay.ts';\nimport { DoomEditor } from '../../tui/doomEditor.ts';\nimport { DoomFooter } from '../../tui/doomFooter.ts';\nimport { DoomHeader } from '../../tui/doomHeader.ts';\nimport { LeaderHints } from '../../tui/leaderHints.ts';\nimport { DEFAULT_THEME_NAME } from '../../tui/theme.ts';\nimport { openToolsOverlay } from '../../tui/toolsOverlay.ts';\nimport { createUiTelemetry, UI_EVENT, type UiTelemetry } from '../telemetry/logSinkTelemetry.ts';\nimport { extensionName, extensionToolSource } from './extensionName.ts';\nimport { registerBuiltinToolUi } from './toolOverrides.ts';\n\nconst LEADER_WIDGET_KEY = 'doom-pi-leader';\nconst TUI_MODE = 'tui';\nconst WIDGET_PLACEMENT = 'belowEditor';\nconst WARNING_STYLE = 'warning';\nconst THEME_ENVIRONMENT_KEY = 'DOOMPI_THEME';\nconst HOTKEYS_COMMAND = 'hotkeys';\nconst TOOLS_COMMAND = 'tools';\nconst CONFIG_COMMAND = 'config';\nconst SESSION_START_EVENT = 'session_start';\nconst SESSION_MESSAGE_ENTRY = 'message';\nconst INPUT_EVENT = 'input';\nconst INTERACTIVE_INPUT_SOURCE = 'interactive';\nconst SESSION_SHUTDOWN_EVENT = 'session_shutdown';\nconst TITLE_MESSAGE_MAX_LENGTH = 64;\nconst TITLE_PREFIX = 'doom-pi';\nconst BUILTIN_LEADER_COMMANDS = new Set([HOTKEYS_COMMAND]);\nconst PACKAGE_SOURCE = '@agimon-ai/doompi-ui';\n\nfunction createMessageTitle(message: string, cwd: string): string | undefined {\n const normalizedMessage = message.trim().replace(/\\s+/g, ' ');\n if (!normalizedMessage) return undefined;\n const messageTitle = normalizedMessage.slice(0, TITLE_MESSAGE_MAX_LENGTH).trimEnd();\n return `${TITLE_PREFIX} · ${messageTitle} · ${path.basename(cwd) || cwd}`;\n}\n\ninterface UiPluginOptions {\n readonly pi: ExtensionAPI;\n readonly telemetry: UiTelemetry;\n}\n\nfunction doomPiUiPlugin(cordis: Context, { pi, telemetry }: UiPluginOptions): void {\n registerBuiltinToolUi(pi, process.cwd());\n const uiState = new DoomUiState();\n const leaderRegistry = new DoomLeaderRegistry();\n const pendingDiagnostics = new Set<string>();\n let footerData: ReadonlyFooterDataProvider | undefined;\n let activeContext: ExtensionContext | undefined;\n let sessionGeneration = 0;\n let hasSessionMessage = false;\n\n /**\n * Asks the MCP extension what it is currently connected to.\n *\n * No answer is a normal session: `--no-mcp` leaves nobody providing the query,\n * and the panel simply lists MCP tools under the extension that registered them.\n */\n const readMcpServers = (): readonly McpServerStatus[] | undefined => readDoomMcpStatus(cordis)?.getSnapshot().servers;\n\n pi.registerCommand(TOOLS_COMMAND, {\n description: 'Browse the tools available in this session',\n handler: async (_args, ctx) => {\n // Read at open time so a reconnected server or a plan-mode tool swap shows\n // up without restarting the session.\n const mcpServers = readMcpServers();\n const sources = buildToolSources({\n tools: pi.getAllTools(),\n activeTools: pi.getActiveTools(),\n ...(mcpServers ? { mcpServers } : {}),\n resolveExtensionName: extensionName,\n resolveExtensionToolSource: (toolName) => extensionToolSource(pi, toolName),\n });\n await openToolsOverlay(ctx, sources);\n },\n });\n\n pi.registerCommand(CONFIG_COMMAND, {\n description: 'Browse and change the settings extensions contribute',\n handler: async (_args, ctx) => {\n // The registry is passed live rather than snapshotted: a contributor can be\n // fetching or installing something while the panel is open, and that\n // progress is meant to land in it.\n await openConfigOverlay(ctx, hub.config);\n },\n });\n\n const reportDiagnostics = (diagnostics: readonly DoomLeaderDiagnostic[]): void => {\n for (const diagnostic of diagnostics) {\n const binding = diagnostic.bindingId ? ` (${diagnostic.bindingId})` : '';\n const message = `Leader contribution from ${diagnostic.source}${binding}: ${diagnostic.message}`;\n if (pendingDiagnostics.has(message)) continue;\n pendingDiagnostics.add(message);\n // A rejected contribution silently drops another extension's keybindings,\n // and the notice below only reaches a run that has a TUI attached.\n void telemetry.recordWarning(UI_EVENT.leaderContributionRejected, diagnostic.message, {\n 'leader.source': diagnostic.source,\n ...(diagnostic.bindingId ? { 'leader.binding.id': diagnostic.bindingId } : {}),\n });\n if (activeContext?.mode === TUI_MODE) activeContext.ui.notify(message, WARNING_STYLE);\n }\n };\n\n const hub = createDoomUiHub({ leaderRegistry, reportDiagnostics });\n cordis.provide(DOOM_UI_HUB_SERVICE, hub);\n cordis.inject([DOOM_MINOR_MODE_CATALOG_SERVICE], (modeContext) => {\n const catalog = createMinorModeCatalogClient(requireMinorModeCatalog(modeContext));\n const update = (): void => uiState.setModes(projectMinorModeRecords(catalog.list()));\n const dispose = catalog.subscribe(update);\n update();\n return () => {\n dispose();\n uiState.setModes([]);\n };\n });\n\n pi.on(SESSION_START_EVENT, (_event, ctx) => {\n activeContext = ctx;\n hub.setContext(ctx);\n const activeGeneration = ++sessionGeneration;\n reportDiagnostics(leaderRegistry.flush());\n hasSessionMessage = ctx.sessionManager.getEntries().some((entry) => entry.type === SESSION_MESSAGE_ENTRY);\n if (ctx.mode !== TUI_MODE) return;\n for (const message of pendingDiagnostics) ctx.ui.notify(message, WARNING_STYLE);\n\n const themeName = process.env[THEME_ENVIRONMENT_KEY] || DEFAULT_THEME_NAME;\n const themeResult = ctx.ui.setTheme(themeName);\n if (!themeResult.success) {\n ctx.ui.notify(`Could not apply Doom Pi theme: ${themeResult.error}`, WARNING_STYLE);\n void telemetry.recordWarning(UI_EVENT.themeApplyFailed, themeResult.error ?? 'Unknown theme error', {\n 'ui.theme': themeName,\n });\n }\n\n ctx.ui.setTitle(`${TITLE_PREFIX} · ${path.basename(ctx.cwd) || ctx.cwd} · pi/coding`);\n ctx.ui.setHeader((tui, theme) => new DoomHeader(theme, ctx.cwd, undefined, ctx, () => tui.terminal.rows));\n ctx.ui.setFooter((tui, theme, data) => {\n footerData = data;\n return new DoomFooter(tui, theme, ctx, data, hub.footer, uiState);\n });\n ctx.ui.setEditorComponent(\n (tui, editorTheme, keybindings) =>\n new DoomEditor(\n tui,\n editorTheme,\n keybindings,\n uiState,\n (snapshot: LeaderSnapshot) => {\n if (!snapshot.active) {\n ctx.ui.setWidget(LEADER_WIDGET_KEY, undefined, { placement: WIDGET_PLACEMENT });\n return;\n }\n ctx.ui.setWidget(\n LEADER_WIDGET_KEY,\n (_widgetTui, widgetTheme) => new LeaderHints(widgetTheme, snapshot, ctx, footerData, uiState.getModes()),\n { placement: WIDGET_PLACEMENT },\n );\n },\n undefined,\n ctx.ui.theme,\n {\n registry: leaderRegistry,\n isCommandAvailable: (commandName) =>\n BUILTIN_LEADER_COMMANDS.has(commandName) ||\n pi.getCommands().some((command) => command.name === commandName),\n onLeaderAction: (source, action) => {\n if (activeContext !== ctx || sessionGeneration !== activeGeneration) {\n ctx.ui.notify(`Leader action ${action} is unavailable.`, WARNING_STYLE);\n return;\n }\n hub.invokeLeaderAction(source, action);\n },\n onUnavailableCommand: (commandName) => {\n void telemetry.recordWarning(\n UI_EVENT.leaderCommandUnavailable,\n `Leader command /${commandName} is unavailable.`,\n { 'ui.kind': 'command' },\n );\n ctx.ui.notify(`Leader command /${commandName} is unavailable.`, WARNING_STYLE);\n },\n onUnavailableAction: (action) => {\n void telemetry.recordWarning(\n UI_EVENT.leaderActionUnavailable,\n `Leader action ${action} is unavailable.`,\n {\n 'ui.kind': 'action',\n },\n );\n ctx.ui.notify(`Leader action ${action} is unavailable.`, WARNING_STYLE);\n },\n },\n ),\n );\n\n void telemetry.recordEvent(UI_EVENT.shellInstalled, {\n 'ui.theme': themeName,\n 'ui.theme.applied': themeResult.success,\n 'ui.leader.group.count': leaderRegistry.getGroup([])?.options.length ?? 0,\n });\n });\n\n pi.on(INPUT_EVENT, (event, ctx) => {\n if (ctx.mode !== TUI_MODE || event.source !== INTERACTIVE_INPUT_SOURCE || hasSessionMessage) return;\n hasSessionMessage = true;\n const title = createMessageTitle(event.text, ctx.cwd);\n if (title) ctx.ui.setTitle(title);\n });\n\n cordis.effect(\n () => async () => {\n const context = activeContext;\n ++sessionGeneration;\n activeContext = undefined;\n hub.setContext(undefined);\n footerData = undefined;\n hub.dispose();\n uiState.reset();\n if (context?.mode === TUI_MODE) {\n context.ui.setWidget(LEADER_WIDGET_KEY, undefined, { placement: WIDGET_PLACEMENT });\n }\n await telemetry.shutdown();\n },\n PACKAGE_SOURCE,\n );\n}\n\n/** The package's standard Pi factory, mounted under the session Cordis host. */\nexport async function doomPiUiExtension(pi: ExtensionAPI, telemetry: UiTelemetry = createUiTelemetry()): Promise<void> {\n const connection = await connectDoomCordisHost(pi, PACKAGE_SOURCE);\n const fiber = connection.root.plugin(doomPiUiPlugin, { pi, telemetry });\n try {\n await fiber;\n } catch (error) {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n throw error;\n }\n\n let disposal: Promise<void> | undefined;\n pi.on(\n SESSION_SHUTDOWN_EVENT,\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"extension.mjs","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"sourcesContent":["import path from 'node:path';\nimport { connectDoomCordisHost, type DoomCordisHostMode } from '@agimon-ai/doompi-extension-contracts/cordis-host';\nimport { readDoomMcpStatus } from '@agimon-ai/doompi-extension-contracts/mcp-status';\nimport {\n DOOM_MINOR_MODE_CATALOG_SERVICE,\n createMinorModeCatalogClient,\n requireMinorModeCatalog,\n} from '@agimon-ai/doompi-extension-contracts/mode';\nimport { DOOM_UI_HUB_SERVICE } from '@agimon-ai/doompi-extension-contracts/ui-hub';\nimport {\n DOOM_TOOL_OVERRIDES_SERVICE,\n type DoomToolOverrideRegistration,\n requireDoomToolOverrides,\n} from '@agimon-ai/doompi-extension-contracts/tool-overrides';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext, ReadonlyFooterDataProvider } from '@earendil-works/pi-coding-agent';\nimport { type DoomLeaderDiagnostic, DoomLeaderRegistry } from '../../services/leader/leaderRegistry.ts';\nimport { createDoomUiHub } from '../../services/hub/uiHub.ts';\nimport { DoomUiState, type LeaderSnapshot, projectMinorModeRecords } from '../../services/state/uiState.ts';\nimport { buildToolSources, type McpServerStatus } from '../../services/tools/toolInventory.ts';\nimport { openConfigOverlay } from '../../tui/configOverlay.ts';\nimport { DoomEditor } from '../../tui/doomEditor.ts';\nimport { DoomFooter } from '../../tui/doomFooter.ts';\nimport { DoomHeader } from '../../tui/doomHeader.ts';\nimport { LeaderHints } from '../../tui/leaderHints.ts';\nimport { DEFAULT_THEME_NAME } from '../../tui/theme.ts';\nimport { openToolsOverlay } from '../../tui/toolsOverlay.ts';\nimport { createUiTelemetry, UI_EVENT, type UiTelemetry } from '../telemetry/logSinkTelemetry.ts';\nimport { extensionName, extensionToolSource } from './extensionName.ts';\nimport { registerBuiltinToolUi } from './toolOverrides.ts';\n\nconst LEADER_WIDGET_KEY = 'doom-pi-leader';\nconst TUI_MODE = 'tui';\nconst WIDGET_PLACEMENT = 'belowEditor';\nconst WARNING_STYLE = 'warning';\nconst THEME_ENVIRONMENT_KEY = 'DOOMPI_THEME';\nconst HOTKEYS_COMMAND = 'hotkeys';\nconst TOOLS_COMMAND = 'tools';\nconst CONFIG_COMMAND = 'config';\nconst SESSION_START_EVENT = 'session_start';\nconst SESSION_MESSAGE_ENTRY = 'message';\nconst INPUT_EVENT = 'input';\nconst INTERACTIVE_INPUT_SOURCE = 'interactive';\nconst SESSION_SHUTDOWN_EVENT = 'session_shutdown';\nconst TITLE_MESSAGE_MAX_LENGTH = 64;\nconst TITLE_PREFIX = 'doom-pi';\nconst BUILTIN_LEADER_COMMANDS = new Set([HOTKEYS_COMMAND]);\nconst PACKAGE_SOURCE = '@agimon-ai/doompi-ui';\n\nfunction createMessageTitle(message: string, cwd: string): string | undefined {\n const normalizedMessage = message.trim().replace(/\\s+/g, ' ');\n if (!normalizedMessage) return undefined;\n const messageTitle = normalizedMessage.slice(0, TITLE_MESSAGE_MAX_LENGTH).trimEnd();\n return `${TITLE_PREFIX} · ${messageTitle} · ${path.basename(cwd) || cwd}`;\n}\n\ninterface UiPluginOptions {\n readonly pi: ExtensionAPI;\n readonly telemetry: UiTelemetry;\n readonly hostMode: DoomCordisHostMode;\n}\n\nfunction doomPiUiPlugin(cordis: Context, { pi, telemetry, hostMode }: UiPluginOptions): void {\n cordis.inject([DOOM_TOOL_OVERRIDES_SERVICE], (overridesContext) => {\n const toolOverrides = requireDoomToolOverrides(overridesContext);\n const registrations: DoomToolOverrideRegistration[] = [];\n const shouldRegister = (tool: string): boolean => {\n if (hostMode === 'composed') return true;\n const registration = toolOverrides.claim({ source: PACKAGE_SOURCE, tools: [tool] });\n if (registration.granted) registrations.push(registration);\n return registration.granted;\n };\n try {\n registerBuiltinToolUi(pi, process.cwd(), shouldRegister);\n } catch (error) {\n for (const registration of registrations) registration.dispose();\n throw error;\n }\n return () => {\n for (const registration of registrations) registration.dispose();\n };\n });\n const uiState = new DoomUiState();\n const leaderRegistry = new DoomLeaderRegistry();\n const pendingDiagnostics = new Set<string>();\n let footerData: ReadonlyFooterDataProvider | undefined;\n let activeContext: ExtensionContext | undefined;\n let sessionGeneration = 0;\n let hasSessionMessage = false;\n\n /**\n * Asks the MCP extension what it is currently connected to.\n *\n * No answer is a normal session: `--no-mcp` leaves nobody providing the query,\n * and the panel simply lists MCP tools under the extension that registered them.\n */\n const readMcpServers = (): readonly McpServerStatus[] | undefined => readDoomMcpStatus(cordis)?.getSnapshot().servers;\n\n pi.registerCommand(TOOLS_COMMAND, {\n description: 'Browse the tools available in this session',\n handler: async (_args, ctx) => {\n // Read at open time so a reconnected server or a plan-mode tool swap shows\n // up without restarting the session.\n const mcpServers = readMcpServers();\n const sources = buildToolSources({\n tools: pi.getAllTools(),\n activeTools: pi.getActiveTools(),\n ...(mcpServers ? { mcpServers } : {}),\n resolveExtensionName: extensionName,\n resolveExtensionToolSource: (toolName) => extensionToolSource(pi, toolName),\n });\n await openToolsOverlay(ctx, sources);\n },\n });\n\n pi.registerCommand(CONFIG_COMMAND, {\n description: 'Browse and change the settings extensions contribute',\n handler: async (_args, ctx) => {\n // The registry is passed live rather than snapshotted: a contributor can be\n // fetching or installing something while the panel is open, and that\n // progress is meant to land in it.\n await openConfigOverlay(ctx, hub.config);\n },\n });\n\n const reportDiagnostics = (diagnostics: readonly DoomLeaderDiagnostic[]): void => {\n for (const diagnostic of diagnostics) {\n const binding = diagnostic.bindingId ? ` (${diagnostic.bindingId})` : '';\n const message = `Leader contribution from ${diagnostic.source}${binding}: ${diagnostic.message}`;\n if (pendingDiagnostics.has(message)) continue;\n pendingDiagnostics.add(message);\n // A rejected contribution silently drops another extension's keybindings,\n // and the notice below only reaches a run that has a TUI attached.\n void telemetry.recordWarning(UI_EVENT.leaderContributionRejected, diagnostic.message, {\n 'leader.source': diagnostic.source,\n ...(diagnostic.bindingId ? { 'leader.binding.id': diagnostic.bindingId } : {}),\n });\n if (activeContext?.mode === TUI_MODE) activeContext.ui.notify(message, WARNING_STYLE);\n }\n };\n\n const hub = createDoomUiHub({ leaderRegistry, reportDiagnostics });\n cordis.provide(DOOM_UI_HUB_SERVICE, hub);\n cordis.inject([DOOM_MINOR_MODE_CATALOG_SERVICE], (modeContext) => {\n const catalog = createMinorModeCatalogClient(requireMinorModeCatalog(modeContext));\n const update = (): void => uiState.setModes(projectMinorModeRecords(catalog.list()));\n const dispose = catalog.subscribe(update);\n update();\n return () => {\n dispose();\n uiState.setModes([]);\n };\n });\n\n pi.on(SESSION_START_EVENT, (_event, ctx) => {\n activeContext = ctx;\n hub.setContext(ctx);\n const activeGeneration = ++sessionGeneration;\n reportDiagnostics(leaderRegistry.flush());\n hasSessionMessage = ctx.sessionManager.getEntries().some((entry) => entry.type === SESSION_MESSAGE_ENTRY);\n if (ctx.mode !== TUI_MODE) return;\n for (const message of pendingDiagnostics) ctx.ui.notify(message, WARNING_STYLE);\n\n const themeName = process.env[THEME_ENVIRONMENT_KEY] || DEFAULT_THEME_NAME;\n const themeResult = ctx.ui.setTheme(themeName);\n if (!themeResult.success) {\n ctx.ui.notify(`Could not apply Doom Pi theme: ${themeResult.error}`, WARNING_STYLE);\n void telemetry.recordWarning(UI_EVENT.themeApplyFailed, themeResult.error ?? 'Unknown theme error', {\n 'ui.theme': themeName,\n });\n }\n\n ctx.ui.setTitle(`${TITLE_PREFIX} · ${path.basename(ctx.cwd) || ctx.cwd} · pi/coding`);\n ctx.ui.setHeader((tui, theme) => new DoomHeader(theme, ctx.cwd, undefined, ctx, () => tui.terminal.rows));\n ctx.ui.setFooter((tui, theme, data) => {\n footerData = data;\n return new DoomFooter(tui, theme, ctx, data, hub.footer, uiState);\n });\n ctx.ui.setEditorComponent(\n (tui, editorTheme, keybindings) =>\n new DoomEditor(\n tui,\n editorTheme,\n keybindings,\n uiState,\n (snapshot: LeaderSnapshot) => {\n if (!snapshot.active) {\n ctx.ui.setWidget(LEADER_WIDGET_KEY, undefined, { placement: WIDGET_PLACEMENT });\n return;\n }\n ctx.ui.setWidget(\n LEADER_WIDGET_KEY,\n (_widgetTui, widgetTheme) => new LeaderHints(widgetTheme, snapshot, ctx, footerData, uiState.getModes()),\n { placement: WIDGET_PLACEMENT },\n );\n },\n undefined,\n ctx.ui.theme,\n {\n registry: leaderRegistry,\n isCommandAvailable: (commandName) =>\n BUILTIN_LEADER_COMMANDS.has(commandName) ||\n pi.getCommands().some((command) => command.name === commandName),\n onLeaderAction: (source, action) => {\n if (activeContext !== ctx || sessionGeneration !== activeGeneration) {\n ctx.ui.notify(`Leader action ${action} is unavailable.`, WARNING_STYLE);\n return;\n }\n hub.invokeLeaderAction(source, action);\n },\n onUnavailableCommand: (commandName) => {\n void telemetry.recordWarning(\n UI_EVENT.leaderCommandUnavailable,\n `Leader command /${commandName} is unavailable.`,\n { 'ui.kind': 'command' },\n );\n ctx.ui.notify(`Leader command /${commandName} is unavailable.`, WARNING_STYLE);\n },\n onUnavailableAction: (action) => {\n void telemetry.recordWarning(\n UI_EVENT.leaderActionUnavailable,\n `Leader action ${action} is unavailable.`,\n {\n 'ui.kind': 'action',\n },\n );\n ctx.ui.notify(`Leader action ${action} is unavailable.`, WARNING_STYLE);\n },\n },\n ),\n );\n\n void telemetry.recordEvent(UI_EVENT.shellInstalled, {\n 'ui.theme': themeName,\n 'ui.theme.applied': themeResult.success,\n 'ui.leader.group.count': leaderRegistry.getGroup([])?.options.length ?? 0,\n });\n });\n\n pi.on(INPUT_EVENT, (event, ctx) => {\n if (ctx.mode !== TUI_MODE || event.source !== INTERACTIVE_INPUT_SOURCE || hasSessionMessage) return;\n hasSessionMessage = true;\n const title = createMessageTitle(event.text, ctx.cwd);\n if (title) ctx.ui.setTitle(title);\n });\n\n cordis.effect(\n () => async () => {\n const context = activeContext;\n ++sessionGeneration;\n activeContext = undefined;\n hub.setContext(undefined);\n footerData = undefined;\n hub.dispose();\n uiState.reset();\n if (context?.mode === TUI_MODE) {\n context.ui.setWidget(LEADER_WIDGET_KEY, undefined, { placement: WIDGET_PLACEMENT });\n }\n await telemetry.shutdown();\n },\n PACKAGE_SOURCE,\n );\n}\n\n/** The package's standard Pi factory, mounted under the session Cordis host. */\nexport async function doomPiUiExtension(pi: ExtensionAPI, telemetry: UiTelemetry = createUiTelemetry()): Promise<void> {\n const connection = await connectDoomCordisHost(pi, PACKAGE_SOURCE);\n const fiber = connection.root.plugin(doomPiUiPlugin, { pi, telemetry, hostMode: connection.runtime.mode });\n try {\n await fiber;\n } catch (error) {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n throw error;\n }\n\n let disposal: Promise<void> | undefined;\n pi.on(\n SESSION_SHUTDOWN_EVENT,\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require("../../tui/builtinToolRender.cjs");let t=require("@earendil-works/pi-coding-agent");function n(n,r){let i=(0,t.createReadToolDefinition)(r);n.registerTool({...i,renderShell:`self`,renderCall:(t,n)=>e.renderReadCall(t,n),renderResult:(t,n,r,i)=>{let a=e.renderReadResult(i.args,t,{expanded:n.expanded,isError:i.isError},r);return e.frameBuiltinResult(a,r,i.lastComponent)}});let a=(0,t.createEditToolDefinition)(r);n.registerTool({...a,renderShell:`self`,renderCall:(t,n)=>e.renderEditCall(t,n),renderResult:(t,n,r,i)=>{let a=e.renderEditResult(i.args,t,{expanded:n.expanded,isError:i.isError},r);return e.frameBuiltinResult(a,r,i.lastComponent)}});let o=(0,t.createWriteToolDefinition)(r),s=o.renderResult;n.registerTool({...o,renderShell:`self`,renderCall:(t,n,r)=>e.renderWriteCall(t,n,{expanded:r.expanded,argsStreaming:r.argsComplete===!1&&r.isPartial}),renderResult:(t,n,r,i)=>{let a=s(t,n,r,{...i,lastComponent:e.previousBuiltinResult(i.lastComponent)});return e.frameBuiltinResult(a,r,i.lastComponent)}});let c=(0,t.createGrepToolDefinition)(r),l=c.renderResult;n.registerTool({...c,renderShell:`self`,renderCall:(t,n)=>e.renderGrepCall(t,n),renderResult:(t,n,r,i)=>{let a=l(t,n,r,{...i,lastComponent:e.previousBuiltinResult(i.lastComponent)});return e.frameBuiltinResult(a,r,i.lastComponent)}});let u=(0,t.createFindToolDefinition)(r),d=u.renderResult;n.registerTool({...u,renderShell:`self`,renderCall:(t,n)=>e.renderFindCall(t,n),renderResult:(t,n,r,i)=>{let a=d(t,n,r,{...i,lastComponent:e.previousBuiltinResult(i.lastComponent)});return e.frameBuiltinResult(a,r,i.lastComponent)}});let f=(0,t.createLsToolDefinition)(r),p=f.renderResult;n.registerTool({...f,renderShell:`self`,renderCall:(t,n)=>e.renderLsCall(t,n),renderResult:(t,n,r,i)=>{let a=p(t,n,r,{...i,lastComponent:e.previousBuiltinResult(i.lastComponent)});return e.frameBuiltinResult(a,r,i.lastComponent)}})}exports.registerBuiltinToolUi=n;
1
+ const e=require("../../tui/builtinToolRender.cjs");let t=require("@earendil-works/pi-coding-agent");function n(n,r,i=()=>!0){let a=(0,t.createReadToolDefinition)(r);i(a.name)&&n.registerTool({...a,renderShell:`self`,renderCall:(t,n)=>e.renderReadCall(t,n),renderResult:(t,n,r,i)=>{let a=e.renderReadResult(i.args,t,{expanded:n.expanded,isError:i.isError},r);return e.frameBuiltinResult(a,r,i.lastComponent)}});let o=(0,t.createEditToolDefinition)(r);i(o.name)&&n.registerTool({...o,renderShell:`self`,renderCall:(t,n)=>e.renderEditCall(t,n),renderResult:(t,n,r,i)=>{let a=e.renderEditResult(i.args,t,{expanded:n.expanded,isError:i.isError},r);return e.frameBuiltinResult(a,r,i.lastComponent)}});let s=(0,t.createWriteToolDefinition)(r),c=s.renderResult;i(s.name)&&n.registerTool({...s,renderShell:`self`,renderCall:(t,n,r)=>e.renderWriteCall(t,n,{expanded:r.expanded,argsStreaming:r.argsComplete===!1&&r.isPartial}),renderResult:(t,n,r,i)=>{let a=c(t,n,r,{...i,lastComponent:e.previousBuiltinResult(i.lastComponent)});return e.frameBuiltinResult(a,r,i.lastComponent)}});let l=(0,t.createGrepToolDefinition)(r),u=l.renderResult;i(l.name)&&n.registerTool({...l,renderShell:`self`,renderCall:(t,n)=>e.renderGrepCall(t,n),renderResult:(t,n,r,i)=>{let a=u(t,n,r,{...i,lastComponent:e.previousBuiltinResult(i.lastComponent)});return e.frameBuiltinResult(a,r,i.lastComponent)}});let d=(0,t.createFindToolDefinition)(r),f=d.renderResult;i(d.name)&&n.registerTool({...d,renderShell:`self`,renderCall:(t,n)=>e.renderFindCall(t,n),renderResult:(t,n,r,i)=>{let a=f(t,n,r,{...i,lastComponent:e.previousBuiltinResult(i.lastComponent)});return e.frameBuiltinResult(a,r,i.lastComponent)}});let p=(0,t.createLsToolDefinition)(r),m=p.renderResult;i(p.name)&&n.registerTool({...p,renderShell:`self`,renderCall:(t,n)=>e.renderLsCall(t,n),renderResult:(t,n,r,i)=>{let a=m(t,n,r,{...i,lastComponent:e.previousBuiltinResult(i.lastComponent)});return e.frameBuiltinResult(a,r,i.lastComponent)}})}exports.registerBuiltinToolUi=n;
2
2
  //# sourceMappingURL=toolOverrides.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"toolOverrides.cjs","names":["createReadToolDefinition","renderReadCall","renderReadResult","frameBuiltinResult","createEditToolDefinition","renderEditCall","renderEditResult","createWriteToolDefinition","renderWriteCall","previousBuiltinResult","createGrepToolDefinition","renderGrepCall","createFindToolDefinition","renderFindCall","createLsToolDefinition","renderLsCall"],"sources":["../../../src/adapters/pi/toolOverrides.ts"],"sourcesContent":["import {\n createEditToolDefinition,\n createFindToolDefinition,\n createGrepToolDefinition,\n createLsToolDefinition,\n createReadToolDefinition,\n createWriteToolDefinition,\n type ExtensionAPI,\n} from '@earendil-works/pi-coding-agent';\nimport {\n frameBuiltinResult,\n previousBuiltinResult,\n renderEditCall,\n renderEditResult,\n renderFindCall,\n renderGrepCall,\n renderLsCall,\n renderReadCall,\n renderReadResult,\n renderWriteCall,\n} from '../../tui/builtinToolRender.ts';\n\n/**\n * Keep Pi's native schemas, prompt metadata, execution, and result formatting;\n * replace only the broad status-background shell and call heading.\n */\nexport function registerBuiltinToolUi(pi: ExtensionAPI, cwd: string): void {\n const read = createReadToolDefinition(cwd);\n pi.registerTool({\n ...read,\n renderShell: 'self',\n renderCall: (args, theme) => renderReadCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = renderReadResult(\n context.args,\n result,\n { expanded: options.expanded, isError: context.isError },\n theme,\n );\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const edit = createEditToolDefinition(cwd);\n pi.registerTool({\n ...edit,\n renderShell: 'self',\n renderCall: (args, theme) => renderEditCall(args, theme),\n // Doom bands the diff on the background and keeps syntax highlighting on\n // the foreground, which Pi's foreground-only diff renderer cannot express.\n renderResult: (result, options, theme, context) => {\n const content = renderEditResult(\n context.args,\n result,\n { expanded: options.expanded, isError: context.isError },\n theme,\n );\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const write = createWriteToolDefinition(cwd);\n const writeResult = write.renderResult!;\n pi.registerTool({\n ...write,\n renderShell: 'self',\n renderCall: (args, theme, context) =>\n renderWriteCall(args, theme, {\n expanded: context.expanded,\n // Restored completed rows may not mark args complete, but their result is no longer partial.\n argsStreaming: context.argsComplete === false && context.isPartial,\n }),\n renderResult: (result, options, theme, context) => {\n const content = writeResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const grep = createGrepToolDefinition(cwd);\n const grepResult = grep.renderResult!;\n pi.registerTool({\n ...grep,\n renderShell: 'self',\n renderCall: (args, theme) => renderGrepCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = grepResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const find = createFindToolDefinition(cwd);\n const findResult = find.renderResult!;\n pi.registerTool({\n ...find,\n renderShell: 'self',\n renderCall: (args, theme) => renderFindCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = findResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const ls = createLsToolDefinition(cwd);\n const lsResult = ls.renderResult!;\n pi.registerTool({\n ...ls,\n renderShell: 'self',\n renderCall: (args, theme) => renderLsCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = lsResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n}\n"],"mappings":"oGA0BA,SAAgB,EAAsB,EAAkB,EAAmB,CACzE,IAAM,GAAA,EAAOA,EAAAA,yBAAAA,CAAyB,CAAG,EACzC,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,IAAUC,EAAAA,eAAe,EAAM,CAAK,EACvD,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAUC,EAAAA,iBACd,EAAQ,KACR,EACA,CAAE,SAAU,EAAQ,SAAU,QAAS,EAAQ,OAAQ,EACvD,CACF,EACA,OAAOC,EAAAA,mBAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,EAED,IAAM,GAAA,EAAOC,EAAAA,yBAAAA,CAAyB,CAAG,EACzC,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,IAAUC,EAAAA,eAAe,EAAM,CAAK,EAGvD,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAUC,EAAAA,iBACd,EAAQ,KACR,EACA,CAAE,SAAU,EAAQ,SAAU,QAAS,EAAQ,OAAQ,EACvD,CACF,EACA,OAAOH,EAAAA,mBAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,EAED,IAAM,GAAA,EAAQI,EAAAA,0BAAAA,CAA0B,CAAG,EACrC,EAAc,EAAM,aAC1B,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,EAAO,IACxBC,EAAAA,gBAAgB,EAAM,EAAO,CAC3B,SAAU,EAAQ,SAElB,cAAe,EAAQ,eAAiB,IAAS,EAAQ,SAC3D,CAAC,EACH,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EAAY,EAAQ,EAAS,EAAO,CAClD,GAAG,EACH,cAAeC,EAAAA,sBAAsB,EAAQ,aAAa,CAC5D,CAAC,EACD,OAAON,EAAAA,mBAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,EAED,IAAM,GAAA,EAAOO,EAAAA,yBAAAA,CAAyB,CAAG,EACnC,EAAa,EAAK,aACxB,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,IAAUC,EAAAA,eAAe,EAAM,CAAK,EACvD,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EAAW,EAAQ,EAAS,EAAO,CACjD,GAAG,EACH,cAAeF,EAAAA,sBAAsB,EAAQ,aAAa,CAC5D,CAAC,EACD,OAAON,EAAAA,mBAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,EAED,IAAM,GAAA,EAAOS,EAAAA,yBAAAA,CAAyB,CAAG,EACnC,EAAa,EAAK,aACxB,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,IAAUC,EAAAA,eAAe,EAAM,CAAK,EACvD,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EAAW,EAAQ,EAAS,EAAO,CACjD,GAAG,EACH,cAAeJ,EAAAA,sBAAsB,EAAQ,aAAa,CAC5D,CAAC,EACD,OAAON,EAAAA,mBAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,EAED,IAAM,GAAA,EAAKW,EAAAA,uBAAAA,CAAuB,CAAG,EAC/B,EAAW,EAAG,aACpB,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,IAAUC,EAAAA,aAAa,EAAM,CAAK,EACrD,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EAAS,EAAQ,EAAS,EAAO,CAC/C,GAAG,EACH,cAAeN,EAAAA,sBAAsB,EAAQ,aAAa,CAC5D,CAAC,EACD,OAAON,EAAAA,mBAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,CACH"}
1
+ {"version":3,"file":"toolOverrides.cjs","names":["createReadToolDefinition","renderReadCall","renderReadResult","frameBuiltinResult","createEditToolDefinition","renderEditCall","renderEditResult","createWriteToolDefinition","renderWriteCall","previousBuiltinResult","createGrepToolDefinition","renderGrepCall","createFindToolDefinition","renderFindCall","createLsToolDefinition","renderLsCall"],"sources":["../../../src/adapters/pi/toolOverrides.ts"],"sourcesContent":["import {\n createEditToolDefinition,\n createFindToolDefinition,\n createGrepToolDefinition,\n createLsToolDefinition,\n createReadToolDefinition,\n createWriteToolDefinition,\n type ExtensionAPI,\n} from '@earendil-works/pi-coding-agent';\nimport {\n frameBuiltinResult,\n previousBuiltinResult,\n renderEditCall,\n renderEditResult,\n renderFindCall,\n renderGrepCall,\n renderLsCall,\n renderReadCall,\n renderReadResult,\n renderWriteCall,\n} from '../../tui/builtinToolRender.ts';\n\n/**\n * Keep Pi's native schemas, prompt metadata, execution, and result formatting;\n * replace only the broad status-background shell and call heading.\n */\nexport function registerBuiltinToolUi(\n pi: ExtensionAPI,\n cwd: string,\n shouldRegister: (tool: string) => boolean = () => true,\n): void {\n const read = createReadToolDefinition(cwd);\n if (shouldRegister(read.name))\n pi.registerTool({\n ...read,\n renderShell: 'self',\n renderCall: (args, theme) => renderReadCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = renderReadResult(\n context.args,\n result,\n { expanded: options.expanded, isError: context.isError },\n theme,\n );\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const edit = createEditToolDefinition(cwd);\n if (shouldRegister(edit.name))\n pi.registerTool({\n ...edit,\n renderShell: 'self',\n renderCall: (args, theme) => renderEditCall(args, theme),\n // Doom bands the diff on the background and keeps syntax highlighting on\n // the foreground, which Pi's foreground-only diff renderer cannot express.\n renderResult: (result, options, theme, context) => {\n const content = renderEditResult(\n context.args,\n result,\n { expanded: options.expanded, isError: context.isError },\n theme,\n );\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const write = createWriteToolDefinition(cwd);\n const writeResult = write.renderResult!;\n if (shouldRegister(write.name))\n pi.registerTool({\n ...write,\n renderShell: 'self',\n renderCall: (args, theme, context) =>\n renderWriteCall(args, theme, {\n expanded: context.expanded,\n // Restored completed rows may not mark args complete, but their result is no longer partial.\n argsStreaming: context.argsComplete === false && context.isPartial,\n }),\n renderResult: (result, options, theme, context) => {\n const content = writeResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const grep = createGrepToolDefinition(cwd);\n const grepResult = grep.renderResult!;\n if (shouldRegister(grep.name))\n pi.registerTool({\n ...grep,\n renderShell: 'self',\n renderCall: (args, theme) => renderGrepCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = grepResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const find = createFindToolDefinition(cwd);\n const findResult = find.renderResult!;\n if (shouldRegister(find.name))\n pi.registerTool({\n ...find,\n renderShell: 'self',\n renderCall: (args, theme) => renderFindCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = findResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const ls = createLsToolDefinition(cwd);\n const lsResult = ls.renderResult!;\n if (shouldRegister(ls.name))\n pi.registerTool({\n ...ls,\n renderShell: 'self',\n renderCall: (args, theme) => renderLsCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = lsResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{frameBuiltinResult as e,previousBuiltinResult as t,renderEditCall as n,renderEditResult as r,renderFindCall as i,renderGrepCall as a,renderLsCall as o,renderReadCall as s,renderReadResult as c,renderWriteCall as l}from"../../tui/builtinToolRender.mjs";import{createEditToolDefinition as u,createFindToolDefinition as d,createGrepToolDefinition as f,createLsToolDefinition as p,createReadToolDefinition as m,createWriteToolDefinition as h}from"@earendil-works/pi-coding-agent";function g(g,_){let v=m(_);g.registerTool({...v,renderShell:`self`,renderCall:(e,t)=>s(e,t),renderResult:(t,n,r,i)=>{let a=c(i.args,t,{expanded:n.expanded,isError:i.isError},r);return e(a,r,i.lastComponent)}});let y=u(_);g.registerTool({...y,renderShell:`self`,renderCall:(e,t)=>n(e,t),renderResult:(t,n,i,a)=>{let o=r(a.args,t,{expanded:n.expanded,isError:a.isError},i);return e(o,i,a.lastComponent)}});let b=h(_),x=b.renderResult;g.registerTool({...b,renderShell:`self`,renderCall:(e,t,n)=>l(e,t,{expanded:n.expanded,argsStreaming:n.argsComplete===!1&&n.isPartial}),renderResult:(n,r,i,a)=>{let o=x(n,r,i,{...a,lastComponent:t(a.lastComponent)});return e(o,i,a.lastComponent)}});let S=f(_),C=S.renderResult;g.registerTool({...S,renderShell:`self`,renderCall:(e,t)=>a(e,t),renderResult:(n,r,i,a)=>{let o=C(n,r,i,{...a,lastComponent:t(a.lastComponent)});return e(o,i,a.lastComponent)}});let w=d(_),T=w.renderResult;g.registerTool({...w,renderShell:`self`,renderCall:(e,t)=>i(e,t),renderResult:(n,r,i,a)=>{let o=T(n,r,i,{...a,lastComponent:t(a.lastComponent)});return e(o,i,a.lastComponent)}});let E=p(_),D=E.renderResult;g.registerTool({...E,renderShell:`self`,renderCall:(e,t)=>o(e,t),renderResult:(n,r,i,a)=>{let o=D(n,r,i,{...a,lastComponent:t(a.lastComponent)});return e(o,i,a.lastComponent)}})}export{g as registerBuiltinToolUi};
1
+ import{frameBuiltinResult as e,previousBuiltinResult as t,renderEditCall as n,renderEditResult as r,renderFindCall as i,renderGrepCall as a,renderLsCall as o,renderReadCall as s,renderReadResult as c,renderWriteCall as l}from"../../tui/builtinToolRender.mjs";import{createEditToolDefinition as u,createFindToolDefinition as d,createGrepToolDefinition as f,createLsToolDefinition as p,createReadToolDefinition as m,createWriteToolDefinition as h}from"@earendil-works/pi-coding-agent";function g(g,_,v=()=>!0){let y=m(_);v(y.name)&&g.registerTool({...y,renderShell:`self`,renderCall:(e,t)=>s(e,t),renderResult:(t,n,r,i)=>{let a=c(i.args,t,{expanded:n.expanded,isError:i.isError},r);return e(a,r,i.lastComponent)}});let b=u(_);v(b.name)&&g.registerTool({...b,renderShell:`self`,renderCall:(e,t)=>n(e,t),renderResult:(t,n,i,a)=>{let o=r(a.args,t,{expanded:n.expanded,isError:a.isError},i);return e(o,i,a.lastComponent)}});let x=h(_),S=x.renderResult;v(x.name)&&g.registerTool({...x,renderShell:`self`,renderCall:(e,t,n)=>l(e,t,{expanded:n.expanded,argsStreaming:n.argsComplete===!1&&n.isPartial}),renderResult:(n,r,i,a)=>{let o=S(n,r,i,{...a,lastComponent:t(a.lastComponent)});return e(o,i,a.lastComponent)}});let C=f(_),w=C.renderResult;v(C.name)&&g.registerTool({...C,renderShell:`self`,renderCall:(e,t)=>a(e,t),renderResult:(n,r,i,a)=>{let o=w(n,r,i,{...a,lastComponent:t(a.lastComponent)});return e(o,i,a.lastComponent)}});let T=d(_),E=T.renderResult;v(T.name)&&g.registerTool({...T,renderShell:`self`,renderCall:(e,t)=>i(e,t),renderResult:(n,r,i,a)=>{let o=E(n,r,i,{...a,lastComponent:t(a.lastComponent)});return e(o,i,a.lastComponent)}});let D=p(_),O=D.renderResult;v(D.name)&&g.registerTool({...D,renderShell:`self`,renderCall:(e,t)=>o(e,t),renderResult:(n,r,i,a)=>{let o=O(n,r,i,{...a,lastComponent:t(a.lastComponent)});return e(o,i,a.lastComponent)}})}export{g as registerBuiltinToolUi};
2
2
  //# sourceMappingURL=toolOverrides.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"toolOverrides.mjs","names":[],"sources":["../../../src/adapters/pi/toolOverrides.ts"],"sourcesContent":["import {\n createEditToolDefinition,\n createFindToolDefinition,\n createGrepToolDefinition,\n createLsToolDefinition,\n createReadToolDefinition,\n createWriteToolDefinition,\n type ExtensionAPI,\n} from '@earendil-works/pi-coding-agent';\nimport {\n frameBuiltinResult,\n previousBuiltinResult,\n renderEditCall,\n renderEditResult,\n renderFindCall,\n renderGrepCall,\n renderLsCall,\n renderReadCall,\n renderReadResult,\n renderWriteCall,\n} from '../../tui/builtinToolRender.ts';\n\n/**\n * Keep Pi's native schemas, prompt metadata, execution, and result formatting;\n * replace only the broad status-background shell and call heading.\n */\nexport function registerBuiltinToolUi(pi: ExtensionAPI, cwd: string): void {\n const read = createReadToolDefinition(cwd);\n pi.registerTool({\n ...read,\n renderShell: 'self',\n renderCall: (args, theme) => renderReadCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = renderReadResult(\n context.args,\n result,\n { expanded: options.expanded, isError: context.isError },\n theme,\n );\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const edit = createEditToolDefinition(cwd);\n pi.registerTool({\n ...edit,\n renderShell: 'self',\n renderCall: (args, theme) => renderEditCall(args, theme),\n // Doom bands the diff on the background and keeps syntax highlighting on\n // the foreground, which Pi's foreground-only diff renderer cannot express.\n renderResult: (result, options, theme, context) => {\n const content = renderEditResult(\n context.args,\n result,\n { expanded: options.expanded, isError: context.isError },\n theme,\n );\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const write = createWriteToolDefinition(cwd);\n const writeResult = write.renderResult!;\n pi.registerTool({\n ...write,\n renderShell: 'self',\n renderCall: (args, theme, context) =>\n renderWriteCall(args, theme, {\n expanded: context.expanded,\n // Restored completed rows may not mark args complete, but their result is no longer partial.\n argsStreaming: context.argsComplete === false && context.isPartial,\n }),\n renderResult: (result, options, theme, context) => {\n const content = writeResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const grep = createGrepToolDefinition(cwd);\n const grepResult = grep.renderResult!;\n pi.registerTool({\n ...grep,\n renderShell: 'self',\n renderCall: (args, theme) => renderGrepCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = grepResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const find = createFindToolDefinition(cwd);\n const findResult = find.renderResult!;\n pi.registerTool({\n ...find,\n renderShell: 'self',\n renderCall: (args, theme) => renderFindCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = findResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const ls = createLsToolDefinition(cwd);\n const lsResult = ls.renderResult!;\n pi.registerTool({\n ...ls,\n renderShell: 'self',\n renderCall: (args, theme) => renderLsCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = lsResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n}\n"],"mappings":"meA0BA,SAAgB,EAAsB,EAAkB,EAAmB,CACzE,IAAM,EAAO,EAAyB,CAAG,EACzC,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,IAAU,EAAe,EAAM,CAAK,EACvD,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EACd,EAAQ,KACR,EACA,CAAE,SAAU,EAAQ,SAAU,QAAS,EAAQ,OAAQ,EACvD,CACF,EACA,OAAO,EAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,EAED,IAAM,EAAO,EAAyB,CAAG,EACzC,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,IAAU,EAAe,EAAM,CAAK,EAGvD,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EACd,EAAQ,KACR,EACA,CAAE,SAAU,EAAQ,SAAU,QAAS,EAAQ,OAAQ,EACvD,CACF,EACA,OAAO,EAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,EAED,IAAM,EAAQ,EAA0B,CAAG,EACrC,EAAc,EAAM,aAC1B,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,EAAO,IACxB,EAAgB,EAAM,EAAO,CAC3B,SAAU,EAAQ,SAElB,cAAe,EAAQ,eAAiB,IAAS,EAAQ,SAC3D,CAAC,EACH,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EAAY,EAAQ,EAAS,EAAO,CAClD,GAAG,EACH,cAAe,EAAsB,EAAQ,aAAa,CAC5D,CAAC,EACD,OAAO,EAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,EAED,IAAM,EAAO,EAAyB,CAAG,EACnC,EAAa,EAAK,aACxB,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,IAAU,EAAe,EAAM,CAAK,EACvD,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EAAW,EAAQ,EAAS,EAAO,CACjD,GAAG,EACH,cAAe,EAAsB,EAAQ,aAAa,CAC5D,CAAC,EACD,OAAO,EAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,EAED,IAAM,EAAO,EAAyB,CAAG,EACnC,EAAa,EAAK,aACxB,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,IAAU,EAAe,EAAM,CAAK,EACvD,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EAAW,EAAQ,EAAS,EAAO,CACjD,GAAG,EACH,cAAe,EAAsB,EAAQ,aAAa,CAC5D,CAAC,EACD,OAAO,EAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,EAED,IAAM,EAAK,EAAuB,CAAG,EAC/B,EAAW,EAAG,aACpB,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,IAAU,EAAa,EAAM,CAAK,EACrD,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EAAS,EAAQ,EAAS,EAAO,CAC/C,GAAG,EACH,cAAe,EAAsB,EAAQ,aAAa,CAC5D,CAAC,EACD,OAAO,EAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,CACH"}
1
+ {"version":3,"file":"toolOverrides.mjs","names":[],"sources":["../../../src/adapters/pi/toolOverrides.ts"],"sourcesContent":["import {\n createEditToolDefinition,\n createFindToolDefinition,\n createGrepToolDefinition,\n createLsToolDefinition,\n createReadToolDefinition,\n createWriteToolDefinition,\n type ExtensionAPI,\n} from '@earendil-works/pi-coding-agent';\nimport {\n frameBuiltinResult,\n previousBuiltinResult,\n renderEditCall,\n renderEditResult,\n renderFindCall,\n renderGrepCall,\n renderLsCall,\n renderReadCall,\n renderReadResult,\n renderWriteCall,\n} from '../../tui/builtinToolRender.ts';\n\n/**\n * Keep Pi's native schemas, prompt metadata, execution, and result formatting;\n * replace only the broad status-background shell and call heading.\n */\nexport function registerBuiltinToolUi(\n pi: ExtensionAPI,\n cwd: string,\n shouldRegister: (tool: string) => boolean = () => true,\n): void {\n const read = createReadToolDefinition(cwd);\n if (shouldRegister(read.name))\n pi.registerTool({\n ...read,\n renderShell: 'self',\n renderCall: (args, theme) => renderReadCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = renderReadResult(\n context.args,\n result,\n { expanded: options.expanded, isError: context.isError },\n theme,\n );\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const edit = createEditToolDefinition(cwd);\n if (shouldRegister(edit.name))\n pi.registerTool({\n ...edit,\n renderShell: 'self',\n renderCall: (args, theme) => renderEditCall(args, theme),\n // Doom bands the diff on the background and keeps syntax highlighting on\n // the foreground, which Pi's foreground-only diff renderer cannot express.\n renderResult: (result, options, theme, context) => {\n const content = renderEditResult(\n context.args,\n result,\n { expanded: options.expanded, isError: context.isError },\n theme,\n );\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const write = createWriteToolDefinition(cwd);\n const writeResult = write.renderResult!;\n if (shouldRegister(write.name))\n pi.registerTool({\n ...write,\n renderShell: 'self',\n renderCall: (args, theme, context) =>\n renderWriteCall(args, theme, {\n expanded: context.expanded,\n // Restored completed rows may not mark args complete, but their result is no longer partial.\n argsStreaming: context.argsComplete === false && context.isPartial,\n }),\n renderResult: (result, options, theme, context) => {\n const content = writeResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const grep = createGrepToolDefinition(cwd);\n const grepResult = grep.renderResult!;\n if (shouldRegister(grep.name))\n pi.registerTool({\n ...grep,\n renderShell: 'self',\n renderCall: (args, theme) => renderGrepCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = grepResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const find = createFindToolDefinition(cwd);\n const findResult = find.renderResult!;\n if (shouldRegister(find.name))\n pi.registerTool({\n ...find,\n renderShell: 'self',\n renderCall: (args, theme) => renderFindCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = findResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const ls = createLsToolDefinition(cwd);\n const lsResult = ls.renderResult!;\n if (shouldRegister(ls.name))\n pi.registerTool({\n ...ls,\n renderShell: 'self',\n renderCall: (args, theme) => renderLsCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = lsResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n}\n"],"mappings":"meA0BA,SAAgB,EACd,EACA,EACA,MAAkD,GAC5C,CACN,IAAM,EAAO,EAAyB,CAAG,EACrC,EAAe,EAAK,IAAI,GAC1B,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,IAAU,EAAe,EAAM,CAAK,EACvD,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EACd,EAAQ,KACR,EACA,CAAE,SAAU,EAAQ,SAAU,QAAS,EAAQ,OAAQ,EACvD,CACF,EACA,OAAO,EAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,EAEH,IAAM,EAAO,EAAyB,CAAG,EACrC,EAAe,EAAK,IAAI,GAC1B,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,IAAU,EAAe,EAAM,CAAK,EAGvD,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EACd,EAAQ,KACR,EACA,CAAE,SAAU,EAAQ,SAAU,QAAS,EAAQ,OAAQ,EACvD,CACF,EACA,OAAO,EAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,EAEH,IAAM,EAAQ,EAA0B,CAAG,EACrC,EAAc,EAAM,aACtB,EAAe,EAAM,IAAI,GAC3B,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,EAAO,IACxB,EAAgB,EAAM,EAAO,CAC3B,SAAU,EAAQ,SAElB,cAAe,EAAQ,eAAiB,IAAS,EAAQ,SAC3D,CAAC,EACH,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EAAY,EAAQ,EAAS,EAAO,CAClD,GAAG,EACH,cAAe,EAAsB,EAAQ,aAAa,CAC5D,CAAC,EACD,OAAO,EAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,EAEH,IAAM,EAAO,EAAyB,CAAG,EACnC,EAAa,EAAK,aACpB,EAAe,EAAK,IAAI,GAC1B,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,IAAU,EAAe,EAAM,CAAK,EACvD,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EAAW,EAAQ,EAAS,EAAO,CACjD,GAAG,EACH,cAAe,EAAsB,EAAQ,aAAa,CAC5D,CAAC,EACD,OAAO,EAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,EAEH,IAAM,EAAO,EAAyB,CAAG,EACnC,EAAa,EAAK,aACpB,EAAe,EAAK,IAAI,GAC1B,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,IAAU,EAAe,EAAM,CAAK,EACvD,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EAAW,EAAQ,EAAS,EAAO,CACjD,GAAG,EACH,cAAe,EAAsB,EAAQ,aAAa,CAC5D,CAAC,EACD,OAAO,EAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,EAEH,IAAM,EAAK,EAAuB,CAAG,EAC/B,EAAW,EAAG,aAChB,EAAe,EAAG,IAAI,GACxB,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,IAAU,EAAa,EAAM,CAAK,EACrD,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EAAS,EAAQ,EAAS,EAAO,CAC/C,GAAG,EACH,cAAe,EAAsB,EAAQ,aAAa,CAC5D,CAAC,EACD,OAAO,EAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,CACL"}
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./tui/hashlineRendering.cjs");exports.GREP_COLLAPSED_LINES=e.GREP_COLLAPSED_LINES,exports.READ_COLLAPSED_LINES=e.READ_COLLAPSED_LINES,exports.renderHashlineCall=e.renderHashlineCall,exports.renderHashlineEditResult=e.renderHashlineEditResult,exports.renderHashlineResult=e.renderHashlineResult;
@@ -0,0 +1,2 @@
1
+ import { GREP_COLLAPSED_LINES, READ_COLLAPSED_LINES, renderHashlineCall, renderHashlineEditResult, renderHashlineResult } from "./tui/hashlineRendering.cjs";
2
+ export { GREP_COLLAPSED_LINES, READ_COLLAPSED_LINES, renderHashlineCall, renderHashlineEditResult, renderHashlineResult };
@@ -0,0 +1,2 @@
1
+ import { GREP_COLLAPSED_LINES, READ_COLLAPSED_LINES, renderHashlineCall, renderHashlineEditResult, renderHashlineResult } from "./tui/hashlineRendering.mjs";
2
+ export { GREP_COLLAPSED_LINES, READ_COLLAPSED_LINES, renderHashlineCall, renderHashlineEditResult, renderHashlineResult };
@@ -0,0 +1 @@
1
+ import{GREP_COLLAPSED_LINES as e,READ_COLLAPSED_LINES as t,renderHashlineCall as n,renderHashlineEditResult as r,renderHashlineResult as i}from"./tui/hashlineRendering.mjs";export{e as GREP_COLLAPSED_LINES,t as READ_COLLAPSED_LINES,n as renderHashlineCall,r as renderHashlineEditResult,i as renderHashlineResult};
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./services/state/uiState.cjs"),t=require("./tui/doomOverlay.cjs"),n=require("./types/harnessMetadata.cjs"),r=require("./tui/doomEditor.cjs"),i=require("./tui/doomFooter.cjs"),a=require("./tui/doomHeader.cjs"),o=require("./tui/leaderHints.cjs"),s=require("./tui/theme.cjs"),c=require("./adapters/telemetry/logSinkTelemetry.cjs"),l=require("./tui/toolChrome.cjs");let u=require("@agimon-ai/doompi-extension-contracts/ui-hub");exports.DEFAULT_THEME=s.DEFAULT_THEME,exports.DEFAULT_THEME_NAME=s.DEFAULT_THEME_NAME,exports.DOOM_FULLSCREEN_UI_OPTIONS=t.DOOM_FULLSCREEN_UI_OPTIONS,exports.DOOM_NAVIGATION_KEYS=t.DOOM_NAVIGATION_KEYS,Object.defineProperty(exports,"DOOM_UI_HUB_SERVICE",{enumerable:!0,get:function(){return u.DOOM_UI_HUB_SERVICE}}),exports.DoomEditor=r.DoomEditor,exports.DoomFooter=i.DoomFooter,exports.DoomHeader=a.DoomHeader,exports.DoomOverlay=t.DoomOverlay,exports.DoomToolCall=l.DoomToolCall,exports.DoomToolResult=l.DoomToolResult,exports.DoomUiState=e.DoomUiState,exports.LeaderHints=o.LeaderHints,exports.UI_EVENT=c.UI_EVENT,exports.createUiTelemetry=c.createUiTelemetry,exports.readDoomHarnessMetadata=n.readDoomHarnessMetadata,Object.defineProperty(exports,"readDoomUiHub",{enumerable:!0,get:function(){return u.readDoomUiHub}}),exports.renderToolBadge=l.renderToolBadge,exports.renderToolHeading=l.renderToolHeading,Object.defineProperty(exports,"requireDoomUiHub",{enumerable:!0,get:function(){return u.requireDoomUiHub}}),exports.writeDefaultTheme=s.writeDefaultTheme;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./services/state/uiState.cjs"),t=require("./tui/doomOverlay.cjs"),n=require("./types/harnessMetadata.cjs"),r=require("./tui/doomEditor.cjs"),i=require("./tui/doomFooter.cjs"),a=require("./tui/doomHeader.cjs"),o=require("./tui/leaderHints.cjs"),s=require("./tui/theme.cjs"),c=require("./adapters/telemetry/logSinkTelemetry.cjs"),l=require("./tui/toolChrome.cjs");let u=require("@agimon-ai/doompi-extension-contracts/ui-hub");exports.DEFAULT_THEME=s.DEFAULT_THEME,exports.DEFAULT_THEME_NAME=s.DEFAULT_THEME_NAME,exports.DOOM_FULLSCREEN_UI_OPTIONS=t.DOOM_FULLSCREEN_UI_OPTIONS,exports.DOOM_NAVIGATION_KEYS=t.DOOM_NAVIGATION_KEYS,Object.defineProperty(exports,"DOOM_UI_HUB_SERVICE",{enumerable:!0,get:function(){return u.DOOM_UI_HUB_SERVICE}}),exports.DoomEditor=r.DoomEditor,exports.DoomFooter=i.DoomFooter,exports.DoomHeader=a.DoomHeader,exports.DoomOverlay=t.DoomOverlay,exports.DoomToolCall=l.DoomToolCall,exports.DoomToolResult=l.DoomToolResult,exports.DoomToolResultFrame=l.DoomToolResultFrame,exports.DoomUiState=e.DoomUiState,exports.LeaderHints=o.LeaderHints,exports.UI_EVENT=c.UI_EVENT,exports.createUiTelemetry=c.createUiTelemetry,exports.frameDoomToolResult=l.frameDoomToolResult,exports.previousDoomToolResult=l.previousDoomToolResult,exports.readDoomHarnessMetadata=n.readDoomHarnessMetadata,Object.defineProperty(exports,"readDoomUiHub",{enumerable:!0,get:function(){return u.readDoomUiHub}}),exports.renderToolBadge=l.renderToolBadge,exports.renderToolHeading=l.renderToolHeading,Object.defineProperty(exports,"requireDoomUiHub",{enumerable:!0,get:function(){return u.requireDoomUiHub}}),exports.writeDefaultTheme=s.writeDefaultTheme;
package/dist/index.d.cts CHANGED
@@ -7,9 +7,9 @@ import { DoomHeader } from "./tui/doomHeader.cjs";
7
7
  import { LeaderHints } from "./tui/leaderHints.cjs";
8
8
  import { UI_EVENT, UiEventAttributes, UiEventName, UiTelemetry, UiTelemetryOptions, createUiTelemetry } from "./adapters/telemetry/logSinkTelemetry.cjs";
9
9
  import { DEFAULT_THEME, DEFAULT_THEME_NAME, writeDefaultTheme } from "./tui/theme.cjs";
10
- import { DoomToolCall, DoomToolResult, DoomToolResultOptions, renderToolBadge, renderToolHeading } from "./tui/toolChrome.cjs";
10
+ import { DoomToolCall, DoomToolResult, DoomToolResultFrame, DoomToolResultOptions, frameDoomToolResult, previousDoomToolResult, renderToolBadge, renderToolHeading } from "./tui/toolChrome.cjs";
11
11
  import { ConfigChoice, ConfigField, ConfigSection, ConfigStep, DoomConfigActionInput, DoomConfigContributionHandle, DoomConfigContributionOptions } from "@agimon-ai/doompi-extension-contracts/config";
12
12
  import { DoomLeaderContributionHandle, LeaderBinding as DoomLeaderBinding, LeaderCommand as DoomLeaderCommand, LeaderContribution as DoomLeaderContribution, LeaderSegment as DoomLeaderSegment } from "@agimon-ai/doompi-extension-contracts/leader";
13
13
  import { DoomFooterContributionDefinition, DoomFooterContributionHandle, DoomFooterContributionValue } from "@agimon-ai/doompi-extension-contracts/footer";
14
14
  import { DOOM_UI_HUB_SERVICE, DoomUiHubService, readDoomUiHub, requireDoomUiHub } from "@agimon-ai/doompi-extension-contracts/ui-hub";
15
- export { type ConfigChoice, type ConfigField, type ConfigSection, type ConfigStep, DEFAULT_THEME, DEFAULT_THEME_NAME, DOOM_FULLSCREEN_UI_OPTIONS, DOOM_NAVIGATION_KEYS, DOOM_UI_HUB_SERVICE, type DoomConfigActionInput, type DoomConfigContributionHandle, type DoomConfigContributionOptions, DoomEditor, DoomFooter, type DoomFooterContributionDefinition, type DoomFooterContributionHandle, type DoomFooterContributionValue, type DoomHarnessMetadata, DoomHeader, type DoomLeaderBinding, type DoomLeaderCommand, type DoomLeaderContribution, type DoomLeaderContributionHandle, type DoomLeaderSegment, DoomOverlay, type DoomOverlayChrome, type DoomOverlayTui, DoomToolCall, DoomToolResult, type DoomToolResultOptions, type DoomUiHubService, DoomUiState, LeaderHints, type LeaderOption, type LeaderSnapshot, UI_EVENT, type UiEventAttributes, type UiEventName, type UiTelemetry, type UiTelemetryOptions, createUiTelemetry, readDoomHarnessMetadata, readDoomUiHub, renderToolBadge, renderToolHeading, requireDoomUiHub, writeDefaultTheme };
15
+ export { type ConfigChoice, type ConfigField, type ConfigSection, type ConfigStep, DEFAULT_THEME, DEFAULT_THEME_NAME, DOOM_FULLSCREEN_UI_OPTIONS, DOOM_NAVIGATION_KEYS, DOOM_UI_HUB_SERVICE, type DoomConfigActionInput, type DoomConfigContributionHandle, type DoomConfigContributionOptions, DoomEditor, DoomFooter, type DoomFooterContributionDefinition, type DoomFooterContributionHandle, type DoomFooterContributionValue, type DoomHarnessMetadata, DoomHeader, type DoomLeaderBinding, type DoomLeaderCommand, type DoomLeaderContribution, type DoomLeaderContributionHandle, type DoomLeaderSegment, DoomOverlay, type DoomOverlayChrome, type DoomOverlayTui, DoomToolCall, DoomToolResult, DoomToolResultFrame, type DoomToolResultOptions, type DoomUiHubService, DoomUiState, LeaderHints, type LeaderOption, type LeaderSnapshot, UI_EVENT, type UiEventAttributes, type UiEventName, type UiTelemetry, type UiTelemetryOptions, createUiTelemetry, frameDoomToolResult, previousDoomToolResult, readDoomHarnessMetadata, readDoomUiHub, renderToolBadge, renderToolHeading, requireDoomUiHub, writeDefaultTheme };
package/dist/index.d.mts CHANGED
@@ -7,9 +7,9 @@ import { DoomHeader } from "./tui/doomHeader.mjs";
7
7
  import { LeaderHints } from "./tui/leaderHints.mjs";
8
8
  import { UI_EVENT, UiEventAttributes, UiEventName, UiTelemetry, UiTelemetryOptions, createUiTelemetry } from "./adapters/telemetry/logSinkTelemetry.mjs";
9
9
  import { DEFAULT_THEME, DEFAULT_THEME_NAME, writeDefaultTheme } from "./tui/theme.mjs";
10
- import { DoomToolCall, DoomToolResult, DoomToolResultOptions, renderToolBadge, renderToolHeading } from "./tui/toolChrome.mjs";
10
+ import { DoomToolCall, DoomToolResult, DoomToolResultFrame, DoomToolResultOptions, frameDoomToolResult, previousDoomToolResult, renderToolBadge, renderToolHeading } from "./tui/toolChrome.mjs";
11
11
  import { ConfigChoice, ConfigField, ConfigSection, ConfigStep, DoomConfigActionInput, DoomConfigContributionHandle, DoomConfigContributionOptions } from "@agimon-ai/doompi-extension-contracts/config";
12
12
  import { DOOM_UI_HUB_SERVICE, DoomUiHubService, readDoomUiHub, requireDoomUiHub } from "@agimon-ai/doompi-extension-contracts/ui-hub";
13
13
  import { DoomFooterContributionDefinition, DoomFooterContributionHandle, DoomFooterContributionValue } from "@agimon-ai/doompi-extension-contracts/footer";
14
14
  import { DoomLeaderContributionHandle, LeaderBinding as DoomLeaderBinding, LeaderCommand as DoomLeaderCommand, LeaderContribution as DoomLeaderContribution, LeaderSegment as DoomLeaderSegment } from "@agimon-ai/doompi-extension-contracts/leader";
15
- export { type ConfigChoice, type ConfigField, type ConfigSection, type ConfigStep, DEFAULT_THEME, DEFAULT_THEME_NAME, DOOM_FULLSCREEN_UI_OPTIONS, DOOM_NAVIGATION_KEYS, DOOM_UI_HUB_SERVICE, type DoomConfigActionInput, type DoomConfigContributionHandle, type DoomConfigContributionOptions, DoomEditor, DoomFooter, type DoomFooterContributionDefinition, type DoomFooterContributionHandle, type DoomFooterContributionValue, type DoomHarnessMetadata, DoomHeader, type DoomLeaderBinding, type DoomLeaderCommand, type DoomLeaderContribution, type DoomLeaderContributionHandle, type DoomLeaderSegment, DoomOverlay, type DoomOverlayChrome, type DoomOverlayTui, DoomToolCall, DoomToolResult, type DoomToolResultOptions, type DoomUiHubService, DoomUiState, LeaderHints, type LeaderOption, type LeaderSnapshot, UI_EVENT, type UiEventAttributes, type UiEventName, type UiTelemetry, type UiTelemetryOptions, createUiTelemetry, readDoomHarnessMetadata, readDoomUiHub, renderToolBadge, renderToolHeading, requireDoomUiHub, writeDefaultTheme };
15
+ export { type ConfigChoice, type ConfigField, type ConfigSection, type ConfigStep, DEFAULT_THEME, DEFAULT_THEME_NAME, DOOM_FULLSCREEN_UI_OPTIONS, DOOM_NAVIGATION_KEYS, DOOM_UI_HUB_SERVICE, type DoomConfigActionInput, type DoomConfigContributionHandle, type DoomConfigContributionOptions, DoomEditor, DoomFooter, type DoomFooterContributionDefinition, type DoomFooterContributionHandle, type DoomFooterContributionValue, type DoomHarnessMetadata, DoomHeader, type DoomLeaderBinding, type DoomLeaderCommand, type DoomLeaderContribution, type DoomLeaderContributionHandle, type DoomLeaderSegment, DoomOverlay, type DoomOverlayChrome, type DoomOverlayTui, DoomToolCall, DoomToolResult, DoomToolResultFrame, type DoomToolResultOptions, type DoomUiHubService, DoomUiState, LeaderHints, type LeaderOption, type LeaderSnapshot, UI_EVENT, type UiEventAttributes, type UiEventName, type UiTelemetry, type UiTelemetryOptions, createUiTelemetry, frameDoomToolResult, previousDoomToolResult, readDoomHarnessMetadata, readDoomUiHub, renderToolBadge, renderToolHeading, requireDoomUiHub, writeDefaultTheme };
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{DoomUiState as e}from"./services/state/uiState.mjs";import{DOOM_FULLSCREEN_UI_OPTIONS as t,DOOM_NAVIGATION_KEYS as n,DoomOverlay as r}from"./tui/doomOverlay.mjs";import{readDoomHarnessMetadata as i}from"./types/harnessMetadata.mjs";import{DoomEditor as a}from"./tui/doomEditor.mjs";import{DoomFooter as o}from"./tui/doomFooter.mjs";import{DoomHeader as s}from"./tui/doomHeader.mjs";import{LeaderHints as c}from"./tui/leaderHints.mjs";import{DEFAULT_THEME as l,DEFAULT_THEME_NAME as u,writeDefaultTheme as d}from"./tui/theme.mjs";import{UI_EVENT as f,createUiTelemetry as p}from"./adapters/telemetry/logSinkTelemetry.mjs";import{DoomToolCall as m,DoomToolResult as h,renderToolBadge as g,renderToolHeading as _}from"./tui/toolChrome.mjs";import{DOOM_UI_HUB_SERVICE as v,readDoomUiHub as y,requireDoomUiHub as b}from"@agimon-ai/doompi-extension-contracts/ui-hub";export{l as DEFAULT_THEME,u as DEFAULT_THEME_NAME,t as DOOM_FULLSCREEN_UI_OPTIONS,n as DOOM_NAVIGATION_KEYS,v as DOOM_UI_HUB_SERVICE,a as DoomEditor,o as DoomFooter,s as DoomHeader,r as DoomOverlay,m as DoomToolCall,h as DoomToolResult,e as DoomUiState,c as LeaderHints,f as UI_EVENT,p as createUiTelemetry,i as readDoomHarnessMetadata,y as readDoomUiHub,g as renderToolBadge,_ as renderToolHeading,b as requireDoomUiHub,d as writeDefaultTheme};
1
+ import{DoomUiState as e}from"./services/state/uiState.mjs";import{DOOM_FULLSCREEN_UI_OPTIONS as t,DOOM_NAVIGATION_KEYS as n,DoomOverlay as r}from"./tui/doomOverlay.mjs";import{readDoomHarnessMetadata as i}from"./types/harnessMetadata.mjs";import{DoomEditor as a}from"./tui/doomEditor.mjs";import{DoomFooter as o}from"./tui/doomFooter.mjs";import{DoomHeader as s}from"./tui/doomHeader.mjs";import{LeaderHints as c}from"./tui/leaderHints.mjs";import{DEFAULT_THEME as l,DEFAULT_THEME_NAME as u,writeDefaultTheme as d}from"./tui/theme.mjs";import{UI_EVENT as f,createUiTelemetry as p}from"./adapters/telemetry/logSinkTelemetry.mjs";import{DoomToolCall as m,DoomToolResult as h,DoomToolResultFrame as g,frameDoomToolResult as _,previousDoomToolResult as v,renderToolBadge as y,renderToolHeading as b}from"./tui/toolChrome.mjs";import{DOOM_UI_HUB_SERVICE as x,readDoomUiHub as S,requireDoomUiHub as C}from"@agimon-ai/doompi-extension-contracts/ui-hub";export{l as DEFAULT_THEME,u as DEFAULT_THEME_NAME,t as DOOM_FULLSCREEN_UI_OPTIONS,n as DOOM_NAVIGATION_KEYS,x as DOOM_UI_HUB_SERVICE,a as DoomEditor,o as DoomFooter,s as DoomHeader,r as DoomOverlay,m as DoomToolCall,h as DoomToolResult,g as DoomToolResultFrame,e as DoomUiState,c as LeaderHints,f as UI_EVENT,p as createUiTelemetry,_ as frameDoomToolResult,v as previousDoomToolResult,i as readDoomHarnessMetadata,S as readDoomUiHub,y as renderToolBadge,b as renderToolHeading,C as requireDoomUiHub,d as writeDefaultTheme};
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./tui/rendering.cjs");exports.alignLine=e.alignLine,exports.fitLine=e.fitLine,exports.fitStyledLine=e.fitStyledLine,exports.formatTokens=e.formatTokens,exports.frameLine=e.frameLine,exports.packSegments=e.packSegments,exports.padLine=e.padLine;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./tui/rendering.cjs"),t=require("./tui/codeGutter.cjs"),n=require("./tui/diffRender.cjs");exports.alignLine=e.alignLine,exports.fitLine=e.fitLine,exports.fitStyledLine=e.fitStyledLine,exports.formatTokens=e.formatTokens,exports.frameLine=e.frameLine,exports.gutterWidth=t.gutterWidth,exports.packSegments=e.packSegments,exports.padLine=e.padLine,exports.renderDoomDiff=n.renderDoomDiff,exports.renderLineNumber=t.renderLineNumber;
@@ -1,2 +1,4 @@
1
1
  import { alignLine, fitLine, fitStyledLine, formatTokens, frameLine, packSegments, padLine } from "./tui/rendering.cjs";
2
- export { alignLine, fitLine, fitStyledLine, formatTokens, frameLine, packSegments, padLine };
2
+ import { gutterWidth, renderLineNumber } from "./tui/codeGutter.cjs";
3
+ import { renderDoomDiff } from "./tui/diffRender.cjs";
4
+ export { alignLine, fitLine, fitStyledLine, formatTokens, frameLine, gutterWidth, packSegments, padLine, renderDoomDiff, renderLineNumber };
@@ -1,2 +1,4 @@
1
1
  import { alignLine, fitLine, fitStyledLine, formatTokens, frameLine, packSegments, padLine } from "./tui/rendering.mjs";
2
- export { alignLine, fitLine, fitStyledLine, formatTokens, frameLine, packSegments, padLine };
2
+ import { gutterWidth, renderLineNumber } from "./tui/codeGutter.mjs";
3
+ import { renderDoomDiff } from "./tui/diffRender.mjs";
4
+ export { alignLine, fitLine, fitStyledLine, formatTokens, frameLine, gutterWidth, packSegments, padLine, renderDoomDiff, renderLineNumber };
@@ -1 +1 @@
1
- import{alignLine as e,fitLine as t,fitStyledLine as n,formatTokens as r,frameLine as i,packSegments as a,padLine as o}from"./tui/rendering.mjs";export{e as alignLine,t as fitLine,n as fitStyledLine,r as formatTokens,i as frameLine,a as packSegments,o as padLine};
1
+ import{alignLine as e,fitLine as t,fitStyledLine as n,formatTokens as r,frameLine as i,packSegments as a,padLine as o}from"./tui/rendering.mjs";import{gutterWidth as s,renderLineNumber as c}from"./tui/codeGutter.mjs";import{renderDoomDiff as l}from"./tui/diffRender.mjs";export{e as alignLine,t as fitLine,n as fitStyledLine,r as formatTokens,i as frameLine,s as gutterWidth,a as packSegments,o as padLine,l as renderDoomDiff,c as renderLineNumber};
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./tui/toolChrome.cjs");exports.DoomToolCall=e.DoomToolCall,exports.DoomToolResult=e.DoomToolResult,exports.renderToolBadge=e.renderToolBadge,exports.renderToolHeading=e.renderToolHeading;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./tui/toolChrome.cjs");exports.DoomToolCall=e.DoomToolCall,exports.DoomToolResult=e.DoomToolResult,exports.DoomToolResultFrame=e.DoomToolResultFrame,exports.frameDoomToolResult=e.frameDoomToolResult,exports.previousDoomToolResult=e.previousDoomToolResult,exports.renderToolBadge=e.renderToolBadge,exports.renderToolHeading=e.renderToolHeading;
@@ -1,2 +1,2 @@
1
- import { DoomToolCall, DoomToolResult, DoomToolResultOptions, renderToolBadge, renderToolHeading } from "./tui/toolChrome.cjs";
2
- export { DoomToolCall, DoomToolResult, type DoomToolResultOptions, renderToolBadge, renderToolHeading };
1
+ import { DoomToolCall, DoomToolResult, DoomToolResultFrame, DoomToolResultOptions, frameDoomToolResult, previousDoomToolResult, renderToolBadge, renderToolHeading } from "./tui/toolChrome.cjs";
2
+ export { DoomToolCall, DoomToolResult, DoomToolResultFrame, type DoomToolResultOptions, frameDoomToolResult, previousDoomToolResult, renderToolBadge, renderToolHeading };
@@ -1,2 +1,2 @@
1
- import { DoomToolCall, DoomToolResult, DoomToolResultOptions, renderToolBadge, renderToolHeading } from "./tui/toolChrome.mjs";
2
- export { DoomToolCall, DoomToolResult, type DoomToolResultOptions, renderToolBadge, renderToolHeading };
1
+ import { DoomToolCall, DoomToolResult, DoomToolResultFrame, DoomToolResultOptions, frameDoomToolResult, previousDoomToolResult, renderToolBadge, renderToolHeading } from "./tui/toolChrome.mjs";
2
+ export { DoomToolCall, DoomToolResult, DoomToolResultFrame, type DoomToolResultOptions, frameDoomToolResult, previousDoomToolResult, renderToolBadge, renderToolHeading };
@@ -1 +1 @@
1
- import{DoomToolCall as e,DoomToolResult as t,renderToolBadge as n,renderToolHeading as r}from"./tui/toolChrome.mjs";export{e as DoomToolCall,t as DoomToolResult,n as renderToolBadge,r as renderToolHeading};
1
+ import{DoomToolCall as e,DoomToolResult as t,DoomToolResultFrame as n,frameDoomToolResult as r,previousDoomToolResult as i,renderToolBadge as a,renderToolHeading as o}from"./tui/toolChrome.mjs";export{e as DoomToolCall,t as DoomToolResult,n as DoomToolResultFrame,r as frameDoomToolResult,i as previousDoomToolResult,a as renderToolBadge,o as renderToolHeading};
@@ -1,14 +1,14 @@
1
- const e=require("./codeGutter.cjs"),t=require("./diffRender.cjs"),n=require("./toolChrome.cjs");let r=require("@earendil-works/pi-tui"),i=require("@earendil-works/pi-coding-agent");var a=class{text;constructor(e){this.text=e}render(e){return e<=0||this.text.length===0?[]:(0,r.wrapTextWithAnsi)(this.text,e)}invalidate(){}},o=class{content;theme;constructor(e,t){this.content=e,this.theme=t}setContent(e){this.content=e}getContent(){return this.content}render(e){if(e<=0)return[];if(e<3)return this.content.render(e);let t=e-2,n=this.content.render(t).map(e=>` ${e}`);return n.length===0?[]:[` ${this.theme.fg(`borderMuted`,`─`.repeat(t))}`,...n,``]}invalidate(){this.content.invalidate()}};function s(e){return e instanceof o?e.getContent():void 0}function c(e,t,n){return n instanceof o?(n.setContent(e),n):new o(e,t)}function l(e,t,r,i){let a=n.renderToolHeading(e,t,i);return r.length>0&&(a+=` ${i.fg(`muted`,`· ${r.join(` · `)}`)}`),new n.DoomToolCall(a)}function u(e,t){return e===void 0?void 0:`${e} ${t}`}function d(e){return e.filter(e=>e!==void 0&&e.length>0)}function f(e,t){return l(`read`,e.path,d([e.offset===void 0?void 0:`from ${e.offset}`,u(e.limit,`lines`)]),t)}function p(e,t){let n=e.edits.length;return l(`edit`,e.path,[`${n} edit${n===1?``:`s`}`],t)}function m(e){let t=e.at(-1);if(!(t===void 0||!t.startsWith(`[`)||!t.endsWith(`]`))){for(e.pop();e.at(-1)===``;)e.pop();return t}}function h(e){return(e.content??[]).filter(e=>e.type===`text`).map(e=>e.text??``).join(`
1
+ const e=require("./codeGutter.cjs"),t=require("./diffRender.cjs"),n=require("./toolChrome.cjs");let r=require("@earendil-works/pi-tui"),i=require("@earendil-works/pi-coding-agent");var a=class{text;constructor(e){this.text=e}render(e){return e<=0||this.text.length===0?[]:(0,r.wrapTextWithAnsi)(this.text,e)}invalidate(){}};function o(e){return n.previousDoomToolResult(e)}function s(e,t,r){return n.frameDoomToolResult(e,t,r)}function c(e,t,r,i){let a=n.renderToolHeading(e,t,i);return r.length>0&&(a+=` ${i.fg(`muted`,`· ${r.join(` · `)}`)}`),new n.DoomToolCall(a)}function l(e,t){return e===void 0?void 0:`${e} ${t}`}function u(e){return e.filter(e=>e!==void 0&&e.length>0)}function d(e,t){return c(`read`,e.path,u([e.offset===void 0?void 0:`from ${e.offset}`,l(e.limit,`lines`)]),t)}function f(e,t){let n=e.edits.length;return c(`edit`,e.path,[`${n} edit${n===1?``:`s`}`],t)}function p(e){let t=e.at(-1);if(!(t===void 0||!t.startsWith(`[`)||!t.endsWith(`]`))){for(e.pop();e.at(-1)===``;)e.pop();return t}}function m(e){return(e.content??[]).filter(e=>e.type===`text`).map(e=>e.text??``).join(`
2
2
  `).replaceAll(` `,` `).replaceAll(`\r
3
3
  `,`
4
- `)}function g(e,n,r,o,s=i.highlightCode,c=i.getLanguageFromPath){if(r.isError)return new a(o.fg(`error`,h(n)));let l=n.details?.diff;return l===void 0||l.length===0?new a(``):t.renderDoomDiff(l,o,c(e.path),s)}function _(t,r,a={},o=i.highlightCode,s=i.getLanguageFromPath){let c=n.renderToolHeading(`write`,t.path,r),l=r.fg(`muted`,`· ${t.content.length.toLocaleString(`en-US`)} chars`);if(t.content.length===0)return new n.DoomToolCall(`${c} ${l}`);let u=t.content.replaceAll(` `,` `).replaceAll(`\r
4
+ `)}function h(e,n,r,o,s=i.highlightCode,c=i.getLanguageFromPath){if(r.isError)return new a(o.fg(`error`,m(n)));let l=n.details?.diff;return l===void 0||l.length===0?new a(``):t.renderDoomDiff(l,o,c(e.path),s)}function g(t,r,a={},o=i.highlightCode,s=i.getLanguageFromPath){let c=n.renderToolHeading(`write`,t.path,r),l=r.fg(`muted`,`· ${t.content.length.toLocaleString(`en-US`)} chars`);if(t.content.length===0)return new n.DoomToolCall(`${c} ${l}`);let u=t.content.replaceAll(` `,` `).replaceAll(`\r
5
5
  `,`
6
6
  `).split(`
7
7
  `);for(;u.at(-1)===``;)u.pop();let d=a.argsStreaming===!0&&a.expanded!==!0,f=a.expanded?u:d?u.slice(-10):u.slice(0,10),p=s(t.path),m=p?o(f.join(`
8
8
  `),p):f.map(e=>r.fg(`toolOutput`,e)),h=u.length-f.length,g=d?h+1:1,_=e.gutterWidth(g+f.length-1),v=m.map((t,n)=>`${e.renderLineNumber(g+n,_,r)} ${t}`),y=d?[...h>0?[r.fg(`muted`,`… ${h} earlier lines · live tail`)]:[],...v]:[...v,...h>0?[r.fg(`muted`,`… ${h} more lines · ctrl+o expand`)]:[]];return new n.DoomToolCall([`${c} ${l}`,``,...y].join(`
9
- `))}function v(t,n,r,o,s=i.highlightCode,c=i.getLanguageFromPath){let l=h(n).split(`
9
+ `))}function _(t,n,r,o,s=i.highlightCode,c=i.getLanguageFromPath){let l=m(n).split(`
10
10
  `);for(;l.at(-1)===``;)l.pop();if(r.isError)return new a(l.map(e=>o.fg(`error`,e)).join(`
11
- `));let u=m(l),d=r.expanded?l:l.slice(0,10),f=c(t.path),p=f?s(d.join(`
12
- `),f):d.map(e=>o.fg(`toolOutput`,e)),g=t.offset??1,_=e.gutterWidth(g+d.length-1),v=p.map((t,n)=>`${e.renderLineNumber(g+n,_,o)} ${t}`),y=l.length-d.length;return y>0&&v.push(o.fg(`muted`,`… ${y} more lines · ctrl+o expand`)),u!==void 0&&v.push(o.fg(`muted`,u)),new a(v.join(`
13
- `))}function y(e,t){return l(`grep`,e.pattern,d([e.path??`.`,e.glob,e.ignoreCase===!0?`ignore case`:void 0,u(e.limit,`matches`)]),t)}function b(e,t){return l(`find`,e.pattern,d([e.path??`.`,u(e.limit,`results`)]),t)}function x(e,t){return l(`ls`,e.path??`.`,d([u(e.limit,`entries`)]),t)}exports.frameBuiltinResult=c,exports.previousBuiltinResult=s,exports.renderEditCall=p,exports.renderEditResult=g,exports.renderFindCall=b,exports.renderGrepCall=y,exports.renderLsCall=x,exports.renderReadCall=f,exports.renderReadResult=v,exports.renderWriteCall=_;
11
+ `));let u=p(l),d=r.expanded?l:l.slice(0,10),f=c(t.path),h=f?s(d.join(`
12
+ `),f):d.map(e=>o.fg(`toolOutput`,e)),g=t.offset??1,_=e.gutterWidth(g+d.length-1),v=h.map((t,n)=>`${e.renderLineNumber(g+n,_,o)} ${t}`),y=l.length-d.length;return y>0&&v.push(o.fg(`muted`,`… ${y} more lines · ctrl+o expand`)),u!==void 0&&v.push(o.fg(`muted`,u)),new a(v.join(`
13
+ `))}function v(e,t){return c(`grep`,e.pattern,u([e.path??`.`,e.glob,e.ignoreCase===!0?`ignore case`:void 0,l(e.limit,`matches`)]),t)}function y(e,t){return c(`find`,e.pattern,u([e.path??`.`,l(e.limit,`results`)]),t)}function b(e,t){return c(`ls`,e.path??`.`,u([l(e.limit,`entries`)]),t)}exports.frameBuiltinResult=s,exports.previousBuiltinResult=o,exports.renderEditCall=f,exports.renderEditResult=h,exports.renderFindCall=y,exports.renderGrepCall=v,exports.renderLsCall=b,exports.renderReadCall=d,exports.renderReadResult=_,exports.renderWriteCall=g;
14
14
  //# sourceMappingURL=builtinToolRender.cjs.map