@agimon-ai/doompi-ui 0.0.1-alpha.2 → 0.0.1-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -18
- package/dist/_virtual/_rolldown/runtime.cjs +1 -1
- package/dist/adapters/pi/extension.cjs +2 -0
- package/dist/adapters/pi/extension.cjs.map +1 -0
- package/dist/adapters/pi/extension.d.cts +7 -0
- package/dist/adapters/pi/extension.d.cts.map +1 -0
- package/dist/adapters/pi/extension.d.mts +7 -0
- package/dist/adapters/pi/extension.d.mts.map +1 -0
- package/dist/adapters/pi/extension.mjs +2 -0
- package/dist/adapters/pi/extension.mjs.map +1 -0
- package/dist/adapters/pi/extensionName.cjs +2 -0
- package/dist/adapters/pi/extensionName.cjs.map +1 -0
- package/dist/adapters/pi/extensionName.d.cts +16 -0
- package/dist/adapters/pi/extensionName.d.cts.map +1 -0
- package/dist/adapters/pi/extensionName.d.mts +16 -0
- package/dist/adapters/pi/extensionName.d.mts.map +1 -0
- package/dist/adapters/pi/extensionName.mjs +2 -0
- package/dist/adapters/pi/extensionName.mjs.map +1 -0
- package/dist/adapters/pi/toolOverrides.cjs +2 -0
- package/dist/adapters/pi/toolOverrides.cjs.map +1 -0
- package/dist/adapters/pi/toolOverrides.mjs +2 -0
- package/dist/adapters/pi/toolOverrides.mjs.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.cjs +2 -0
- package/dist/adapters/telemetry/logSinkTelemetry.cjs.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.cts +29 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.cts.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.mts +29 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.mts.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.mjs +2 -0
- package/dist/adapters/telemetry/logSinkTelemetry.mjs.map +1 -0
- package/dist/components/configOverlay.cjs +0 -0
- package/dist/components/configOverlay.d.cts +0 -0
- package/dist/components/configOverlay.d.mts +0 -0
- package/dist/components/configOverlay.mjs +0 -0
- package/dist/components/doomEditor.cjs +1 -2
- package/dist/components/doomEditor.d.cts +2 -59
- package/dist/components/doomEditor.d.mts +2 -59
- package/dist/components/doomEditor.mjs +1 -2
- package/dist/components/doomFooter.cjs +1 -2
- package/dist/components/doomFooter.d.cts +2 -32
- package/dist/components/doomFooter.d.mts +2 -32
- package/dist/components/doomFooter.mjs +1 -2
- package/dist/components/doomHeader.cjs +1 -2
- package/dist/components/doomHeader.d.cts +2 -34
- package/dist/components/doomHeader.d.mts +2 -34
- package/dist/components/doomHeader.mjs +1 -2
- package/dist/components/doomOverlay.cjs +1 -2
- package/dist/components/doomOverlay.d.cts +2 -79
- package/dist/components/doomOverlay.d.mts +2 -79
- package/dist/components/doomOverlay.mjs +1 -2
- package/dist/components/leaderHints.cjs +1 -2
- package/dist/components/leaderHints.d.cts +2 -37
- package/dist/components/leaderHints.d.mts +2 -37
- package/dist/components/leaderHints.mjs +1 -2
- package/dist/components/toolsOverlay.cjs +1 -2
- package/dist/components/toolsOverlay.d.cts +2 -29
- package/dist/components/toolsOverlay.d.mts +2 -29
- package/dist/components/toolsOverlay.mjs +1 -2
- package/dist/config.cjs +1 -2
- package/dist/config.d.cts +2 -5
- package/dist/config.d.mts +2 -5
- package/dist/config.mjs +1 -2
- package/dist/extension.cjs +1 -2
- package/dist/extension.d.cts +2 -7
- package/dist/extension.d.mts +2 -7
- package/dist/extension.mjs +1 -2
- package/dist/extensionName.cjs +1 -2
- package/dist/extensionName.d.cts +2 -5
- package/dist/extensionName.d.mts +2 -5
- package/dist/extensionName.mjs +1 -2
- package/dist/extensions/pi.cjs +1 -1
- package/dist/extensions/pi.cjs.map +1 -1
- package/dist/extensions/pi.d.cts +1 -1
- package/dist/extensions/pi.d.mts +1 -1
- package/dist/extensions/pi.mjs +1 -1
- package/dist/extensions/pi.mjs.map +1 -1
- package/dist/footer.cjs +1 -2
- package/dist/footer.d.cts +2 -5
- package/dist/footer.d.mts +2 -5
- package/dist/footer.mjs +1 -2
- package/dist/harnessMetadata.cjs +1 -2
- package/dist/harnessMetadata.d.cts +2 -21
- package/dist/harnessMetadata.d.mts +2 -21
- package/dist/harnessMetadata.mjs +1 -2
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +14 -25
- package/dist/index.d.mts +14 -25
- package/dist/index.mjs +1 -1
- package/dist/leaderRegistry.cjs +1 -2
- package/dist/leaderRegistry.d.cts +2 -58
- package/dist/leaderRegistry.d.mts +2 -58
- package/dist/leaderRegistry.mjs +1 -2
- package/dist/logSinkTelemetry.cjs +1 -2
- package/dist/logSinkTelemetry.d.cts +2 -29
- package/dist/logSinkTelemetry.d.mts +2 -29
- package/dist/logSinkTelemetry.mjs +1 -2
- package/dist/rendering.cjs +1 -2
- package/dist/rendering.d.cts +2 -11
- package/dist/rendering.d.mts +2 -11
- package/dist/rendering.mjs +1 -2
- package/dist/services/leader/leaderRegistry.cjs +2 -0
- package/dist/services/leader/leaderRegistry.cjs.map +1 -0
- package/dist/services/leader/leaderRegistry.d.cts +58 -0
- package/dist/services/leader/leaderRegistry.d.cts.map +1 -0
- package/dist/services/leader/leaderRegistry.d.mts +58 -0
- package/dist/services/leader/leaderRegistry.d.mts.map +1 -0
- package/dist/services/leader/leaderRegistry.mjs +2 -0
- package/dist/services/leader/leaderRegistry.mjs.map +1 -0
- package/dist/services/state/uiState.cjs +2 -0
- package/dist/services/state/uiState.cjs.map +1 -0
- package/dist/services/state/uiState.d.cts +38 -0
- package/dist/services/state/uiState.d.cts.map +1 -0
- package/dist/services/state/uiState.d.mts +38 -0
- package/dist/services/state/uiState.d.mts.map +1 -0
- package/dist/services/state/uiState.mjs +2 -0
- package/dist/services/state/uiState.mjs.map +1 -0
- package/dist/services/tools/toolInventory.cjs +2 -0
- package/dist/services/tools/toolInventory.cjs.map +1 -0
- package/dist/services/tools/toolInventory.d.cts +51 -0
- package/dist/services/tools/toolInventory.d.cts.map +1 -0
- package/dist/services/tools/toolInventory.d.mts +51 -0
- package/dist/services/tools/toolInventory.d.mts.map +1 -0
- package/dist/services/tools/toolInventory.mjs +2 -0
- package/dist/services/tools/toolInventory.mjs.map +1 -0
- package/dist/skills.cjs +1 -1
- package/dist/skills.d.cts +2 -1
- package/dist/skills.d.mts +2 -1
- package/dist/skills.mjs +1 -1
- package/dist/theme.cjs +1 -2
- package/dist/theme.d.cts +2 -95
- package/dist/theme.d.mts +2 -95
- package/dist/theme.mjs +1 -2
- package/dist/toolChrome.cjs +1 -0
- package/dist/toolChrome.d.cts +2 -0
- package/dist/toolChrome.d.mts +2 -0
- package/dist/toolChrome.mjs +1 -0
- package/dist/toolInventory.cjs +1 -2
- package/dist/toolInventory.d.cts +2 -40
- package/dist/toolInventory.d.mts +2 -40
- package/dist/toolInventory.mjs +1 -2
- package/dist/tui/builtinToolRender.cjs +14 -0
- package/dist/tui/builtinToolRender.cjs.map +1 -0
- package/dist/tui/builtinToolRender.mjs +14 -0
- package/dist/tui/builtinToolRender.mjs.map +1 -0
- package/dist/tui/codeGutter.cjs +2 -0
- package/dist/tui/codeGutter.cjs.map +1 -0
- package/dist/tui/codeGutter.mjs +2 -0
- package/dist/tui/codeGutter.mjs.map +1 -0
- package/dist/tui/configOverlay.cjs +0 -0
- package/dist/tui/configOverlay.cjs.map +1 -0
- package/dist/tui/configOverlay.d.cts +0 -0
- package/dist/tui/configOverlay.d.cts.map +1 -0
- package/dist/tui/configOverlay.d.mts +0 -0
- package/dist/tui/configOverlay.d.mts.map +1 -0
- package/dist/tui/configOverlay.mjs +0 -0
- package/dist/tui/configOverlay.mjs.map +1 -0
- package/dist/tui/diffRender.cjs +4 -0
- package/dist/tui/diffRender.cjs.map +1 -0
- package/dist/tui/diffRender.mjs +4 -0
- package/dist/tui/diffRender.mjs.map +1 -0
- package/dist/tui/doomEditor.cjs +2 -0
- package/dist/tui/doomEditor.cjs.map +1 -0
- package/dist/tui/doomEditor.d.cts +63 -0
- package/dist/tui/doomEditor.d.cts.map +1 -0
- package/dist/tui/doomEditor.d.mts +63 -0
- package/dist/tui/doomEditor.d.mts.map +1 -0
- package/dist/tui/doomEditor.mjs +2 -0
- package/dist/tui/doomEditor.mjs.map +1 -0
- package/dist/tui/doomFooter.cjs +2 -0
- package/dist/tui/doomFooter.cjs.map +1 -0
- package/dist/tui/doomFooter.d.cts +32 -0
- package/dist/tui/doomFooter.d.cts.map +1 -0
- package/dist/tui/doomFooter.d.mts +32 -0
- package/dist/tui/doomFooter.d.mts.map +1 -0
- package/dist/tui/doomFooter.mjs +2 -0
- package/dist/tui/doomFooter.mjs.map +1 -0
- package/dist/tui/doomHeader.cjs +2 -0
- package/dist/tui/doomHeader.cjs.map +1 -0
- package/dist/tui/doomHeader.d.cts +34 -0
- package/dist/tui/doomHeader.d.cts.map +1 -0
- package/dist/tui/doomHeader.d.mts +34 -0
- package/dist/tui/doomHeader.d.mts.map +1 -0
- package/dist/tui/doomHeader.mjs +2 -0
- package/dist/tui/doomHeader.mjs.map +1 -0
- package/dist/tui/doomOverlay.cjs +2 -0
- package/dist/tui/doomOverlay.cjs.map +1 -0
- package/dist/tui/doomOverlay.d.cts +84 -0
- package/dist/tui/doomOverlay.d.cts.map +1 -0
- package/dist/tui/doomOverlay.d.mts +84 -0
- package/dist/tui/doomOverlay.d.mts.map +1 -0
- package/dist/tui/doomOverlay.mjs +2 -0
- package/dist/tui/doomOverlay.mjs.map +1 -0
- package/dist/tui/leaderHints.cjs +2 -0
- package/dist/tui/leaderHints.cjs.map +1 -0
- package/dist/tui/leaderHints.d.cts +36 -0
- package/dist/tui/leaderHints.d.cts.map +1 -0
- package/dist/tui/leaderHints.d.mts +36 -0
- package/dist/tui/leaderHints.d.mts.map +1 -0
- package/dist/tui/leaderHints.mjs +2 -0
- package/dist/tui/leaderHints.mjs.map +1 -0
- package/dist/tui/rendering.cjs +2 -0
- package/dist/tui/rendering.cjs.map +1 -0
- package/dist/tui/rendering.d.cts +16 -0
- package/dist/tui/rendering.d.cts.map +1 -0
- package/dist/tui/rendering.d.mts +16 -0
- package/dist/tui/rendering.d.mts.map +1 -0
- package/dist/tui/rendering.mjs +2 -0
- package/dist/tui/rendering.mjs.map +1 -0
- package/dist/tui/theme.cjs +2 -0
- package/dist/tui/theme.cjs.map +1 -0
- package/dist/tui/theme.d.cts +103 -0
- package/dist/tui/theme.d.cts.map +1 -0
- package/dist/tui/theme.d.mts +103 -0
- package/dist/tui/theme.d.mts.map +1 -0
- package/dist/tui/theme.mjs +2 -0
- package/dist/tui/theme.mjs.map +1 -0
- package/dist/tui/toolChrome.cjs +2 -0
- package/dist/tui/toolChrome.cjs.map +1 -0
- package/dist/tui/toolChrome.d.cts +30 -0
- package/dist/tui/toolChrome.d.cts.map +1 -0
- package/dist/tui/toolChrome.d.mts +30 -0
- package/dist/tui/toolChrome.d.mts.map +1 -0
- package/dist/tui/toolChrome.mjs +2 -0
- package/dist/tui/toolChrome.mjs.map +1 -0
- package/dist/tui/toolsOverlay.cjs +2 -0
- package/dist/tui/toolsOverlay.cjs.map +1 -0
- package/dist/tui/toolsOverlay.d.cts +29 -0
- package/dist/tui/toolsOverlay.d.cts.map +1 -0
- package/dist/tui/toolsOverlay.d.mts +29 -0
- package/dist/tui/toolsOverlay.d.mts.map +1 -0
- package/dist/tui/toolsOverlay.mjs +2 -0
- package/dist/tui/toolsOverlay.mjs.map +1 -0
- package/dist/types/harnessMetadata.cjs +2 -0
- package/dist/types/harnessMetadata.cjs.map +1 -0
- package/dist/types/harnessMetadata.d.cts +21 -0
- package/dist/types/harnessMetadata.d.cts.map +1 -0
- package/dist/types/harnessMetadata.d.mts +21 -0
- package/dist/types/harnessMetadata.d.mts.map +1 -0
- package/dist/types/harnessMetadata.mjs +2 -0
- package/dist/types/harnessMetadata.mjs.map +1 -0
- package/dist/uiState.cjs +1 -2
- package/dist/uiState.d.cts +2 -37
- package/dist/uiState.d.mts +2 -37
- package/dist/uiState.mjs +1 -2
- package/package.json +19 -12
- package/themes/doom-pi-dark.json +32 -30
- package/dist/_virtual/_rolldown/runtime.mjs +0 -1
- package/dist/components/configOverlay.cjs.map +0 -1
- package/dist/components/configOverlay.d.cts.map +0 -1
- package/dist/components/configOverlay.d.mts.map +0 -1
- package/dist/components/configOverlay.mjs.map +0 -1
- package/dist/components/doomEditor.cjs.map +0 -1
- package/dist/components/doomEditor.d.cts.map +0 -1
- package/dist/components/doomEditor.d.mts.map +0 -1
- package/dist/components/doomEditor.mjs.map +0 -1
- package/dist/components/doomFooter.cjs.map +0 -1
- package/dist/components/doomFooter.d.cts.map +0 -1
- package/dist/components/doomFooter.d.mts.map +0 -1
- package/dist/components/doomFooter.mjs.map +0 -1
- package/dist/components/doomHeader.cjs.map +0 -1
- package/dist/components/doomHeader.d.cts.map +0 -1
- package/dist/components/doomHeader.d.mts.map +0 -1
- package/dist/components/doomHeader.mjs.map +0 -1
- package/dist/components/doomOverlay.cjs.map +0 -1
- package/dist/components/doomOverlay.d.cts.map +0 -1
- package/dist/components/doomOverlay.d.mts.map +0 -1
- package/dist/components/doomOverlay.mjs.map +0 -1
- package/dist/components/leaderHints.cjs.map +0 -1
- package/dist/components/leaderHints.d.cts.map +0 -1
- package/dist/components/leaderHints.d.mts.map +0 -1
- package/dist/components/leaderHints.mjs.map +0 -1
- package/dist/components/toolsOverlay.cjs.map +0 -1
- package/dist/components/toolsOverlay.d.cts.map +0 -1
- package/dist/components/toolsOverlay.d.mts.map +0 -1
- package/dist/components/toolsOverlay.mjs.map +0 -1
- package/dist/config.cjs.map +0 -1
- package/dist/config.d.cts.map +0 -1
- package/dist/config.d.mts.map +0 -1
- package/dist/config.mjs.map +0 -1
- package/dist/extension.cjs.map +0 -1
- package/dist/extension.d.cts.map +0 -1
- package/dist/extension.d.mts.map +0 -1
- package/dist/extension.mjs.map +0 -1
- package/dist/extensionName.cjs.map +0 -1
- package/dist/extensionName.d.cts.map +0 -1
- package/dist/extensionName.d.mts.map +0 -1
- package/dist/extensionName.mjs.map +0 -1
- package/dist/footer.cjs.map +0 -1
- package/dist/footer.d.cts.map +0 -1
- package/dist/footer.d.mts.map +0 -1
- package/dist/footer.mjs.map +0 -1
- package/dist/harnessMetadata.cjs.map +0 -1
- package/dist/harnessMetadata.d.cts.map +0 -1
- package/dist/harnessMetadata.d.mts.map +0 -1
- package/dist/harnessMetadata.mjs.map +0 -1
- package/dist/leaderRegistry.cjs.map +0 -1
- package/dist/leaderRegistry.d.cts.map +0 -1
- package/dist/leaderRegistry.d.mts.map +0 -1
- package/dist/leaderRegistry.mjs.map +0 -1
- package/dist/logSinkTelemetry.cjs.map +0 -1
- package/dist/logSinkTelemetry.d.cts.map +0 -1
- package/dist/logSinkTelemetry.d.mts.map +0 -1
- package/dist/logSinkTelemetry.mjs.map +0 -1
- package/dist/mode.cjs +0 -2
- package/dist/mode.cjs.map +0 -1
- package/dist/mode.d.cts +0 -5
- package/dist/mode.d.cts.map +0 -1
- package/dist/mode.d.mts +0 -5
- package/dist/mode.d.mts.map +0 -1
- package/dist/mode.mjs +0 -2
- package/dist/mode.mjs.map +0 -1
- package/dist/rendering.cjs.map +0 -1
- package/dist/rendering.d.cts.map +0 -1
- package/dist/rendering.d.mts.map +0 -1
- package/dist/rendering.mjs.map +0 -1
- package/dist/theme.cjs.map +0 -1
- package/dist/theme.d.cts.map +0 -1
- package/dist/theme.d.mts.map +0 -1
- package/dist/theme.mjs.map +0 -1
- package/dist/toolInventory.cjs.map +0 -1
- package/dist/toolInventory.d.cts.map +0 -1
- package/dist/toolInventory.d.mts.map +0 -1
- package/dist/toolInventory.mjs.map +0 -1
- package/dist/uiState.cjs.map +0 -1
- package/dist/uiState.d.cts.map +0 -1
- package/dist/uiState.d.mts.map +0 -1
- package/dist/uiState.mjs.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{truncateToWidth as e,wrapTextWithAnsi as t}from"@earendil-works/pi-tui";var n=class{text;constructor(e){this.text=e}render(e){if(e<=0)return[];let n=Math.max(1,e-2);return t(this.text,n).map(e=>` ${e}`)}invalidate(){}},r=class{lines;theme;options;constructor(e,t,n={}){this.lines=e,this.theme=t,this.options=n}render(n){if(n<=0)return[];if(n<3)return this.lines.map(t=>e(t,n,`…`));let r=n-2,i=this.options.wrap?this.lines.flatMap(e=>t(e,r)):this.lines.map(t=>e(t,r,`…`)),a=[this.theme.fg(`borderMuted`,`─`.repeat(r)),...i].map(e=>` ${e}`);return this.options.trailingBlank!==!1&&a.push(``),a}invalidate(){}};function i(e,t){return t.inverse(t.bold(t.fg(`mdHeading`,` ${e.toUpperCase()} `)))}function a(e,t,n,r=`accent`){let a=i(e,n);return t.length>0?`${a} ${n.fg(r,t)}`:a}export{n as DoomToolCall,r as DoomToolResult,i as renderToolBadge,a as renderToolHeading};
|
|
2
|
+
//# sourceMappingURL=toolChrome.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolChrome.mjs","names":[],"sources":["../../src/tui/toolChrome.ts"],"sourcesContent":["import type { Theme, ThemeColor } from '@earendil-works/pi-coding-agent';\nimport { type Component, truncateToWidth, wrapTextWithAnsi } from '@earendil-works/pi-tui';\n\nconst TOOL_BADGE_COLOR: ThemeColor = 'mdHeading';\nconst TOOL_PURPOSE_COLOR: ThemeColor = 'accent';\n\n/** Shared width-aware call surface with the standard one-column Doom inset. */\nexport class DoomToolCall implements Component {\n constructor(private readonly text: string) {}\n\n render(width: number): string[] {\n if (width <= 0) return [];\n const contentWidth = Math.max(1, width - 2);\n return wrapTextWithAnsi(this.text, contentWidth).map((line) => ` ${line}`);\n }\n\n invalidate(): void {\n // Call text is immutable and reflows from the current width on every render.\n }\n}\n\nexport interface DoomToolResultOptions {\n wrap?: boolean;\n trailingBlank?: boolean;\n}\n\n/** Neutral self-owned result frame for compact custom tools. */\nexport class DoomToolResult implements Component {\n constructor(\n private readonly lines: readonly string[],\n private readonly theme: Theme,\n private readonly options: DoomToolResultOptions = {},\n ) {}\n\n render(width: number): string[] {\n if (width <= 0) return [];\n if (width < 3) return this.lines.map((line) => truncateToWidth(line, width, '…'));\n\n const contentWidth = width - 2;\n const content = this.options.wrap\n ? this.lines.flatMap((line) => wrapTextWithAnsi(line, contentWidth))\n : this.lines.map((line) => truncateToWidth(line, contentWidth, '…'));\n const divider = this.theme.fg('borderMuted', '─'.repeat(contentWidth));\n const rendered = [divider, ...content].map((line) => ` ${line}`);\n if (this.options.trailingBlank !== false) rendered.push('');\n return rendered;\n }\n\n invalidate(): void {\n // Result text is immutable and reflows from the current width on every render.\n }\n}\n\n/** Doom-style inverse badge used to identify every self-rendered tool. */\nexport function renderToolBadge(label: string, theme: Theme): string {\n return theme.inverse(theme.bold(theme.fg(TOOL_BADGE_COLOR, ` ${label.toUpperCase()} `)));\n}\n\n/** Keep the tool identity visually separate from its path, command, or action. */\nexport function renderToolHeading(\n label: string,\n purpose: string,\n theme: Theme,\n purposeColor: ThemeColor = TOOL_PURPOSE_COLOR,\n): string {\n const badge = renderToolBadge(label, theme);\n return purpose.length > 0 ? `${badge} ${theme.fg(purposeColor, purpose)}` : badge;\n}\n"],"mappings":"+EAOA,IAAa,EAAb,KAA+C,CAChB,KAA7B,YAAY,EAA+B,CAAd,KAAA,KAAA,CAAe,CAE5C,OAAO,EAAyB,CAC9B,GAAI,GAAS,EAAG,MAAO,CAAC,EACxB,IAAM,EAAe,KAAK,IAAI,EAAG,EAAQ,CAAC,EAC1C,OAAO,EAAiB,KAAK,KAAM,CAAY,CAAC,CAAC,IAAK,GAAS,IAAI,GAAM,CAC3E,CAEA,YAAmB,CAEnB,CACF,EAQa,EAAb,KAAiD,CAE5B,MACA,MACA,QAHnB,YACE,EACA,EACA,EAAkD,CAAC,EACnD,CAHiB,KAAA,MAAA,EACA,KAAA,MAAA,EACA,KAAA,QAAA,CAChB,CAEH,OAAO,EAAyB,CAC9B,GAAI,GAAS,EAAG,MAAO,CAAC,EACxB,GAAI,EAAQ,EAAG,OAAO,KAAK,MAAM,IAAK,GAAS,EAAgB,EAAM,EAAO,GAAG,CAAC,EAEhF,IAAM,EAAe,EAAQ,EACvB,EAAU,KAAK,QAAQ,KACzB,KAAK,MAAM,QAAS,GAAS,EAAiB,EAAM,CAAY,CAAC,EACjE,KAAK,MAAM,IAAK,GAAS,EAAgB,EAAM,EAAc,GAAG,CAAC,EAE/D,EAAW,CADD,KAAK,MAAM,GAAG,cAAe,IAAI,OAAO,CAAY,CAC5C,EAAG,GAAG,CAAO,CAAC,CAAC,IAAK,GAAS,IAAI,GAAM,EAE/D,OADI,KAAK,QAAQ,gBAAkB,IAAO,EAAS,KAAK,EAAE,EACnD,CACT,CAEA,YAAmB,CAEnB,CACF,EAGA,SAAgB,EAAgB,EAAe,EAAsB,CACnE,OAAO,EAAM,QAAQ,EAAM,KAAK,EAAM,GAAG,YAAkB,IAAI,EAAM,YAAY,EAAE,EAAE,CAAC,CAAC,CACzF,CAGA,SAAgB,EACd,EACA,EACA,EACA,EAA2B,SACnB,CACR,IAAM,EAAQ,EAAgB,EAAO,CAAK,EAC1C,OAAO,EAAQ,OAAS,EAAI,GAAG,EAAM,GAAG,EAAM,GAAG,EAAc,CAAO,IAAM,CAC9E"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./rendering.cjs"),t=require("./doomOverlay.cjs");let n=require("@earendil-works/pi-tui");const r=[[`↑↓`,`move`],[`esc`,`close`]],i=`No tools are registered in this session.`;function a(t,n){return e.fitStyledLine(t,n,`…`)}function o(e,t,r){let i=(0,n.visibleWidth)(t),o=Math.max(0,r-i-1);return a(e,o)+` `.repeat(Math.max(1,r-o-i))+a(t,i)}function s(e,t){if(t<=0)return[];let n=[],r=``;for(let i of e.split(/\s+/).filter(Boolean))r.length===0?r=i:r.length+1+i.length<=t?r+=` ${i}`:(n.push(r),r=i);return r.length>0&&n.push(r),n}function c(e){if(typeof e!=`object`||!e)return[];let t=e;if(typeof t.properties!=`object`||t.properties===null)return[];let n=new Set(Array.isArray(t.required)?t.required.filter(e=>typeof e==`string`):[]);return Object.entries(t.properties).map(([e,t])=>{let r=typeof t==`object`&&t?t.type:void 0;return{name:e,type:typeof r==`string`?r:``,required:n.has(e)}})}function l(e){return e.tools.reduce((e,t)=>e+ +!!t.active,0)}var u=class extends t.DoomOverlay{sources;done;selected;bodyHeight=1;constructor(e,t,n,r){super(e,t),this.sources=n,this.done=r,this.selected=this.rows().findIndex(e=>e.kind===`tool`)}rows(){let e=[];for(let t of this.sources){e.push({kind:`source`,source:t});for(let n of t.tools)e.push({kind:`tool`,source:t,tool:n})}return e}currentTool(){let e=this.rows()[this.selected];return e?.kind===`tool`?e:void 0}move(e){let t=this.rows(),n=e<0?-1:1,r=this.selected;for(let i=Math.abs(e);i>0;--i){let e=r+n;for(;e>=0&&e<t.length&&t[e]?.kind!==`tool`;)e+=n;if(e<0||e>=t.length)break;r=e}r!==this.selected&&(this.selected=r,this.tui.requestRender())}handleInput(e){if((0,n.matchesKey)(e,`escape`)||(0,n.matchesKey)(e,`ctrl+c`)||e===`q`){this.done(void 0);return}if((0,n.matchesKey)(e,`up`)||e===`k`){this.move(-1);return}if((0,n.matchesKey)(e,`down`)||e===`j`){this.move(1);return}if((0,n.matchesKey)(e,`pageUp`)){this.move(-Math.max(1,this.bodyHeight-1));return}(0,n.matchesKey)(e,`pageDown`)&&this.move(Math.max(1,this.bodyHeight-1))}treeLines(e){let t=this.rows(),n=[this.theme.bold(`SOURCES`),``];if(t.length===0)return n.push(this.theme.fg(`dim`,i)),n;let r=Math.max(1,this.bodyHeight-n.length),s=Math.max(0,Math.min(this.selected,t.length-1)),c=Math.max(0,Math.min(s-r+1,Math.max(0,t.length-r)));for(let[i,u]of t.slice(c,c+r).entries()){let t=u.kind===`source`?o(this.theme.bold(u.source.label),this.theme.fg(`dim`,u.source.status??String(l(u.source))),e):this.theme.fg(u.tool.active?`text`:`dim`,a(` ${u.tool.name}`,e));n.push(c+i===s?this.theme.bg(`selectedBg`,a(t,e)):t)}return n}field(e,t,n){let r=Math.max(1,n-12);return s(t,r).map((t,n)=>`${this.theme.fg(`dim`,a(n===0?e:``,12))}${a(t,r)}`)}toolLines(e,t,n){let r=[this.theme.bold(t.name),``];r.push(...this.field(`source`,e.label,n)),e.detail&&r.push(...this.field(`registered`,e.detail,n)),r.push(...this.field(`status`,t.active?this.theme.fg(`success`,`active`):this.theme.fg(`dim`,`inactive`),n)),t.description&&(r.push(``),r.push(...s(t.description,n)));let i=c(t.parameters);if(i.length>0){r.push(``),r.push(this.theme.fg(`dim`,`PARAMETERS`));for(let e of i){let t=e.required?`${e.name}${this.theme.fg(`warning`,` *`)}`:e.name;r.push(o(t,this.theme.fg(`dim`,e.type),n))}}for(let e of t.promptGuidelines??[])r.push(``),r.push(...s(e,n));return r}detailLines(e){let t=this.currentTool();return t?this.toolLines(t.source,t.tool,e):[this.theme.fg(`dim`,i)]}getChrome(){let e=`${this.sources.reduce((e,t)=>e+l(t),0)}/${this.sources.reduce((e,t)=>e+t.tools.length,0)}`;return{title:`TOOLS`,accent:t.DOOM_OVERLAY_ACCENT,breadcrumb:`SPC › e / t · tools`,headerRight:`${e} tools · ${this.sources.length} sources · esc close`,footer:this.hintLine()}}hintLine(){return r.map(([e,t])=>`${this.theme.bg(`selectedBg`,this.theme.fg(`text`,` ${e} `))}${this.theme.fg(`dim`,` ${t}`)}`).join(this.theme.fg(`dim`,` `))}renderBody(e,t){if(this.bodyHeight=t,e<48)return this.renderStacked(e,t);let r=Math.max(18,Math.floor((e-1)*.3333333333333333)),i=Math.max(1,e-r-1),o=Math.max(1,r-1),s=Math.max(1,i-1),c=this.treeLines(o),l=this.detailLines(s),u=this.theme.fg(`borderMuted`,`│`);return Array.from({length:t},(t,r)=>{let i=`${a(c[r]??``,o)} ${u} ${a(l[r]??``,s)}`;return(0,n.truncateToWidth)(i,e,`…`)})}renderStacked(e,t){let n=Math.max(1,Math.floor((t-1)/2)),r=Math.max(0,t-n-1);this.bodyHeight=n;let i=this.treeLines(e),a=this.detailLines(e);return[...i.slice(0,n),...Array.from({length:Math.max(0,n-i.length)},()=>``),this.theme.fg(`borderMuted`,`─`.repeat(e)),...a.slice(0,r)]}};async function d(e,n){await e.ui.custom((e,t,r,i)=>new u(e,t,n,i),t.DOOM_FULLSCREEN_UI_OPTIONS)}exports.ToolsOverlayComponent=u,exports.openToolsOverlay=d;
|
|
2
|
+
//# sourceMappingURL=toolsOverlay.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolsOverlay.cjs","names":["fitStyledLine","visibleWidth","DoomOverlay","matchesKey","DOOM_OVERLAY_ACCENT","truncateToWidth","DOOM_FULLSCREEN_UI_OPTIONS"],"sources":["../../src/tui/toolsOverlay.ts"],"sourcesContent":["/**\n * Tools browser: the `SPC e t` overlay.\n *\n * A grouped list on the left (Pi core, one group per MCP server, one per\n * extension) and a detail pane on the right for the tool under the cursor.\n * Read-only: nothing here enables or disables a tool, so it cannot fight plan\n * mode or the workflow dispatcher over the active tool set.\n *\n * Group headings are labels, not controls: everything is always expanded and\n * the cursor steps over them, so there is no expansion state to track and the\n * whole inventory is legible without navigating it. The tree stays a flat row\n * list, which keeps selection a single index and every row assertable as text.\n */\n\nimport type { ExtensionContext, Theme } from '@earendil-works/pi-coding-agent';\nimport { matchesKey, truncateToWidth, visibleWidth } from '@earendil-works/pi-tui';\nimport type { ToolEntry, ToolSource } from '../services/tools/toolInventory.ts';\nimport {\n DOOM_FULLSCREEN_UI_OPTIONS,\n DOOM_OVERLAY_ACCENT,\n DoomOverlay,\n type DoomOverlayChrome,\n type DoomOverlayTui,\n} from './doomOverlay.ts';\nimport { fitStyledLine } from './rendering.ts';\n\ntype Row = { kind: 'source'; source: ToolSource } | { kind: 'tool'; source: ToolSource; tool: ToolEntry };\n\nconst TITLE = 'TOOLS';\nconst BREADCRUMB = 'SPC › e / t · tools';\nconst HEADER_RIGHT = 'esc close';\nconst HINTS: readonly (readonly [string, string])[] = [\n ['↑↓', 'move'],\n ['esc', 'close'],\n];\n\nconst MIN_WIDTH = 48;\n/** A third for the tree, two thirds for the tool being read. */\nconst TREE_PANE_RATIO = 1 / 3;\n/** One blank column each side of the pane divider so neither column touches it. */\nconst PANE_GUTTER = 1;\nconst MIN_PANE_WIDTH = 18;\nconst ELLIPSIS = '…';\nconst TOOL_INDENT = ' ';\nconst LABEL_COLUMN = 12;\nconst REQUIRED_MARKER = ' *';\nconst EMPTY_MESSAGE = 'No tools are registered in this session.';\nconst ACTIVE_LABEL = 'active';\nconst INACTIVE_LABEL = 'inactive';\nconst SOURCE_HEADING = 'SOURCES';\n\nfunction fitRow(text: string, width: number): string {\n return fitStyledLine(text, width, ELLIPSIS);\n}\n\nfunction rightAligned(left: string, right: string, width: number): string {\n const rightWidth = visibleWidth(right);\n const leftWidth = Math.max(0, width - rightWidth - 1);\n return fitRow(left, leftWidth) + ' '.repeat(Math.max(1, width - leftWidth - rightWidth)) + fitRow(right, rightWidth);\n}\n\nfunction wrap(text: string, width: number): string[] {\n if (width <= 0) return [];\n const lines: string[] = [];\n let current = '';\n for (const word of text.split(/\\s+/).filter(Boolean)) {\n if (current.length === 0) current = word;\n else if (current.length + 1 + word.length <= width) current += ` ${word}`;\n else {\n lines.push(current);\n current = word;\n }\n }\n if (current.length > 0) lines.push(current);\n return lines;\n}\n\n/** Top-level properties of a JSON-schema-shaped parameter object, if it has any. */\nfunction parameterRows(parameters: unknown): readonly { name: string; type: string; required: boolean }[] {\n if (typeof parameters !== 'object' || parameters === null) return [];\n const schema = parameters as { properties?: unknown; required?: unknown };\n if (typeof schema.properties !== 'object' || schema.properties === null) return [];\n const required = new Set(\n Array.isArray(schema.required) ? schema.required.filter((name) => typeof name === 'string') : [],\n );\n return Object.entries(schema.properties as Record<string, unknown>).map(([name, value]) => {\n const type = typeof value === 'object' && value !== null ? (value as { type?: unknown }).type : undefined;\n return {\n name,\n type: typeof type === 'string' ? type : '',\n required: required.has(name),\n };\n });\n}\n\nfunction activeCount(source: ToolSource): number {\n return source.tools.reduce((total, tool) => total + (tool.active ? 1 : 0), 0);\n}\n\nexport class ToolsOverlayComponent extends DoomOverlay {\n private readonly sources: readonly ToolSource[];\n private readonly done: (result: undefined) => void;\n private selected: number;\n private bodyHeight = 1;\n\n constructor(tui: DoomOverlayTui, theme: Theme, sources: readonly ToolSource[], done: (result: undefined) => void) {\n super(tui, theme);\n this.sources = sources;\n this.done = done;\n this.selected = this.rows().findIndex((row) => row.kind === 'tool');\n }\n\n /** Every source is always expanded: the source row is a heading, not a control. */\n private rows(): readonly Row[] {\n const rows: Row[] = [];\n for (const source of this.sources) {\n rows.push({ kind: 'source', source });\n for (const tool of source.tools) rows.push({ kind: 'tool', source, tool });\n }\n return rows;\n }\n\n private currentTool(): Extract<Row, { kind: 'tool' }> | undefined {\n const row = this.rows()[this.selected];\n return row?.kind === 'tool' ? row : undefined;\n }\n\n /** Source rows are labels, so the cursor steps over them to the next tool. */\n private move(delta: number): void {\n const rows = this.rows();\n const step = delta < 0 ? -1 : 1;\n let index = this.selected;\n for (let remaining = Math.abs(delta); remaining > 0; remaining -= 1) {\n let next = index + step;\n while (next >= 0 && next < rows.length && rows[next]?.kind !== 'tool') next += step;\n if (next < 0 || next >= rows.length) break;\n index = next;\n }\n if (index === this.selected) return;\n this.selected = index;\n this.tui.requestRender();\n }\n\n handleInput(data: string): void {\n if (matchesKey(data, 'escape') || matchesKey(data, 'ctrl+c') || data === 'q') {\n this.done(undefined);\n return;\n }\n if (matchesKey(data, 'up') || data === 'k') {\n this.move(-1);\n return;\n }\n if (matchesKey(data, 'down') || data === 'j') {\n this.move(1);\n return;\n }\n if (matchesKey(data, 'pageUp')) {\n this.move(-Math.max(1, this.bodyHeight - 1));\n return;\n }\n if (matchesKey(data, 'pageDown')) this.move(Math.max(1, this.bodyHeight - 1));\n }\n\n private treeLines(width: number): string[] {\n const rows = this.rows();\n const lines = [this.theme.bold(SOURCE_HEADING), ''];\n if (rows.length === 0) {\n lines.push(this.theme.fg('dim', EMPTY_MESSAGE));\n return lines;\n }\n\n const budget = Math.max(1, this.bodyHeight - lines.length);\n const selected = Math.max(0, Math.min(this.selected, rows.length - 1));\n const start = Math.max(0, Math.min(selected - budget + 1, Math.max(0, rows.length - budget)));\n for (const [offset, row] of rows.slice(start, start + budget).entries()) {\n const line =\n row.kind === 'source'\n ? rightAligned(\n this.theme.bold(row.source.label),\n this.theme.fg('dim', row.source.status ?? String(activeCount(row.source))),\n width,\n )\n : // Colour separates the active tool set from the merely registered one,\n // so the cursor never has to visit a row to learn its state.\n this.theme.fg(row.tool.active ? 'text' : 'dim', fitRow(`${TOOL_INDENT}${row.tool.name}`, width));\n lines.push(start + offset === selected ? this.theme.bg('selectedBg', fitRow(line, width)) : line);\n }\n return lines;\n }\n\n private field(label: string, value: string, width: number): string[] {\n const valueWidth = Math.max(1, width - LABEL_COLUMN);\n return wrap(value, valueWidth).map(\n (line, index) =>\n `${this.theme.fg('dim', fitRow(index === 0 ? label : '', LABEL_COLUMN))}${fitRow(line, valueWidth)}`,\n );\n }\n\n private toolLines(source: ToolSource, tool: ToolEntry, width: number): string[] {\n const lines = [this.theme.bold(tool.name), ''];\n lines.push(...this.field('source', source.label, width));\n // Source rows no longer open a detail pane, so the entry path is shown here.\n if (source.detail) lines.push(...this.field('registered', source.detail, width));\n lines.push(\n ...this.field(\n 'status',\n tool.active ? this.theme.fg('success', ACTIVE_LABEL) : this.theme.fg('dim', INACTIVE_LABEL),\n width,\n ),\n );\n if (tool.description) {\n lines.push('');\n lines.push(...wrap(tool.description, width));\n }\n const parameters = parameterRows(tool.parameters);\n if (parameters.length > 0) {\n lines.push('');\n lines.push(this.theme.fg('dim', 'PARAMETERS'));\n for (const parameter of parameters) {\n // The name takes the whole line so long ones stop truncating into the\n // type, which sits flush right where the eye can run down the column.\n const name = parameter.required\n ? `${parameter.name}${this.theme.fg('warning', REQUIRED_MARKER)}`\n : parameter.name;\n lines.push(rightAligned(name, this.theme.fg('dim', parameter.type), width));\n }\n }\n for (const guideline of tool.promptGuidelines ?? []) {\n lines.push('');\n lines.push(...wrap(guideline, width));\n }\n return lines;\n }\n\n private detailLines(width: number): string[] {\n const row = this.currentTool();\n if (!row) return [this.theme.fg('dim', EMPTY_MESSAGE)];\n return this.toolLines(row.source, row.tool, width);\n }\n\n protected getChrome(): DoomOverlayChrome {\n // Active over registered: the first number is what the model can call, the\n // second is what a different mode or profile could turn back on.\n const active = this.sources.reduce((total, source) => total + activeCount(source), 0);\n const tools = `${active}/${this.sources.reduce((total, source) => total + source.tools.length, 0)}`;\n return {\n title: TITLE,\n accent: DOOM_OVERLAY_ACCENT,\n breadcrumb: BREADCRUMB,\n headerRight: `${tools} tools · ${this.sources.length} sources · ${HEADER_RIGHT}`,\n footer: this.hintLine(),\n };\n }\n\n private hintLine(): string {\n return HINTS.map(\n ([key, label]) =>\n `${this.theme.bg('selectedBg', this.theme.fg('text', ` ${key} `))}${this.theme.fg('dim', ` ${label}`)}`,\n ).join(this.theme.fg('dim', ' '));\n }\n\n protected renderBody(width: number, height: number): string[] {\n this.bodyHeight = height;\n if (width < MIN_WIDTH) return this.renderStacked(width, height);\n\n const leftWidth = Math.max(MIN_PANE_WIDTH, Math.floor((width - 1) * TREE_PANE_RATIO));\n const rightWidth = Math.max(1, width - leftWidth - 1);\n const leftContent = Math.max(1, leftWidth - PANE_GUTTER);\n const rightContent = Math.max(1, rightWidth - PANE_GUTTER);\n const left = this.treeLines(leftContent);\n const right = this.detailLines(rightContent);\n\n const divider = this.theme.fg('borderMuted', '│');\n return Array.from({ length: height }, (_, index) => {\n const row = `${fitRow(left[index] ?? '', leftContent)} ${divider} ${fitRow(right[index] ?? '', rightContent)}`;\n return truncateToWidth(row, width, ELLIPSIS);\n });\n }\n\n private renderStacked(width: number, height: number): string[] {\n const topHeight = Math.max(1, Math.floor((height - 1) / 2));\n const bottomHeight = Math.max(0, height - topHeight - 1);\n this.bodyHeight = topHeight;\n const top = this.treeLines(width);\n const bottom = this.detailLines(width);\n return [\n ...top.slice(0, topHeight),\n ...Array.from({ length: Math.max(0, topHeight - top.length) }, () => ''),\n this.theme.fg('borderMuted', '─'.repeat(width)),\n ...bottom.slice(0, bottomHeight),\n ];\n }\n}\n\nexport async function openToolsOverlay(ctx: ExtensionContext, sources: readonly ToolSource[]): Promise<void> {\n await ctx.ui.custom<undefined>(\n (tui, theme, _keybindings, done) => new ToolsOverlayComponent(tui, theme, sources, done),\n DOOM_FULLSCREEN_UI_OPTIONS,\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { DoomOverlay, DoomOverlayChrome, DoomOverlayTui } from "./doomOverlay.cjs";
|
|
2
|
+
import { ToolSource } from "../services/tools/toolInventory.cjs";
|
|
3
|
+
import { ExtensionContext, Theme } from "@earendil-works/pi-coding-agent";
|
|
4
|
+
//#region src/tui/toolsOverlay.d.ts
|
|
5
|
+
declare class ToolsOverlayComponent extends DoomOverlay {
|
|
6
|
+
private readonly sources;
|
|
7
|
+
private readonly done;
|
|
8
|
+
private selected;
|
|
9
|
+
private bodyHeight;
|
|
10
|
+
constructor(tui: DoomOverlayTui, theme: Theme, sources: readonly ToolSource[], done: (result: undefined) => void);
|
|
11
|
+
/** Every source is always expanded: the source row is a heading, not a control. */
|
|
12
|
+
private rows;
|
|
13
|
+
private currentTool;
|
|
14
|
+
/** Source rows are labels, so the cursor steps over them to the next tool. */
|
|
15
|
+
private move;
|
|
16
|
+
handleInput(data: string): void;
|
|
17
|
+
private treeLines;
|
|
18
|
+
private field;
|
|
19
|
+
private toolLines;
|
|
20
|
+
private detailLines;
|
|
21
|
+
protected getChrome(): DoomOverlayChrome;
|
|
22
|
+
private hintLine;
|
|
23
|
+
protected renderBody(width: number, height: number): string[];
|
|
24
|
+
private renderStacked;
|
|
25
|
+
}
|
|
26
|
+
declare function openToolsOverlay(ctx: ExtensionContext, sources: readonly ToolSource[]): Promise<void>;
|
|
27
|
+
//#endregion
|
|
28
|
+
export { ToolsOverlayComponent, openToolsOverlay };
|
|
29
|
+
//# sourceMappingURL=toolsOverlay.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolsOverlay.d.cts","names":[],"sources":["../../src/tui/toolsOverlay.ts"],"mappings":";;;;cAmGa,8BAA8B;mBACxB;mBACA;UACT;UACA;EAEI,YAAA,KAAK,gBAAgB,OAAO,OAAO,kBAAkB,cAAc,OAAO;;UAQ9E;UASA;;UAMA;EAeR,YAAY;UAoBJ;UA2BA;UAQA;UAoCA;YAME,aAAa;UAcf;YAOE,WAAW,eAAe;UAkB5B;;iBAeY,iBAAiB,KAAK,kBAAkB,kBAAkB,eAAe"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { DoomOverlay, DoomOverlayChrome, DoomOverlayTui } from "./doomOverlay.mjs";
|
|
2
|
+
import { ToolSource } from "../services/tools/toolInventory.mjs";
|
|
3
|
+
import { ExtensionContext, Theme } from "@earendil-works/pi-coding-agent";
|
|
4
|
+
//#region src/tui/toolsOverlay.d.ts
|
|
5
|
+
declare class ToolsOverlayComponent extends DoomOverlay {
|
|
6
|
+
private readonly sources;
|
|
7
|
+
private readonly done;
|
|
8
|
+
private selected;
|
|
9
|
+
private bodyHeight;
|
|
10
|
+
constructor(tui: DoomOverlayTui, theme: Theme, sources: readonly ToolSource[], done: (result: undefined) => void);
|
|
11
|
+
/** Every source is always expanded: the source row is a heading, not a control. */
|
|
12
|
+
private rows;
|
|
13
|
+
private currentTool;
|
|
14
|
+
/** Source rows are labels, so the cursor steps over them to the next tool. */
|
|
15
|
+
private move;
|
|
16
|
+
handleInput(data: string): void;
|
|
17
|
+
private treeLines;
|
|
18
|
+
private field;
|
|
19
|
+
private toolLines;
|
|
20
|
+
private detailLines;
|
|
21
|
+
protected getChrome(): DoomOverlayChrome;
|
|
22
|
+
private hintLine;
|
|
23
|
+
protected renderBody(width: number, height: number): string[];
|
|
24
|
+
private renderStacked;
|
|
25
|
+
}
|
|
26
|
+
declare function openToolsOverlay(ctx: ExtensionContext, sources: readonly ToolSource[]): Promise<void>;
|
|
27
|
+
//#endregion
|
|
28
|
+
export { ToolsOverlayComponent, openToolsOverlay };
|
|
29
|
+
//# sourceMappingURL=toolsOverlay.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolsOverlay.d.mts","names":[],"sources":["../../src/tui/toolsOverlay.ts"],"mappings":";;;;cAmGa,8BAA8B;mBACxB;mBACA;UACT;UACA;EAEI,YAAA,KAAK,gBAAgB,OAAO,OAAO,kBAAkB,cAAc,OAAO;;UAQ9E;UASA;;UAMA;EAeR,YAAY;UAoBJ;UA2BA;UAQA;UAoCA;YAME,aAAa;UAcf;YAOE,WAAW,eAAe;UAkB5B;;iBAeY,iBAAiB,KAAK,kBAAkB,kBAAkB,eAAe"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{fitStyledLine as e}from"./rendering.mjs";import{DOOM_FULLSCREEN_UI_OPTIONS as t,DOOM_OVERLAY_ACCENT as n,DoomOverlay as r}from"./doomOverlay.mjs";import{matchesKey as i,truncateToWidth as a,visibleWidth as o}from"@earendil-works/pi-tui";const s=[[`↑↓`,`move`],[`esc`,`close`]],c=`No tools are registered in this session.`;function l(t,n){return e(t,n,`…`)}function u(e,t,n){let r=o(t),i=Math.max(0,n-r-1);return l(e,i)+` `.repeat(Math.max(1,n-i-r))+l(t,r)}function d(e,t){if(t<=0)return[];let n=[],r=``;for(let i of e.split(/\s+/).filter(Boolean))r.length===0?r=i:r.length+1+i.length<=t?r+=` ${i}`:(n.push(r),r=i);return r.length>0&&n.push(r),n}function f(e){if(typeof e!=`object`||!e)return[];let t=e;if(typeof t.properties!=`object`||t.properties===null)return[];let n=new Set(Array.isArray(t.required)?t.required.filter(e=>typeof e==`string`):[]);return Object.entries(t.properties).map(([e,t])=>{let r=typeof t==`object`&&t?t.type:void 0;return{name:e,type:typeof r==`string`?r:``,required:n.has(e)}})}function p(e){return e.tools.reduce((e,t)=>e+ +!!t.active,0)}var m=class extends r{sources;done;selected;bodyHeight=1;constructor(e,t,n,r){super(e,t),this.sources=n,this.done=r,this.selected=this.rows().findIndex(e=>e.kind===`tool`)}rows(){let e=[];for(let t of this.sources){e.push({kind:`source`,source:t});for(let n of t.tools)e.push({kind:`tool`,source:t,tool:n})}return e}currentTool(){let e=this.rows()[this.selected];return e?.kind===`tool`?e:void 0}move(e){let t=this.rows(),n=e<0?-1:1,r=this.selected;for(let i=Math.abs(e);i>0;--i){let e=r+n;for(;e>=0&&e<t.length&&t[e]?.kind!==`tool`;)e+=n;if(e<0||e>=t.length)break;r=e}r!==this.selected&&(this.selected=r,this.tui.requestRender())}handleInput(e){if(i(e,`escape`)||i(e,`ctrl+c`)||e===`q`){this.done(void 0);return}if(i(e,`up`)||e===`k`){this.move(-1);return}if(i(e,`down`)||e===`j`){this.move(1);return}if(i(e,`pageUp`)){this.move(-Math.max(1,this.bodyHeight-1));return}i(e,`pageDown`)&&this.move(Math.max(1,this.bodyHeight-1))}treeLines(e){let t=this.rows(),n=[this.theme.bold(`SOURCES`),``];if(t.length===0)return n.push(this.theme.fg(`dim`,c)),n;let r=Math.max(1,this.bodyHeight-n.length),i=Math.max(0,Math.min(this.selected,t.length-1)),a=Math.max(0,Math.min(i-r+1,Math.max(0,t.length-r)));for(let[o,s]of t.slice(a,a+r).entries()){let t=s.kind===`source`?u(this.theme.bold(s.source.label),this.theme.fg(`dim`,s.source.status??String(p(s.source))),e):this.theme.fg(s.tool.active?`text`:`dim`,l(` ${s.tool.name}`,e));n.push(a+o===i?this.theme.bg(`selectedBg`,l(t,e)):t)}return n}field(e,t,n){let r=Math.max(1,n-12);return d(t,r).map((t,n)=>`${this.theme.fg(`dim`,l(n===0?e:``,12))}${l(t,r)}`)}toolLines(e,t,n){let r=[this.theme.bold(t.name),``];r.push(...this.field(`source`,e.label,n)),e.detail&&r.push(...this.field(`registered`,e.detail,n)),r.push(...this.field(`status`,t.active?this.theme.fg(`success`,`active`):this.theme.fg(`dim`,`inactive`),n)),t.description&&(r.push(``),r.push(...d(t.description,n)));let i=f(t.parameters);if(i.length>0){r.push(``),r.push(this.theme.fg(`dim`,`PARAMETERS`));for(let e of i){let t=e.required?`${e.name}${this.theme.fg(`warning`,` *`)}`:e.name;r.push(u(t,this.theme.fg(`dim`,e.type),n))}}for(let e of t.promptGuidelines??[])r.push(``),r.push(...d(e,n));return r}detailLines(e){let t=this.currentTool();return t?this.toolLines(t.source,t.tool,e):[this.theme.fg(`dim`,c)]}getChrome(){let e=`${this.sources.reduce((e,t)=>e+p(t),0)}/${this.sources.reduce((e,t)=>e+t.tools.length,0)}`;return{title:`TOOLS`,accent:n,breadcrumb:`SPC › e / t · tools`,headerRight:`${e} tools · ${this.sources.length} sources · esc close`,footer:this.hintLine()}}hintLine(){return s.map(([e,t])=>`${this.theme.bg(`selectedBg`,this.theme.fg(`text`,` ${e} `))}${this.theme.fg(`dim`,` ${t}`)}`).join(this.theme.fg(`dim`,` `))}renderBody(e,t){if(this.bodyHeight=t,e<48)return this.renderStacked(e,t);let n=Math.max(18,Math.floor((e-1)*.3333333333333333)),r=Math.max(1,e-n-1),i=Math.max(1,n-1),o=Math.max(1,r-1),s=this.treeLines(i),c=this.detailLines(o),u=this.theme.fg(`borderMuted`,`│`);return Array.from({length:t},(t,n)=>{let r=`${l(s[n]??``,i)} ${u} ${l(c[n]??``,o)}`;return a(r,e,`…`)})}renderStacked(e,t){let n=Math.max(1,Math.floor((t-1)/2)),r=Math.max(0,t-n-1);this.bodyHeight=n;let i=this.treeLines(e),a=this.detailLines(e);return[...i.slice(0,n),...Array.from({length:Math.max(0,n-i.length)},()=>``),this.theme.fg(`borderMuted`,`─`.repeat(e)),...a.slice(0,r)]}};async function h(e,n){await e.ui.custom((e,t,r,i)=>new m(e,t,n,i),t)}export{m as ToolsOverlayComponent,h as openToolsOverlay};
|
|
2
|
+
//# sourceMappingURL=toolsOverlay.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolsOverlay.mjs","names":[],"sources":["../../src/tui/toolsOverlay.ts"],"sourcesContent":["/**\n * Tools browser: the `SPC e t` overlay.\n *\n * A grouped list on the left (Pi core, one group per MCP server, one per\n * extension) and a detail pane on the right for the tool under the cursor.\n * Read-only: nothing here enables or disables a tool, so it cannot fight plan\n * mode or the workflow dispatcher over the active tool set.\n *\n * Group headings are labels, not controls: everything is always expanded and\n * the cursor steps over them, so there is no expansion state to track and the\n * whole inventory is legible without navigating it. The tree stays a flat row\n * list, which keeps selection a single index and every row assertable as text.\n */\n\nimport type { ExtensionContext, Theme } from '@earendil-works/pi-coding-agent';\nimport { matchesKey, truncateToWidth, visibleWidth } from '@earendil-works/pi-tui';\nimport type { ToolEntry, ToolSource } from '../services/tools/toolInventory.ts';\nimport {\n DOOM_FULLSCREEN_UI_OPTIONS,\n DOOM_OVERLAY_ACCENT,\n DoomOverlay,\n type DoomOverlayChrome,\n type DoomOverlayTui,\n} from './doomOverlay.ts';\nimport { fitStyledLine } from './rendering.ts';\n\ntype Row = { kind: 'source'; source: ToolSource } | { kind: 'tool'; source: ToolSource; tool: ToolEntry };\n\nconst TITLE = 'TOOLS';\nconst BREADCRUMB = 'SPC › e / t · tools';\nconst HEADER_RIGHT = 'esc close';\nconst HINTS: readonly (readonly [string, string])[] = [\n ['↑↓', 'move'],\n ['esc', 'close'],\n];\n\nconst MIN_WIDTH = 48;\n/** A third for the tree, two thirds for the tool being read. */\nconst TREE_PANE_RATIO = 1 / 3;\n/** One blank column each side of the pane divider so neither column touches it. */\nconst PANE_GUTTER = 1;\nconst MIN_PANE_WIDTH = 18;\nconst ELLIPSIS = '…';\nconst TOOL_INDENT = ' ';\nconst LABEL_COLUMN = 12;\nconst REQUIRED_MARKER = ' *';\nconst EMPTY_MESSAGE = 'No tools are registered in this session.';\nconst ACTIVE_LABEL = 'active';\nconst INACTIVE_LABEL = 'inactive';\nconst SOURCE_HEADING = 'SOURCES';\n\nfunction fitRow(text: string, width: number): string {\n return fitStyledLine(text, width, ELLIPSIS);\n}\n\nfunction rightAligned(left: string, right: string, width: number): string {\n const rightWidth = visibleWidth(right);\n const leftWidth = Math.max(0, width - rightWidth - 1);\n return fitRow(left, leftWidth) + ' '.repeat(Math.max(1, width - leftWidth - rightWidth)) + fitRow(right, rightWidth);\n}\n\nfunction wrap(text: string, width: number): string[] {\n if (width <= 0) return [];\n const lines: string[] = [];\n let current = '';\n for (const word of text.split(/\\s+/).filter(Boolean)) {\n if (current.length === 0) current = word;\n else if (current.length + 1 + word.length <= width) current += ` ${word}`;\n else {\n lines.push(current);\n current = word;\n }\n }\n if (current.length > 0) lines.push(current);\n return lines;\n}\n\n/** Top-level properties of a JSON-schema-shaped parameter object, if it has any. */\nfunction parameterRows(parameters: unknown): readonly { name: string; type: string; required: boolean }[] {\n if (typeof parameters !== 'object' || parameters === null) return [];\n const schema = parameters as { properties?: unknown; required?: unknown };\n if (typeof schema.properties !== 'object' || schema.properties === null) return [];\n const required = new Set(\n Array.isArray(schema.required) ? schema.required.filter((name) => typeof name === 'string') : [],\n );\n return Object.entries(schema.properties as Record<string, unknown>).map(([name, value]) => {\n const type = typeof value === 'object' && value !== null ? (value as { type?: unknown }).type : undefined;\n return {\n name,\n type: typeof type === 'string' ? type : '',\n required: required.has(name),\n };\n });\n}\n\nfunction activeCount(source: ToolSource): number {\n return source.tools.reduce((total, tool) => total + (tool.active ? 1 : 0), 0);\n}\n\nexport class ToolsOverlayComponent extends DoomOverlay {\n private readonly sources: readonly ToolSource[];\n private readonly done: (result: undefined) => void;\n private selected: number;\n private bodyHeight = 1;\n\n constructor(tui: DoomOverlayTui, theme: Theme, sources: readonly ToolSource[], done: (result: undefined) => void) {\n super(tui, theme);\n this.sources = sources;\n this.done = done;\n this.selected = this.rows().findIndex((row) => row.kind === 'tool');\n }\n\n /** Every source is always expanded: the source row is a heading, not a control. */\n private rows(): readonly Row[] {\n const rows: Row[] = [];\n for (const source of this.sources) {\n rows.push({ kind: 'source', source });\n for (const tool of source.tools) rows.push({ kind: 'tool', source, tool });\n }\n return rows;\n }\n\n private currentTool(): Extract<Row, { kind: 'tool' }> | undefined {\n const row = this.rows()[this.selected];\n return row?.kind === 'tool' ? row : undefined;\n }\n\n /** Source rows are labels, so the cursor steps over them to the next tool. */\n private move(delta: number): void {\n const rows = this.rows();\n const step = delta < 0 ? -1 : 1;\n let index = this.selected;\n for (let remaining = Math.abs(delta); remaining > 0; remaining -= 1) {\n let next = index + step;\n while (next >= 0 && next < rows.length && rows[next]?.kind !== 'tool') next += step;\n if (next < 0 || next >= rows.length) break;\n index = next;\n }\n if (index === this.selected) return;\n this.selected = index;\n this.tui.requestRender();\n }\n\n handleInput(data: string): void {\n if (matchesKey(data, 'escape') || matchesKey(data, 'ctrl+c') || data === 'q') {\n this.done(undefined);\n return;\n }\n if (matchesKey(data, 'up') || data === 'k') {\n this.move(-1);\n return;\n }\n if (matchesKey(data, 'down') || data === 'j') {\n this.move(1);\n return;\n }\n if (matchesKey(data, 'pageUp')) {\n this.move(-Math.max(1, this.bodyHeight - 1));\n return;\n }\n if (matchesKey(data, 'pageDown')) this.move(Math.max(1, this.bodyHeight - 1));\n }\n\n private treeLines(width: number): string[] {\n const rows = this.rows();\n const lines = [this.theme.bold(SOURCE_HEADING), ''];\n if (rows.length === 0) {\n lines.push(this.theme.fg('dim', EMPTY_MESSAGE));\n return lines;\n }\n\n const budget = Math.max(1, this.bodyHeight - lines.length);\n const selected = Math.max(0, Math.min(this.selected, rows.length - 1));\n const start = Math.max(0, Math.min(selected - budget + 1, Math.max(0, rows.length - budget)));\n for (const [offset, row] of rows.slice(start, start + budget).entries()) {\n const line =\n row.kind === 'source'\n ? rightAligned(\n this.theme.bold(row.source.label),\n this.theme.fg('dim', row.source.status ?? String(activeCount(row.source))),\n width,\n )\n : // Colour separates the active tool set from the merely registered one,\n // so the cursor never has to visit a row to learn its state.\n this.theme.fg(row.tool.active ? 'text' : 'dim', fitRow(`${TOOL_INDENT}${row.tool.name}`, width));\n lines.push(start + offset === selected ? this.theme.bg('selectedBg', fitRow(line, width)) : line);\n }\n return lines;\n }\n\n private field(label: string, value: string, width: number): string[] {\n const valueWidth = Math.max(1, width - LABEL_COLUMN);\n return wrap(value, valueWidth).map(\n (line, index) =>\n `${this.theme.fg('dim', fitRow(index === 0 ? label : '', LABEL_COLUMN))}${fitRow(line, valueWidth)}`,\n );\n }\n\n private toolLines(source: ToolSource, tool: ToolEntry, width: number): string[] {\n const lines = [this.theme.bold(tool.name), ''];\n lines.push(...this.field('source', source.label, width));\n // Source rows no longer open a detail pane, so the entry path is shown here.\n if (source.detail) lines.push(...this.field('registered', source.detail, width));\n lines.push(\n ...this.field(\n 'status',\n tool.active ? this.theme.fg('success', ACTIVE_LABEL) : this.theme.fg('dim', INACTIVE_LABEL),\n width,\n ),\n );\n if (tool.description) {\n lines.push('');\n lines.push(...wrap(tool.description, width));\n }\n const parameters = parameterRows(tool.parameters);\n if (parameters.length > 0) {\n lines.push('');\n lines.push(this.theme.fg('dim', 'PARAMETERS'));\n for (const parameter of parameters) {\n // The name takes the whole line so long ones stop truncating into the\n // type, which sits flush right where the eye can run down the column.\n const name = parameter.required\n ? `${parameter.name}${this.theme.fg('warning', REQUIRED_MARKER)}`\n : parameter.name;\n lines.push(rightAligned(name, this.theme.fg('dim', parameter.type), width));\n }\n }\n for (const guideline of tool.promptGuidelines ?? []) {\n lines.push('');\n lines.push(...wrap(guideline, width));\n }\n return lines;\n }\n\n private detailLines(width: number): string[] {\n const row = this.currentTool();\n if (!row) return [this.theme.fg('dim', EMPTY_MESSAGE)];\n return this.toolLines(row.source, row.tool, width);\n }\n\n protected getChrome(): DoomOverlayChrome {\n // Active over registered: the first number is what the model can call, the\n // second is what a different mode or profile could turn back on.\n const active = this.sources.reduce((total, source) => total + activeCount(source), 0);\n const tools = `${active}/${this.sources.reduce((total, source) => total + source.tools.length, 0)}`;\n return {\n title: TITLE,\n accent: DOOM_OVERLAY_ACCENT,\n breadcrumb: BREADCRUMB,\n headerRight: `${tools} tools · ${this.sources.length} sources · ${HEADER_RIGHT}`,\n footer: this.hintLine(),\n };\n }\n\n private hintLine(): string {\n return HINTS.map(\n ([key, label]) =>\n `${this.theme.bg('selectedBg', this.theme.fg('text', ` ${key} `))}${this.theme.fg('dim', ` ${label}`)}`,\n ).join(this.theme.fg('dim', ' '));\n }\n\n protected renderBody(width: number, height: number): string[] {\n this.bodyHeight = height;\n if (width < MIN_WIDTH) return this.renderStacked(width, height);\n\n const leftWidth = Math.max(MIN_PANE_WIDTH, Math.floor((width - 1) * TREE_PANE_RATIO));\n const rightWidth = Math.max(1, width - leftWidth - 1);\n const leftContent = Math.max(1, leftWidth - PANE_GUTTER);\n const rightContent = Math.max(1, rightWidth - PANE_GUTTER);\n const left = this.treeLines(leftContent);\n const right = this.detailLines(rightContent);\n\n const divider = this.theme.fg('borderMuted', '│');\n return Array.from({ length: height }, (_, index) => {\n const row = `${fitRow(left[index] ?? '', leftContent)} ${divider} ${fitRow(right[index] ?? '', rightContent)}`;\n return truncateToWidth(row, width, ELLIPSIS);\n });\n }\n\n private renderStacked(width: number, height: number): string[] {\n const topHeight = Math.max(1, Math.floor((height - 1) / 2));\n const bottomHeight = Math.max(0, height - topHeight - 1);\n this.bodyHeight = topHeight;\n const top = this.treeLines(width);\n const bottom = this.detailLines(width);\n return [\n ...top.slice(0, topHeight),\n ...Array.from({ length: Math.max(0, topHeight - top.length) }, () => ''),\n this.theme.fg('borderMuted', '─'.repeat(width)),\n ...bottom.slice(0, bottomHeight),\n ];\n }\n}\n\nexport async function openToolsOverlay(ctx: ExtensionContext, sources: readonly ToolSource[]): Promise<void> {\n await ctx.ui.custom<undefined>(\n (tui, theme, _keybindings, done) => new ToolsOverlayComponent(tui, theme, sources, done),\n DOOM_FULLSCREEN_UI_OPTIONS,\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e){return e?e.split(`,`).map(e=>e.trim()).filter(Boolean):[]}function t(t=process.env){return{root:t.DOOMPI_ROOT,majorMode:t.DOOMPI_MAJOR_MODE?.trim()||`copilot`,domains:e(t.DOOMPI_DOMAINS),layers:e(t.DOOMPI_LAYERS),profile:t.DOOMPI_PROFILE?.trim()||void 0}}exports.readDoomHarnessMetadata=t;
|
|
2
|
+
//# sourceMappingURL=harnessMetadata.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harnessMetadata.cjs","names":[],"sources":["../../src/types/harnessMetadata.ts"],"sourcesContent":["/**\n * The slice of harness state the header renders.\n *\n * A projection of the store rather than its own reader. This used to\n * re-implement five of the state keys with its own list parser and its own\n * default mode, which is two definitions of one protocol to keep in step.\n */\n\nconst DEFAULT_MAJOR_MODE = 'copilot';\n\nexport interface DoomHarnessMetadata {\n root?: string;\n /** The one named major mode this session runs under. */\n majorMode: string;\n domains: string[];\n /** The layer components the major mode resolved to. */\n layers: string[];\n profile?: string;\n}\n\nfunction parseList(value: string | undefined): string[] {\n return value\n ? value\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean)\n : [];\n}\n\nexport function readDoomHarnessMetadata(environment: NodeJS.ProcessEnv = process.env): DoomHarnessMetadata {\n return {\n root: environment.DOOMPI_ROOT,\n majorMode: environment.DOOMPI_MAJOR_MODE?.trim() || DEFAULT_MAJOR_MODE,\n domains: parseList(environment.DOOMPI_DOMAINS),\n layers: parseList(environment.DOOMPI_LAYERS),\n profile: environment.DOOMPI_PROFILE?.trim() || undefined,\n };\n}\n"],"mappings":"AAoBA,SAAS,EAAU,EAAqC,CACtD,OAAO,EACH,EACG,MAAM,GAAG,CAAC,CACV,IAAK,GAAS,EAAK,KAAK,CAAC,CAAC,CAC1B,OAAO,OAAO,EACjB,CAAC,CACP,CAEA,SAAgB,EAAwB,EAAiC,QAAQ,IAA0B,CACzG,MAAO,CACL,KAAM,EAAY,YAClB,UAAW,EAAY,mBAAmB,KAAK,GAAK,UACpD,QAAS,EAAU,EAAY,cAAc,EAC7C,OAAQ,EAAU,EAAY,aAAa,EAC3C,QAAS,EAAY,gBAAgB,KAAK,GAAK,IAAA,EACjD,CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//#region src/types/harnessMetadata.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* The slice of harness state the header renders.
|
|
4
|
+
*
|
|
5
|
+
* A projection of the store rather than its own reader. This used to
|
|
6
|
+
* re-implement five of the state keys with its own list parser and its own
|
|
7
|
+
* default mode, which is two definitions of one protocol to keep in step.
|
|
8
|
+
*/
|
|
9
|
+
interface DoomHarnessMetadata {
|
|
10
|
+
root?: string;
|
|
11
|
+
/** The one named major mode this session runs under. */
|
|
12
|
+
majorMode: string;
|
|
13
|
+
domains: string[];
|
|
14
|
+
/** The layer components the major mode resolved to. */
|
|
15
|
+
layers: string[];
|
|
16
|
+
profile?: string;
|
|
17
|
+
}
|
|
18
|
+
declare function readDoomHarnessMetadata(environment?: NodeJS.ProcessEnv): DoomHarnessMetadata;
|
|
19
|
+
//#endregion
|
|
20
|
+
export { DoomHarnessMetadata, readDoomHarnessMetadata };
|
|
21
|
+
//# sourceMappingURL=harnessMetadata.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harnessMetadata.d.cts","names":[],"sources":["../../src/types/harnessMetadata.ts"],"mappings":";;;;;;;;UAUiB;EACf;;EAEA;EACA;;EAEA;EACA;;iBAYc,wBAAwB,cAAa,OAAO,aAA2B"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//#region src/types/harnessMetadata.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* The slice of harness state the header renders.
|
|
4
|
+
*
|
|
5
|
+
* A projection of the store rather than its own reader. This used to
|
|
6
|
+
* re-implement five of the state keys with its own list parser and its own
|
|
7
|
+
* default mode, which is two definitions of one protocol to keep in step.
|
|
8
|
+
*/
|
|
9
|
+
interface DoomHarnessMetadata {
|
|
10
|
+
root?: string;
|
|
11
|
+
/** The one named major mode this session runs under. */
|
|
12
|
+
majorMode: string;
|
|
13
|
+
domains: string[];
|
|
14
|
+
/** The layer components the major mode resolved to. */
|
|
15
|
+
layers: string[];
|
|
16
|
+
profile?: string;
|
|
17
|
+
}
|
|
18
|
+
declare function readDoomHarnessMetadata(environment?: NodeJS.ProcessEnv): DoomHarnessMetadata;
|
|
19
|
+
//#endregion
|
|
20
|
+
export { DoomHarnessMetadata, readDoomHarnessMetadata };
|
|
21
|
+
//# sourceMappingURL=harnessMetadata.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harnessMetadata.d.mts","names":[],"sources":["../../src/types/harnessMetadata.ts"],"mappings":";;;;;;;;UAUiB;EACf;;EAEA;EACA;;EAEA;EACA;;iBAYc,wBAAwB,cAAa,OAAO,aAA2B"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e){return e?e.split(`,`).map(e=>e.trim()).filter(Boolean):[]}function t(t=process.env){return{root:t.DOOMPI_ROOT,majorMode:t.DOOMPI_MAJOR_MODE?.trim()||`copilot`,domains:e(t.DOOMPI_DOMAINS),layers:e(t.DOOMPI_LAYERS),profile:t.DOOMPI_PROFILE?.trim()||void 0}}export{t as readDoomHarnessMetadata};
|
|
2
|
+
//# sourceMappingURL=harnessMetadata.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harnessMetadata.mjs","names":[],"sources":["../../src/types/harnessMetadata.ts"],"sourcesContent":["/**\n * The slice of harness state the header renders.\n *\n * A projection of the store rather than its own reader. This used to\n * re-implement five of the state keys with its own list parser and its own\n * default mode, which is two definitions of one protocol to keep in step.\n */\n\nconst DEFAULT_MAJOR_MODE = 'copilot';\n\nexport interface DoomHarnessMetadata {\n root?: string;\n /** The one named major mode this session runs under. */\n majorMode: string;\n domains: string[];\n /** The layer components the major mode resolved to. */\n layers: string[];\n profile?: string;\n}\n\nfunction parseList(value: string | undefined): string[] {\n return value\n ? value\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean)\n : [];\n}\n\nexport function readDoomHarnessMetadata(environment: NodeJS.ProcessEnv = process.env): DoomHarnessMetadata {\n return {\n root: environment.DOOMPI_ROOT,\n majorMode: environment.DOOMPI_MAJOR_MODE?.trim() || DEFAULT_MAJOR_MODE,\n domains: parseList(environment.DOOMPI_DOMAINS),\n layers: parseList(environment.DOOMPI_LAYERS),\n profile: environment.DOOMPI_PROFILE?.trim() || undefined,\n };\n}\n"],"mappings":"AAoBA,SAAS,EAAU,EAAqC,CACtD,OAAO,EACH,EACG,MAAM,GAAG,CAAC,CACV,IAAK,GAAS,EAAK,KAAK,CAAC,CAAC,CAC1B,OAAO,OAAO,EACjB,CAAC,CACP,CAEA,SAAgB,EAAwB,EAAiC,QAAQ,IAA0B,CACzG,MAAO,CACL,KAAM,EAAY,YAClB,UAAW,EAAY,mBAAmB,KAAK,GAAK,UACpD,QAAS,EAAU,EAAY,cAAc,EAC7C,OAAQ,EAAU,EAAY,aAAa,EAC3C,QAAS,EAAY,gBAAgB,KAAK,GAAK,IAAA,EACjD,CACF"}
|
package/dist/uiState.cjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=
|
|
2
|
-
//# sourceMappingURL=uiState.cjs.map
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./services/state/uiState.cjs");exports.DoomUiState=e.DoomUiState,exports.projectMinorModeRecords=e.projectMinorModeRecords;
|
package/dist/uiState.d.cts
CHANGED
|
@@ -1,37 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
interface LeaderOption {
|
|
4
|
-
key: string;
|
|
5
|
-
label: string;
|
|
6
|
-
detail?: string;
|
|
7
|
-
}
|
|
8
|
-
interface LeaderSnapshot {
|
|
9
|
-
active: boolean;
|
|
10
|
-
prefix: string[];
|
|
11
|
-
label: string;
|
|
12
|
-
options: LeaderOption[];
|
|
13
|
-
rootOptions?: LeaderOption[];
|
|
14
|
-
}
|
|
15
|
-
type StateListener = (snapshot: LeaderSnapshot) => void;
|
|
16
|
-
declare class DoomUiState {
|
|
17
|
-
private snapshot;
|
|
18
|
-
/**
|
|
19
|
-
* The enabled modes, shown in two places at two levels of detail.
|
|
20
|
-
*
|
|
21
|
-
* Held here rather than read from the mode registry by each surface because
|
|
22
|
-
* both readers already take this state: the editor prints the names beside
|
|
23
|
-
* its mode badge, and the leader panel prints them with their detail. One
|
|
24
|
-
* source, so the two can never disagree about what is on.
|
|
25
|
-
*/
|
|
26
|
-
private modes;
|
|
27
|
-
private readonly listeners;
|
|
28
|
-
getSnapshot(): LeaderSnapshot;
|
|
29
|
-
getModes(): readonly mode_d_exports.DoomModeStatus[];
|
|
30
|
-
setModes(modes: readonly mode_d_exports.DoomModeStatus[]): void;
|
|
31
|
-
setLeader(snapshot: LeaderSnapshot): void;
|
|
32
|
-
reset(): void;
|
|
33
|
-
subscribe(listener: StateListener): () => void;
|
|
34
|
-
}
|
|
35
|
-
//#endregion
|
|
36
|
-
export { DoomUiState, LeaderOption, LeaderSnapshot };
|
|
37
|
-
//# sourceMappingURL=uiState.d.cts.map
|
|
1
|
+
import { DoomUiState, LeaderOption, LeaderSnapshot, UiMinorModeStatus, projectMinorModeRecords } from "./services/state/uiState.cjs";
|
|
2
|
+
export { DoomUiState, type LeaderOption, type LeaderSnapshot, type UiMinorModeStatus, projectMinorModeRecords };
|
package/dist/uiState.d.mts
CHANGED
|
@@ -1,37 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
interface LeaderOption {
|
|
4
|
-
key: string;
|
|
5
|
-
label: string;
|
|
6
|
-
detail?: string;
|
|
7
|
-
}
|
|
8
|
-
interface LeaderSnapshot {
|
|
9
|
-
active: boolean;
|
|
10
|
-
prefix: string[];
|
|
11
|
-
label: string;
|
|
12
|
-
options: LeaderOption[];
|
|
13
|
-
rootOptions?: LeaderOption[];
|
|
14
|
-
}
|
|
15
|
-
type StateListener = (snapshot: LeaderSnapshot) => void;
|
|
16
|
-
declare class DoomUiState {
|
|
17
|
-
private snapshot;
|
|
18
|
-
/**
|
|
19
|
-
* The enabled modes, shown in two places at two levels of detail.
|
|
20
|
-
*
|
|
21
|
-
* Held here rather than read from the mode registry by each surface because
|
|
22
|
-
* both readers already take this state: the editor prints the names beside
|
|
23
|
-
* its mode badge, and the leader panel prints them with their detail. One
|
|
24
|
-
* source, so the two can never disagree about what is on.
|
|
25
|
-
*/
|
|
26
|
-
private modes;
|
|
27
|
-
private readonly listeners;
|
|
28
|
-
getSnapshot(): LeaderSnapshot;
|
|
29
|
-
getModes(): readonly mode_d_exports.DoomModeStatus[];
|
|
30
|
-
setModes(modes: readonly mode_d_exports.DoomModeStatus[]): void;
|
|
31
|
-
setLeader(snapshot: LeaderSnapshot): void;
|
|
32
|
-
reset(): void;
|
|
33
|
-
subscribe(listener: StateListener): () => void;
|
|
34
|
-
}
|
|
35
|
-
//#endregion
|
|
36
|
-
export { DoomUiState, LeaderOption, LeaderSnapshot };
|
|
37
|
-
//# sourceMappingURL=uiState.d.mts.map
|
|
1
|
+
import { DoomUiState, LeaderOption, LeaderSnapshot, UiMinorModeStatus, projectMinorModeRecords } from "./services/state/uiState.mjs";
|
|
2
|
+
export { DoomUiState, type LeaderOption, type LeaderSnapshot, type UiMinorModeStatus, projectMinorModeRecords };
|
package/dist/uiState.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
//# sourceMappingURL=uiState.mjs.map
|
|
1
|
+
import{DoomUiState as e,projectMinorModeRecords as t}from"./services/state/uiState.mjs";export{e as DoomUiState,t as projectMinorModeRecords};
|
package/package.json
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agimon-ai/doompi-ui",
|
|
3
|
-
"version": "0.0.1-alpha.
|
|
3
|
+
"version": "0.0.1-alpha.21",
|
|
4
4
|
"description": "Doom-inspired interactive UI extension for Pi",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"ai",
|
|
7
|
+
"coding-agent",
|
|
8
|
+
"developer-tools",
|
|
9
|
+
"doompi",
|
|
10
|
+
"pi-package"
|
|
11
|
+
],
|
|
5
12
|
"homepage": "https://agimon.ai",
|
|
6
13
|
"license": "MIT",
|
|
7
14
|
"author": "Vuong Ngo",
|
|
@@ -99,11 +106,6 @@
|
|
|
99
106
|
"import": "./dist/logSinkTelemetry.mjs",
|
|
100
107
|
"require": "./dist/logSinkTelemetry.cjs"
|
|
101
108
|
},
|
|
102
|
-
"./mode": {
|
|
103
|
-
"types": "./dist/mode.d.mts",
|
|
104
|
-
"import": "./dist/mode.mjs",
|
|
105
|
-
"require": "./dist/mode.cjs"
|
|
106
|
-
},
|
|
107
109
|
"./rendering": {
|
|
108
110
|
"types": "./dist/rendering.d.mts",
|
|
109
111
|
"import": "./dist/rendering.mjs",
|
|
@@ -119,6 +121,11 @@
|
|
|
119
121
|
"import": "./dist/theme.mjs",
|
|
120
122
|
"require": "./dist/theme.cjs"
|
|
121
123
|
},
|
|
124
|
+
"./toolChrome": {
|
|
125
|
+
"types": "./dist/toolChrome.d.mts",
|
|
126
|
+
"import": "./dist/toolChrome.mjs",
|
|
127
|
+
"require": "./dist/toolChrome.cjs"
|
|
128
|
+
},
|
|
122
129
|
"./toolInventory": {
|
|
123
130
|
"types": "./dist/toolInventory.d.mts",
|
|
124
131
|
"import": "./dist/toolInventory.mjs",
|
|
@@ -137,12 +144,12 @@
|
|
|
137
144
|
},
|
|
138
145
|
"dependencies": {
|
|
139
146
|
"yaml": "2.9.0",
|
|
140
|
-
"@agimon-ai/doompi-extension-contracts": "0.0.1-alpha.
|
|
141
|
-
"@agimon-ai/doompi-telemetry": "0.0.1-alpha.
|
|
147
|
+
"@agimon-ai/doompi-extension-contracts": "0.0.1-alpha.21",
|
|
148
|
+
"@agimon-ai/doompi-telemetry": "0.0.1-alpha.21"
|
|
142
149
|
},
|
|
143
150
|
"devDependencies": {
|
|
144
|
-
"@earendil-works/pi-coding-agent": "0.84.
|
|
145
|
-
"@earendil-works/pi-tui": "0.84.
|
|
151
|
+
"@earendil-works/pi-coding-agent": "0.84.2",
|
|
152
|
+
"@earendil-works/pi-tui": "0.84.2",
|
|
146
153
|
"@types/node": "26.1.1",
|
|
147
154
|
"@vitest/coverage-v8": "4.1.10",
|
|
148
155
|
"tsdown": "0.22.14",
|
|
@@ -150,8 +157,8 @@
|
|
|
150
157
|
"vitest": "4.1.10"
|
|
151
158
|
},
|
|
152
159
|
"peerDependencies": {
|
|
153
|
-
"@earendil-works/pi-coding-agent": "0.84.
|
|
154
|
-
"@earendil-works/pi-tui": "0.84.
|
|
160
|
+
"@earendil-works/pi-coding-agent": "0.84.2",
|
|
161
|
+
"@earendil-works/pi-tui": "0.84.2"
|
|
155
162
|
},
|
|
156
163
|
"engines": {
|
|
157
164
|
"node": ">=22.19.0"
|
package/themes/doom-pi-dark.json
CHANGED
|
@@ -2,27 +2,29 @@
|
|
|
2
2
|
"$schema": "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
|
|
3
3
|
"name": "doom-pi-dark",
|
|
4
4
|
"vars": {
|
|
5
|
-
"bg": "#
|
|
6
|
-
"bgAlt": "#
|
|
7
|
-
"bgActive": "#
|
|
8
|
-
"bgHover": "#
|
|
9
|
-
"fg": "#
|
|
10
|
-
"fgAlt": "#
|
|
11
|
-
"grey": "#
|
|
12
|
-
"greyAlt": "#
|
|
13
|
-
"blue": "#
|
|
14
|
-
"darkBlue": "#
|
|
15
|
-
"cyan": "#
|
|
16
|
-
"green": "#
|
|
17
|
-
"lightGreen": "#
|
|
18
|
-
"teal": "#
|
|
19
|
-
"orange": "#
|
|
20
|
-
"red": "#
|
|
21
|
-
"violet": "#
|
|
22
|
-
"magenta": "#
|
|
23
|
-
"yellow": "#
|
|
24
|
-
"lightYellow": "#
|
|
25
|
-
"comment": "#
|
|
5
|
+
"bg": "#282c34",
|
|
6
|
+
"bgAlt": "#21242b",
|
|
7
|
+
"bgActive": "#3e4451",
|
|
8
|
+
"bgHover": "#3e4451",
|
|
9
|
+
"fg": "#bbc2cf",
|
|
10
|
+
"fgAlt": "#9ca0a4",
|
|
11
|
+
"grey": "#3f444a",
|
|
12
|
+
"greyAlt": "#5b6268",
|
|
13
|
+
"blue": "#51afef",
|
|
14
|
+
"darkBlue": "#2257a0",
|
|
15
|
+
"cyan": "#46d9ff",
|
|
16
|
+
"green": "#98be65",
|
|
17
|
+
"lightGreen": "#a8cc8a",
|
|
18
|
+
"teal": "#4db5bd",
|
|
19
|
+
"orange": "#da8548",
|
|
20
|
+
"red": "#ff6c6b",
|
|
21
|
+
"violet": "#a9a1e1",
|
|
22
|
+
"magenta": "#c678dd",
|
|
23
|
+
"yellow": "#ecbe7b",
|
|
24
|
+
"lightYellow": "#f0c674",
|
|
25
|
+
"comment": "#5b6268",
|
|
26
|
+
"diffAddedBg": "#1b2315",
|
|
27
|
+
"diffRemovedBg": "#2b1c20"
|
|
26
28
|
},
|
|
27
29
|
"colors": {
|
|
28
30
|
"accent": "blue",
|
|
@@ -39,12 +41,12 @@
|
|
|
39
41
|
"selectedBg": "bgHover",
|
|
40
42
|
"userMessageBg": "bgActive",
|
|
41
43
|
"userMessageText": "fg",
|
|
42
|
-
"customMessageBg": "#
|
|
44
|
+
"customMessageBg": "#2d253f",
|
|
43
45
|
"customMessageText": "fg",
|
|
44
46
|
"customMessageLabel": "violet",
|
|
45
47
|
"toolPendingBg": "bgAlt",
|
|
46
|
-
"toolSuccessBg": "
|
|
47
|
-
"toolErrorBg": "
|
|
48
|
+
"toolSuccessBg": "diffAddedBg",
|
|
49
|
+
"toolErrorBg": "diffRemovedBg",
|
|
48
50
|
"toolTitle": "blue",
|
|
49
51
|
"toolOutput": "fg",
|
|
50
52
|
"mdHeading": "magenta",
|
|
@@ -61,13 +63,13 @@
|
|
|
61
63
|
"toolDiffRemoved": "red",
|
|
62
64
|
"toolDiffContext": "fgAlt",
|
|
63
65
|
"syntaxComment": "comment",
|
|
64
|
-
"syntaxKeyword": "
|
|
65
|
-
"syntaxFunction": "
|
|
66
|
-
"syntaxVariable": "
|
|
67
|
-
"syntaxString": "
|
|
66
|
+
"syntaxKeyword": "blue",
|
|
67
|
+
"syntaxFunction": "magenta",
|
|
68
|
+
"syntaxVariable": "violet",
|
|
69
|
+
"syntaxString": "green",
|
|
68
70
|
"syntaxNumber": "orange",
|
|
69
71
|
"syntaxType": "yellow",
|
|
70
|
-
"syntaxOperator": "
|
|
72
|
+
"syntaxOperator": "orange",
|
|
71
73
|
"syntaxPunctuation": "fgAlt",
|
|
72
74
|
"thinkingOff": "grey",
|
|
73
75
|
"thinkingMinimal": "fgAlt",
|
|
@@ -81,6 +83,6 @@
|
|
|
81
83
|
"export": {
|
|
82
84
|
"pageBg": "bg",
|
|
83
85
|
"cardBg": "bgAlt",
|
|
84
|
-
"infoBg": "#
|
|
86
|
+
"infoBg": "#343225"
|
|
85
87
|
}
|
|
86
88
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,r=Object.prototype.hasOwnProperty,i=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r},a=(i,a,o,s)=>{if(a&&typeof a==`object`||typeof a==`function`)for(var c=n(a),l=0,u=c.length,d;l<u;l++)d=c[l],!r.call(i,d)&&d!==o&&e(i,d,{get:(e=>a[e]).bind(null,d),enumerable:!(s=t(a,d))||s.enumerable});return i},o=(e,t,n)=>(a(e,t,`default`),n&&a(n,t,`default`));export{i as __exportAll,o as __reExport};
|