@agimon-ai/doompi-ui 0.0.1-alpha.87 → 0.0.1-alpha.89
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/extensions/mcp-ui.mjs +46 -0
- package/dist/extensions/mcp-ui.mjs.map +1 -0
- package/dist/extensions/mcp.cjs +10 -3
- package/dist/extensions/mcp.cjs.map +1 -1
- package/dist/extensions/mcp.d.mts.map +1 -1
- package/dist/extensions/mcp.mjs +10 -3
- package/dist/extensions/mcp.mjs.map +1 -1
- package/dist/extensions/pi.cjs +6 -0
- package/dist/extensions/pi.cjs.map +1 -1
- package/dist/extensions/pi.mjs +6 -0
- package/dist/extensions/pi.mjs.map +1 -1
- package/package.json +22 -12
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { defineMcpWidget } from "@agimon-ai/doompi-core/web";
|
|
2
|
+
import { McpToolFields, McpToolFrame, McpToolOutput } from "@agimon-ai/doompi-web-components";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
//#region src/extensions/workspaces/sessions/(frontend)/tool/find.mcp.tsx
|
|
5
|
+
function FindMcpWidget(props) {
|
|
6
|
+
return /* @__PURE__ */ jsxs(McpToolFrame, {
|
|
7
|
+
...props,
|
|
8
|
+
title: "Find files",
|
|
9
|
+
children: [/* @__PURE__ */ jsx(McpToolFields, { fields: [
|
|
10
|
+
["Pattern", props.args.pattern],
|
|
11
|
+
["Path", props.args.path],
|
|
12
|
+
["Limit", props.args.limit]
|
|
13
|
+
] }), /* @__PURE__ */ jsx(McpToolOutput, { result: props.result })]
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
var find_mcp_default = defineMcpWidget(FindMcpWidget);
|
|
17
|
+
//#endregion
|
|
18
|
+
//#region src/extensions/workspaces/sessions/(frontend)/tool/ls.mcp.tsx
|
|
19
|
+
function LsMcpWidget(props) {
|
|
20
|
+
return /* @__PURE__ */ jsxs(McpToolFrame, {
|
|
21
|
+
...props,
|
|
22
|
+
title: "List directory",
|
|
23
|
+
children: [/* @__PURE__ */ jsx(McpToolFields, { fields: [["Path", props.args.path], ["Limit", props.args.limit]] }), /* @__PURE__ */ jsx(McpToolOutput, { result: props.result })]
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
var ls_mcp_default = defineMcpWidget(LsMcpWidget);
|
|
27
|
+
//#endregion
|
|
28
|
+
//#region src/extensions/workspaces/sessions/(frontend)/tool/write.mcp.tsx
|
|
29
|
+
function WriteMcpWidget(props) {
|
|
30
|
+
return /* @__PURE__ */ jsxs(McpToolFrame, {
|
|
31
|
+
...props,
|
|
32
|
+
title: "Write file",
|
|
33
|
+
children: [/* @__PURE__ */ jsx(McpToolFields, { fields: [["Path", props.args.path], ["Characters", typeof props.args.content === "string" ? props.args.content.length : void 0]] }), /* @__PURE__ */ jsx(McpToolOutput, { result: props.result })]
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
//#region generated/mcp-ui.ts
|
|
38
|
+
const widgets = {
|
|
39
|
+
"@agimon-ai/doompi-ui/find": find_mcp_default,
|
|
40
|
+
"@agimon-ai/doompi-ui/ls": ls_mcp_default,
|
|
41
|
+
"@agimon-ai/doompi-ui/write": defineMcpWidget(WriteMcpWidget)
|
|
42
|
+
};
|
|
43
|
+
//#endregion
|
|
44
|
+
export { widgets };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=mcp-ui.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-ui.mjs","names":["Widget0","Widget1","Widget2"],"sources":["../../src/extensions/workspaces/sessions/(frontend)/tool/find.mcp.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/ls.mcp.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/write.mcp.tsx","../../generated/mcp-ui.ts"],"sourcesContent":["import { defineMcpWidget, type DoomMcpWidgetProps } from '@agimon-ai/doompi-core/web';\nimport { McpToolFrame, McpToolFields, McpToolOutput } from '@agimon-ai/doompi-web-components';\n\nfunction FindMcpWidget(props: DoomMcpWidgetProps) {\n return (\n <McpToolFrame {...props} title=\"Find files\">\n <McpToolFields\n fields={[\n ['Pattern', props.args.pattern],\n ['Path', props.args.path],\n ['Limit', props.args.limit],\n ]}\n />\n <McpToolOutput result={props.result} />\n </McpToolFrame>\n );\n}\n\nexport default defineMcpWidget(FindMcpWidget);\n","import { defineMcpWidget, type DoomMcpWidgetProps } from '@agimon-ai/doompi-core/web';\nimport { McpToolFrame, McpToolFields, McpToolOutput } from '@agimon-ai/doompi-web-components';\n\nfunction LsMcpWidget(props: DoomMcpWidgetProps) {\n return (\n <McpToolFrame {...props} title=\"List directory\">\n <McpToolFields\n fields={[\n ['Path', props.args.path],\n ['Limit', props.args.limit],\n ]}\n />\n <McpToolOutput result={props.result} />\n </McpToolFrame>\n );\n}\n\nexport default defineMcpWidget(LsMcpWidget);\n","import { defineMcpWidget, type DoomMcpWidgetProps } from '@agimon-ai/doompi-core/web';\nimport { McpToolFrame, McpToolFields, McpToolOutput } from '@agimon-ai/doompi-web-components';\n\nfunction WriteMcpWidget(props: DoomMcpWidgetProps) {\n return (\n <McpToolFrame {...props} title=\"Write file\">\n <McpToolFields\n fields={[\n ['Path', props.args.path],\n ['Characters', typeof props.args.content === 'string' ? props.args.content.length : undefined],\n ]}\n />\n <McpToolOutput result={props.result} />\n </McpToolFrame>\n );\n}\n\nexport default defineMcpWidget(WriteMcpWidget);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport type { ComponentType } from 'react';\nimport type { DoomMcpWidgetProps } from '@agimon-ai/doompi-core/mcpWidget';\nimport Widget0 from \"../src/extensions/workspaces/sessions/(frontend)/tool/find.mcp\";\nimport Widget1 from \"../src/extensions/workspaces/sessions/(frontend)/tool/ls.mcp\";\nimport Widget2 from \"../src/extensions/workspaces/sessions/(frontend)/tool/write.mcp\";\n\nexport const widgets: Readonly<Record<string, ComponentType<DoomMcpWidgetProps>>> = {\n \"@agimon-ai/doompi-ui/find\": Widget0,\n \"@agimon-ai/doompi-ui/ls\": Widget1,\n \"@agimon-ai/doompi-ui/write\": Widget2,\n};\n"],"mappings":";;;;AAGA,SAAS,cAAc,OAA2B;CAChD,OACE,qBAAC,cAAD;EAAc,GAAI;EAAO,OAAM;EAA/B,UAAA,CACE,oBAAC,eAAD,EACE,QAAQ;GACN,CAAC,WAAW,MAAM,KAAK,OAAO;GAC9B,CAAC,QAAQ,MAAM,KAAK,IAAI;GACxB,CAAC,SAAS,MAAM,KAAK,KAAK;EAC5B,EACD,CAAA,GACD,oBAAC,eAAD,EAAe,QAAQ,MAAM,OAAS,CAAA,CAC1B;;AAElB;AAEA,IAAA,mBAAe,gBAAgB,aAAa;;;ACf5C,SAAS,YAAY,OAA2B;CAC9C,OACE,qBAAC,cAAD;EAAc,GAAI;EAAO,OAAM;EAA/B,UAAA,CACE,oBAAC,eAAD,EACE,QAAQ,CACN,CAAC,QAAQ,MAAM,KAAK,IAAI,GACxB,CAAC,SAAS,MAAM,KAAK,KAAK,CAC5B,EACD,CAAA,GACD,oBAAC,eAAD,EAAe,QAAQ,MAAM,OAAS,CAAA,CAC1B;;AAElB;AAEA,IAAA,iBAAe,gBAAgB,WAAW;;;ACd1C,SAAS,eAAe,OAA2B;CACjD,OACE,qBAAC,cAAD;EAAc,GAAI;EAAO,OAAM;EAA/B,UAAA,CACE,oBAAC,eAAD,EACE,QAAQ,CACN,CAAC,QAAQ,MAAM,KAAK,IAAI,GACxB,CAAC,cAAc,OAAO,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,QAAQ,SAAS,KAAA,CAAS,CAC/F,EACD,CAAA,GACD,oBAAC,eAAD,EAAe,QAAQ,MAAM,OAAS,CAAA,CAC1B;;AAElB;;;ACRA,MAAa,UAAuE;CAClF,6BAA6BA;CAC7B,2BAA2BC;CAC3B,8BDOa,gBAAgB,cCPCC;AAChC"}
|
package/dist/extensions/mcp.cjs
CHANGED
|
@@ -51,13 +51,20 @@ const via = (identity, value) => value === void 0 ? void 0 : {
|
|
|
51
51
|
...identity,
|
|
52
52
|
...value
|
|
53
53
|
};
|
|
54
|
+
const withWidget = (key, value) => value === void 0 ? value : {
|
|
55
|
+
...value,
|
|
56
|
+
_meta: {
|
|
57
|
+
...value._meta,
|
|
58
|
+
["doompi/widget"]: key
|
|
59
|
+
}
|
|
60
|
+
};
|
|
54
61
|
const mcp = (0, _agimon_ai_doompi_core_mcpFacet.defineMcpPlugin)({
|
|
55
62
|
name: "@agimon-ai/doompi-ui",
|
|
56
63
|
session: (context) => ({ get tools() {
|
|
57
64
|
return [
|
|
58
|
-
via({ name: "find" }, at(find_mcp_default, context)),
|
|
59
|
-
via({ name: "ls" }, at(ls_mcp_default, context)),
|
|
60
|
-
via({ name: "write" }, at(write_mcp_default, context))
|
|
65
|
+
withWidget("@agimon-ai/doompi-ui/find", via({ name: "find" }, at(find_mcp_default, context))),
|
|
66
|
+
withWidget("@agimon-ai/doompi-ui/ls", via({ name: "ls" }, at(ls_mcp_default, context))),
|
|
67
|
+
withWidget("@agimon-ai/doompi-ui/write", via({ name: "write" }, at(write_mcp_default, context)))
|
|
61
68
|
];
|
|
62
69
|
} })
|
|
63
70
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.cjs","names":["createWriteTool","createFindTool","createLsTool","defineMcpTool","defineMcpTool","defineMcpTool","defineMcpPlugin","toolFind","toolLs","toolWrite"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/mcpFileTools.ts","../../src/extensions/workspaces/sessions/(backend)/tool/find.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/ls.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/write.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport type { DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\nimport { createFindTool, createLsTool, createWriteTool } from '@earendil-works/pi-coding-agent';\n\nexport function createMcpWriteTool(\n context: DoomMcpPluginContext,\n): DoomHeadlessTool<ReturnType<typeof createWriteTool>['parameters']> {\n const tool = createWriteTool(context.execution.cwd);\n return {\n ...tool,\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n execute(toolCallId, parameters, signal, onUpdate) {\n return tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate,\n );\n },\n };\n}\n\nexport function createMcpFindTool(\n context: DoomMcpPluginContext,\n): DoomHeadlessTool<ReturnType<typeof createFindTool>['parameters']> {\n const tool = createFindTool(context.execution.cwd);\n return {\n ...tool,\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n execute(toolCallId, parameters, signal, onUpdate) {\n return tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate,\n );\n },\n };\n}\n\nexport function createMcpLsTool(\n context: DoomMcpPluginContext,\n): DoomHeadlessTool<ReturnType<typeof createLsTool>['parameters']> {\n const tool = createLsTool(context.execution.cwd);\n return {\n ...tool,\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n execute(toolCallId, parameters, signal, onUpdate) {\n return tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate,\n );\n },\n };\n}\n","import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport { createMcpFindTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<DoomHeadlessTool['parameters'], DoomMcpPluginContext>(createMcpFindTool);\n","import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport { createMcpLsTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<DoomHeadlessTool['parameters'], DoomMcpPluginContext>(createMcpLsTool);\n","import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport { createMcpWriteTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<DoomHeadlessTool['parameters'], DoomMcpPluginContext>(createMcpWriteTool);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineMcpPlugin, type DoomMcpSessionPlugin } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport toolFind from '../src/extensions/workspaces/sessions/(backend)/tool/find.mcp';\nimport toolLs from '../src/extensions/workspaces/sessions/(backend)/tool/ls.mcp';\nimport toolWrite from '../src/extensions/workspaces/sessions/(backend)/tool/write.mcp';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const mcp = defineMcpPlugin({\n name: '@agimon-ai/doompi-ui',\n session: (context) => ({\n get tools(): DoomMcpSessionPlugin['tools'] { return [via({ name: 'find' }, at(toolFind, context)), via({ name: 'ls' }, at(toolLs, context)), via({ name: 'write' }, at(toolWrite, context))]; },\n }) satisfies DoomMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":";;;;;;;AAIA,SAAgB,mBACd,SACoE;CACpE,MAAM,QAAA,GAAOA,gCAAAA,gBAAAA,CAAgB,QAAQ,UAAU,GAAG;CAClD,OAAO;EACL,GAAG;EACH,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,QAAQ,YAAY,YAAY,QAAQ,UAAU;GAChD,OAAO,KAAK,QACV,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,QACF;EACF;CACF;AACF;AAEA,SAAgB,kBACd,SACmE;CACnE,MAAM,QAAA,GAAOC,gCAAAA,eAAAA,CAAe,QAAQ,UAAU,GAAG;CACjD,OAAO;EACL,GAAG;EACH,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,QAAQ,YAAY,YAAY,QAAQ,UAAU;GAChD,OAAO,KAAK,QACV,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,QACF;EACF;CACF;AACF;AAEA,SAAgB,gBACd,SACiE;CACjE,MAAM,QAAA,GAAOC,gCAAAA,aAAAA,CAAa,QAAQ,UAAU,GAAG;CAC/C,OAAO;EACL,GAAG;EACH,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,QAAQ,YAAY,YAAY,QAAQ,UAAU;GAChD,OAAO,KAAK,QACV,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,QACF;EACF;CACF;AACF;;;ACnDA,IAAA,oBAAA,GAAeC,gCAAAA,cAAAA,CAAoE,iBAAiB;;;ACApG,IAAA,kBAAA,GAAeC,gCAAAA,cAAAA,CAAoE,eAAe;;;ACAlG,IAAA,qBAAA,GAAeC,gCAAAA,cAAAA,CAAoE,kBAAkB;;;ACGrG,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AACpE,MAAM,OAAU,UAAmC,UAChD,UAAU,KAAA,IAAY,KAAA,IAAY;CAAE,GAAG;CAAU,GAAI;AAAiB;AAEzE,MAAa,OAAA,GAAMC,gCAAAA,gBAAAA,CAAgB;CACjC,MAAM;CACN,UAAU,aAAa,EACrB,IAAI,QAAuC;EAAE,OAAO;GAAC,IAAI,EAAE,MAAM,OAAO,GAAG,GAAGC,kBAAU,OAAO,CAAC;GAAG,IAAI,EAAE,MAAM,KAAK,GAAG,GAAGC,gBAAQ,OAAO,CAAC;GAAG,IAAI,EAAE,MAAM,QAAQ,GAAG,GAAGC,mBAAW,OAAO,CAAC;EAAC;CAAG,
|
|
1
|
+
{"version":3,"file":"mcp.cjs","names":["createWriteTool","createFindTool","createLsTool","defineMcpTool","defineMcpTool","defineMcpTool","defineMcpPlugin","toolFind","toolLs","toolWrite"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/mcpFileTools.ts","../../src/extensions/workspaces/sessions/(backend)/tool/find.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/ls.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/write.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport type { DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\nimport { createFindTool, createLsTool, createWriteTool } from '@earendil-works/pi-coding-agent';\n\nexport function createMcpWriteTool(\n context: DoomMcpPluginContext,\n): DoomHeadlessTool<ReturnType<typeof createWriteTool>['parameters']> {\n const tool = createWriteTool(context.execution.cwd);\n return {\n ...tool,\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n execute(toolCallId, parameters, signal, onUpdate) {\n return tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate,\n );\n },\n };\n}\n\nexport function createMcpFindTool(\n context: DoomMcpPluginContext,\n): DoomHeadlessTool<ReturnType<typeof createFindTool>['parameters']> {\n const tool = createFindTool(context.execution.cwd);\n return {\n ...tool,\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n execute(toolCallId, parameters, signal, onUpdate) {\n return tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate,\n );\n },\n };\n}\n\nexport function createMcpLsTool(\n context: DoomMcpPluginContext,\n): DoomHeadlessTool<ReturnType<typeof createLsTool>['parameters']> {\n const tool = createLsTool(context.execution.cwd);\n return {\n ...tool,\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n execute(toolCallId, parameters, signal, onUpdate) {\n return tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate,\n );\n },\n };\n}\n","import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport { createMcpFindTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<DoomHeadlessTool['parameters'], DoomMcpPluginContext>(createMcpFindTool);\n","import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport { createMcpLsTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<DoomHeadlessTool['parameters'], DoomMcpPluginContext>(createMcpLsTool);\n","import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport { createMcpWriteTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<DoomHeadlessTool['parameters'], DoomMcpPluginContext>(createMcpWriteTool);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineMcpPlugin, type DoomMcpSessionPlugin } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport toolFind from '../src/extensions/workspaces/sessions/(backend)/tool/find.mcp';\nimport toolLs from '../src/extensions/workspaces/sessions/(backend)/tool/ls.mcp';\nimport toolWrite from '../src/extensions/workspaces/sessions/(backend)/tool/write.mcp';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nconst withWidget = <T>(key: string, value: T): T => value === undefined ? value : ({\n ...value, _meta: { ...(value as { _meta?: object })._meta, [\"doompi/widget\"]: key },\n});\n\nexport const mcp = defineMcpPlugin({\n name: '@agimon-ai/doompi-ui',\n session: (context) => ({\n get tools(): DoomMcpSessionPlugin['tools'] { return [withWidget(\"@agimon-ai/doompi-ui/find\", via({ name: 'find' }, at(toolFind, context))), withWidget(\"@agimon-ai/doompi-ui/ls\", via({ name: 'ls' }, at(toolLs, context))), withWidget(\"@agimon-ai/doompi-ui/write\", via({ name: 'write' }, at(toolWrite, context)))]; },\n }) satisfies DoomMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":";;;;;;;AAIA,SAAgB,mBACd,SACoE;CACpE,MAAM,QAAA,GAAOA,gCAAAA,gBAAAA,CAAgB,QAAQ,UAAU,GAAG;CAClD,OAAO;EACL,GAAG;EACH,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,QAAQ,YAAY,YAAY,QAAQ,UAAU;GAChD,OAAO,KAAK,QACV,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,QACF;EACF;CACF;AACF;AAEA,SAAgB,kBACd,SACmE;CACnE,MAAM,QAAA,GAAOC,gCAAAA,eAAAA,CAAe,QAAQ,UAAU,GAAG;CACjD,OAAO;EACL,GAAG;EACH,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,QAAQ,YAAY,YAAY,QAAQ,UAAU;GAChD,OAAO,KAAK,QACV,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,QACF;EACF;CACF;AACF;AAEA,SAAgB,gBACd,SACiE;CACjE,MAAM,QAAA,GAAOC,gCAAAA,aAAAA,CAAa,QAAQ,UAAU,GAAG;CAC/C,OAAO;EACL,GAAG;EACH,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,QAAQ,YAAY,YAAY,QAAQ,UAAU;GAChD,OAAO,KAAK,QACV,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,QACF;EACF;CACF;AACF;;;ACnDA,IAAA,oBAAA,GAAeC,gCAAAA,cAAAA,CAAoE,iBAAiB;;;ACApG,IAAA,kBAAA,GAAeC,gCAAAA,cAAAA,CAAoE,eAAe;;;ACAlG,IAAA,qBAAA,GAAeC,gCAAAA,cAAAA,CAAoE,kBAAkB;;;ACGrG,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AACpE,MAAM,OAAU,UAAmC,UAChD,UAAU,KAAA,IAAY,KAAA,IAAY;CAAE,GAAG;CAAU,GAAI;AAAiB;AAEzE,MAAM,cAAiB,KAAa,UAAgB,UAAU,KAAA,IAAY,QAAS;CACjF,GAAG;CAAO,OAAO;EAAE,GAAI,MAA6B;GAAQ,kBAAkB;CAAI;AACpF;AAEA,MAAa,OAAA,GAAMC,gCAAAA,gBAAAA,CAAgB;CACjC,MAAM;CACN,UAAU,aAAa,EACrB,IAAI,QAAuC;EAAE,OAAO;GAAC,WAAW,6BAA6B,IAAI,EAAE,MAAM,OAAO,GAAG,GAAGC,kBAAU,OAAO,CAAC,CAAC;GAAG,WAAW,2BAA2B,IAAI,EAAE,MAAM,KAAK,GAAG,GAAGC,gBAAQ,OAAO,CAAC,CAAC;GAAG,WAAW,8BAA8B,IAAI,EAAE,MAAM,QAAQ,GAAG,GAAGC,mBAAW,OAAO,CAAC,CAAC;EAAC;CAAG,EAC1T;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.mts","names":[],"sources":["../../generated/mcp.ts"],"mappings":";
|
|
1
|
+
{"version":3,"file":"mcp.d.mts","names":[],"sources":["../../generated/mcp.ts"],"mappings":";qBAiBa,+CAAG"}
|
package/dist/extensions/mcp.mjs
CHANGED
|
@@ -47,13 +47,20 @@ const via = (identity, value) => value === void 0 ? void 0 : {
|
|
|
47
47
|
...identity,
|
|
48
48
|
...value
|
|
49
49
|
};
|
|
50
|
+
const withWidget = (key, value) => value === void 0 ? value : {
|
|
51
|
+
...value,
|
|
52
|
+
_meta: {
|
|
53
|
+
...value._meta,
|
|
54
|
+
["doompi/widget"]: key
|
|
55
|
+
}
|
|
56
|
+
};
|
|
50
57
|
const mcp = defineMcpPlugin({
|
|
51
58
|
name: "@agimon-ai/doompi-ui",
|
|
52
59
|
session: (context) => ({ get tools() {
|
|
53
60
|
return [
|
|
54
|
-
via({ name: "find" }, at(find_mcp_default, context)),
|
|
55
|
-
via({ name: "ls" }, at(ls_mcp_default, context)),
|
|
56
|
-
via({ name: "write" }, at(write_mcp_default, context))
|
|
61
|
+
withWidget("@agimon-ai/doompi-ui/find", via({ name: "find" }, at(find_mcp_default, context))),
|
|
62
|
+
withWidget("@agimon-ai/doompi-ui/ls", via({ name: "ls" }, at(ls_mcp_default, context))),
|
|
63
|
+
withWidget("@agimon-ai/doompi-ui/write", via({ name: "write" }, at(write_mcp_default, context)))
|
|
57
64
|
];
|
|
58
65
|
} })
|
|
59
66
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.mjs","names":["toolFind","toolLs","toolWrite"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/mcpFileTools.ts","../../src/extensions/workspaces/sessions/(backend)/tool/find.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/ls.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/write.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport type { DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\nimport { createFindTool, createLsTool, createWriteTool } from '@earendil-works/pi-coding-agent';\n\nexport function createMcpWriteTool(\n context: DoomMcpPluginContext,\n): DoomHeadlessTool<ReturnType<typeof createWriteTool>['parameters']> {\n const tool = createWriteTool(context.execution.cwd);\n return {\n ...tool,\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n execute(toolCallId, parameters, signal, onUpdate) {\n return tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate,\n );\n },\n };\n}\n\nexport function createMcpFindTool(\n context: DoomMcpPluginContext,\n): DoomHeadlessTool<ReturnType<typeof createFindTool>['parameters']> {\n const tool = createFindTool(context.execution.cwd);\n return {\n ...tool,\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n execute(toolCallId, parameters, signal, onUpdate) {\n return tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate,\n );\n },\n };\n}\n\nexport function createMcpLsTool(\n context: DoomMcpPluginContext,\n): DoomHeadlessTool<ReturnType<typeof createLsTool>['parameters']> {\n const tool = createLsTool(context.execution.cwd);\n return {\n ...tool,\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n execute(toolCallId, parameters, signal, onUpdate) {\n return tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate,\n );\n },\n };\n}\n","import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport { createMcpFindTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<DoomHeadlessTool['parameters'], DoomMcpPluginContext>(createMcpFindTool);\n","import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport { createMcpLsTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<DoomHeadlessTool['parameters'], DoomMcpPluginContext>(createMcpLsTool);\n","import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport { createMcpWriteTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<DoomHeadlessTool['parameters'], DoomMcpPluginContext>(createMcpWriteTool);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineMcpPlugin, type DoomMcpSessionPlugin } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport toolFind from '../src/extensions/workspaces/sessions/(backend)/tool/find.mcp';\nimport toolLs from '../src/extensions/workspaces/sessions/(backend)/tool/ls.mcp';\nimport toolWrite from '../src/extensions/workspaces/sessions/(backend)/tool/write.mcp';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const mcp = defineMcpPlugin({\n name: '@agimon-ai/doompi-ui',\n session: (context) => ({\n get tools(): DoomMcpSessionPlugin['tools'] { return [via({ name: 'find' }, at(toolFind, context)), via({ name: 'ls' }, at(toolLs, context)), via({ name: 'write' }, at(toolWrite, context))]; },\n }) satisfies DoomMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":";;;AAIA,SAAgB,mBACd,SACoE;CACpE,MAAM,OAAO,gBAAgB,QAAQ,UAAU,GAAG;CAClD,OAAO;EACL,GAAG;EACH,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,QAAQ,YAAY,YAAY,QAAQ,UAAU;GAChD,OAAO,KAAK,QACV,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,QACF;EACF;CACF;AACF;AAEA,SAAgB,kBACd,SACmE;CACnE,MAAM,OAAO,eAAe,QAAQ,UAAU,GAAG;CACjD,OAAO;EACL,GAAG;EACH,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,QAAQ,YAAY,YAAY,QAAQ,UAAU;GAChD,OAAO,KAAK,QACV,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,QACF;EACF;CACF;AACF;AAEA,SAAgB,gBACd,SACiE;CACjE,MAAM,OAAO,aAAa,QAAQ,UAAU,GAAG;CAC/C,OAAO;EACL,GAAG;EACH,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,QAAQ,YAAY,YAAY,QAAQ,UAAU;GAChD,OAAO,KAAK,QACV,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,QACF;EACF;CACF;AACF;;;ACnDA,IAAA,mBAAe,cAAoE,iBAAiB;;;ACApG,IAAA,iBAAe,cAAoE,eAAe;;;ACAlG,IAAA,oBAAe,cAAoE,kBAAkB;;;ACGrG,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AACpE,MAAM,OAAU,UAAmC,UAChD,UAAU,KAAA,IAAY,KAAA,IAAY;CAAE,GAAG;CAAU,GAAI;AAAiB;AAEzE,MAAa,MAAM,gBAAgB;CACjC,MAAM;CACN,UAAU,aAAa,EACrB,IAAI,QAAuC;EAAE,OAAO;GAAC,IAAI,EAAE,MAAM,OAAO,GAAG,GAAGA,kBAAU,OAAO,CAAC;GAAG,IAAI,EAAE,MAAM,KAAK,GAAG,GAAGC,gBAAQ,OAAO,CAAC;GAAG,IAAI,EAAE,MAAM,QAAQ,GAAG,GAAGC,mBAAW,OAAO,CAAC;EAAC;CAAG,
|
|
1
|
+
{"version":3,"file":"mcp.mjs","names":["toolFind","toolLs","toolWrite"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/mcpFileTools.ts","../../src/extensions/workspaces/sessions/(backend)/tool/find.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/ls.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/write.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport type { DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\nimport { createFindTool, createLsTool, createWriteTool } from '@earendil-works/pi-coding-agent';\n\nexport function createMcpWriteTool(\n context: DoomMcpPluginContext,\n): DoomHeadlessTool<ReturnType<typeof createWriteTool>['parameters']> {\n const tool = createWriteTool(context.execution.cwd);\n return {\n ...tool,\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n execute(toolCallId, parameters, signal, onUpdate) {\n return tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate,\n );\n },\n };\n}\n\nexport function createMcpFindTool(\n context: DoomMcpPluginContext,\n): DoomHeadlessTool<ReturnType<typeof createFindTool>['parameters']> {\n const tool = createFindTool(context.execution.cwd);\n return {\n ...tool,\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n execute(toolCallId, parameters, signal, onUpdate) {\n return tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate,\n );\n },\n };\n}\n\nexport function createMcpLsTool(\n context: DoomMcpPluginContext,\n): DoomHeadlessTool<ReturnType<typeof createLsTool>['parameters']> {\n const tool = createLsTool(context.execution.cwd);\n return {\n ...tool,\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n execute(toolCallId, parameters, signal, onUpdate) {\n return tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate,\n );\n },\n };\n}\n","import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport { createMcpFindTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<DoomHeadlessTool['parameters'], DoomMcpPluginContext>(createMcpFindTool);\n","import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport { createMcpLsTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<DoomHeadlessTool['parameters'], DoomMcpPluginContext>(createMcpLsTool);\n","import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport { createMcpWriteTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<DoomHeadlessTool['parameters'], DoomMcpPluginContext>(createMcpWriteTool);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineMcpPlugin, type DoomMcpSessionPlugin } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport toolFind from '../src/extensions/workspaces/sessions/(backend)/tool/find.mcp';\nimport toolLs from '../src/extensions/workspaces/sessions/(backend)/tool/ls.mcp';\nimport toolWrite from '../src/extensions/workspaces/sessions/(backend)/tool/write.mcp';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nconst withWidget = <T>(key: string, value: T): T => value === undefined ? value : ({\n ...value, _meta: { ...(value as { _meta?: object })._meta, [\"doompi/widget\"]: key },\n});\n\nexport const mcp = defineMcpPlugin({\n name: '@agimon-ai/doompi-ui',\n session: (context) => ({\n get tools(): DoomMcpSessionPlugin['tools'] { return [withWidget(\"@agimon-ai/doompi-ui/find\", via({ name: 'find' }, at(toolFind, context))), withWidget(\"@agimon-ai/doompi-ui/ls\", via({ name: 'ls' }, at(toolLs, context))), withWidget(\"@agimon-ai/doompi-ui/write\", via({ name: 'write' }, at(toolWrite, context)))]; },\n }) satisfies DoomMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":";;;AAIA,SAAgB,mBACd,SACoE;CACpE,MAAM,OAAO,gBAAgB,QAAQ,UAAU,GAAG;CAClD,OAAO;EACL,GAAG;EACH,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,QAAQ,YAAY,YAAY,QAAQ,UAAU;GAChD,OAAO,KAAK,QACV,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,QACF;EACF;CACF;AACF;AAEA,SAAgB,kBACd,SACmE;CACnE,MAAM,OAAO,eAAe,QAAQ,UAAU,GAAG;CACjD,OAAO;EACL,GAAG;EACH,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,QAAQ,YAAY,YAAY,QAAQ,UAAU;GAChD,OAAO,KAAK,QACV,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,QACF;EACF;CACF;AACF;AAEA,SAAgB,gBACd,SACiE;CACjE,MAAM,OAAO,aAAa,QAAQ,UAAU,GAAG;CAC/C,OAAO;EACL,GAAG;EACH,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,QAAQ,YAAY,YAAY,QAAQ,UAAU;GAChD,OAAO,KAAK,QACV,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,QACF;EACF;CACF;AACF;;;ACnDA,IAAA,mBAAe,cAAoE,iBAAiB;;;ACApG,IAAA,iBAAe,cAAoE,eAAe;;;ACAlG,IAAA,oBAAe,cAAoE,kBAAkB;;;ACGrG,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AACpE,MAAM,OAAU,UAAmC,UAChD,UAAU,KAAA,IAAY,KAAA,IAAY;CAAE,GAAG;CAAU,GAAI;AAAiB;AAEzE,MAAM,cAAiB,KAAa,UAAgB,UAAU,KAAA,IAAY,QAAS;CACjF,GAAG;CAAO,OAAO;EAAE,GAAI,MAA6B;GAAQ,kBAAkB;CAAI;AACpF;AAEA,MAAa,MAAM,gBAAgB;CACjC,MAAM;CACN,UAAU,aAAa,EACrB,IAAI,QAAuC;EAAE,OAAO;GAAC,WAAW,6BAA6B,IAAI,EAAE,MAAM,OAAO,GAAG,GAAGA,kBAAU,OAAO,CAAC,CAAC;GAAG,WAAW,2BAA2B,IAAI,EAAE,MAAM,KAAK,GAAG,GAAGC,gBAAQ,OAAO,CAAC,CAAC;GAAG,WAAW,8BAA8B,IAAI,EAAE,MAAM,QAAQ,GAAG,GAAGC,mBAAW,OAAO,CAAC,CAAC;EAAC;CAAG,EAC1T;AACF,CAAC"}
|
package/dist/extensions/pi.cjs
CHANGED
|
@@ -150,6 +150,7 @@ function createBuiltinTools(cwd) {
|
|
|
150
150
|
const read = (0, _earendil_works_pi_coding_agent.createReadToolDefinition)(cwd);
|
|
151
151
|
tools.push((0, _agimon_ai_doompi_core_piExtension.definePiTool)({
|
|
152
152
|
...read,
|
|
153
|
+
execute: (...args) => (0, _earendil_works_pi_coding_agent.createReadToolDefinition)(args[4].cwd).execute(...args),
|
|
153
154
|
renderShell: "self",
|
|
154
155
|
renderCall: (args, theme) => renderReadCall(args, theme),
|
|
155
156
|
renderResult: (result, options, theme, context) => {
|
|
@@ -162,6 +163,7 @@ function createBuiltinTools(cwd) {
|
|
|
162
163
|
const edit = (0, _earendil_works_pi_coding_agent.createEditToolDefinition)(cwd);
|
|
163
164
|
tools.push((0, _agimon_ai_doompi_core_piExtension.definePiTool)({
|
|
164
165
|
...edit,
|
|
166
|
+
execute: (...args) => (0, _earendil_works_pi_coding_agent.createEditToolDefinition)(args[4].cwd).execute(...args),
|
|
165
167
|
renderShell: "self",
|
|
166
168
|
renderCall: (args, theme) => renderEditCall(args, theme),
|
|
167
169
|
renderResult: (result, options, theme, context) => {
|
|
@@ -175,6 +177,7 @@ function createBuiltinTools(cwd) {
|
|
|
175
177
|
const writeResult = write.renderResult;
|
|
176
178
|
tools.push((0, _agimon_ai_doompi_core_piExtension.definePiTool)({
|
|
177
179
|
...write,
|
|
180
|
+
execute: (...args) => (0, _earendil_works_pi_coding_agent.createWriteToolDefinition)(args[4].cwd).execute(...args),
|
|
178
181
|
renderShell: "self",
|
|
179
182
|
renderCall: (args, theme, context) => renderWriteCall(args, theme, {
|
|
180
183
|
expanded: context.expanded,
|
|
@@ -191,6 +194,7 @@ function createBuiltinTools(cwd) {
|
|
|
191
194
|
const grepResult = grep.renderResult;
|
|
192
195
|
tools.push((0, _agimon_ai_doompi_core_piExtension.definePiTool)({
|
|
193
196
|
...grep,
|
|
197
|
+
execute: (...args) => (0, _earendil_works_pi_coding_agent.createGrepToolDefinition)(args[4].cwd).execute(...args),
|
|
194
198
|
renderShell: "self",
|
|
195
199
|
renderCall: (args, theme) => renderGrepCall(args, theme),
|
|
196
200
|
renderResult: (result, options, theme, context) => {
|
|
@@ -204,6 +208,7 @@ function createBuiltinTools(cwd) {
|
|
|
204
208
|
const findResult = find.renderResult;
|
|
205
209
|
tools.push((0, _agimon_ai_doompi_core_piExtension.definePiTool)({
|
|
206
210
|
...find,
|
|
211
|
+
execute: (...args) => (0, _earendil_works_pi_coding_agent.createFindToolDefinition)(args[4].cwd).execute(...args),
|
|
207
212
|
renderShell: "self",
|
|
208
213
|
renderCall: (args, theme) => renderFindCall(args, theme),
|
|
209
214
|
renderResult: (result, options, theme, context) => {
|
|
@@ -217,6 +222,7 @@ function createBuiltinTools(cwd) {
|
|
|
217
222
|
const lsResult = ls.renderResult;
|
|
218
223
|
tools.push((0, _agimon_ai_doompi_core_piExtension.definePiTool)({
|
|
219
224
|
...ls,
|
|
225
|
+
execute: (...args) => (0, _earendil_works_pi_coding_agent.createLsToolDefinition)(args[4].cwd).execute(...args),
|
|
220
226
|
renderShell: "self",
|
|
221
227
|
renderCall: (args, theme) => renderLsCall(args, theme),
|
|
222
228
|
renderResult: (result, options, theme, context) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi.cjs","names":["wrapTextWithAnsi","previousDoomToolResult","frameDoomToolResult","renderToolHeading","DoomToolCall","highlightCode","getLanguageFromPath","renderDoomDiff","gutterWidth","renderLineNumber","createReadToolDefinition","definePiTool","createEditToolDefinition","createWriteToolDefinition","createGrepToolDefinition","createFindToolDefinition","createLsToolDefinition","notify","readDoomNotificationService","TITLE_PREFIX","path","DoomUiState","DoomLeaderRegistry","readDoomMcpStatus","UI_EVENT","WARNING_STYLE","LEADER_WIDGET_KEY","WIDGET_PLACEMENT","TOOLS_COMMAND","buildToolSources","extensionName","extensionPackageName","extensionToolSource","openToolsOverlay","CONFIG_COMMAND","openConfigOverlay","SESSION_START_EVENT","SESSION_MESSAGE_ENTRY","DoomHeader","DoomFooter","DoomEditor","LeaderHints","BUILTIN_LEADER_COMMANDS","INPUT_EVENT","defineRoot","createUiTelemetry","DOOM_UI_HUB_SERVICE","DOOM_MINOR_MODE_CATALOG_SERVICE","createMinorModeCatalogClient","requireMinorModeCatalog","projectMinorModeRecords","defineCliCommand","defineCliCommand","defineCliHook","defineCliHook","defineCliTool","defineCliTool","defineCliTool","defineCliTool","defineCliTool","defineCliTool","definePiExtension","rootSession","composeRootHooks","commandConfig","commandTools","hookInput","hookSessionStart","piToolContributions","toolEdit","toolFind","toolGrep","toolLs","toolRead","toolWrite"],"sources":["../../src/tui/builtinToolRender.ts","../../src/tui/builtinTools.ts","../../src/services/eventLoopLag/index.ts","../../src/services/uiHub/index.ts","../../src/tui/uiRuntime.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/config.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/tools.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/input.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/edit.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/find.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/grep.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/ls.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/read.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/write.cli.ts","../../generated/pi.ts"],"sourcesContent":["import {\n type EditToolDetails,\n type EditToolInput,\n type FindToolInput,\n type GrepToolInput,\n getLanguageFromPath,\n highlightCode,\n type LsToolInput,\n type ReadToolInput,\n type Theme,\n type WriteToolInput,\n} from '@earendil-works/pi-coding-agent';\nimport { type Component, wrapTextWithAnsi } from '@earendil-works/pi-tui';\n\nimport { gutterWidth, renderLineNumber } from './codeGutter';\nimport { renderDoomDiff } from './diffRender';\nimport { DoomToolCall, frameDoomToolResult, previousDoomToolResult, renderToolHeading } from './toolChrome';\n\nconst COLLAPSED_FILE_LINES = 10;\n\ntype Highlighter = (code: string, language?: string) => string[];\ntype LanguageResolver = (path: string) => string | undefined;\n\nexport interface ToolPreviewOptions {\n expanded?: boolean;\n isError?: boolean;\n}\n\nexport interface WritePreviewOptions extends ToolPreviewOptions {\n argsStreaming?: boolean;\n}\n\nexport interface TextToolResult {\n content?: ReadonlyArray<{ type: string; text?: string }>;\n}\n\nexport interface EditToolResult extends TextToolResult {\n details?: EditToolDetails;\n}\n\n/** Self-owned result shell shared by Pi's native file and search tools. */\nclass BuiltinToolContent implements Component {\n constructor(private readonly text: string) {}\n\n render(width: number): string[] {\n if (width <= 0 || this.text.length === 0) return [];\n return wrapTextWithAnsi(this.text, width);\n }\n\n invalidate(): void {\n // Content is immutable and reflows from the current width on every render.\n }\n}\n\n/** Recover the native renderer's component from the shell returned on its previous pass. */\nexport function previousBuiltinResult(component: Component | undefined): Component | undefined {\n return previousDoomToolResult(component);\n}\n\n/** Reuse the shell while allowing Pi's native renderer to reuse its own inner component. */\nexport function frameBuiltinResult(content: Component, theme: Theme, previous: Component | undefined): Component {\n return frameDoomToolResult(content, theme, previous);\n}\n\nfunction renderCall(label: string, primary: string, details: readonly string[], theme: Theme): Component {\n let text = renderToolHeading(label, primary, theme);\n if (details.length > 0) text += ` ${theme.fg('muted', `· ${details.join(' · ')}`)}`;\n return new DoomToolCall(text);\n}\n\nfunction optionalCount(value: number | undefined, unit: string): string | undefined {\n return value === undefined ? undefined : `${value} ${unit}`;\n}\n\nfunction compactDetails(values: ReadonlyArray<string | undefined>): string[] {\n return values.filter((value): value is string => value !== undefined && value.length > 0);\n}\n\nexport function renderReadCall(args: ReadToolInput, theme: Theme): Component {\n return renderCall(\n 'read',\n args.path,\n compactDetails([args.offset === undefined ? undefined : `from ${args.offset}`, optionalCount(args.limit, 'lines')]),\n theme,\n );\n}\n\nexport function renderEditCall(args: EditToolInput, theme: Theme): Component {\n const count = args.edits.length;\n return renderCall('edit', args.path, [`${count} edit${count === 1 ? '' : 's'}`], theme);\n}\n\n/**\n * Read appends a bracketed pagination note after a blank line. Detach it so the\n * gutter numbers file content only, and mutate the caller's line list to match.\n */\nfunction takeTrailingNote(lines: string[]): string | undefined {\n const last = lines.at(-1);\n if (last === undefined || !last.startsWith('[') || !last.endsWith(']')) return undefined;\n\n lines.pop();\n while (lines.at(-1) === '') lines.pop();\n return last;\n}\n\nfunction textContent(result: TextToolResult): string {\n return (result.content ?? [])\n .filter((block) => block.type === 'text')\n .map((block) => block.text ?? '')\n .join('\\n')\n .replaceAll('\\t', ' ')\n .replaceAll('\\r\\n', '\\n');\n}\n\nexport function renderEditResult(\n args: EditToolInput,\n result: EditToolResult,\n options: ToolPreviewOptions,\n theme: Theme,\n highlight: Highlighter = highlightCode,\n resolveLanguage: LanguageResolver = getLanguageFromPath,\n): Component {\n if (options.isError) return new BuiltinToolContent(theme.fg('error', textContent(result)));\n\n const diff = result.details?.diff;\n // A successful edit whose details never arrived has nothing worth a frame.\n if (diff === undefined || diff.length === 0) return new BuiltinToolContent('');\n return renderDoomDiff(diff, theme, resolveLanguage(args.path), highlight);\n}\n\nexport function renderWriteCall(\n args: WriteToolInput,\n theme: Theme,\n options: WritePreviewOptions = {},\n highlight: Highlighter = highlightCode,\n resolveLanguage: LanguageResolver = getLanguageFromPath,\n): Component {\n const heading = renderToolHeading('write', args.path, theme);\n const details = theme.fg('muted', `· ${args.content.length.toLocaleString('en-US')} chars`);\n if (args.content.length === 0) return new DoomToolCall(`${heading} ${details}`);\n\n const normalizedLines = args.content.replaceAll('\\t', ' ').replaceAll('\\r\\n', '\\n').split('\\n');\n while (normalizedLines.at(-1) === '') normalizedLines.pop();\n const showLiveTail = options.argsStreaming === true && options.expanded !== true;\n const visibleLines = options.expanded\n ? normalizedLines\n : showLiveTail\n ? normalizedLines.slice(-COLLAPSED_FILE_LINES)\n : normalizedLines.slice(0, COLLAPSED_FILE_LINES);\n const language = resolveLanguage(args.path);\n const highlighted = language\n ? highlight(visibleLines.join('\\n'), language)\n : visibleLines.map((line) => theme.fg('toolOutput', line));\n const hiddenLineCount = normalizedLines.length - visibleLines.length;\n // A live tail shows the file's end, so numbering starts where the tail does.\n const firstVisibleLineNumber = showLiveTail ? hiddenLineCount + 1 : 1;\n const numberWidth = gutterWidth(firstVisibleLineNumber + visibleLines.length - 1);\n const preview = highlighted.map(\n (line, index) => `${renderLineNumber(firstVisibleLineNumber + index, numberWidth, theme)} ${line}`,\n );\n const previewLines = showLiveTail\n ? [\n ...(hiddenLineCount > 0 ? [theme.fg('muted', `… ${hiddenLineCount} earlier lines · live tail`)] : []),\n ...preview,\n ]\n : [\n ...preview,\n ...(hiddenLineCount > 0 ? [theme.fg('muted', `… ${hiddenLineCount} more lines · ctrl+o expand`)] : []),\n ];\n return new DoomToolCall([`${heading} ${details}`, '', ...previewLines].join('\\n'));\n}\n\nexport function renderReadResult(\n args: ReadToolInput,\n result: TextToolResult,\n options: ToolPreviewOptions,\n theme: Theme,\n highlight: Highlighter = highlightCode,\n resolveLanguage: LanguageResolver = getLanguageFromPath,\n): Component {\n const normalizedLines = textContent(result).split('\\n');\n while (normalizedLines.at(-1) === '') normalizedLines.pop();\n if (options.isError) {\n return new BuiltinToolContent(normalizedLines.map((line) => theme.fg('error', line)).join('\\n'));\n }\n\n const note = takeTrailingNote(normalizedLines);\n const visibleLines = options.expanded ? normalizedLines : normalizedLines.slice(0, COLLAPSED_FILE_LINES);\n const language = resolveLanguage(args.path);\n const highlighted = language\n ? highlight(visibleLines.join('\\n'), language)\n : visibleLines.map((line) => theme.fg('toolOutput', line));\n // Read starts at `offset`, so the gutter has to agree with the file, not the excerpt.\n const firstLineNumber = args.offset ?? 1;\n const numberWidth = gutterWidth(firstLineNumber + visibleLines.length - 1);\n const preview = highlighted.map(\n (line, index) => `${renderLineNumber(firstLineNumber + index, numberWidth, theme)} ${line}`,\n );\n const remaining = normalizedLines.length - visibleLines.length;\n if (remaining > 0) preview.push(theme.fg('muted', `… ${remaining} more lines · ctrl+o expand`));\n if (note !== undefined) preview.push(theme.fg('muted', note));\n return new BuiltinToolContent(preview.join('\\n'));\n}\n\nexport function renderGrepCall(args: GrepToolInput, theme: Theme): Component {\n return renderCall(\n 'grep',\n args.pattern,\n compactDetails([\n args.path ?? '.',\n args.glob,\n args.ignoreCase === true ? 'ignore case' : undefined,\n optionalCount(args.limit, 'matches'),\n ]),\n theme,\n );\n}\n\nexport function renderFindCall(args: FindToolInput, theme: Theme): Component {\n return renderCall(\n 'find',\n args.pattern,\n compactDetails([args.path ?? '.', optionalCount(args.limit, 'results')]),\n theme,\n );\n}\n\nexport function renderLsCall(args: LsToolInput, theme: Theme): Component {\n return renderCall('ls', args.path ?? '.', compactDetails([optionalCount(args.limit, 'entries')]), theme);\n}\n","import { definePiTool, type PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\nimport {\n createEditToolDefinition,\n createFindToolDefinition,\n createGrepToolDefinition,\n createLsToolDefinition,\n createReadToolDefinition,\n createWriteToolDefinition,\n} from '@earendil-works/pi-coding-agent';\n\nimport {\n frameBuiltinResult,\n previousBuiltinResult,\n renderEditCall,\n renderEditResult,\n renderFindCall,\n renderGrepCall,\n renderLsCall,\n renderReadCall,\n renderReadResult,\n renderWriteCall,\n} from './builtinToolRender';\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 createBuiltinTools(cwd: string): PiToolDeclaration[] {\n const tools: PiToolDeclaration[] = [];\n const read = createReadToolDefinition(cwd);\n tools.push(\n definePiTool({\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\n const edit = createEditToolDefinition(cwd);\n tools.push(\n definePiTool({\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\n const write = createWriteToolDefinition(cwd);\n const writeResult = write.renderResult!;\n tools.push(\n definePiTool({\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\n const grep = createGrepToolDefinition(cwd);\n const grepResult = grep.renderResult!;\n tools.push(\n definePiTool({\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\n const find = createFindToolDefinition(cwd);\n const findResult = find.renderResult!;\n tools.push(\n definePiTool({\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\n const ls = createLsToolDefinition(cwd);\n const lsResult = ls.renderResult!;\n tools.push(\n definePiTool({\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 return tools;\n}\n","/** How often the sampler asks to be woken. Short enough to catch a stall inside a single tool call. */\nconst SAMPLE_INTERVAL_MS = 250;\n/**\n * Below this, a late timer is ordinary scheduling jitter rather than something a\n * user would feel. Reporting every sample would cost more than it measures.\n */\nconst REPORT_THRESHOLD_MS = 250;\n\nexport interface EventLoopLagSampler {\n stop(): void;\n}\n\n/**\n * Reports how far behind schedule the event loop is running.\n *\n * A timer that wakes late is the only signal from inside the process that\n * something synchronous, garbage collection included, held the loop. Nothing in\n * a session transcript records it, so a stall here is otherwise invisible and\n * reads as a slow model or a slow tool.\n */\nexport function startEventLoopLagSampler(report: (lagMs: number) => void): EventLoopLagSampler {\n let expected = Date.now() + SAMPLE_INTERVAL_MS;\n const timer = setInterval(() => {\n const now = Date.now();\n const lagMs = now - expected;\n // Rebased on the wake that just happened rather than advanced by a fixed\n // step, so one long stall does not report itself again on every later tick.\n expected = now + SAMPLE_INTERVAL_MS;\n if (lagMs >= REPORT_THRESHOLD_MS) report(lagMs);\n }, SAMPLE_INTERVAL_MS);\n // A diagnostic must never be the reason a process refuses to exit.\n timer.unref();\n return {\n stop: () => {\n clearInterval(timer);\n },\n };\n}\n","import type {\n ConfigSection,\n DoomConfigActionInput,\n DoomConfigContributionHandle,\n DoomConfigContributionOptions,\n DoomConfigInvocation,\n DoomConfigSectionView,\n DoomExtensionContext,\n} from '@agimon-ai/doompi-core/config';\nimport type {\n DoomFooterContributionDefinition,\n DoomFooterContributionHandle,\n DoomFooterContributionValue,\n DoomFooterStatus,\n} from '@agimon-ai/doompi-core/footer';\nimport type { DoomLeaderActionHandlerOptions, LeaderBinding } from '@agimon-ai/doompi-core/leader';\nimport type { DoomUiHubService } from '@agimon-ai/doompi-core/uiHub';\n\nimport type { DoomLeaderDiagnostic, DoomLeaderRegistry } from '../leaderRegistry';\n\ntype Listener = () => void;\n\nfunction notify(listeners: ReadonlySet<Listener>): void {\n for (const listener of listeners) listener();\n}\n\nfunction copyBindings(bindings: readonly LeaderBinding[]): LeaderBinding[] {\n return bindings.map((binding) => ({\n ...binding,\n path: binding.path.map((segment) => ({ ...segment })) as [\n LeaderBinding['path'][number],\n ...LeaderBinding['path'][number][],\n ],\n ...('command' in binding ? { command: { ...binding.command } } : { action: { ...binding.action } }),\n }));\n}\n\nfunction copySections(sections: readonly ConfigSection[]): ConfigSection[] {\n return sections.map((section) => ({\n ...section,\n fields: section.fields.map((field) => ({\n ...field,\n ...(field.choices ? { choices: field.choices.map((choice) => ({ ...choice })) } : {}),\n ...(field.actions ? { actions: field.actions.map((action) => ({ ...action })) } : {}),\n ...(field.steps ? { steps: field.steps.map((step) => ({ ...step })) } : {}),\n ...(field.output ? { output: [...field.output] } : {}),\n })),\n }));\n}\n\ninterface ActiveFooterContribution {\n readonly token: symbol;\n readonly definition: DoomFooterContributionDefinition;\n value?: DoomFooterContributionValue;\n}\n\nexport class DoomUiFooterStore {\n private readonly contributions = new Map<string, ActiveFooterContribution>();\n private readonly listeners = new Set<Listener>();\n\n register(definition: DoomFooterContributionDefinition): DoomFooterContributionHandle {\n const token = Symbol(definition.source);\n const contribution: ActiveFooterContribution = { token, definition: { ...definition } };\n this.contributions.set(definition.source, contribution);\n notify(this.listeners);\n let disposed = false;\n return {\n update: (value) => {\n if (disposed || this.contributions.get(definition.source)?.token !== token) return;\n contribution.value = value\n ? {\n ...value,\n ...(value.fullSegments ? { fullSegments: value.fullSegments.map((segment) => ({ ...segment })) } : {}),\n ...(value.compactSegments\n ? { compactSegments: value.compactSegments.map((segment) => ({ ...segment })) }\n : {}),\n }\n : undefined;\n notify(this.listeners);\n },\n dispose: () => {\n if (disposed) return;\n disposed = true;\n if (this.contributions.get(definition.source)?.token !== token) return;\n this.contributions.delete(definition.source);\n notify(this.listeners);\n },\n };\n }\n\n getStatuses(): DoomFooterStatus[] {\n return [...this.contributions.values()]\n .flatMap(({ definition, value }) =>\n value\n ? [\n {\n source: definition.source,\n id: definition.id,\n order: definition.order,\n ...(definition.placement ? { placement: definition.placement } : {}),\n ...value,\n },\n ]\n : [],\n )\n .toSorted(\n (left, right) =>\n left.order - right.order || left.source.localeCompare(right.source) || left.id.localeCompare(right.id),\n );\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n dispose(): void {\n this.contributions.clear();\n notify(this.listeners);\n this.listeners.clear();\n }\n}\n\ninterface ActiveConfigContribution {\n readonly token: symbol;\n readonly options: DoomConfigContributionOptions<DoomExtensionContext>;\n}\n\nexport class DoomUiConfigStore {\n private readonly contributions = new Map<string, ActiveConfigContribution>();\n private readonly listeners = new Set<Listener>();\n\n constructor(private readonly getContext: () => DoomExtensionContext | undefined) {}\n\n register<ExtensionContext extends DoomExtensionContext>(\n options: DoomConfigContributionOptions<ExtensionContext>,\n ): DoomConfigContributionHandle {\n const token = Symbol(options.source);\n const contribution = {\n token,\n options: options as unknown as DoomConfigContributionOptions<DoomExtensionContext>,\n };\n this.contributions.set(options.source, contribution);\n notify(this.listeners);\n let disposed = false;\n return {\n update: () => {\n if (!disposed && this.contributions.get(options.source)?.token === token) notify(this.listeners);\n },\n dispose: () => {\n if (disposed) return;\n disposed = true;\n if (this.contributions.get(options.source)?.token !== token) return;\n this.contributions.delete(options.source);\n notify(this.listeners);\n },\n };\n }\n\n getSections(): DoomConfigSectionView[] {\n return [...this.contributions.values()]\n .flatMap(({ options }) => {\n try {\n return copySections(options.listSections()).map((section) => ({ source: options.source, ...section }));\n } catch (error) {\n const context = this.getContext();\n if (context) options.onError(error, 'listSections', context);\n return [];\n }\n })\n .toSorted(\n (left, right) =>\n left.order - right.order || left.source.localeCompare(right.source) || left.id.localeCompare(right.id),\n );\n }\n\n invoke(invocation: DoomConfigInvocation): void {\n const active = this.contributions.get(invocation.source);\n const context = this.getContext();\n if (!active || !context) return;\n const handler = active.options.handlers[invocation.action];\n if (!handler) return;\n const input: DoomConfigActionInput = {\n ctx: context,\n sectionId: invocation.sectionId,\n fieldId: invocation.fieldId,\n ...(invocation.value === undefined ? {} : { value: invocation.value }),\n };\n void Promise.resolve(handler(input))\n .catch((error: unknown) => active.options.onError(error, invocation.action, context))\n .finally(() => {\n if (this.contributions.get(invocation.source)?.token === active.token) notify(this.listeners);\n });\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n dispose(): void {\n this.contributions.clear();\n notify(this.listeners);\n this.listeners.clear();\n }\n}\n\nexport interface DoomUiHubController extends DoomUiHubService {\n readonly config: DoomUiConfigStore;\n readonly footer: DoomUiFooterStore;\n setContext(context: DoomExtensionContext | undefined): void;\n invokeLeaderAction(source: string, action: string): void;\n dispose(): void;\n}\n\nexport interface CreateDoomUiHubOptions {\n readonly leaderRegistry: DoomLeaderRegistry;\n readonly reportDiagnostics: (diagnostics: readonly DoomLeaderDiagnostic[]) => void;\n}\n\nexport function createDoomUiHub({ leaderRegistry, reportDiagnostics }: CreateDoomUiHubOptions): DoomUiHubController {\n let activeContext: DoomExtensionContext | undefined;\n const leaderGenerations = new Map<string, symbol>();\n const actionHandlers = new Map<\n string,\n { token: symbol; options: DoomLeaderActionHandlerOptions<DoomExtensionContext> }\n >();\n const footer = new DoomUiFooterStore();\n const config = new DoomUiConfigStore(() => activeContext);\n\n return {\n footer,\n config,\n registerLeader(contribution) {\n const token = Symbol(contribution.source);\n const publish = (bindings: readonly LeaderBinding[]): void => {\n const result = leaderRegistry.register({ source: contribution.source, bindings: copyBindings(bindings) });\n reportDiagnostics(result.diagnostics);\n };\n publish(contribution.bindings);\n leaderGenerations.set(contribution.source, token);\n let disposed = false;\n return {\n update(bindings) {\n if (disposed || leaderGenerations.get(contribution.source) !== token) return;\n publish(bindings);\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n if (leaderGenerations.get(contribution.source) !== token) return;\n leaderGenerations.delete(contribution.source);\n publish([]);\n },\n };\n },\n registerLeaderActions(options) {\n const token = Symbol(options.source);\n actionHandlers.set(options.source, {\n token,\n options: options as unknown as DoomLeaderActionHandlerOptions<DoomExtensionContext>,\n });\n let disposed = false;\n return () => {\n if (disposed) return;\n disposed = true;\n if (actionHandlers.get(options.source)?.token === token) actionHandlers.delete(options.source);\n };\n },\n registerFooter: (definition) => footer.register(definition),\n registerConfig: (options) => config.register(options),\n setContext(context) {\n activeContext = context;\n },\n invokeLeaderAction(source, action) {\n const context = activeContext;\n const active = actionHandlers.get(source);\n if (!context || !active) return;\n const handler = active.options.handlers[action];\n if (!handler) return;\n void Promise.resolve(handler(context)).catch((error: unknown) => active.options.onError(error, action, context));\n },\n dispose() {\n activeContext = undefined;\n actionHandlers.clear();\n leaderGenerations.clear();\n footer.dispose();\n config.dispose();\n },\n };\n}\n","import path from 'node:path';\n\nimport { readDoomMcpStatus } from '@agimon-ai/doompi-core/mcpStatus';\nimport { type DoomNotificationLevel, readDoomNotificationService } from '@agimon-ai/doompi-core/notification';\nimport type { PiEventHandlers } from '@agimon-ai/doompi-core/piExtension';\nimport { buildToolSources, type McpServerStatus } from '@agimon-ai/doompi-core/toolInventory';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext, ReadonlyFooterDataProvider } from '@earendil-works/pi-coding-agent';\n\nimport {\n LEADER_WIDGET_KEY,\n TUI_MODE,\n WIDGET_PLACEMENT,\n WARNING_STYLE,\n THEME_ENVIRONMENT_KEY,\n TOOLS_COMMAND,\n CONFIG_COMMAND,\n SESSION_START_EVENT,\n SESSION_MESSAGE_ENTRY,\n INPUT_EVENT,\n INTERACTIVE_INPUT_SOURCE,\n TITLE_MESSAGE_MAX_LENGTH,\n TITLE_PREFIX,\n BUILTIN_LEADER_COMMANDS,\n} from '../constants/ui';\nimport { DoomUiState, type LeaderSnapshot } from '../models/uiState';\nimport { type EventLoopLagSampler, startEventLoopLagSampler } from '../services/eventLoopLag';\nimport { extensionName, extensionPackageName, extensionToolSource } from '../services/extensionSource';\nimport { type DoomLeaderDiagnostic, DoomLeaderRegistry } from '../services/leaderRegistry';\nimport { UI_EVENT, type UiTelemetry } from '../services/telemetry';\nimport { createDoomUiHub } from '../services/uiHub';\nimport { openConfigOverlay } from './configOverlay';\nimport { DoomEditor } from './doomEditor';\nimport { DoomFooter } from './doomFooter';\nimport { DoomHeader } from './doomHeader';\nimport { LeaderHints } from './leaderHints';\nimport { DEFAULT_THEME_NAME } from './theme';\nimport { openToolsOverlay } from './toolsOverlay';\n\nfunction notify(cordis: Context, context: ExtensionContext, body: string, level: DoomNotificationLevel): void {\n const service = readDoomNotificationService(cordis);\n if (service) {\n try {\n void Promise.resolve(service.request({ body, level })).catch(() => undefined);\n } catch {\n // Notification delivery is best effort and does not fall back after routing.\n }\n return;\n }\n context.ui.notify(body, level);\n}\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\nexport interface UiRuntime {\n readonly hub: ReturnType<typeof createDoomUiHub>;\n readonly uiState: DoomUiState;\n readonly commands: readonly (readonly [...Parameters<ExtensionAPI['registerCommand']>])[];\n readonly events: PiEventHandlers;\n dispose(): Promise<void>;\n}\n\nexport function createUiRuntime(cordis: Context, { pi, telemetry }: UiPluginOptions): UiRuntime {\n let disposed = false;\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 let lagSampler: EventLoopLagSampler | undefined;\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 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) notify(cordis, activeContext, message, WARNING_STYLE);\n }\n };\n\n const hub = createDoomUiHub({ leaderRegistry, reportDiagnostics });\n return {\n hub,\n uiState,\n async dispose() {\n if (disposed) return;\n disposed = true;\n const context = activeContext;\n ++sessionGeneration;\n activeContext = undefined;\n hub.setContext(undefined);\n footerData = undefined;\n lagSampler?.stop();\n lagSampler = 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 commands: [\n [\n TOOLS_COMMAND,\n {\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 resolveExtensionPackageName: extensionPackageName,\n resolveExtensionToolSource: (toolName) => extensionToolSource(pi, toolName),\n });\n await openToolsOverlay(ctx, sources);\n },\n },\n ],\n\n [\n CONFIG_COMMAND,\n {\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 ],\n events: {\n [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) notify(cordis, ctx, message, WARNING_STYLE);\n\n // A resumed or forked session runs this again, and two samplers would\n // double every report.\n lagSampler?.stop();\n lagSampler = startEventLoopLagSampler((lagMs) => {\n void telemetry.recordWarning(UI_EVENT.eventLoopStalled, `Event loop stalled for ${String(lagMs)}ms.`, {\n lag_ms: lagMs,\n });\n });\n\n const themeName = process.env[THEME_ENVIRONMENT_KEY] || DEFAULT_THEME_NAME;\n const themeResult = ctx.ui.setTheme(themeName);\n if (!themeResult.success) {\n notify(cordis, ctx, `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) =>\n 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.includes(commandName) ||\n pi.getCommands().some((command) => command.name === commandName),\n onLeaderAction: (source, action) => {\n if (activeContext !== ctx || sessionGeneration !== activeGeneration) {\n notify(cordis, ctx, `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 notify(cordis, ctx, `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 notify(cordis, ctx, `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 [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 };\n}\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\nimport { DOOM_UI_HUB_SERVICE } from '@agimon-ai/doompi-core/uiHub';\nimport {\n DOOM_MINOR_MODE_CATALOG_SERVICE,\n createMinorModeCatalogClient,\n requireMinorModeCatalog,\n} from '@agimon-ai/doompi-minor-mode';\n\nimport { projectMinorModeRecords } from '../../../../models/uiState';\nimport { createUiTelemetry, type UiTelemetry } from '../../../../services/telemetry';\nimport { createBuiltinTools } from '../../../../tui/builtinTools';\nimport { createUiRuntime } from '../../../../tui/uiRuntime';\nimport type { UiPiScope } from './_lib/piScope';\n\nexport default defineRoot(({ context, pi, options, runtime }: PiPluginContext<UiTelemetry>) => {\n if (!runtime) throw new Error('This Pi extension requires the Cordis runtime metadata.');\n const ui = createUiRuntime(context, { pi, telemetry: options ?? createUiTelemetry() });\n const tools = createBuiltinTools(process.cwd());\n const service = (owner: PiPluginContext['context']) => {\n owner.provide(DOOM_UI_HUB_SERVICE, ui.hub);\n owner.inject([DOOM_MINOR_MODE_CATALOG_SERVICE], (modeContext) => {\n const catalog = createMinorModeCatalogClient(requireMinorModeCatalog(modeContext));\n const update = (): void => ui.uiState.setModes(projectMinorModeRecords(catalog.list()));\n const unsubscribe = catalog.subscribe(update);\n update();\n return () => {\n unsubscribe();\n ui.uiState.setModes([]);\n };\n });\n };\n return {\n value: { ui, tools, runtime } satisfies UiPiScope,\n services: [service],\n onStop: () => ui.dispose(),\n onDispose: () => ui.dispose(),\n };\n});\n","import { defineCliCommand } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliCommand(\n (context: WithRoot<PiPluginContext<unknown>, UiPiScope>) => context.root.ui.commands[1],\n);\n","import { defineCliCommand } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliCommand(\n (context: WithRoot<PiPluginContext<unknown>, UiPiScope>) => context.root.ui.commands[0],\n);\n","import { defineCliHook } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliHook((context: WithRoot<PiPluginContext<unknown>, UiPiScope>) => context.root.ui.events.input!);\n","import { defineCliHook } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliHook(\n (context: WithRoot<PiPluginContext<unknown>, UiPiScope>) => context.root.ui.events.session_start!,\n);\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'edit');\n if (!tool) throw new Error('Missing built-in edit tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'find');\n if (!tool) throw new Error('Missing built-in find tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'grep');\n if (!tool) throw new Error('Missing built-in grep tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'ls');\n if (!tool) throw new Error('Missing built-in ls tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'read');\n if (!tool) throw new Error('Missing built-in read tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'write');\n if (!tool) throw new Error('Missing built-in write tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, piToolContributions, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport commandConfig from '../src/extensions/workspaces/sessions/(backend)/command/config.cli';\nimport commandTools from '../src/extensions/workspaces/sessions/(backend)/command/tools.cli';\nimport hookInput from '../src/extensions/workspaces/sessions/(backend)/hook/input.cli';\nimport hookSessionStart from '../src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli';\nimport toolEdit from '../src/extensions/workspaces/sessions/(backend)/tool/edit.cli';\nimport toolFind from '../src/extensions/workspaces/sessions/(backend)/tool/find.cli';\nimport toolGrep from '../src/extensions/workspaces/sessions/(backend)/tool/grep.cli';\nimport toolLs from '../src/extensions/workspaces/sessions/(backend)/tool/ls.cli';\nimport toolRead from '../src/extensions/workspaces/sessions/(backend)/tool/read.cli';\nimport toolWrite from '../src/extensions/workspaces/sessions/(backend)/tool/write.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof commandConfig> | OptionsOf<typeof commandTools> | OptionsOf<typeof hookInput> | OptionsOf<typeof hookSessionStart> | OptionsOf<typeof toolEdit> | OptionsOf<typeof toolFind> | OptionsOf<typeof toolGrep> | OptionsOf<typeof toolLs> | OptionsOf<typeof toolRead> | OptionsOf<typeof toolWrite>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-ui', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): PiPluginContributions['commands'] { return [at(commandConfig, contextSession), at(commandTools, contextSession)]; },\n events: {\n input: at(hookInput, contextSession) as NonNullable<PiPluginContributions['events']>['input'],\n session_start: at(hookSessionStart, contextSession) as NonNullable<PiPluginContributions['events']>['session_start'],\n },\n ...piToolContributions('@agimon-ai/doompi-ui', [via({ name: 'edit' }, at(toolEdit, contextSession)), via({ name: 'find' }, at(toolFind, contextSession)), via({ name: 'grep' }, at(toolGrep, contextSession)), via({ name: 'ls' }, at(toolLs, contextSession)), via({ name: 'read' }, at(toolRead, contextSession)), via({ name: 'write' }, at(toolWrite, contextSession))]),\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pi.cjs","names":["wrapTextWithAnsi","previousDoomToolResult","frameDoomToolResult","renderToolHeading","DoomToolCall","highlightCode","getLanguageFromPath","renderDoomDiff","gutterWidth","renderLineNumber","createReadToolDefinition","definePiTool","createEditToolDefinition","createWriteToolDefinition","createGrepToolDefinition","createFindToolDefinition","createLsToolDefinition","notify","readDoomNotificationService","TITLE_PREFIX","path","DoomUiState","DoomLeaderRegistry","readDoomMcpStatus","UI_EVENT","WARNING_STYLE","LEADER_WIDGET_KEY","WIDGET_PLACEMENT","TOOLS_COMMAND","buildToolSources","extensionName","extensionPackageName","extensionToolSource","openToolsOverlay","CONFIG_COMMAND","openConfigOverlay","SESSION_START_EVENT","SESSION_MESSAGE_ENTRY","DoomHeader","DoomFooter","DoomEditor","LeaderHints","BUILTIN_LEADER_COMMANDS","INPUT_EVENT","defineRoot","createUiTelemetry","DOOM_UI_HUB_SERVICE","DOOM_MINOR_MODE_CATALOG_SERVICE","createMinorModeCatalogClient","requireMinorModeCatalog","projectMinorModeRecords","defineCliCommand","defineCliCommand","defineCliHook","defineCliHook","defineCliTool","defineCliTool","defineCliTool","defineCliTool","defineCliTool","defineCliTool","definePiExtension","rootSession","composeRootHooks","commandConfig","commandTools","hookInput","hookSessionStart","piToolContributions","toolEdit","toolFind","toolGrep","toolLs","toolRead","toolWrite"],"sources":["../../src/tui/builtinToolRender.ts","../../src/tui/builtinTools.ts","../../src/services/eventLoopLag/index.ts","../../src/services/uiHub/index.ts","../../src/tui/uiRuntime.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/config.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/tools.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/input.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/edit.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/find.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/grep.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/ls.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/read.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/write.cli.ts","../../generated/pi.ts"],"sourcesContent":["import {\n type EditToolDetails,\n type EditToolInput,\n type FindToolInput,\n type GrepToolInput,\n getLanguageFromPath,\n highlightCode,\n type LsToolInput,\n type ReadToolInput,\n type Theme,\n type WriteToolInput,\n} from '@earendil-works/pi-coding-agent';\nimport { type Component, wrapTextWithAnsi } from '@earendil-works/pi-tui';\n\nimport { gutterWidth, renderLineNumber } from './codeGutter';\nimport { renderDoomDiff } from './diffRender';\nimport { DoomToolCall, frameDoomToolResult, previousDoomToolResult, renderToolHeading } from './toolChrome';\n\nconst COLLAPSED_FILE_LINES = 10;\n\ntype Highlighter = (code: string, language?: string) => string[];\ntype LanguageResolver = (path: string) => string | undefined;\n\nexport interface ToolPreviewOptions {\n expanded?: boolean;\n isError?: boolean;\n}\n\nexport interface WritePreviewOptions extends ToolPreviewOptions {\n argsStreaming?: boolean;\n}\n\nexport interface TextToolResult {\n content?: ReadonlyArray<{ type: string; text?: string }>;\n}\n\nexport interface EditToolResult extends TextToolResult {\n details?: EditToolDetails;\n}\n\n/** Self-owned result shell shared by Pi's native file and search tools. */\nclass BuiltinToolContent implements Component {\n constructor(private readonly text: string) {}\n\n render(width: number): string[] {\n if (width <= 0 || this.text.length === 0) return [];\n return wrapTextWithAnsi(this.text, width);\n }\n\n invalidate(): void {\n // Content is immutable and reflows from the current width on every render.\n }\n}\n\n/** Recover the native renderer's component from the shell returned on its previous pass. */\nexport function previousBuiltinResult(component: Component | undefined): Component | undefined {\n return previousDoomToolResult(component);\n}\n\n/** Reuse the shell while allowing Pi's native renderer to reuse its own inner component. */\nexport function frameBuiltinResult(content: Component, theme: Theme, previous: Component | undefined): Component {\n return frameDoomToolResult(content, theme, previous);\n}\n\nfunction renderCall(label: string, primary: string, details: readonly string[], theme: Theme): Component {\n let text = renderToolHeading(label, primary, theme);\n if (details.length > 0) text += ` ${theme.fg('muted', `· ${details.join(' · ')}`)}`;\n return new DoomToolCall(text);\n}\n\nfunction optionalCount(value: number | undefined, unit: string): string | undefined {\n return value === undefined ? undefined : `${value} ${unit}`;\n}\n\nfunction compactDetails(values: ReadonlyArray<string | undefined>): string[] {\n return values.filter((value): value is string => value !== undefined && value.length > 0);\n}\n\nexport function renderReadCall(args: ReadToolInput, theme: Theme): Component {\n return renderCall(\n 'read',\n args.path,\n compactDetails([args.offset === undefined ? undefined : `from ${args.offset}`, optionalCount(args.limit, 'lines')]),\n theme,\n );\n}\n\nexport function renderEditCall(args: EditToolInput, theme: Theme): Component {\n const count = args.edits.length;\n return renderCall('edit', args.path, [`${count} edit${count === 1 ? '' : 's'}`], theme);\n}\n\n/**\n * Read appends a bracketed pagination note after a blank line. Detach it so the\n * gutter numbers file content only, and mutate the caller's line list to match.\n */\nfunction takeTrailingNote(lines: string[]): string | undefined {\n const last = lines.at(-1);\n if (last === undefined || !last.startsWith('[') || !last.endsWith(']')) return undefined;\n\n lines.pop();\n while (lines.at(-1) === '') lines.pop();\n return last;\n}\n\nfunction textContent(result: TextToolResult): string {\n return (result.content ?? [])\n .filter((block) => block.type === 'text')\n .map((block) => block.text ?? '')\n .join('\\n')\n .replaceAll('\\t', ' ')\n .replaceAll('\\r\\n', '\\n');\n}\n\nexport function renderEditResult(\n args: EditToolInput,\n result: EditToolResult,\n options: ToolPreviewOptions,\n theme: Theme,\n highlight: Highlighter = highlightCode,\n resolveLanguage: LanguageResolver = getLanguageFromPath,\n): Component {\n if (options.isError) return new BuiltinToolContent(theme.fg('error', textContent(result)));\n\n const diff = result.details?.diff;\n // A successful edit whose details never arrived has nothing worth a frame.\n if (diff === undefined || diff.length === 0) return new BuiltinToolContent('');\n return renderDoomDiff(diff, theme, resolveLanguage(args.path), highlight);\n}\n\nexport function renderWriteCall(\n args: WriteToolInput,\n theme: Theme,\n options: WritePreviewOptions = {},\n highlight: Highlighter = highlightCode,\n resolveLanguage: LanguageResolver = getLanguageFromPath,\n): Component {\n const heading = renderToolHeading('write', args.path, theme);\n const details = theme.fg('muted', `· ${args.content.length.toLocaleString('en-US')} chars`);\n if (args.content.length === 0) return new DoomToolCall(`${heading} ${details}`);\n\n const normalizedLines = args.content.replaceAll('\\t', ' ').replaceAll('\\r\\n', '\\n').split('\\n');\n while (normalizedLines.at(-1) === '') normalizedLines.pop();\n const showLiveTail = options.argsStreaming === true && options.expanded !== true;\n const visibleLines = options.expanded\n ? normalizedLines\n : showLiveTail\n ? normalizedLines.slice(-COLLAPSED_FILE_LINES)\n : normalizedLines.slice(0, COLLAPSED_FILE_LINES);\n const language = resolveLanguage(args.path);\n const highlighted = language\n ? highlight(visibleLines.join('\\n'), language)\n : visibleLines.map((line) => theme.fg('toolOutput', line));\n const hiddenLineCount = normalizedLines.length - visibleLines.length;\n // A live tail shows the file's end, so numbering starts where the tail does.\n const firstVisibleLineNumber = showLiveTail ? hiddenLineCount + 1 : 1;\n const numberWidth = gutterWidth(firstVisibleLineNumber + visibleLines.length - 1);\n const preview = highlighted.map(\n (line, index) => `${renderLineNumber(firstVisibleLineNumber + index, numberWidth, theme)} ${line}`,\n );\n const previewLines = showLiveTail\n ? [\n ...(hiddenLineCount > 0 ? [theme.fg('muted', `… ${hiddenLineCount} earlier lines · live tail`)] : []),\n ...preview,\n ]\n : [\n ...preview,\n ...(hiddenLineCount > 0 ? [theme.fg('muted', `… ${hiddenLineCount} more lines · ctrl+o expand`)] : []),\n ];\n return new DoomToolCall([`${heading} ${details}`, '', ...previewLines].join('\\n'));\n}\n\nexport function renderReadResult(\n args: ReadToolInput,\n result: TextToolResult,\n options: ToolPreviewOptions,\n theme: Theme,\n highlight: Highlighter = highlightCode,\n resolveLanguage: LanguageResolver = getLanguageFromPath,\n): Component {\n const normalizedLines = textContent(result).split('\\n');\n while (normalizedLines.at(-1) === '') normalizedLines.pop();\n if (options.isError) {\n return new BuiltinToolContent(normalizedLines.map((line) => theme.fg('error', line)).join('\\n'));\n }\n\n const note = takeTrailingNote(normalizedLines);\n const visibleLines = options.expanded ? normalizedLines : normalizedLines.slice(0, COLLAPSED_FILE_LINES);\n const language = resolveLanguage(args.path);\n const highlighted = language\n ? highlight(visibleLines.join('\\n'), language)\n : visibleLines.map((line) => theme.fg('toolOutput', line));\n // Read starts at `offset`, so the gutter has to agree with the file, not the excerpt.\n const firstLineNumber = args.offset ?? 1;\n const numberWidth = gutterWidth(firstLineNumber + visibleLines.length - 1);\n const preview = highlighted.map(\n (line, index) => `${renderLineNumber(firstLineNumber + index, numberWidth, theme)} ${line}`,\n );\n const remaining = normalizedLines.length - visibleLines.length;\n if (remaining > 0) preview.push(theme.fg('muted', `… ${remaining} more lines · ctrl+o expand`));\n if (note !== undefined) preview.push(theme.fg('muted', note));\n return new BuiltinToolContent(preview.join('\\n'));\n}\n\nexport function renderGrepCall(args: GrepToolInput, theme: Theme): Component {\n return renderCall(\n 'grep',\n args.pattern,\n compactDetails([\n args.path ?? '.',\n args.glob,\n args.ignoreCase === true ? 'ignore case' : undefined,\n optionalCount(args.limit, 'matches'),\n ]),\n theme,\n );\n}\n\nexport function renderFindCall(args: FindToolInput, theme: Theme): Component {\n return renderCall(\n 'find',\n args.pattern,\n compactDetails([args.path ?? '.', optionalCount(args.limit, 'results')]),\n theme,\n );\n}\n\nexport function renderLsCall(args: LsToolInput, theme: Theme): Component {\n return renderCall('ls', args.path ?? '.', compactDetails([optionalCount(args.limit, 'entries')]), theme);\n}\n","import { definePiTool, type PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\nimport {\n createEditToolDefinition,\n createFindToolDefinition,\n createGrepToolDefinition,\n createLsToolDefinition,\n createReadToolDefinition,\n createWriteToolDefinition,\n} from '@earendil-works/pi-coding-agent';\n\nimport {\n frameBuiltinResult,\n previousBuiltinResult,\n renderEditCall,\n renderEditResult,\n renderFindCall,\n renderGrepCall,\n renderLsCall,\n renderReadCall,\n renderReadResult,\n renderWriteCall,\n} from './builtinToolRender';\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 createBuiltinTools(cwd: string): PiToolDeclaration[] {\n const tools: PiToolDeclaration[] = [];\n const read = createReadToolDefinition(cwd);\n tools.push(\n definePiTool({\n ...read,\n execute: (...args: Parameters<typeof read.execute>) => createReadToolDefinition(args[4].cwd).execute(...args),\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\n const edit = createEditToolDefinition(cwd);\n tools.push(\n definePiTool({\n ...edit,\n execute: (...args: Parameters<typeof edit.execute>) => createEditToolDefinition(args[4].cwd).execute(...args),\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\n const write = createWriteToolDefinition(cwd);\n const writeResult = write.renderResult!;\n tools.push(\n definePiTool({\n ...write,\n execute: (...args: Parameters<typeof write.execute>) => createWriteToolDefinition(args[4].cwd).execute(...args),\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\n const grep = createGrepToolDefinition(cwd);\n const grepResult = grep.renderResult!;\n tools.push(\n definePiTool({\n ...grep,\n execute: (...args: Parameters<typeof grep.execute>) => createGrepToolDefinition(args[4].cwd).execute(...args),\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\n const find = createFindToolDefinition(cwd);\n const findResult = find.renderResult!;\n tools.push(\n definePiTool({\n ...find,\n execute: (...args: Parameters<typeof find.execute>) => createFindToolDefinition(args[4].cwd).execute(...args),\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\n const ls = createLsToolDefinition(cwd);\n const lsResult = ls.renderResult!;\n tools.push(\n definePiTool({\n ...ls,\n execute: (...args: Parameters<typeof ls.execute>) => createLsToolDefinition(args[4].cwd).execute(...args),\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 return tools;\n}\n","/** How often the sampler asks to be woken. Short enough to catch a stall inside a single tool call. */\nconst SAMPLE_INTERVAL_MS = 250;\n/**\n * Below this, a late timer is ordinary scheduling jitter rather than something a\n * user would feel. Reporting every sample would cost more than it measures.\n */\nconst REPORT_THRESHOLD_MS = 250;\n\nexport interface EventLoopLagSampler {\n stop(): void;\n}\n\n/**\n * Reports how far behind schedule the event loop is running.\n *\n * A timer that wakes late is the only signal from inside the process that\n * something synchronous, garbage collection included, held the loop. Nothing in\n * a session transcript records it, so a stall here is otherwise invisible and\n * reads as a slow model or a slow tool.\n */\nexport function startEventLoopLagSampler(report: (lagMs: number) => void): EventLoopLagSampler {\n let expected = Date.now() + SAMPLE_INTERVAL_MS;\n const timer = setInterval(() => {\n const now = Date.now();\n const lagMs = now - expected;\n // Rebased on the wake that just happened rather than advanced by a fixed\n // step, so one long stall does not report itself again on every later tick.\n expected = now + SAMPLE_INTERVAL_MS;\n if (lagMs >= REPORT_THRESHOLD_MS) report(lagMs);\n }, SAMPLE_INTERVAL_MS);\n // A diagnostic must never be the reason a process refuses to exit.\n timer.unref();\n return {\n stop: () => {\n clearInterval(timer);\n },\n };\n}\n","import type {\n ConfigSection,\n DoomConfigActionInput,\n DoomConfigContributionHandle,\n DoomConfigContributionOptions,\n DoomConfigInvocation,\n DoomConfigSectionView,\n DoomExtensionContext,\n} from '@agimon-ai/doompi-core/config';\nimport type {\n DoomFooterContributionDefinition,\n DoomFooterContributionHandle,\n DoomFooterContributionValue,\n DoomFooterStatus,\n} from '@agimon-ai/doompi-core/footer';\nimport type { DoomLeaderActionHandlerOptions, LeaderBinding } from '@agimon-ai/doompi-core/leader';\nimport type { DoomUiHubService } from '@agimon-ai/doompi-core/uiHub';\n\nimport type { DoomLeaderDiagnostic, DoomLeaderRegistry } from '../leaderRegistry';\n\ntype Listener = () => void;\n\nfunction notify(listeners: ReadonlySet<Listener>): void {\n for (const listener of listeners) listener();\n}\n\nfunction copyBindings(bindings: readonly LeaderBinding[]): LeaderBinding[] {\n return bindings.map((binding) => ({\n ...binding,\n path: binding.path.map((segment) => ({ ...segment })) as [\n LeaderBinding['path'][number],\n ...LeaderBinding['path'][number][],\n ],\n ...('command' in binding ? { command: { ...binding.command } } : { action: { ...binding.action } }),\n }));\n}\n\nfunction copySections(sections: readonly ConfigSection[]): ConfigSection[] {\n return sections.map((section) => ({\n ...section,\n fields: section.fields.map((field) => ({\n ...field,\n ...(field.choices ? { choices: field.choices.map((choice) => ({ ...choice })) } : {}),\n ...(field.actions ? { actions: field.actions.map((action) => ({ ...action })) } : {}),\n ...(field.steps ? { steps: field.steps.map((step) => ({ ...step })) } : {}),\n ...(field.output ? { output: [...field.output] } : {}),\n })),\n }));\n}\n\ninterface ActiveFooterContribution {\n readonly token: symbol;\n readonly definition: DoomFooterContributionDefinition;\n value?: DoomFooterContributionValue;\n}\n\nexport class DoomUiFooterStore {\n private readonly contributions = new Map<string, ActiveFooterContribution>();\n private readonly listeners = new Set<Listener>();\n\n register(definition: DoomFooterContributionDefinition): DoomFooterContributionHandle {\n const token = Symbol(definition.source);\n const contribution: ActiveFooterContribution = { token, definition: { ...definition } };\n this.contributions.set(definition.source, contribution);\n notify(this.listeners);\n let disposed = false;\n return {\n update: (value) => {\n if (disposed || this.contributions.get(definition.source)?.token !== token) return;\n contribution.value = value\n ? {\n ...value,\n ...(value.fullSegments ? { fullSegments: value.fullSegments.map((segment) => ({ ...segment })) } : {}),\n ...(value.compactSegments\n ? { compactSegments: value.compactSegments.map((segment) => ({ ...segment })) }\n : {}),\n }\n : undefined;\n notify(this.listeners);\n },\n dispose: () => {\n if (disposed) return;\n disposed = true;\n if (this.contributions.get(definition.source)?.token !== token) return;\n this.contributions.delete(definition.source);\n notify(this.listeners);\n },\n };\n }\n\n getStatuses(): DoomFooterStatus[] {\n return [...this.contributions.values()]\n .flatMap(({ definition, value }) =>\n value\n ? [\n {\n source: definition.source,\n id: definition.id,\n order: definition.order,\n ...(definition.placement ? { placement: definition.placement } : {}),\n ...value,\n },\n ]\n : [],\n )\n .toSorted(\n (left, right) =>\n left.order - right.order || left.source.localeCompare(right.source) || left.id.localeCompare(right.id),\n );\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n dispose(): void {\n this.contributions.clear();\n notify(this.listeners);\n this.listeners.clear();\n }\n}\n\ninterface ActiveConfigContribution {\n readonly token: symbol;\n readonly options: DoomConfigContributionOptions<DoomExtensionContext>;\n}\n\nexport class DoomUiConfigStore {\n private readonly contributions = new Map<string, ActiveConfigContribution>();\n private readonly listeners = new Set<Listener>();\n\n constructor(private readonly getContext: () => DoomExtensionContext | undefined) {}\n\n register<ExtensionContext extends DoomExtensionContext>(\n options: DoomConfigContributionOptions<ExtensionContext>,\n ): DoomConfigContributionHandle {\n const token = Symbol(options.source);\n const contribution = {\n token,\n options: options as unknown as DoomConfigContributionOptions<DoomExtensionContext>,\n };\n this.contributions.set(options.source, contribution);\n notify(this.listeners);\n let disposed = false;\n return {\n update: () => {\n if (!disposed && this.contributions.get(options.source)?.token === token) notify(this.listeners);\n },\n dispose: () => {\n if (disposed) return;\n disposed = true;\n if (this.contributions.get(options.source)?.token !== token) return;\n this.contributions.delete(options.source);\n notify(this.listeners);\n },\n };\n }\n\n getSections(): DoomConfigSectionView[] {\n return [...this.contributions.values()]\n .flatMap(({ options }) => {\n try {\n return copySections(options.listSections()).map((section) => ({ source: options.source, ...section }));\n } catch (error) {\n const context = this.getContext();\n if (context) options.onError(error, 'listSections', context);\n return [];\n }\n })\n .toSorted(\n (left, right) =>\n left.order - right.order || left.source.localeCompare(right.source) || left.id.localeCompare(right.id),\n );\n }\n\n invoke(invocation: DoomConfigInvocation): void {\n const active = this.contributions.get(invocation.source);\n const context = this.getContext();\n if (!active || !context) return;\n const handler = active.options.handlers[invocation.action];\n if (!handler) return;\n const input: DoomConfigActionInput = {\n ctx: context,\n sectionId: invocation.sectionId,\n fieldId: invocation.fieldId,\n ...(invocation.value === undefined ? {} : { value: invocation.value }),\n };\n void Promise.resolve(handler(input))\n .catch((error: unknown) => active.options.onError(error, invocation.action, context))\n .finally(() => {\n if (this.contributions.get(invocation.source)?.token === active.token) notify(this.listeners);\n });\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n dispose(): void {\n this.contributions.clear();\n notify(this.listeners);\n this.listeners.clear();\n }\n}\n\nexport interface DoomUiHubController extends DoomUiHubService {\n readonly config: DoomUiConfigStore;\n readonly footer: DoomUiFooterStore;\n setContext(context: DoomExtensionContext | undefined): void;\n invokeLeaderAction(source: string, action: string): void;\n dispose(): void;\n}\n\nexport interface CreateDoomUiHubOptions {\n readonly leaderRegistry: DoomLeaderRegistry;\n readonly reportDiagnostics: (diagnostics: readonly DoomLeaderDiagnostic[]) => void;\n}\n\nexport function createDoomUiHub({ leaderRegistry, reportDiagnostics }: CreateDoomUiHubOptions): DoomUiHubController {\n let activeContext: DoomExtensionContext | undefined;\n const leaderGenerations = new Map<string, symbol>();\n const actionHandlers = new Map<\n string,\n { token: symbol; options: DoomLeaderActionHandlerOptions<DoomExtensionContext> }\n >();\n const footer = new DoomUiFooterStore();\n const config = new DoomUiConfigStore(() => activeContext);\n\n return {\n footer,\n config,\n registerLeader(contribution) {\n const token = Symbol(contribution.source);\n const publish = (bindings: readonly LeaderBinding[]): void => {\n const result = leaderRegistry.register({ source: contribution.source, bindings: copyBindings(bindings) });\n reportDiagnostics(result.diagnostics);\n };\n publish(contribution.bindings);\n leaderGenerations.set(contribution.source, token);\n let disposed = false;\n return {\n update(bindings) {\n if (disposed || leaderGenerations.get(contribution.source) !== token) return;\n publish(bindings);\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n if (leaderGenerations.get(contribution.source) !== token) return;\n leaderGenerations.delete(contribution.source);\n publish([]);\n },\n };\n },\n registerLeaderActions(options) {\n const token = Symbol(options.source);\n actionHandlers.set(options.source, {\n token,\n options: options as unknown as DoomLeaderActionHandlerOptions<DoomExtensionContext>,\n });\n let disposed = false;\n return () => {\n if (disposed) return;\n disposed = true;\n if (actionHandlers.get(options.source)?.token === token) actionHandlers.delete(options.source);\n };\n },\n registerFooter: (definition) => footer.register(definition),\n registerConfig: (options) => config.register(options),\n setContext(context) {\n activeContext = context;\n },\n invokeLeaderAction(source, action) {\n const context = activeContext;\n const active = actionHandlers.get(source);\n if (!context || !active) return;\n const handler = active.options.handlers[action];\n if (!handler) return;\n void Promise.resolve(handler(context)).catch((error: unknown) => active.options.onError(error, action, context));\n },\n dispose() {\n activeContext = undefined;\n actionHandlers.clear();\n leaderGenerations.clear();\n footer.dispose();\n config.dispose();\n },\n };\n}\n","import path from 'node:path';\n\nimport { readDoomMcpStatus } from '@agimon-ai/doompi-core/mcpStatus';\nimport { type DoomNotificationLevel, readDoomNotificationService } from '@agimon-ai/doompi-core/notification';\nimport type { PiEventHandlers } from '@agimon-ai/doompi-core/piExtension';\nimport { buildToolSources, type McpServerStatus } from '@agimon-ai/doompi-core/toolInventory';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext, ReadonlyFooterDataProvider } from '@earendil-works/pi-coding-agent';\n\nimport {\n LEADER_WIDGET_KEY,\n TUI_MODE,\n WIDGET_PLACEMENT,\n WARNING_STYLE,\n THEME_ENVIRONMENT_KEY,\n TOOLS_COMMAND,\n CONFIG_COMMAND,\n SESSION_START_EVENT,\n SESSION_MESSAGE_ENTRY,\n INPUT_EVENT,\n INTERACTIVE_INPUT_SOURCE,\n TITLE_MESSAGE_MAX_LENGTH,\n TITLE_PREFIX,\n BUILTIN_LEADER_COMMANDS,\n} from '../constants/ui';\nimport { DoomUiState, type LeaderSnapshot } from '../models/uiState';\nimport { type EventLoopLagSampler, startEventLoopLagSampler } from '../services/eventLoopLag';\nimport { extensionName, extensionPackageName, extensionToolSource } from '../services/extensionSource';\nimport { type DoomLeaderDiagnostic, DoomLeaderRegistry } from '../services/leaderRegistry';\nimport { UI_EVENT, type UiTelemetry } from '../services/telemetry';\nimport { createDoomUiHub } from '../services/uiHub';\nimport { openConfigOverlay } from './configOverlay';\nimport { DoomEditor } from './doomEditor';\nimport { DoomFooter } from './doomFooter';\nimport { DoomHeader } from './doomHeader';\nimport { LeaderHints } from './leaderHints';\nimport { DEFAULT_THEME_NAME } from './theme';\nimport { openToolsOverlay } from './toolsOverlay';\n\nfunction notify(cordis: Context, context: ExtensionContext, body: string, level: DoomNotificationLevel): void {\n const service = readDoomNotificationService(cordis);\n if (service) {\n try {\n void Promise.resolve(service.request({ body, level })).catch(() => undefined);\n } catch {\n // Notification delivery is best effort and does not fall back after routing.\n }\n return;\n }\n context.ui.notify(body, level);\n}\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\nexport interface UiRuntime {\n readonly hub: ReturnType<typeof createDoomUiHub>;\n readonly uiState: DoomUiState;\n readonly commands: readonly (readonly [...Parameters<ExtensionAPI['registerCommand']>])[];\n readonly events: PiEventHandlers;\n dispose(): Promise<void>;\n}\n\nexport function createUiRuntime(cordis: Context, { pi, telemetry }: UiPluginOptions): UiRuntime {\n let disposed = false;\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 let lagSampler: EventLoopLagSampler | undefined;\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 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) notify(cordis, activeContext, message, WARNING_STYLE);\n }\n };\n\n const hub = createDoomUiHub({ leaderRegistry, reportDiagnostics });\n return {\n hub,\n uiState,\n async dispose() {\n if (disposed) return;\n disposed = true;\n const context = activeContext;\n ++sessionGeneration;\n activeContext = undefined;\n hub.setContext(undefined);\n footerData = undefined;\n lagSampler?.stop();\n lagSampler = 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 commands: [\n [\n TOOLS_COMMAND,\n {\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 resolveExtensionPackageName: extensionPackageName,\n resolveExtensionToolSource: (toolName) => extensionToolSource(pi, toolName),\n });\n await openToolsOverlay(ctx, sources);\n },\n },\n ],\n\n [\n CONFIG_COMMAND,\n {\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 ],\n events: {\n [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) notify(cordis, ctx, message, WARNING_STYLE);\n\n // A resumed or forked session runs this again, and two samplers would\n // double every report.\n lagSampler?.stop();\n lagSampler = startEventLoopLagSampler((lagMs) => {\n void telemetry.recordWarning(UI_EVENT.eventLoopStalled, `Event loop stalled for ${String(lagMs)}ms.`, {\n lag_ms: lagMs,\n });\n });\n\n const themeName = process.env[THEME_ENVIRONMENT_KEY] || DEFAULT_THEME_NAME;\n const themeResult = ctx.ui.setTheme(themeName);\n if (!themeResult.success) {\n notify(cordis, ctx, `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) =>\n 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.includes(commandName) ||\n pi.getCommands().some((command) => command.name === commandName),\n onLeaderAction: (source, action) => {\n if (activeContext !== ctx || sessionGeneration !== activeGeneration) {\n notify(cordis, ctx, `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 notify(cordis, ctx, `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 notify(cordis, ctx, `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 [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 };\n}\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\nimport { DOOM_UI_HUB_SERVICE } from '@agimon-ai/doompi-core/uiHub';\nimport {\n DOOM_MINOR_MODE_CATALOG_SERVICE,\n createMinorModeCatalogClient,\n requireMinorModeCatalog,\n} from '@agimon-ai/doompi-minor-mode';\n\nimport { projectMinorModeRecords } from '../../../../models/uiState';\nimport { createUiTelemetry, type UiTelemetry } from '../../../../services/telemetry';\nimport { createBuiltinTools } from '../../../../tui/builtinTools';\nimport { createUiRuntime } from '../../../../tui/uiRuntime';\nimport type { UiPiScope } from './_lib/piScope';\n\nexport default defineRoot(({ context, pi, options, runtime }: PiPluginContext<UiTelemetry>) => {\n if (!runtime) throw new Error('This Pi extension requires the Cordis runtime metadata.');\n const ui = createUiRuntime(context, { pi, telemetry: options ?? createUiTelemetry() });\n const tools = createBuiltinTools(process.cwd());\n const service = (owner: PiPluginContext['context']) => {\n owner.provide(DOOM_UI_HUB_SERVICE, ui.hub);\n owner.inject([DOOM_MINOR_MODE_CATALOG_SERVICE], (modeContext) => {\n const catalog = createMinorModeCatalogClient(requireMinorModeCatalog(modeContext));\n const update = (): void => ui.uiState.setModes(projectMinorModeRecords(catalog.list()));\n const unsubscribe = catalog.subscribe(update);\n update();\n return () => {\n unsubscribe();\n ui.uiState.setModes([]);\n };\n });\n };\n return {\n value: { ui, tools, runtime } satisfies UiPiScope,\n services: [service],\n onStop: () => ui.dispose(),\n onDispose: () => ui.dispose(),\n };\n});\n","import { defineCliCommand } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliCommand(\n (context: WithRoot<PiPluginContext<unknown>, UiPiScope>) => context.root.ui.commands[1],\n);\n","import { defineCliCommand } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliCommand(\n (context: WithRoot<PiPluginContext<unknown>, UiPiScope>) => context.root.ui.commands[0],\n);\n","import { defineCliHook } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliHook((context: WithRoot<PiPluginContext<unknown>, UiPiScope>) => context.root.ui.events.input!);\n","import { defineCliHook } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliHook(\n (context: WithRoot<PiPluginContext<unknown>, UiPiScope>) => context.root.ui.events.session_start!,\n);\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'edit');\n if (!tool) throw new Error('Missing built-in edit tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'find');\n if (!tool) throw new Error('Missing built-in find tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'grep');\n if (!tool) throw new Error('Missing built-in grep tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'ls');\n if (!tool) throw new Error('Missing built-in ls tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'read');\n if (!tool) throw new Error('Missing built-in read tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'write');\n if (!tool) throw new Error('Missing built-in write tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, piToolContributions, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport commandConfig from '../src/extensions/workspaces/sessions/(backend)/command/config.cli';\nimport commandTools from '../src/extensions/workspaces/sessions/(backend)/command/tools.cli';\nimport hookInput from '../src/extensions/workspaces/sessions/(backend)/hook/input.cli';\nimport hookSessionStart from '../src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli';\nimport toolEdit from '../src/extensions/workspaces/sessions/(backend)/tool/edit.cli';\nimport toolFind from '../src/extensions/workspaces/sessions/(backend)/tool/find.cli';\nimport toolGrep from '../src/extensions/workspaces/sessions/(backend)/tool/grep.cli';\nimport toolLs from '../src/extensions/workspaces/sessions/(backend)/tool/ls.cli';\nimport toolRead from '../src/extensions/workspaces/sessions/(backend)/tool/read.cli';\nimport toolWrite from '../src/extensions/workspaces/sessions/(backend)/tool/write.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof commandConfig> | OptionsOf<typeof commandTools> | OptionsOf<typeof hookInput> | OptionsOf<typeof hookSessionStart> | OptionsOf<typeof toolEdit> | OptionsOf<typeof toolFind> | OptionsOf<typeof toolGrep> | OptionsOf<typeof toolLs> | OptionsOf<typeof toolRead> | OptionsOf<typeof toolWrite>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-ui', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): PiPluginContributions['commands'] { return [at(commandConfig, contextSession), at(commandTools, contextSession)]; },\n events: {\n input: at(hookInput, contextSession) as NonNullable<PiPluginContributions['events']>['input'],\n session_start: at(hookSessionStart, contextSession) as NonNullable<PiPluginContributions['events']>['session_start'],\n },\n ...piToolContributions('@agimon-ai/doompi-ui', [via({ name: 'edit' }, at(toolEdit, contextSession)), via({ name: 'find' }, at(toolFind, contextSession)), via({ name: 'grep' }, at(toolGrep, contextSession)), via({ name: 'ls' }, at(toolLs, contextSession)), via({ name: 'read' }, at(toolRead, contextSession)), via({ name: 'write' }, at(toolWrite, contextSession))]),\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":"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"}
|
package/dist/extensions/pi.mjs
CHANGED
|
@@ -144,6 +144,7 @@ function createBuiltinTools(cwd) {
|
|
|
144
144
|
const read = createReadToolDefinition(cwd);
|
|
145
145
|
tools.push(definePiTool({
|
|
146
146
|
...read,
|
|
147
|
+
execute: (...args) => createReadToolDefinition(args[4].cwd).execute(...args),
|
|
147
148
|
renderShell: "self",
|
|
148
149
|
renderCall: (args, theme) => renderReadCall(args, theme),
|
|
149
150
|
renderResult: (result, options, theme, context) => {
|
|
@@ -156,6 +157,7 @@ function createBuiltinTools(cwd) {
|
|
|
156
157
|
const edit = createEditToolDefinition(cwd);
|
|
157
158
|
tools.push(definePiTool({
|
|
158
159
|
...edit,
|
|
160
|
+
execute: (...args) => createEditToolDefinition(args[4].cwd).execute(...args),
|
|
159
161
|
renderShell: "self",
|
|
160
162
|
renderCall: (args, theme) => renderEditCall(args, theme),
|
|
161
163
|
renderResult: (result, options, theme, context) => {
|
|
@@ -169,6 +171,7 @@ function createBuiltinTools(cwd) {
|
|
|
169
171
|
const writeResult = write.renderResult;
|
|
170
172
|
tools.push(definePiTool({
|
|
171
173
|
...write,
|
|
174
|
+
execute: (...args) => createWriteToolDefinition(args[4].cwd).execute(...args),
|
|
172
175
|
renderShell: "self",
|
|
173
176
|
renderCall: (args, theme, context) => renderWriteCall(args, theme, {
|
|
174
177
|
expanded: context.expanded,
|
|
@@ -185,6 +188,7 @@ function createBuiltinTools(cwd) {
|
|
|
185
188
|
const grepResult = grep.renderResult;
|
|
186
189
|
tools.push(definePiTool({
|
|
187
190
|
...grep,
|
|
191
|
+
execute: (...args) => createGrepToolDefinition(args[4].cwd).execute(...args),
|
|
188
192
|
renderShell: "self",
|
|
189
193
|
renderCall: (args, theme) => renderGrepCall(args, theme),
|
|
190
194
|
renderResult: (result, options, theme, context) => {
|
|
@@ -198,6 +202,7 @@ function createBuiltinTools(cwd) {
|
|
|
198
202
|
const findResult = find.renderResult;
|
|
199
203
|
tools.push(definePiTool({
|
|
200
204
|
...find,
|
|
205
|
+
execute: (...args) => createFindToolDefinition(args[4].cwd).execute(...args),
|
|
201
206
|
renderShell: "self",
|
|
202
207
|
renderCall: (args, theme) => renderFindCall(args, theme),
|
|
203
208
|
renderResult: (result, options, theme, context) => {
|
|
@@ -211,6 +216,7 @@ function createBuiltinTools(cwd) {
|
|
|
211
216
|
const lsResult = ls.renderResult;
|
|
212
217
|
tools.push(definePiTool({
|
|
213
218
|
...ls,
|
|
219
|
+
execute: (...args) => createLsToolDefinition(args[4].cwd).execute(...args),
|
|
214
220
|
renderShell: "self",
|
|
215
221
|
renderCall: (args, theme) => renderLsCall(args, theme),
|
|
216
222
|
renderResult: (result, options, theme, context) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi.mjs","names":["notify","rootSession","commandConfig","commandTools","hookInput","hookSessionStart","toolEdit","toolFind","toolGrep","toolLs","toolRead","toolWrite"],"sources":["../../src/tui/builtinToolRender.ts","../../src/tui/builtinTools.ts","../../src/services/eventLoopLag/index.ts","../../src/services/uiHub/index.ts","../../src/tui/uiRuntime.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/config.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/tools.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/input.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/edit.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/find.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/grep.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/ls.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/read.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/write.cli.ts","../../generated/pi.ts"],"sourcesContent":["import {\n type EditToolDetails,\n type EditToolInput,\n type FindToolInput,\n type GrepToolInput,\n getLanguageFromPath,\n highlightCode,\n type LsToolInput,\n type ReadToolInput,\n type Theme,\n type WriteToolInput,\n} from '@earendil-works/pi-coding-agent';\nimport { type Component, wrapTextWithAnsi } from '@earendil-works/pi-tui';\n\nimport { gutterWidth, renderLineNumber } from './codeGutter';\nimport { renderDoomDiff } from './diffRender';\nimport { DoomToolCall, frameDoomToolResult, previousDoomToolResult, renderToolHeading } from './toolChrome';\n\nconst COLLAPSED_FILE_LINES = 10;\n\ntype Highlighter = (code: string, language?: string) => string[];\ntype LanguageResolver = (path: string) => string | undefined;\n\nexport interface ToolPreviewOptions {\n expanded?: boolean;\n isError?: boolean;\n}\n\nexport interface WritePreviewOptions extends ToolPreviewOptions {\n argsStreaming?: boolean;\n}\n\nexport interface TextToolResult {\n content?: ReadonlyArray<{ type: string; text?: string }>;\n}\n\nexport interface EditToolResult extends TextToolResult {\n details?: EditToolDetails;\n}\n\n/** Self-owned result shell shared by Pi's native file and search tools. */\nclass BuiltinToolContent implements Component {\n constructor(private readonly text: string) {}\n\n render(width: number): string[] {\n if (width <= 0 || this.text.length === 0) return [];\n return wrapTextWithAnsi(this.text, width);\n }\n\n invalidate(): void {\n // Content is immutable and reflows from the current width on every render.\n }\n}\n\n/** Recover the native renderer's component from the shell returned on its previous pass. */\nexport function previousBuiltinResult(component: Component | undefined): Component | undefined {\n return previousDoomToolResult(component);\n}\n\n/** Reuse the shell while allowing Pi's native renderer to reuse its own inner component. */\nexport function frameBuiltinResult(content: Component, theme: Theme, previous: Component | undefined): Component {\n return frameDoomToolResult(content, theme, previous);\n}\n\nfunction renderCall(label: string, primary: string, details: readonly string[], theme: Theme): Component {\n let text = renderToolHeading(label, primary, theme);\n if (details.length > 0) text += ` ${theme.fg('muted', `· ${details.join(' · ')}`)}`;\n return new DoomToolCall(text);\n}\n\nfunction optionalCount(value: number | undefined, unit: string): string | undefined {\n return value === undefined ? undefined : `${value} ${unit}`;\n}\n\nfunction compactDetails(values: ReadonlyArray<string | undefined>): string[] {\n return values.filter((value): value is string => value !== undefined && value.length > 0);\n}\n\nexport function renderReadCall(args: ReadToolInput, theme: Theme): Component {\n return renderCall(\n 'read',\n args.path,\n compactDetails([args.offset === undefined ? undefined : `from ${args.offset}`, optionalCount(args.limit, 'lines')]),\n theme,\n );\n}\n\nexport function renderEditCall(args: EditToolInput, theme: Theme): Component {\n const count = args.edits.length;\n return renderCall('edit', args.path, [`${count} edit${count === 1 ? '' : 's'}`], theme);\n}\n\n/**\n * Read appends a bracketed pagination note after a blank line. Detach it so the\n * gutter numbers file content only, and mutate the caller's line list to match.\n */\nfunction takeTrailingNote(lines: string[]): string | undefined {\n const last = lines.at(-1);\n if (last === undefined || !last.startsWith('[') || !last.endsWith(']')) return undefined;\n\n lines.pop();\n while (lines.at(-1) === '') lines.pop();\n return last;\n}\n\nfunction textContent(result: TextToolResult): string {\n return (result.content ?? [])\n .filter((block) => block.type === 'text')\n .map((block) => block.text ?? '')\n .join('\\n')\n .replaceAll('\\t', ' ')\n .replaceAll('\\r\\n', '\\n');\n}\n\nexport function renderEditResult(\n args: EditToolInput,\n result: EditToolResult,\n options: ToolPreviewOptions,\n theme: Theme,\n highlight: Highlighter = highlightCode,\n resolveLanguage: LanguageResolver = getLanguageFromPath,\n): Component {\n if (options.isError) return new BuiltinToolContent(theme.fg('error', textContent(result)));\n\n const diff = result.details?.diff;\n // A successful edit whose details never arrived has nothing worth a frame.\n if (diff === undefined || diff.length === 0) return new BuiltinToolContent('');\n return renderDoomDiff(diff, theme, resolveLanguage(args.path), highlight);\n}\n\nexport function renderWriteCall(\n args: WriteToolInput,\n theme: Theme,\n options: WritePreviewOptions = {},\n highlight: Highlighter = highlightCode,\n resolveLanguage: LanguageResolver = getLanguageFromPath,\n): Component {\n const heading = renderToolHeading('write', args.path, theme);\n const details = theme.fg('muted', `· ${args.content.length.toLocaleString('en-US')} chars`);\n if (args.content.length === 0) return new DoomToolCall(`${heading} ${details}`);\n\n const normalizedLines = args.content.replaceAll('\\t', ' ').replaceAll('\\r\\n', '\\n').split('\\n');\n while (normalizedLines.at(-1) === '') normalizedLines.pop();\n const showLiveTail = options.argsStreaming === true && options.expanded !== true;\n const visibleLines = options.expanded\n ? normalizedLines\n : showLiveTail\n ? normalizedLines.slice(-COLLAPSED_FILE_LINES)\n : normalizedLines.slice(0, COLLAPSED_FILE_LINES);\n const language = resolveLanguage(args.path);\n const highlighted = language\n ? highlight(visibleLines.join('\\n'), language)\n : visibleLines.map((line) => theme.fg('toolOutput', line));\n const hiddenLineCount = normalizedLines.length - visibleLines.length;\n // A live tail shows the file's end, so numbering starts where the tail does.\n const firstVisibleLineNumber = showLiveTail ? hiddenLineCount + 1 : 1;\n const numberWidth = gutterWidth(firstVisibleLineNumber + visibleLines.length - 1);\n const preview = highlighted.map(\n (line, index) => `${renderLineNumber(firstVisibleLineNumber + index, numberWidth, theme)} ${line}`,\n );\n const previewLines = showLiveTail\n ? [\n ...(hiddenLineCount > 0 ? [theme.fg('muted', `… ${hiddenLineCount} earlier lines · live tail`)] : []),\n ...preview,\n ]\n : [\n ...preview,\n ...(hiddenLineCount > 0 ? [theme.fg('muted', `… ${hiddenLineCount} more lines · ctrl+o expand`)] : []),\n ];\n return new DoomToolCall([`${heading} ${details}`, '', ...previewLines].join('\\n'));\n}\n\nexport function renderReadResult(\n args: ReadToolInput,\n result: TextToolResult,\n options: ToolPreviewOptions,\n theme: Theme,\n highlight: Highlighter = highlightCode,\n resolveLanguage: LanguageResolver = getLanguageFromPath,\n): Component {\n const normalizedLines = textContent(result).split('\\n');\n while (normalizedLines.at(-1) === '') normalizedLines.pop();\n if (options.isError) {\n return new BuiltinToolContent(normalizedLines.map((line) => theme.fg('error', line)).join('\\n'));\n }\n\n const note = takeTrailingNote(normalizedLines);\n const visibleLines = options.expanded ? normalizedLines : normalizedLines.slice(0, COLLAPSED_FILE_LINES);\n const language = resolveLanguage(args.path);\n const highlighted = language\n ? highlight(visibleLines.join('\\n'), language)\n : visibleLines.map((line) => theme.fg('toolOutput', line));\n // Read starts at `offset`, so the gutter has to agree with the file, not the excerpt.\n const firstLineNumber = args.offset ?? 1;\n const numberWidth = gutterWidth(firstLineNumber + visibleLines.length - 1);\n const preview = highlighted.map(\n (line, index) => `${renderLineNumber(firstLineNumber + index, numberWidth, theme)} ${line}`,\n );\n const remaining = normalizedLines.length - visibleLines.length;\n if (remaining > 0) preview.push(theme.fg('muted', `… ${remaining} more lines · ctrl+o expand`));\n if (note !== undefined) preview.push(theme.fg('muted', note));\n return new BuiltinToolContent(preview.join('\\n'));\n}\n\nexport function renderGrepCall(args: GrepToolInput, theme: Theme): Component {\n return renderCall(\n 'grep',\n args.pattern,\n compactDetails([\n args.path ?? '.',\n args.glob,\n args.ignoreCase === true ? 'ignore case' : undefined,\n optionalCount(args.limit, 'matches'),\n ]),\n theme,\n );\n}\n\nexport function renderFindCall(args: FindToolInput, theme: Theme): Component {\n return renderCall(\n 'find',\n args.pattern,\n compactDetails([args.path ?? '.', optionalCount(args.limit, 'results')]),\n theme,\n );\n}\n\nexport function renderLsCall(args: LsToolInput, theme: Theme): Component {\n return renderCall('ls', args.path ?? '.', compactDetails([optionalCount(args.limit, 'entries')]), theme);\n}\n","import { definePiTool, type PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\nimport {\n createEditToolDefinition,\n createFindToolDefinition,\n createGrepToolDefinition,\n createLsToolDefinition,\n createReadToolDefinition,\n createWriteToolDefinition,\n} from '@earendil-works/pi-coding-agent';\n\nimport {\n frameBuiltinResult,\n previousBuiltinResult,\n renderEditCall,\n renderEditResult,\n renderFindCall,\n renderGrepCall,\n renderLsCall,\n renderReadCall,\n renderReadResult,\n renderWriteCall,\n} from './builtinToolRender';\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 createBuiltinTools(cwd: string): PiToolDeclaration[] {\n const tools: PiToolDeclaration[] = [];\n const read = createReadToolDefinition(cwd);\n tools.push(\n definePiTool({\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\n const edit = createEditToolDefinition(cwd);\n tools.push(\n definePiTool({\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\n const write = createWriteToolDefinition(cwd);\n const writeResult = write.renderResult!;\n tools.push(\n definePiTool({\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\n const grep = createGrepToolDefinition(cwd);\n const grepResult = grep.renderResult!;\n tools.push(\n definePiTool({\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\n const find = createFindToolDefinition(cwd);\n const findResult = find.renderResult!;\n tools.push(\n definePiTool({\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\n const ls = createLsToolDefinition(cwd);\n const lsResult = ls.renderResult!;\n tools.push(\n definePiTool({\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 return tools;\n}\n","/** How often the sampler asks to be woken. Short enough to catch a stall inside a single tool call. */\nconst SAMPLE_INTERVAL_MS = 250;\n/**\n * Below this, a late timer is ordinary scheduling jitter rather than something a\n * user would feel. Reporting every sample would cost more than it measures.\n */\nconst REPORT_THRESHOLD_MS = 250;\n\nexport interface EventLoopLagSampler {\n stop(): void;\n}\n\n/**\n * Reports how far behind schedule the event loop is running.\n *\n * A timer that wakes late is the only signal from inside the process that\n * something synchronous, garbage collection included, held the loop. Nothing in\n * a session transcript records it, so a stall here is otherwise invisible and\n * reads as a slow model or a slow tool.\n */\nexport function startEventLoopLagSampler(report: (lagMs: number) => void): EventLoopLagSampler {\n let expected = Date.now() + SAMPLE_INTERVAL_MS;\n const timer = setInterval(() => {\n const now = Date.now();\n const lagMs = now - expected;\n // Rebased on the wake that just happened rather than advanced by a fixed\n // step, so one long stall does not report itself again on every later tick.\n expected = now + SAMPLE_INTERVAL_MS;\n if (lagMs >= REPORT_THRESHOLD_MS) report(lagMs);\n }, SAMPLE_INTERVAL_MS);\n // A diagnostic must never be the reason a process refuses to exit.\n timer.unref();\n return {\n stop: () => {\n clearInterval(timer);\n },\n };\n}\n","import type {\n ConfigSection,\n DoomConfigActionInput,\n DoomConfigContributionHandle,\n DoomConfigContributionOptions,\n DoomConfigInvocation,\n DoomConfigSectionView,\n DoomExtensionContext,\n} from '@agimon-ai/doompi-core/config';\nimport type {\n DoomFooterContributionDefinition,\n DoomFooterContributionHandle,\n DoomFooterContributionValue,\n DoomFooterStatus,\n} from '@agimon-ai/doompi-core/footer';\nimport type { DoomLeaderActionHandlerOptions, LeaderBinding } from '@agimon-ai/doompi-core/leader';\nimport type { DoomUiHubService } from '@agimon-ai/doompi-core/uiHub';\n\nimport type { DoomLeaderDiagnostic, DoomLeaderRegistry } from '../leaderRegistry';\n\ntype Listener = () => void;\n\nfunction notify(listeners: ReadonlySet<Listener>): void {\n for (const listener of listeners) listener();\n}\n\nfunction copyBindings(bindings: readonly LeaderBinding[]): LeaderBinding[] {\n return bindings.map((binding) => ({\n ...binding,\n path: binding.path.map((segment) => ({ ...segment })) as [\n LeaderBinding['path'][number],\n ...LeaderBinding['path'][number][],\n ],\n ...('command' in binding ? { command: { ...binding.command } } : { action: { ...binding.action } }),\n }));\n}\n\nfunction copySections(sections: readonly ConfigSection[]): ConfigSection[] {\n return sections.map((section) => ({\n ...section,\n fields: section.fields.map((field) => ({\n ...field,\n ...(field.choices ? { choices: field.choices.map((choice) => ({ ...choice })) } : {}),\n ...(field.actions ? { actions: field.actions.map((action) => ({ ...action })) } : {}),\n ...(field.steps ? { steps: field.steps.map((step) => ({ ...step })) } : {}),\n ...(field.output ? { output: [...field.output] } : {}),\n })),\n }));\n}\n\ninterface ActiveFooterContribution {\n readonly token: symbol;\n readonly definition: DoomFooterContributionDefinition;\n value?: DoomFooterContributionValue;\n}\n\nexport class DoomUiFooterStore {\n private readonly contributions = new Map<string, ActiveFooterContribution>();\n private readonly listeners = new Set<Listener>();\n\n register(definition: DoomFooterContributionDefinition): DoomFooterContributionHandle {\n const token = Symbol(definition.source);\n const contribution: ActiveFooterContribution = { token, definition: { ...definition } };\n this.contributions.set(definition.source, contribution);\n notify(this.listeners);\n let disposed = false;\n return {\n update: (value) => {\n if (disposed || this.contributions.get(definition.source)?.token !== token) return;\n contribution.value = value\n ? {\n ...value,\n ...(value.fullSegments ? { fullSegments: value.fullSegments.map((segment) => ({ ...segment })) } : {}),\n ...(value.compactSegments\n ? { compactSegments: value.compactSegments.map((segment) => ({ ...segment })) }\n : {}),\n }\n : undefined;\n notify(this.listeners);\n },\n dispose: () => {\n if (disposed) return;\n disposed = true;\n if (this.contributions.get(definition.source)?.token !== token) return;\n this.contributions.delete(definition.source);\n notify(this.listeners);\n },\n };\n }\n\n getStatuses(): DoomFooterStatus[] {\n return [...this.contributions.values()]\n .flatMap(({ definition, value }) =>\n value\n ? [\n {\n source: definition.source,\n id: definition.id,\n order: definition.order,\n ...(definition.placement ? { placement: definition.placement } : {}),\n ...value,\n },\n ]\n : [],\n )\n .toSorted(\n (left, right) =>\n left.order - right.order || left.source.localeCompare(right.source) || left.id.localeCompare(right.id),\n );\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n dispose(): void {\n this.contributions.clear();\n notify(this.listeners);\n this.listeners.clear();\n }\n}\n\ninterface ActiveConfigContribution {\n readonly token: symbol;\n readonly options: DoomConfigContributionOptions<DoomExtensionContext>;\n}\n\nexport class DoomUiConfigStore {\n private readonly contributions = new Map<string, ActiveConfigContribution>();\n private readonly listeners = new Set<Listener>();\n\n constructor(private readonly getContext: () => DoomExtensionContext | undefined) {}\n\n register<ExtensionContext extends DoomExtensionContext>(\n options: DoomConfigContributionOptions<ExtensionContext>,\n ): DoomConfigContributionHandle {\n const token = Symbol(options.source);\n const contribution = {\n token,\n options: options as unknown as DoomConfigContributionOptions<DoomExtensionContext>,\n };\n this.contributions.set(options.source, contribution);\n notify(this.listeners);\n let disposed = false;\n return {\n update: () => {\n if (!disposed && this.contributions.get(options.source)?.token === token) notify(this.listeners);\n },\n dispose: () => {\n if (disposed) return;\n disposed = true;\n if (this.contributions.get(options.source)?.token !== token) return;\n this.contributions.delete(options.source);\n notify(this.listeners);\n },\n };\n }\n\n getSections(): DoomConfigSectionView[] {\n return [...this.contributions.values()]\n .flatMap(({ options }) => {\n try {\n return copySections(options.listSections()).map((section) => ({ source: options.source, ...section }));\n } catch (error) {\n const context = this.getContext();\n if (context) options.onError(error, 'listSections', context);\n return [];\n }\n })\n .toSorted(\n (left, right) =>\n left.order - right.order || left.source.localeCompare(right.source) || left.id.localeCompare(right.id),\n );\n }\n\n invoke(invocation: DoomConfigInvocation): void {\n const active = this.contributions.get(invocation.source);\n const context = this.getContext();\n if (!active || !context) return;\n const handler = active.options.handlers[invocation.action];\n if (!handler) return;\n const input: DoomConfigActionInput = {\n ctx: context,\n sectionId: invocation.sectionId,\n fieldId: invocation.fieldId,\n ...(invocation.value === undefined ? {} : { value: invocation.value }),\n };\n void Promise.resolve(handler(input))\n .catch((error: unknown) => active.options.onError(error, invocation.action, context))\n .finally(() => {\n if (this.contributions.get(invocation.source)?.token === active.token) notify(this.listeners);\n });\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n dispose(): void {\n this.contributions.clear();\n notify(this.listeners);\n this.listeners.clear();\n }\n}\n\nexport interface DoomUiHubController extends DoomUiHubService {\n readonly config: DoomUiConfigStore;\n readonly footer: DoomUiFooterStore;\n setContext(context: DoomExtensionContext | undefined): void;\n invokeLeaderAction(source: string, action: string): void;\n dispose(): void;\n}\n\nexport interface CreateDoomUiHubOptions {\n readonly leaderRegistry: DoomLeaderRegistry;\n readonly reportDiagnostics: (diagnostics: readonly DoomLeaderDiagnostic[]) => void;\n}\n\nexport function createDoomUiHub({ leaderRegistry, reportDiagnostics }: CreateDoomUiHubOptions): DoomUiHubController {\n let activeContext: DoomExtensionContext | undefined;\n const leaderGenerations = new Map<string, symbol>();\n const actionHandlers = new Map<\n string,\n { token: symbol; options: DoomLeaderActionHandlerOptions<DoomExtensionContext> }\n >();\n const footer = new DoomUiFooterStore();\n const config = new DoomUiConfigStore(() => activeContext);\n\n return {\n footer,\n config,\n registerLeader(contribution) {\n const token = Symbol(contribution.source);\n const publish = (bindings: readonly LeaderBinding[]): void => {\n const result = leaderRegistry.register({ source: contribution.source, bindings: copyBindings(bindings) });\n reportDiagnostics(result.diagnostics);\n };\n publish(contribution.bindings);\n leaderGenerations.set(contribution.source, token);\n let disposed = false;\n return {\n update(bindings) {\n if (disposed || leaderGenerations.get(contribution.source) !== token) return;\n publish(bindings);\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n if (leaderGenerations.get(contribution.source) !== token) return;\n leaderGenerations.delete(contribution.source);\n publish([]);\n },\n };\n },\n registerLeaderActions(options) {\n const token = Symbol(options.source);\n actionHandlers.set(options.source, {\n token,\n options: options as unknown as DoomLeaderActionHandlerOptions<DoomExtensionContext>,\n });\n let disposed = false;\n return () => {\n if (disposed) return;\n disposed = true;\n if (actionHandlers.get(options.source)?.token === token) actionHandlers.delete(options.source);\n };\n },\n registerFooter: (definition) => footer.register(definition),\n registerConfig: (options) => config.register(options),\n setContext(context) {\n activeContext = context;\n },\n invokeLeaderAction(source, action) {\n const context = activeContext;\n const active = actionHandlers.get(source);\n if (!context || !active) return;\n const handler = active.options.handlers[action];\n if (!handler) return;\n void Promise.resolve(handler(context)).catch((error: unknown) => active.options.onError(error, action, context));\n },\n dispose() {\n activeContext = undefined;\n actionHandlers.clear();\n leaderGenerations.clear();\n footer.dispose();\n config.dispose();\n },\n };\n}\n","import path from 'node:path';\n\nimport { readDoomMcpStatus } from '@agimon-ai/doompi-core/mcpStatus';\nimport { type DoomNotificationLevel, readDoomNotificationService } from '@agimon-ai/doompi-core/notification';\nimport type { PiEventHandlers } from '@agimon-ai/doompi-core/piExtension';\nimport { buildToolSources, type McpServerStatus } from '@agimon-ai/doompi-core/toolInventory';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext, ReadonlyFooterDataProvider } from '@earendil-works/pi-coding-agent';\n\nimport {\n LEADER_WIDGET_KEY,\n TUI_MODE,\n WIDGET_PLACEMENT,\n WARNING_STYLE,\n THEME_ENVIRONMENT_KEY,\n TOOLS_COMMAND,\n CONFIG_COMMAND,\n SESSION_START_EVENT,\n SESSION_MESSAGE_ENTRY,\n INPUT_EVENT,\n INTERACTIVE_INPUT_SOURCE,\n TITLE_MESSAGE_MAX_LENGTH,\n TITLE_PREFIX,\n BUILTIN_LEADER_COMMANDS,\n} from '../constants/ui';\nimport { DoomUiState, type LeaderSnapshot } from '../models/uiState';\nimport { type EventLoopLagSampler, startEventLoopLagSampler } from '../services/eventLoopLag';\nimport { extensionName, extensionPackageName, extensionToolSource } from '../services/extensionSource';\nimport { type DoomLeaderDiagnostic, DoomLeaderRegistry } from '../services/leaderRegistry';\nimport { UI_EVENT, type UiTelemetry } from '../services/telemetry';\nimport { createDoomUiHub } from '../services/uiHub';\nimport { openConfigOverlay } from './configOverlay';\nimport { DoomEditor } from './doomEditor';\nimport { DoomFooter } from './doomFooter';\nimport { DoomHeader } from './doomHeader';\nimport { LeaderHints } from './leaderHints';\nimport { DEFAULT_THEME_NAME } from './theme';\nimport { openToolsOverlay } from './toolsOverlay';\n\nfunction notify(cordis: Context, context: ExtensionContext, body: string, level: DoomNotificationLevel): void {\n const service = readDoomNotificationService(cordis);\n if (service) {\n try {\n void Promise.resolve(service.request({ body, level })).catch(() => undefined);\n } catch {\n // Notification delivery is best effort and does not fall back after routing.\n }\n return;\n }\n context.ui.notify(body, level);\n}\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\nexport interface UiRuntime {\n readonly hub: ReturnType<typeof createDoomUiHub>;\n readonly uiState: DoomUiState;\n readonly commands: readonly (readonly [...Parameters<ExtensionAPI['registerCommand']>])[];\n readonly events: PiEventHandlers;\n dispose(): Promise<void>;\n}\n\nexport function createUiRuntime(cordis: Context, { pi, telemetry }: UiPluginOptions): UiRuntime {\n let disposed = false;\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 let lagSampler: EventLoopLagSampler | undefined;\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 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) notify(cordis, activeContext, message, WARNING_STYLE);\n }\n };\n\n const hub = createDoomUiHub({ leaderRegistry, reportDiagnostics });\n return {\n hub,\n uiState,\n async dispose() {\n if (disposed) return;\n disposed = true;\n const context = activeContext;\n ++sessionGeneration;\n activeContext = undefined;\n hub.setContext(undefined);\n footerData = undefined;\n lagSampler?.stop();\n lagSampler = 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 commands: [\n [\n TOOLS_COMMAND,\n {\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 resolveExtensionPackageName: extensionPackageName,\n resolveExtensionToolSource: (toolName) => extensionToolSource(pi, toolName),\n });\n await openToolsOverlay(ctx, sources);\n },\n },\n ],\n\n [\n CONFIG_COMMAND,\n {\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 ],\n events: {\n [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) notify(cordis, ctx, message, WARNING_STYLE);\n\n // A resumed or forked session runs this again, and two samplers would\n // double every report.\n lagSampler?.stop();\n lagSampler = startEventLoopLagSampler((lagMs) => {\n void telemetry.recordWarning(UI_EVENT.eventLoopStalled, `Event loop stalled for ${String(lagMs)}ms.`, {\n lag_ms: lagMs,\n });\n });\n\n const themeName = process.env[THEME_ENVIRONMENT_KEY] || DEFAULT_THEME_NAME;\n const themeResult = ctx.ui.setTheme(themeName);\n if (!themeResult.success) {\n notify(cordis, ctx, `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) =>\n 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.includes(commandName) ||\n pi.getCommands().some((command) => command.name === commandName),\n onLeaderAction: (source, action) => {\n if (activeContext !== ctx || sessionGeneration !== activeGeneration) {\n notify(cordis, ctx, `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 notify(cordis, ctx, `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 notify(cordis, ctx, `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 [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 };\n}\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\nimport { DOOM_UI_HUB_SERVICE } from '@agimon-ai/doompi-core/uiHub';\nimport {\n DOOM_MINOR_MODE_CATALOG_SERVICE,\n createMinorModeCatalogClient,\n requireMinorModeCatalog,\n} from '@agimon-ai/doompi-minor-mode';\n\nimport { projectMinorModeRecords } from '../../../../models/uiState';\nimport { createUiTelemetry, type UiTelemetry } from '../../../../services/telemetry';\nimport { createBuiltinTools } from '../../../../tui/builtinTools';\nimport { createUiRuntime } from '../../../../tui/uiRuntime';\nimport type { UiPiScope } from './_lib/piScope';\n\nexport default defineRoot(({ context, pi, options, runtime }: PiPluginContext<UiTelemetry>) => {\n if (!runtime) throw new Error('This Pi extension requires the Cordis runtime metadata.');\n const ui = createUiRuntime(context, { pi, telemetry: options ?? createUiTelemetry() });\n const tools = createBuiltinTools(process.cwd());\n const service = (owner: PiPluginContext['context']) => {\n owner.provide(DOOM_UI_HUB_SERVICE, ui.hub);\n owner.inject([DOOM_MINOR_MODE_CATALOG_SERVICE], (modeContext) => {\n const catalog = createMinorModeCatalogClient(requireMinorModeCatalog(modeContext));\n const update = (): void => ui.uiState.setModes(projectMinorModeRecords(catalog.list()));\n const unsubscribe = catalog.subscribe(update);\n update();\n return () => {\n unsubscribe();\n ui.uiState.setModes([]);\n };\n });\n };\n return {\n value: { ui, tools, runtime } satisfies UiPiScope,\n services: [service],\n onStop: () => ui.dispose(),\n onDispose: () => ui.dispose(),\n };\n});\n","import { defineCliCommand } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliCommand(\n (context: WithRoot<PiPluginContext<unknown>, UiPiScope>) => context.root.ui.commands[1],\n);\n","import { defineCliCommand } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliCommand(\n (context: WithRoot<PiPluginContext<unknown>, UiPiScope>) => context.root.ui.commands[0],\n);\n","import { defineCliHook } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliHook((context: WithRoot<PiPluginContext<unknown>, UiPiScope>) => context.root.ui.events.input!);\n","import { defineCliHook } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliHook(\n (context: WithRoot<PiPluginContext<unknown>, UiPiScope>) => context.root.ui.events.session_start!,\n);\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'edit');\n if (!tool) throw new Error('Missing built-in edit tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'find');\n if (!tool) throw new Error('Missing built-in find tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'grep');\n if (!tool) throw new Error('Missing built-in grep tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'ls');\n if (!tool) throw new Error('Missing built-in ls tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'read');\n if (!tool) throw new Error('Missing built-in read tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'write');\n if (!tool) throw new Error('Missing built-in write tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, piToolContributions, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport commandConfig from '../src/extensions/workspaces/sessions/(backend)/command/config.cli';\nimport commandTools from '../src/extensions/workspaces/sessions/(backend)/command/tools.cli';\nimport hookInput from '../src/extensions/workspaces/sessions/(backend)/hook/input.cli';\nimport hookSessionStart from '../src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli';\nimport toolEdit from '../src/extensions/workspaces/sessions/(backend)/tool/edit.cli';\nimport toolFind from '../src/extensions/workspaces/sessions/(backend)/tool/find.cli';\nimport toolGrep from '../src/extensions/workspaces/sessions/(backend)/tool/grep.cli';\nimport toolLs from '../src/extensions/workspaces/sessions/(backend)/tool/ls.cli';\nimport toolRead from '../src/extensions/workspaces/sessions/(backend)/tool/read.cli';\nimport toolWrite from '../src/extensions/workspaces/sessions/(backend)/tool/write.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof commandConfig> | OptionsOf<typeof commandTools> | OptionsOf<typeof hookInput> | OptionsOf<typeof hookSessionStart> | OptionsOf<typeof toolEdit> | OptionsOf<typeof toolFind> | OptionsOf<typeof toolGrep> | OptionsOf<typeof toolLs> | OptionsOf<typeof toolRead> | OptionsOf<typeof toolWrite>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-ui', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): PiPluginContributions['commands'] { return [at(commandConfig, contextSession), at(commandTools, contextSession)]; },\n events: {\n input: at(hookInput, contextSession) as NonNullable<PiPluginContributions['events']>['input'],\n session_start: at(hookSessionStart, contextSession) as NonNullable<PiPluginContributions['events']>['session_start'],\n },\n ...piToolContributions('@agimon-ai/doompi-ui', [via({ name: 'edit' }, at(toolEdit, contextSession)), via({ name: 'find' }, at(toolFind, contextSession)), via({ name: 'grep' }, at(toolGrep, contextSession)), via({ name: 'ls' }, at(toolLs, contextSession)), via({ name: 'read' }, at(toolRead, contextSession)), via({ name: 'write' }, at(toolWrite, contextSession))]),\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pi.mjs","names":["notify","rootSession","commandConfig","commandTools","hookInput","hookSessionStart","toolEdit","toolFind","toolGrep","toolLs","toolRead","toolWrite"],"sources":["../../src/tui/builtinToolRender.ts","../../src/tui/builtinTools.ts","../../src/services/eventLoopLag/index.ts","../../src/services/uiHub/index.ts","../../src/tui/uiRuntime.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/config.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/tools.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/input.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/edit.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/find.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/grep.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/ls.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/read.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/write.cli.ts","../../generated/pi.ts"],"sourcesContent":["import {\n type EditToolDetails,\n type EditToolInput,\n type FindToolInput,\n type GrepToolInput,\n getLanguageFromPath,\n highlightCode,\n type LsToolInput,\n type ReadToolInput,\n type Theme,\n type WriteToolInput,\n} from '@earendil-works/pi-coding-agent';\nimport { type Component, wrapTextWithAnsi } from '@earendil-works/pi-tui';\n\nimport { gutterWidth, renderLineNumber } from './codeGutter';\nimport { renderDoomDiff } from './diffRender';\nimport { DoomToolCall, frameDoomToolResult, previousDoomToolResult, renderToolHeading } from './toolChrome';\n\nconst COLLAPSED_FILE_LINES = 10;\n\ntype Highlighter = (code: string, language?: string) => string[];\ntype LanguageResolver = (path: string) => string | undefined;\n\nexport interface ToolPreviewOptions {\n expanded?: boolean;\n isError?: boolean;\n}\n\nexport interface WritePreviewOptions extends ToolPreviewOptions {\n argsStreaming?: boolean;\n}\n\nexport interface TextToolResult {\n content?: ReadonlyArray<{ type: string; text?: string }>;\n}\n\nexport interface EditToolResult extends TextToolResult {\n details?: EditToolDetails;\n}\n\n/** Self-owned result shell shared by Pi's native file and search tools. */\nclass BuiltinToolContent implements Component {\n constructor(private readonly text: string) {}\n\n render(width: number): string[] {\n if (width <= 0 || this.text.length === 0) return [];\n return wrapTextWithAnsi(this.text, width);\n }\n\n invalidate(): void {\n // Content is immutable and reflows from the current width on every render.\n }\n}\n\n/** Recover the native renderer's component from the shell returned on its previous pass. */\nexport function previousBuiltinResult(component: Component | undefined): Component | undefined {\n return previousDoomToolResult(component);\n}\n\n/** Reuse the shell while allowing Pi's native renderer to reuse its own inner component. */\nexport function frameBuiltinResult(content: Component, theme: Theme, previous: Component | undefined): Component {\n return frameDoomToolResult(content, theme, previous);\n}\n\nfunction renderCall(label: string, primary: string, details: readonly string[], theme: Theme): Component {\n let text = renderToolHeading(label, primary, theme);\n if (details.length > 0) text += ` ${theme.fg('muted', `· ${details.join(' · ')}`)}`;\n return new DoomToolCall(text);\n}\n\nfunction optionalCount(value: number | undefined, unit: string): string | undefined {\n return value === undefined ? undefined : `${value} ${unit}`;\n}\n\nfunction compactDetails(values: ReadonlyArray<string | undefined>): string[] {\n return values.filter((value): value is string => value !== undefined && value.length > 0);\n}\n\nexport function renderReadCall(args: ReadToolInput, theme: Theme): Component {\n return renderCall(\n 'read',\n args.path,\n compactDetails([args.offset === undefined ? undefined : `from ${args.offset}`, optionalCount(args.limit, 'lines')]),\n theme,\n );\n}\n\nexport function renderEditCall(args: EditToolInput, theme: Theme): Component {\n const count = args.edits.length;\n return renderCall('edit', args.path, [`${count} edit${count === 1 ? '' : 's'}`], theme);\n}\n\n/**\n * Read appends a bracketed pagination note after a blank line. Detach it so the\n * gutter numbers file content only, and mutate the caller's line list to match.\n */\nfunction takeTrailingNote(lines: string[]): string | undefined {\n const last = lines.at(-1);\n if (last === undefined || !last.startsWith('[') || !last.endsWith(']')) return undefined;\n\n lines.pop();\n while (lines.at(-1) === '') lines.pop();\n return last;\n}\n\nfunction textContent(result: TextToolResult): string {\n return (result.content ?? [])\n .filter((block) => block.type === 'text')\n .map((block) => block.text ?? '')\n .join('\\n')\n .replaceAll('\\t', ' ')\n .replaceAll('\\r\\n', '\\n');\n}\n\nexport function renderEditResult(\n args: EditToolInput,\n result: EditToolResult,\n options: ToolPreviewOptions,\n theme: Theme,\n highlight: Highlighter = highlightCode,\n resolveLanguage: LanguageResolver = getLanguageFromPath,\n): Component {\n if (options.isError) return new BuiltinToolContent(theme.fg('error', textContent(result)));\n\n const diff = result.details?.diff;\n // A successful edit whose details never arrived has nothing worth a frame.\n if (diff === undefined || diff.length === 0) return new BuiltinToolContent('');\n return renderDoomDiff(diff, theme, resolveLanguage(args.path), highlight);\n}\n\nexport function renderWriteCall(\n args: WriteToolInput,\n theme: Theme,\n options: WritePreviewOptions = {},\n highlight: Highlighter = highlightCode,\n resolveLanguage: LanguageResolver = getLanguageFromPath,\n): Component {\n const heading = renderToolHeading('write', args.path, theme);\n const details = theme.fg('muted', `· ${args.content.length.toLocaleString('en-US')} chars`);\n if (args.content.length === 0) return new DoomToolCall(`${heading} ${details}`);\n\n const normalizedLines = args.content.replaceAll('\\t', ' ').replaceAll('\\r\\n', '\\n').split('\\n');\n while (normalizedLines.at(-1) === '') normalizedLines.pop();\n const showLiveTail = options.argsStreaming === true && options.expanded !== true;\n const visibleLines = options.expanded\n ? normalizedLines\n : showLiveTail\n ? normalizedLines.slice(-COLLAPSED_FILE_LINES)\n : normalizedLines.slice(0, COLLAPSED_FILE_LINES);\n const language = resolveLanguage(args.path);\n const highlighted = language\n ? highlight(visibleLines.join('\\n'), language)\n : visibleLines.map((line) => theme.fg('toolOutput', line));\n const hiddenLineCount = normalizedLines.length - visibleLines.length;\n // A live tail shows the file's end, so numbering starts where the tail does.\n const firstVisibleLineNumber = showLiveTail ? hiddenLineCount + 1 : 1;\n const numberWidth = gutterWidth(firstVisibleLineNumber + visibleLines.length - 1);\n const preview = highlighted.map(\n (line, index) => `${renderLineNumber(firstVisibleLineNumber + index, numberWidth, theme)} ${line}`,\n );\n const previewLines = showLiveTail\n ? [\n ...(hiddenLineCount > 0 ? [theme.fg('muted', `… ${hiddenLineCount} earlier lines · live tail`)] : []),\n ...preview,\n ]\n : [\n ...preview,\n ...(hiddenLineCount > 0 ? [theme.fg('muted', `… ${hiddenLineCount} more lines · ctrl+o expand`)] : []),\n ];\n return new DoomToolCall([`${heading} ${details}`, '', ...previewLines].join('\\n'));\n}\n\nexport function renderReadResult(\n args: ReadToolInput,\n result: TextToolResult,\n options: ToolPreviewOptions,\n theme: Theme,\n highlight: Highlighter = highlightCode,\n resolveLanguage: LanguageResolver = getLanguageFromPath,\n): Component {\n const normalizedLines = textContent(result).split('\\n');\n while (normalizedLines.at(-1) === '') normalizedLines.pop();\n if (options.isError) {\n return new BuiltinToolContent(normalizedLines.map((line) => theme.fg('error', line)).join('\\n'));\n }\n\n const note = takeTrailingNote(normalizedLines);\n const visibleLines = options.expanded ? normalizedLines : normalizedLines.slice(0, COLLAPSED_FILE_LINES);\n const language = resolveLanguage(args.path);\n const highlighted = language\n ? highlight(visibleLines.join('\\n'), language)\n : visibleLines.map((line) => theme.fg('toolOutput', line));\n // Read starts at `offset`, so the gutter has to agree with the file, not the excerpt.\n const firstLineNumber = args.offset ?? 1;\n const numberWidth = gutterWidth(firstLineNumber + visibleLines.length - 1);\n const preview = highlighted.map(\n (line, index) => `${renderLineNumber(firstLineNumber + index, numberWidth, theme)} ${line}`,\n );\n const remaining = normalizedLines.length - visibleLines.length;\n if (remaining > 0) preview.push(theme.fg('muted', `… ${remaining} more lines · ctrl+o expand`));\n if (note !== undefined) preview.push(theme.fg('muted', note));\n return new BuiltinToolContent(preview.join('\\n'));\n}\n\nexport function renderGrepCall(args: GrepToolInput, theme: Theme): Component {\n return renderCall(\n 'grep',\n args.pattern,\n compactDetails([\n args.path ?? '.',\n args.glob,\n args.ignoreCase === true ? 'ignore case' : undefined,\n optionalCount(args.limit, 'matches'),\n ]),\n theme,\n );\n}\n\nexport function renderFindCall(args: FindToolInput, theme: Theme): Component {\n return renderCall(\n 'find',\n args.pattern,\n compactDetails([args.path ?? '.', optionalCount(args.limit, 'results')]),\n theme,\n );\n}\n\nexport function renderLsCall(args: LsToolInput, theme: Theme): Component {\n return renderCall('ls', args.path ?? '.', compactDetails([optionalCount(args.limit, 'entries')]), theme);\n}\n","import { definePiTool, type PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\nimport {\n createEditToolDefinition,\n createFindToolDefinition,\n createGrepToolDefinition,\n createLsToolDefinition,\n createReadToolDefinition,\n createWriteToolDefinition,\n} from '@earendil-works/pi-coding-agent';\n\nimport {\n frameBuiltinResult,\n previousBuiltinResult,\n renderEditCall,\n renderEditResult,\n renderFindCall,\n renderGrepCall,\n renderLsCall,\n renderReadCall,\n renderReadResult,\n renderWriteCall,\n} from './builtinToolRender';\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 createBuiltinTools(cwd: string): PiToolDeclaration[] {\n const tools: PiToolDeclaration[] = [];\n const read = createReadToolDefinition(cwd);\n tools.push(\n definePiTool({\n ...read,\n execute: (...args: Parameters<typeof read.execute>) => createReadToolDefinition(args[4].cwd).execute(...args),\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\n const edit = createEditToolDefinition(cwd);\n tools.push(\n definePiTool({\n ...edit,\n execute: (...args: Parameters<typeof edit.execute>) => createEditToolDefinition(args[4].cwd).execute(...args),\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\n const write = createWriteToolDefinition(cwd);\n const writeResult = write.renderResult!;\n tools.push(\n definePiTool({\n ...write,\n execute: (...args: Parameters<typeof write.execute>) => createWriteToolDefinition(args[4].cwd).execute(...args),\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\n const grep = createGrepToolDefinition(cwd);\n const grepResult = grep.renderResult!;\n tools.push(\n definePiTool({\n ...grep,\n execute: (...args: Parameters<typeof grep.execute>) => createGrepToolDefinition(args[4].cwd).execute(...args),\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\n const find = createFindToolDefinition(cwd);\n const findResult = find.renderResult!;\n tools.push(\n definePiTool({\n ...find,\n execute: (...args: Parameters<typeof find.execute>) => createFindToolDefinition(args[4].cwd).execute(...args),\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\n const ls = createLsToolDefinition(cwd);\n const lsResult = ls.renderResult!;\n tools.push(\n definePiTool({\n ...ls,\n execute: (...args: Parameters<typeof ls.execute>) => createLsToolDefinition(args[4].cwd).execute(...args),\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 return tools;\n}\n","/** How often the sampler asks to be woken. Short enough to catch a stall inside a single tool call. */\nconst SAMPLE_INTERVAL_MS = 250;\n/**\n * Below this, a late timer is ordinary scheduling jitter rather than something a\n * user would feel. Reporting every sample would cost more than it measures.\n */\nconst REPORT_THRESHOLD_MS = 250;\n\nexport interface EventLoopLagSampler {\n stop(): void;\n}\n\n/**\n * Reports how far behind schedule the event loop is running.\n *\n * A timer that wakes late is the only signal from inside the process that\n * something synchronous, garbage collection included, held the loop. Nothing in\n * a session transcript records it, so a stall here is otherwise invisible and\n * reads as a slow model or a slow tool.\n */\nexport function startEventLoopLagSampler(report: (lagMs: number) => void): EventLoopLagSampler {\n let expected = Date.now() + SAMPLE_INTERVAL_MS;\n const timer = setInterval(() => {\n const now = Date.now();\n const lagMs = now - expected;\n // Rebased on the wake that just happened rather than advanced by a fixed\n // step, so one long stall does not report itself again on every later tick.\n expected = now + SAMPLE_INTERVAL_MS;\n if (lagMs >= REPORT_THRESHOLD_MS) report(lagMs);\n }, SAMPLE_INTERVAL_MS);\n // A diagnostic must never be the reason a process refuses to exit.\n timer.unref();\n return {\n stop: () => {\n clearInterval(timer);\n },\n };\n}\n","import type {\n ConfigSection,\n DoomConfigActionInput,\n DoomConfigContributionHandle,\n DoomConfigContributionOptions,\n DoomConfigInvocation,\n DoomConfigSectionView,\n DoomExtensionContext,\n} from '@agimon-ai/doompi-core/config';\nimport type {\n DoomFooterContributionDefinition,\n DoomFooterContributionHandle,\n DoomFooterContributionValue,\n DoomFooterStatus,\n} from '@agimon-ai/doompi-core/footer';\nimport type { DoomLeaderActionHandlerOptions, LeaderBinding } from '@agimon-ai/doompi-core/leader';\nimport type { DoomUiHubService } from '@agimon-ai/doompi-core/uiHub';\n\nimport type { DoomLeaderDiagnostic, DoomLeaderRegistry } from '../leaderRegistry';\n\ntype Listener = () => void;\n\nfunction notify(listeners: ReadonlySet<Listener>): void {\n for (const listener of listeners) listener();\n}\n\nfunction copyBindings(bindings: readonly LeaderBinding[]): LeaderBinding[] {\n return bindings.map((binding) => ({\n ...binding,\n path: binding.path.map((segment) => ({ ...segment })) as [\n LeaderBinding['path'][number],\n ...LeaderBinding['path'][number][],\n ],\n ...('command' in binding ? { command: { ...binding.command } } : { action: { ...binding.action } }),\n }));\n}\n\nfunction copySections(sections: readonly ConfigSection[]): ConfigSection[] {\n return sections.map((section) => ({\n ...section,\n fields: section.fields.map((field) => ({\n ...field,\n ...(field.choices ? { choices: field.choices.map((choice) => ({ ...choice })) } : {}),\n ...(field.actions ? { actions: field.actions.map((action) => ({ ...action })) } : {}),\n ...(field.steps ? { steps: field.steps.map((step) => ({ ...step })) } : {}),\n ...(field.output ? { output: [...field.output] } : {}),\n })),\n }));\n}\n\ninterface ActiveFooterContribution {\n readonly token: symbol;\n readonly definition: DoomFooterContributionDefinition;\n value?: DoomFooterContributionValue;\n}\n\nexport class DoomUiFooterStore {\n private readonly contributions = new Map<string, ActiveFooterContribution>();\n private readonly listeners = new Set<Listener>();\n\n register(definition: DoomFooterContributionDefinition): DoomFooterContributionHandle {\n const token = Symbol(definition.source);\n const contribution: ActiveFooterContribution = { token, definition: { ...definition } };\n this.contributions.set(definition.source, contribution);\n notify(this.listeners);\n let disposed = false;\n return {\n update: (value) => {\n if (disposed || this.contributions.get(definition.source)?.token !== token) return;\n contribution.value = value\n ? {\n ...value,\n ...(value.fullSegments ? { fullSegments: value.fullSegments.map((segment) => ({ ...segment })) } : {}),\n ...(value.compactSegments\n ? { compactSegments: value.compactSegments.map((segment) => ({ ...segment })) }\n : {}),\n }\n : undefined;\n notify(this.listeners);\n },\n dispose: () => {\n if (disposed) return;\n disposed = true;\n if (this.contributions.get(definition.source)?.token !== token) return;\n this.contributions.delete(definition.source);\n notify(this.listeners);\n },\n };\n }\n\n getStatuses(): DoomFooterStatus[] {\n return [...this.contributions.values()]\n .flatMap(({ definition, value }) =>\n value\n ? [\n {\n source: definition.source,\n id: definition.id,\n order: definition.order,\n ...(definition.placement ? { placement: definition.placement } : {}),\n ...value,\n },\n ]\n : [],\n )\n .toSorted(\n (left, right) =>\n left.order - right.order || left.source.localeCompare(right.source) || left.id.localeCompare(right.id),\n );\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n dispose(): void {\n this.contributions.clear();\n notify(this.listeners);\n this.listeners.clear();\n }\n}\n\ninterface ActiveConfigContribution {\n readonly token: symbol;\n readonly options: DoomConfigContributionOptions<DoomExtensionContext>;\n}\n\nexport class DoomUiConfigStore {\n private readonly contributions = new Map<string, ActiveConfigContribution>();\n private readonly listeners = new Set<Listener>();\n\n constructor(private readonly getContext: () => DoomExtensionContext | undefined) {}\n\n register<ExtensionContext extends DoomExtensionContext>(\n options: DoomConfigContributionOptions<ExtensionContext>,\n ): DoomConfigContributionHandle {\n const token = Symbol(options.source);\n const contribution = {\n token,\n options: options as unknown as DoomConfigContributionOptions<DoomExtensionContext>,\n };\n this.contributions.set(options.source, contribution);\n notify(this.listeners);\n let disposed = false;\n return {\n update: () => {\n if (!disposed && this.contributions.get(options.source)?.token === token) notify(this.listeners);\n },\n dispose: () => {\n if (disposed) return;\n disposed = true;\n if (this.contributions.get(options.source)?.token !== token) return;\n this.contributions.delete(options.source);\n notify(this.listeners);\n },\n };\n }\n\n getSections(): DoomConfigSectionView[] {\n return [...this.contributions.values()]\n .flatMap(({ options }) => {\n try {\n return copySections(options.listSections()).map((section) => ({ source: options.source, ...section }));\n } catch (error) {\n const context = this.getContext();\n if (context) options.onError(error, 'listSections', context);\n return [];\n }\n })\n .toSorted(\n (left, right) =>\n left.order - right.order || left.source.localeCompare(right.source) || left.id.localeCompare(right.id),\n );\n }\n\n invoke(invocation: DoomConfigInvocation): void {\n const active = this.contributions.get(invocation.source);\n const context = this.getContext();\n if (!active || !context) return;\n const handler = active.options.handlers[invocation.action];\n if (!handler) return;\n const input: DoomConfigActionInput = {\n ctx: context,\n sectionId: invocation.sectionId,\n fieldId: invocation.fieldId,\n ...(invocation.value === undefined ? {} : { value: invocation.value }),\n };\n void Promise.resolve(handler(input))\n .catch((error: unknown) => active.options.onError(error, invocation.action, context))\n .finally(() => {\n if (this.contributions.get(invocation.source)?.token === active.token) notify(this.listeners);\n });\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n dispose(): void {\n this.contributions.clear();\n notify(this.listeners);\n this.listeners.clear();\n }\n}\n\nexport interface DoomUiHubController extends DoomUiHubService {\n readonly config: DoomUiConfigStore;\n readonly footer: DoomUiFooterStore;\n setContext(context: DoomExtensionContext | undefined): void;\n invokeLeaderAction(source: string, action: string): void;\n dispose(): void;\n}\n\nexport interface CreateDoomUiHubOptions {\n readonly leaderRegistry: DoomLeaderRegistry;\n readonly reportDiagnostics: (diagnostics: readonly DoomLeaderDiagnostic[]) => void;\n}\n\nexport function createDoomUiHub({ leaderRegistry, reportDiagnostics }: CreateDoomUiHubOptions): DoomUiHubController {\n let activeContext: DoomExtensionContext | undefined;\n const leaderGenerations = new Map<string, symbol>();\n const actionHandlers = new Map<\n string,\n { token: symbol; options: DoomLeaderActionHandlerOptions<DoomExtensionContext> }\n >();\n const footer = new DoomUiFooterStore();\n const config = new DoomUiConfigStore(() => activeContext);\n\n return {\n footer,\n config,\n registerLeader(contribution) {\n const token = Symbol(contribution.source);\n const publish = (bindings: readonly LeaderBinding[]): void => {\n const result = leaderRegistry.register({ source: contribution.source, bindings: copyBindings(bindings) });\n reportDiagnostics(result.diagnostics);\n };\n publish(contribution.bindings);\n leaderGenerations.set(contribution.source, token);\n let disposed = false;\n return {\n update(bindings) {\n if (disposed || leaderGenerations.get(contribution.source) !== token) return;\n publish(bindings);\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n if (leaderGenerations.get(contribution.source) !== token) return;\n leaderGenerations.delete(contribution.source);\n publish([]);\n },\n };\n },\n registerLeaderActions(options) {\n const token = Symbol(options.source);\n actionHandlers.set(options.source, {\n token,\n options: options as unknown as DoomLeaderActionHandlerOptions<DoomExtensionContext>,\n });\n let disposed = false;\n return () => {\n if (disposed) return;\n disposed = true;\n if (actionHandlers.get(options.source)?.token === token) actionHandlers.delete(options.source);\n };\n },\n registerFooter: (definition) => footer.register(definition),\n registerConfig: (options) => config.register(options),\n setContext(context) {\n activeContext = context;\n },\n invokeLeaderAction(source, action) {\n const context = activeContext;\n const active = actionHandlers.get(source);\n if (!context || !active) return;\n const handler = active.options.handlers[action];\n if (!handler) return;\n void Promise.resolve(handler(context)).catch((error: unknown) => active.options.onError(error, action, context));\n },\n dispose() {\n activeContext = undefined;\n actionHandlers.clear();\n leaderGenerations.clear();\n footer.dispose();\n config.dispose();\n },\n };\n}\n","import path from 'node:path';\n\nimport { readDoomMcpStatus } from '@agimon-ai/doompi-core/mcpStatus';\nimport { type DoomNotificationLevel, readDoomNotificationService } from '@agimon-ai/doompi-core/notification';\nimport type { PiEventHandlers } from '@agimon-ai/doompi-core/piExtension';\nimport { buildToolSources, type McpServerStatus } from '@agimon-ai/doompi-core/toolInventory';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext, ReadonlyFooterDataProvider } from '@earendil-works/pi-coding-agent';\n\nimport {\n LEADER_WIDGET_KEY,\n TUI_MODE,\n WIDGET_PLACEMENT,\n WARNING_STYLE,\n THEME_ENVIRONMENT_KEY,\n TOOLS_COMMAND,\n CONFIG_COMMAND,\n SESSION_START_EVENT,\n SESSION_MESSAGE_ENTRY,\n INPUT_EVENT,\n INTERACTIVE_INPUT_SOURCE,\n TITLE_MESSAGE_MAX_LENGTH,\n TITLE_PREFIX,\n BUILTIN_LEADER_COMMANDS,\n} from '../constants/ui';\nimport { DoomUiState, type LeaderSnapshot } from '../models/uiState';\nimport { type EventLoopLagSampler, startEventLoopLagSampler } from '../services/eventLoopLag';\nimport { extensionName, extensionPackageName, extensionToolSource } from '../services/extensionSource';\nimport { type DoomLeaderDiagnostic, DoomLeaderRegistry } from '../services/leaderRegistry';\nimport { UI_EVENT, type UiTelemetry } from '../services/telemetry';\nimport { createDoomUiHub } from '../services/uiHub';\nimport { openConfigOverlay } from './configOverlay';\nimport { DoomEditor } from './doomEditor';\nimport { DoomFooter } from './doomFooter';\nimport { DoomHeader } from './doomHeader';\nimport { LeaderHints } from './leaderHints';\nimport { DEFAULT_THEME_NAME } from './theme';\nimport { openToolsOverlay } from './toolsOverlay';\n\nfunction notify(cordis: Context, context: ExtensionContext, body: string, level: DoomNotificationLevel): void {\n const service = readDoomNotificationService(cordis);\n if (service) {\n try {\n void Promise.resolve(service.request({ body, level })).catch(() => undefined);\n } catch {\n // Notification delivery is best effort and does not fall back after routing.\n }\n return;\n }\n context.ui.notify(body, level);\n}\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\nexport interface UiRuntime {\n readonly hub: ReturnType<typeof createDoomUiHub>;\n readonly uiState: DoomUiState;\n readonly commands: readonly (readonly [...Parameters<ExtensionAPI['registerCommand']>])[];\n readonly events: PiEventHandlers;\n dispose(): Promise<void>;\n}\n\nexport function createUiRuntime(cordis: Context, { pi, telemetry }: UiPluginOptions): UiRuntime {\n let disposed = false;\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 let lagSampler: EventLoopLagSampler | undefined;\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 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) notify(cordis, activeContext, message, WARNING_STYLE);\n }\n };\n\n const hub = createDoomUiHub({ leaderRegistry, reportDiagnostics });\n return {\n hub,\n uiState,\n async dispose() {\n if (disposed) return;\n disposed = true;\n const context = activeContext;\n ++sessionGeneration;\n activeContext = undefined;\n hub.setContext(undefined);\n footerData = undefined;\n lagSampler?.stop();\n lagSampler = 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 commands: [\n [\n TOOLS_COMMAND,\n {\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 resolveExtensionPackageName: extensionPackageName,\n resolveExtensionToolSource: (toolName) => extensionToolSource(pi, toolName),\n });\n await openToolsOverlay(ctx, sources);\n },\n },\n ],\n\n [\n CONFIG_COMMAND,\n {\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 ],\n events: {\n [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) notify(cordis, ctx, message, WARNING_STYLE);\n\n // A resumed or forked session runs this again, and two samplers would\n // double every report.\n lagSampler?.stop();\n lagSampler = startEventLoopLagSampler((lagMs) => {\n void telemetry.recordWarning(UI_EVENT.eventLoopStalled, `Event loop stalled for ${String(lagMs)}ms.`, {\n lag_ms: lagMs,\n });\n });\n\n const themeName = process.env[THEME_ENVIRONMENT_KEY] || DEFAULT_THEME_NAME;\n const themeResult = ctx.ui.setTheme(themeName);\n if (!themeResult.success) {\n notify(cordis, ctx, `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) =>\n 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.includes(commandName) ||\n pi.getCommands().some((command) => command.name === commandName),\n onLeaderAction: (source, action) => {\n if (activeContext !== ctx || sessionGeneration !== activeGeneration) {\n notify(cordis, ctx, `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 notify(cordis, ctx, `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 notify(cordis, ctx, `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 [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 };\n}\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\nimport { DOOM_UI_HUB_SERVICE } from '@agimon-ai/doompi-core/uiHub';\nimport {\n DOOM_MINOR_MODE_CATALOG_SERVICE,\n createMinorModeCatalogClient,\n requireMinorModeCatalog,\n} from '@agimon-ai/doompi-minor-mode';\n\nimport { projectMinorModeRecords } from '../../../../models/uiState';\nimport { createUiTelemetry, type UiTelemetry } from '../../../../services/telemetry';\nimport { createBuiltinTools } from '../../../../tui/builtinTools';\nimport { createUiRuntime } from '../../../../tui/uiRuntime';\nimport type { UiPiScope } from './_lib/piScope';\n\nexport default defineRoot(({ context, pi, options, runtime }: PiPluginContext<UiTelemetry>) => {\n if (!runtime) throw new Error('This Pi extension requires the Cordis runtime metadata.');\n const ui = createUiRuntime(context, { pi, telemetry: options ?? createUiTelemetry() });\n const tools = createBuiltinTools(process.cwd());\n const service = (owner: PiPluginContext['context']) => {\n owner.provide(DOOM_UI_HUB_SERVICE, ui.hub);\n owner.inject([DOOM_MINOR_MODE_CATALOG_SERVICE], (modeContext) => {\n const catalog = createMinorModeCatalogClient(requireMinorModeCatalog(modeContext));\n const update = (): void => ui.uiState.setModes(projectMinorModeRecords(catalog.list()));\n const unsubscribe = catalog.subscribe(update);\n update();\n return () => {\n unsubscribe();\n ui.uiState.setModes([]);\n };\n });\n };\n return {\n value: { ui, tools, runtime } satisfies UiPiScope,\n services: [service],\n onStop: () => ui.dispose(),\n onDispose: () => ui.dispose(),\n };\n});\n","import { defineCliCommand } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliCommand(\n (context: WithRoot<PiPluginContext<unknown>, UiPiScope>) => context.root.ui.commands[1],\n);\n","import { defineCliCommand } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliCommand(\n (context: WithRoot<PiPluginContext<unknown>, UiPiScope>) => context.root.ui.commands[0],\n);\n","import { defineCliHook } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliHook((context: WithRoot<PiPluginContext<unknown>, UiPiScope>) => context.root.ui.events.input!);\n","import { defineCliHook } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliHook(\n (context: WithRoot<PiPluginContext<unknown>, UiPiScope>) => context.root.ui.events.session_start!,\n);\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'edit');\n if (!tool) throw new Error('Missing built-in edit tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'find');\n if (!tool) throw new Error('Missing built-in find tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'grep');\n if (!tool) throw new Error('Missing built-in grep tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'ls');\n if (!tool) throw new Error('Missing built-in ls tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'read');\n if (!tool) throw new Error('Missing built-in read tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { UiPiScope } from '../_lib/piScope';\nexport default defineCliTool((context: WithRoot<PiPluginContext<unknown>, UiPiScope>): PiToolDeclaration => {\n const tool = context.root.tools.find((candidate) => candidate.name === 'write');\n if (!tool) throw new Error('Missing built-in write tool.');\n return { ...tool, overrides: context.root.runtime.mode !== 'composed' };\n});\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, piToolContributions, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport commandConfig from '../src/extensions/workspaces/sessions/(backend)/command/config.cli';\nimport commandTools from '../src/extensions/workspaces/sessions/(backend)/command/tools.cli';\nimport hookInput from '../src/extensions/workspaces/sessions/(backend)/hook/input.cli';\nimport hookSessionStart from '../src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli';\nimport toolEdit from '../src/extensions/workspaces/sessions/(backend)/tool/edit.cli';\nimport toolFind from '../src/extensions/workspaces/sessions/(backend)/tool/find.cli';\nimport toolGrep from '../src/extensions/workspaces/sessions/(backend)/tool/grep.cli';\nimport toolLs from '../src/extensions/workspaces/sessions/(backend)/tool/ls.cli';\nimport toolRead from '../src/extensions/workspaces/sessions/(backend)/tool/read.cli';\nimport toolWrite from '../src/extensions/workspaces/sessions/(backend)/tool/write.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof commandConfig> | OptionsOf<typeof commandTools> | OptionsOf<typeof hookInput> | OptionsOf<typeof hookSessionStart> | OptionsOf<typeof toolEdit> | OptionsOf<typeof toolFind> | OptionsOf<typeof toolGrep> | OptionsOf<typeof toolLs> | OptionsOf<typeof toolRead> | OptionsOf<typeof toolWrite>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-ui', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): PiPluginContributions['commands'] { return [at(commandConfig, contextSession), at(commandTools, contextSession)]; },\n events: {\n input: at(hookInput, contextSession) as NonNullable<PiPluginContributions['events']>['input'],\n session_start: at(hookSessionStart, contextSession) as NonNullable<PiPluginContributions['events']>['session_start'],\n },\n ...piToolContributions('@agimon-ai/doompi-ui', [via({ name: 'edit' }, at(toolEdit, contextSession)), via({ name: 'find' }, at(toolFind, contextSession)), via({ name: 'grep' }, at(toolGrep, contextSession)), via({ name: 'ls' }, at(toolLs, contextSession)), via({ name: 'read' }, at(toolRead, contextSession)), via({ name: 'write' }, at(toolWrite, contextSession))]),\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agimon-ai/doompi-ui",
|
|
3
|
-
"version": "0.0.1-alpha.
|
|
3
|
+
"version": "0.0.1-alpha.89",
|
|
4
4
|
"description": "Leader-key menus, themes, and TUI components for DoomPi and Pi extensions.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -170,18 +170,19 @@
|
|
|
170
170
|
"access": "public"
|
|
171
171
|
},
|
|
172
172
|
"dependencies": {
|
|
173
|
-
"@agimon-ai/doompi-core": "0.0.1-alpha.
|
|
174
|
-
"@agimon-ai/doompi-hashline": "0.0.1-alpha.
|
|
175
|
-
"@agimon-ai/doompi-minor-mode": "0.0.1-alpha.
|
|
176
|
-
"@agimon-ai/doompi-telemetry": "0.0.1-alpha.
|
|
173
|
+
"@agimon-ai/doompi-core": "0.0.1-alpha.89",
|
|
174
|
+
"@agimon-ai/doompi-hashline": "0.0.1-alpha.55",
|
|
175
|
+
"@agimon-ai/doompi-minor-mode": "0.0.1-alpha.89",
|
|
176
|
+
"@agimon-ai/doompi-telemetry": "0.0.1-alpha.83",
|
|
177
|
+
"@agimon-ai/doompi-web-components": "0.0.1-alpha.47",
|
|
177
178
|
"@deepseek-ai/cordis": "4.0.2",
|
|
178
179
|
"@earendil-works/pi-tui": "0.87.1",
|
|
179
180
|
"yaml": "2.9.1"
|
|
180
181
|
},
|
|
181
182
|
"devDependencies": {
|
|
182
|
-
"@agimon-ai/doompi-build": "0.0.1-alpha.
|
|
183
|
-
"@agimon-ai/doompi-core": "0.0.1-alpha.
|
|
184
|
-
"@agimon-ai/doompi-web-components": "0.0.1-alpha.
|
|
183
|
+
"@agimon-ai/doompi-build": "0.0.1-alpha.15",
|
|
184
|
+
"@agimon-ai/doompi-core": "0.0.1-alpha.89",
|
|
185
|
+
"@agimon-ai/doompi-web-components": "0.0.1-alpha.47",
|
|
185
186
|
"@earendil-works/pi-coding-agent": "0.87.1",
|
|
186
187
|
"@tanstack/react-store": "0.11.1",
|
|
187
188
|
"@tanstack/store": "0.11.1",
|
|
@@ -195,8 +196,8 @@
|
|
|
195
196
|
"vitest": "5.0.1"
|
|
196
197
|
},
|
|
197
198
|
"peerDependencies": {
|
|
198
|
-
"@agimon-ai/doompi-core": "0.0.1-alpha.
|
|
199
|
-
"@agimon-ai/doompi-web-components": "0.0.1-alpha.
|
|
199
|
+
"@agimon-ai/doompi-core": "0.0.1-alpha.89",
|
|
200
|
+
"@agimon-ai/doompi-web-components": "0.0.1-alpha.47",
|
|
200
201
|
"@earendil-works/pi-coding-agent": "0.87.1"
|
|
201
202
|
},
|
|
202
203
|
"peerDependenciesMeta": {
|
|
@@ -215,7 +216,16 @@
|
|
|
215
216
|
"dist": "./dist/extensions/mcp.mjs",
|
|
216
217
|
"scopes": [
|
|
217
218
|
"session"
|
|
218
|
-
]
|
|
219
|
+
],
|
|
220
|
+
"ui": {
|
|
221
|
+
"entry": "./generated/mcp-ui.ts",
|
|
222
|
+
"dist": "./dist/extensions/mcp-ui.mjs",
|
|
223
|
+
"widgets": [
|
|
224
|
+
"@agimon-ai/doompi-ui/find",
|
|
225
|
+
"@agimon-ai/doompi-ui/ls",
|
|
226
|
+
"@agimon-ai/doompi-ui/write"
|
|
227
|
+
]
|
|
228
|
+
}
|
|
219
229
|
},
|
|
220
230
|
"doompiServer": {
|
|
221
231
|
"entry": "./generated/server.ts",
|
|
@@ -245,7 +255,7 @@
|
|
|
245
255
|
"build": "tsdown && tsdown --config tsdown.mcp.config.ts",
|
|
246
256
|
"build:mcp": "tsdown --config tsdown.mcp.config.ts",
|
|
247
257
|
"test": "vitest --run",
|
|
248
|
-
"typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.web.json",
|
|
258
|
+
"typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.web.json && tsc --noEmit -p tsconfig.mcp.json",
|
|
249
259
|
"lint": "oxlint . && oxfmt . --check",
|
|
250
260
|
"fixcode": "oxlint . --fix && oxfmt ."
|
|
251
261
|
}
|