@agimon-ai/doompi-ui 0.0.1-alpha.82 → 0.0.1-alpha.84
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.cjs +2 -2
- package/dist/extensions/mcp.cjs.map +1 -1
- package/dist/extensions/mcp.d.mts.map +1 -1
- package/dist/extensions/mcp.mjs +2 -2
- package/dist/extensions/mcp.mjs.map +1 -1
- package/dist/extensions/pi.cjs +2 -2
- package/dist/extensions/pi.cjs.map +1 -1
- package/dist/extensions/pi.d.mts.map +1 -1
- package/dist/extensions/pi.mjs +2 -2
- package/dist/extensions/pi.mjs.map +1 -1
- package/dist/extensions/server.cjs +2 -2
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.d.mts.map +1 -1
- package/dist/extensions/server.mjs +2 -2
- package/dist/extensions/server.mjs.map +1 -1
- package/dist/extensions/web.mjs +2 -2
- package/dist/extensions/web.mjs.map +1 -1
- package/package.json +10 -10
package/dist/extensions/mcp.cjs
CHANGED
|
@@ -47,10 +47,10 @@ var write_mcp_default = (0, _agimon_ai_doompi_core_mcpFacet.defineMcpTool)(creat
|
|
|
47
47
|
//#endregion
|
|
48
48
|
//#region generated/mcp.ts
|
|
49
49
|
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
50
|
-
const via = (identity, value) =>
|
|
50
|
+
const via = (identity, value) => value === void 0 ? void 0 : {
|
|
51
51
|
...identity,
|
|
52
52
|
...value
|
|
53
|
-
}
|
|
53
|
+
};
|
|
54
54
|
const mcp = (0, _agimon_ai_doompi_core_mcpFacet.defineMcpPlugin)({
|
|
55
55
|
name: "@agimon-ai/doompi-ui",
|
|
56
56
|
session: (context) => ({ get tools() {
|
|
@@ -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
|
|
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,EAChM;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":";qBAaa,+CAAG"}
|
package/dist/extensions/mcp.mjs
CHANGED
|
@@ -43,10 +43,10 @@ var write_mcp_default = defineMcpTool(createMcpWriteTool);
|
|
|
43
43
|
//#endregion
|
|
44
44
|
//#region generated/mcp.ts
|
|
45
45
|
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
46
|
-
const via = (identity, value) =>
|
|
46
|
+
const via = (identity, value) => value === void 0 ? void 0 : {
|
|
47
47
|
...identity,
|
|
48
48
|
...value
|
|
49
|
-
}
|
|
49
|
+
};
|
|
50
50
|
const mcp = defineMcpPlugin({
|
|
51
51
|
name: "@agimon-ai/doompi-ui",
|
|
52
52
|
session: (context) => ({ get tools() {
|
|
@@ -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
|
|
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,EAChM;AACF,CAAC"}
|
package/dist/extensions/pi.cjs
CHANGED
|
@@ -736,10 +736,10 @@ var write_cli_default = (0, _agimon_ai_doompi_core_extensionFile.defineCliTool)(
|
|
|
736
736
|
//#endregion
|
|
737
737
|
//#region generated/pi.ts
|
|
738
738
|
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
739
|
-
const via = (identity, value) =>
|
|
739
|
+
const via = (identity, value) => value === void 0 ? void 0 : {
|
|
740
740
|
...identity,
|
|
741
741
|
...value
|
|
742
|
-
}
|
|
742
|
+
};
|
|
743
743
|
const extension = (0, _agimon_ai_doompi_core_piExtension.definePiExtension)("@agimon-ai/doompi-ui", async (context) => {
|
|
744
744
|
const scopeSession = await root_cli_default(context);
|
|
745
745
|
const contextSession = {
|
|
@@ -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 => ({ ...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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,MAAM,uBAAuB;;AAuB7B,IAAM,qBAAN,MAA8C;CACf;CAA7B,YAAY,MAA+B;EAAd,KAAA,OAAA;CAAe;CAE5C,OAAO,OAAyB;EAC9B,IAAI,SAAS,KAAK,KAAK,KAAK,WAAW,GAAG,OAAO,CAAC;EAClD,QAAA,GAAOA,uBAAAA,iBAAAA,CAAiB,KAAK,MAAM,KAAK;CAC1C;CAEA,aAAmB,CAEnB;AACF;;AAGA,SAAgB,sBAAsB,WAAyD;CAC7F,OAAOC,mBAAAA,uBAAuB,SAAS;AACzC;;AAGA,SAAgB,mBAAmB,SAAoB,OAAc,UAA4C;CAC/G,OAAOC,mBAAAA,oBAAoB,SAAS,OAAO,QAAQ;AACrD;AAEA,SAAS,WAAW,OAAe,SAAiB,SAA4B,OAAyB;CACvG,IAAI,OAAOC,mBAAAA,kBAAkB,OAAO,SAAS,KAAK;CAClD,IAAI,QAAQ,SAAS,GAAG,QAAQ,IAAI,MAAM,GAAG,SAAS,KAAK,QAAQ,KAAK,KAAK,GAAG;CAChF,OAAO,IAAIC,mBAAAA,aAAa,IAAI;AAC9B;AAEA,SAAS,cAAc,OAA2B,MAAkC;CAClF,OAAO,UAAU,KAAA,IAAY,KAAA,IAAY,GAAG,MAAM,GAAG;AACvD;AAEA,SAAS,eAAe,QAAqD;CAC3E,OAAO,OAAO,QAAQ,UAA2B,UAAU,KAAA,KAAa,MAAM,SAAS,CAAC;AAC1F;AAEA,SAAgB,eAAe,MAAqB,OAAyB;CAC3E,OAAO,WACL,QACA,KAAK,MACL,eAAe,CAAC,KAAK,WAAW,KAAA,IAAY,KAAA,IAAY,QAAQ,KAAK,UAAU,cAAc,KAAK,OAAO,OAAO,CAAC,CAAC,GAClH,KACF;AACF;AAEA,SAAgB,eAAe,MAAqB,OAAyB;CAC3E,MAAM,QAAQ,KAAK,MAAM;CACzB,OAAO,WAAW,QAAQ,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,UAAU,IAAI,KAAK,KAAK,GAAG,KAAK;AACxF;;;;;AAMA,SAAS,iBAAiB,OAAqC;CAC7D,MAAM,OAAO,MAAM,GAAG,EAAE;CACxB,IAAI,SAAS,KAAA,KAAa,CAAC,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,SAAS,GAAG,GAAG,OAAO,KAAA;CAE/E,MAAM,IAAI;CACV,OAAO,MAAM,GAAG,EAAE,MAAM,IAAI,MAAM,IAAI;CACtC,OAAO;AACT;AAEA,SAAS,YAAY,QAAgC;CACnD,QAAQ,OAAO,WAAW,CAAC,EAAA,CACxB,QAAQ,UAAU,MAAM,SAAS,MAAM,CAAC,CACxC,KAAK,UAAU,MAAM,QAAQ,EAAE,CAAC,CAChC,KAAK,IAAI,CAAC,CACV,WAAW,KAAM,IAAI,CAAC,CACtB,WAAW,QAAQ,IAAI;AAC5B;AAEA,SAAgB,iBACd,MACA,QACA,SACA,OACA,YAAyBC,gCAAAA,eACzB,kBAAoCC,gCAAAA,qBACzB;CACX,IAAI,QAAQ,SAAS,OAAO,IAAI,mBAAmB,MAAM,GAAG,SAAS,YAAY,MAAM,CAAC,CAAC;CAEzF,MAAM,OAAO,OAAO,SAAS;CAE7B,IAAI,SAAS,KAAA,KAAa,KAAK,WAAW,GAAG,OAAO,IAAI,mBAAmB,EAAE;CAC7E,OAAOC,mBAAAA,eAAe,MAAM,OAAO,gBAAgB,KAAK,IAAI,GAAG,SAAS;AAC1E;AAEA,SAAgB,gBACd,MACA,OACA,UAA+B,CAAC,GAChC,YAAyBF,gCAAAA,eACzB,kBAAoCC,gCAAAA,qBACzB;CACX,MAAM,UAAUH,mBAAAA,kBAAkB,SAAS,KAAK,MAAM,KAAK;CAC3D,MAAM,UAAU,MAAM,GAAG,SAAS,KAAK,KAAK,QAAQ,OAAO,eAAe,OAAO,EAAE,OAAO;CAC1F,IAAI,KAAK,QAAQ,WAAW,GAAG,OAAO,IAAIC,mBAAAA,aAAa,GAAG,QAAQ,GAAG,SAAS;CAE9E,MAAM,kBAAkB,KAAK,QAAQ,WAAW,KAAM,IAAI,CAAC,CAAC,WAAW,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI;CAC/F,OAAO,gBAAgB,GAAG,EAAE,MAAM,IAAI,gBAAgB,IAAI;CAC1D,MAAM,eAAe,QAAQ,kBAAkB,QAAQ,QAAQ,aAAa;CAC5E,MAAM,eAAe,QAAQ,WACzB,kBACA,eACE,gBAAgB,MAAM,GAAqB,IAC3C,gBAAgB,MAAM,GAAG,oBAAoB;CACnD,MAAM,WAAW,gBAAgB,KAAK,IAAI;CAC1C,MAAM,cAAc,WAChB,UAAU,aAAa,KAAK,IAAI,GAAG,QAAQ,IAC3C,aAAa,KAAK,SAAS,MAAM,GAAG,cAAc,IAAI,CAAC;CAC3D,MAAM,kBAAkB,gBAAgB,SAAS,aAAa;CAE9D,MAAM,yBAAyB,eAAe,kBAAkB,IAAI;CACpE,MAAM,cAAcI,mBAAAA,YAAY,yBAAyB,aAAa,SAAS,CAAC;CAChF,MAAM,UAAU,YAAY,KACzB,MAAM,UAAU,GAAGC,mBAAAA,iBAAiB,yBAAyB,OAAO,aAAa,KAAK,EAAE,GAAG,MAC9F;CACA,MAAM,eAAe,eACjB,CACE,GAAI,kBAAkB,IAAI,CAAC,MAAM,GAAG,SAAS,KAAK,gBAAgB,2BAA2B,CAAC,IAAI,CAAC,GACnG,GAAG,OACL,IACA,CACE,GAAG,SACH,GAAI,kBAAkB,IAAI,CAAC,MAAM,GAAG,SAAS,KAAK,gBAAgB,4BAA4B,CAAC,IAAI,CAAC,CACtG;CACJ,OAAO,IAAIL,mBAAAA,aAAa;EAAC,GAAG,QAAQ,GAAG;EAAW;EAAI,GAAG;CAAY,CAAC,CAAC,KAAK,IAAI,CAAC;AACnF;AAEA,SAAgB,iBACd,MACA,QACA,SACA,OACA,YAAyBC,gCAAAA,eACzB,kBAAoCC,gCAAAA,qBACzB;CACX,MAAM,kBAAkB,YAAY,MAAM,CAAC,CAAC,MAAM,IAAI;CACtD,OAAO,gBAAgB,GAAG,EAAE,MAAM,IAAI,gBAAgB,IAAI;CAC1D,IAAI,QAAQ,SACV,OAAO,IAAI,mBAAmB,gBAAgB,KAAK,SAAS,MAAM,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;CAGjG,MAAM,OAAO,iBAAiB,eAAe;CAC7C,MAAM,eAAe,QAAQ,WAAW,kBAAkB,gBAAgB,MAAM,GAAG,oBAAoB;CACvG,MAAM,WAAW,gBAAgB,KAAK,IAAI;CAC1C,MAAM,cAAc,WAChB,UAAU,aAAa,KAAK,IAAI,GAAG,QAAQ,IAC3C,aAAa,KAAK,SAAS,MAAM,GAAG,cAAc,IAAI,CAAC;CAE3D,MAAM,kBAAkB,KAAK,UAAU;CACvC,MAAM,cAAcE,mBAAAA,YAAY,kBAAkB,aAAa,SAAS,CAAC;CACzE,MAAM,UAAU,YAAY,KACzB,MAAM,UAAU,GAAGC,mBAAAA,iBAAiB,kBAAkB,OAAO,aAAa,KAAK,EAAE,GAAG,MACvF;CACA,MAAM,YAAY,gBAAgB,SAAS,aAAa;CACxD,IAAI,YAAY,GAAG,QAAQ,KAAK,MAAM,GAAG,SAAS,KAAK,UAAU,4BAA4B,CAAC;CAC9F,IAAI,SAAS,KAAA,GAAW,QAAQ,KAAK,MAAM,GAAG,SAAS,IAAI,CAAC;CAC5D,OAAO,IAAI,mBAAmB,QAAQ,KAAK,IAAI,CAAC;AAClD;AAEA,SAAgB,eAAe,MAAqB,OAAyB;CAC3E,OAAO,WACL,QACA,KAAK,SACL,eAAe;EACb,KAAK,QAAQ;EACb,KAAK;EACL,KAAK,eAAe,OAAO,gBAAgB,KAAA;EAC3C,cAAc,KAAK,OAAO,SAAS;CACrC,CAAC,GACD,KACF;AACF;AAEA,SAAgB,eAAe,MAAqB,OAAyB;CAC3E,OAAO,WACL,QACA,KAAK,SACL,eAAe,CAAC,KAAK,QAAQ,KAAK,cAAc,KAAK,OAAO,SAAS,CAAC,CAAC,GACvE,KACF;AACF;AAEA,SAAgB,aAAa,MAAmB,OAAyB;CACvE,OAAO,WAAW,MAAM,KAAK,QAAQ,KAAK,eAAe,CAAC,cAAc,KAAK,OAAO,SAAS,CAAC,CAAC,GAAG,KAAK;AACzG;;;;;;;AC1MA,SAAgB,mBAAmB,KAAkC;CACnE,MAAM,QAA6B,CAAC;CACpC,MAAM,QAAA,GAAOC,gCAAAA,yBAAAA,CAAyB,GAAG;CACzC,MAAM,MAAA,GACJC,mCAAAA,aAAAA,CAAa;EACX,GAAG;EACH,aAAa;EACb,aAAa,MAAM,UAAU,eAAe,MAAM,KAAK;EACvD,eAAe,QAAQ,SAAS,OAAO,YAAY;GAOjD,OAAO,mBANS,iBACd,QAAQ,MACR,QACA;IAAE,UAAU,QAAQ;IAAU,SAAS,QAAQ;GAAQ,GACvD,KAEwB,GAAS,OAAO,QAAQ,aAAa;EACjE;CACF,CAAC,CACH;CAEA,MAAM,QAAA,GAAOC,gCAAAA,yBAAAA,CAAyB,GAAG;CACzC,MAAM,MAAA,GACJD,mCAAAA,aAAAA,CAAa;EACX,GAAG;EACH,aAAa;EACb,aAAa,MAAM,UAAU,eAAe,MAAM,KAAK;EAGvD,eAAe,QAAQ,SAAS,OAAO,YAAY;GAOjD,OAAO,mBANS,iBACd,QAAQ,MACR,QACA;IAAE,UAAU,QAAQ;IAAU,SAAS,QAAQ;GAAQ,GACvD,KAEwB,GAAS,OAAO,QAAQ,aAAa;EACjE;CACF,CAAC,CACH;CAEA,MAAM,SAAA,GAAQE,gCAAAA,0BAAAA,CAA0B,GAAG;CAC3C,MAAM,cAAc,MAAM;CAC1B,MAAM,MAAA,GACJF,mCAAAA,aAAAA,CAAa;EACX,GAAG;EACH,aAAa;EACb,aAAa,MAAM,OAAO,YACxB,gBAAgB,MAAM,OAAO;GAC3B,UAAU,QAAQ;GAElB,eAAe,QAAQ,iBAAiB,SAAS,QAAQ;EAC3D,CAAC;EACH,eAAe,QAAQ,SAAS,OAAO,YAAY;GAKjD,OAAO,mBAJS,YAAY,QAAQ,SAAS,OAAO;IAClD,GAAG;IACH,eAAe,sBAAsB,QAAQ,aAAa;GAC5D,CAC0B,GAAS,OAAO,QAAQ,aAAa;EACjE;CACF,CAAC,CACH;CAEA,MAAM,QAAA,GAAOG,gCAAAA,yBAAAA,CAAyB,GAAG;CACzC,MAAM,aAAa,KAAK;CACxB,MAAM,MAAA,GACJH,mCAAAA,aAAAA,CAAa;EACX,GAAG;EACH,aAAa;EACb,aAAa,MAAM,UAAU,eAAe,MAAM,KAAK;EACvD,eAAe,QAAQ,SAAS,OAAO,YAAY;GAKjD,OAAO,mBAJS,WAAW,QAAQ,SAAS,OAAO;IACjD,GAAG;IACH,eAAe,sBAAsB,QAAQ,aAAa;GAC5D,CAC0B,GAAS,OAAO,QAAQ,aAAa;EACjE;CACF,CAAC,CACH;CAEA,MAAM,QAAA,GAAOI,gCAAAA,yBAAAA,CAAyB,GAAG;CACzC,MAAM,aAAa,KAAK;CACxB,MAAM,MAAA,GACJJ,mCAAAA,aAAAA,CAAa;EACX,GAAG;EACH,aAAa;EACb,aAAa,MAAM,UAAU,eAAe,MAAM,KAAK;EACvD,eAAe,QAAQ,SAAS,OAAO,YAAY;GAKjD,OAAO,mBAJS,WAAW,QAAQ,SAAS,OAAO;IACjD,GAAG;IACH,eAAe,sBAAsB,QAAQ,aAAa;GAC5D,CAC0B,GAAS,OAAO,QAAQ,aAAa;EACjE;CACF,CAAC,CACH;CAEA,MAAM,MAAA,GAAKK,gCAAAA,uBAAAA,CAAuB,GAAG;CACrC,MAAM,WAAW,GAAG;CACpB,MAAM,MAAA,GACJL,mCAAAA,aAAAA,CAAa;EACX,GAAG;EACH,aAAa;EACb,aAAa,MAAM,UAAU,aAAa,MAAM,KAAK;EACrD,eAAe,QAAQ,SAAS,OAAO,YAAY;GAKjD,OAAO,mBAJS,SAAS,QAAQ,SAAS,OAAO;IAC/C,GAAG;IACH,eAAe,sBAAsB,QAAQ,aAAa;GAC5D,CAC0B,GAAS,OAAO,QAAQ,aAAa;EACjE;CACF,CAAC,CACH;CACA,OAAO;AACT;;;;AC3IA,MAAM,qBAAqB;;;;;AAK3B,MAAM,sBAAsB;;;;;;;;;AAc5B,SAAgB,yBAAyB,QAAsD;CAC7F,IAAI,WAAW,KAAK,IAAI,IAAI;CAC5B,MAAM,QAAQ,kBAAkB;EAC9B,MAAM,MAAM,KAAK,IAAI;EACrB,MAAM,QAAQ,MAAM;EAGpB,WAAW,MAAM;EACjB,IAAI,SAAS,qBAAqB,OAAO,KAAK;CAChD,GAAG,kBAAkB;CAErB,MAAM,MAAM;CACZ,OAAO,EACL,YAAY;EACV,cAAc,KAAK;CACrB,EACF;AACF;;;ACfA,SAASM,SAAO,WAAwC;CACtD,KAAK,MAAM,YAAY,WAAW,SAAS;AAC7C;AAEA,SAAS,aAAa,UAAqD;CACzE,OAAO,SAAS,KAAK,aAAa;EAChC,GAAG;EACH,MAAM,QAAQ,KAAK,KAAK,aAAa,EAAE,GAAG,QAAQ,EAAE;EAIpD,GAAI,aAAa,UAAU,EAAE,SAAS,EAAE,GAAG,QAAQ,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,QAAQ,OAAO,EAAE;CACnG,EAAE;AACJ;AAEA,SAAS,aAAa,UAAqD;CACzE,OAAO,SAAS,KAAK,aAAa;EAChC,GAAG;EACH,QAAQ,QAAQ,OAAO,KAAK,WAAW;GACrC,GAAG;GACH,GAAI,MAAM,UAAU,EAAE,SAAS,MAAM,QAAQ,KAAK,YAAY,EAAE,GAAG,OAAO,EAAE,EAAE,IAAI,CAAC;GACnF,GAAI,MAAM,UAAU,EAAE,SAAS,MAAM,QAAQ,KAAK,YAAY,EAAE,GAAG,OAAO,EAAE,EAAE,IAAI,CAAC;GACnF,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,MAAM,KAAK,UAAU,EAAE,GAAG,KAAK,EAAE,EAAE,IAAI,CAAC;GACzE,GAAI,MAAM,SAAS,EAAE,QAAQ,CAAC,GAAG,MAAM,MAAM,EAAE,IAAI,CAAC;EACtD,EAAE;CACJ,EAAE;AACJ;AAQA,IAAa,oBAAb,MAA+B;CAC7B,gCAAiC,IAAI,IAAsC;CAC3E,4BAA6B,IAAI,IAAc;CAE/C,SAAS,YAA4E;EACnF,MAAM,QAAQ,OAAO,WAAW,MAAM;EACtC,MAAM,eAAyC;GAAE;GAAO,YAAY,EAAE,GAAG,WAAW;EAAE;EACtF,KAAK,cAAc,IAAI,WAAW,QAAQ,YAAY;EACtD,SAAO,KAAK,SAAS;EACrB,IAAI,WAAW;EACf,OAAO;GACL,SAAS,UAAU;IACjB,IAAI,YAAY,KAAK,cAAc,IAAI,WAAW,MAAM,CAAC,EAAE,UAAU,OAAO;IAC5E,aAAa,QAAQ,QACjB;KACE,GAAG;KACH,GAAI,MAAM,eAAe,EAAE,cAAc,MAAM,aAAa,KAAK,aAAa,EAAE,GAAG,QAAQ,EAAE,EAAE,IAAI,CAAC;KACpG,GAAI,MAAM,kBACN,EAAE,iBAAiB,MAAM,gBAAgB,KAAK,aAAa,EAAE,GAAG,QAAQ,EAAE,EAAE,IAC5E,CAAC;IACP,IACA,KAAA;IACJ,SAAO,KAAK,SAAS;GACvB;GACA,eAAe;IACb,IAAI,UAAU;IACd,WAAW;IACX,IAAI,KAAK,cAAc,IAAI,WAAW,MAAM,CAAC,EAAE,UAAU,OAAO;IAChE,KAAK,cAAc,OAAO,WAAW,MAAM;IAC3C,SAAO,KAAK,SAAS;GACvB;EACF;CACF;CAEA,cAAkC;EAChC,OAAO,CAAC,GAAG,KAAK,cAAc,OAAO,CAAC,CAAC,CACpC,SAAS,EAAE,YAAY,YACtB,QACI,CACE;GACE,QAAQ,WAAW;GACnB,IAAI,WAAW;GACf,OAAO,WAAW;GAClB,GAAI,WAAW,YAAY,EAAE,WAAW,WAAW,UAAU,IAAI,CAAC;GAClE,GAAG;EACL,CACF,IACA,CAAC,CACP,CAAC,CACA,UACE,MAAM,UACL,KAAK,QAAQ,MAAM,SAAS,KAAK,OAAO,cAAc,MAAM,MAAM,KAAK,KAAK,GAAG,cAAc,MAAM,EAAE,CACzG;CACJ;CAEA,UAAU,UAAgC;EACxC,KAAK,UAAU,IAAI,QAAQ;EAC3B,aAAa,KAAK,UAAU,OAAO,QAAQ;CAC7C;CAEA,UAAgB;EACd,KAAK,cAAc,MAAM;EACzB,SAAO,KAAK,SAAS;EACrB,KAAK,UAAU,MAAM;CACvB;AACF;AAOA,IAAa,oBAAb,MAA+B;CAIA;CAH7B,gCAAiC,IAAI,IAAsC;CAC3E,4BAA6B,IAAI,IAAc;CAE/C,YAAY,YAAqE;EAApD,KAAA,aAAA;CAAqD;CAElF,SACE,SAC8B;EAC9B,MAAM,QAAQ,OAAO,QAAQ,MAAM;EACnC,MAAM,eAAe;GACnB;GACS;EACX;EACA,KAAK,cAAc,IAAI,QAAQ,QAAQ,YAAY;EACnD,SAAO,KAAK,SAAS;EACrB,IAAI,WAAW;EACf,OAAO;GACL,cAAc;IACZ,IAAI,CAAC,YAAY,KAAK,cAAc,IAAI,QAAQ,MAAM,CAAC,EAAE,UAAU,OAAO,SAAO,KAAK,SAAS;GACjG;GACA,eAAe;IACb,IAAI,UAAU;IACd,WAAW;IACX,IAAI,KAAK,cAAc,IAAI,QAAQ,MAAM,CAAC,EAAE,UAAU,OAAO;IAC7D,KAAK,cAAc,OAAO,QAAQ,MAAM;IACxC,SAAO,KAAK,SAAS;GACvB;EACF;CACF;CAEA,cAAuC;EACrC,OAAO,CAAC,GAAG,KAAK,cAAc,OAAO,CAAC,CAAC,CACpC,SAAS,EAAE,cAAc;GACxB,IAAI;IACF,OAAO,aAAa,QAAQ,aAAa,CAAC,CAAC,CAAC,KAAK,aAAa;KAAE,QAAQ,QAAQ;KAAQ,GAAG;IAAQ,EAAE;GACvG,SAAS,OAAO;IACd,MAAM,UAAU,KAAK,WAAW;IAChC,IAAI,SAAS,QAAQ,QAAQ,OAAO,gBAAgB,OAAO;IAC3D,OAAO,CAAC;GACV;EACF,CAAC,CAAC,CACD,UACE,MAAM,UACL,KAAK,QAAQ,MAAM,SAAS,KAAK,OAAO,cAAc,MAAM,MAAM,KAAK,KAAK,GAAG,cAAc,MAAM,EAAE,CACzG;CACJ;CAEA,OAAO,YAAwC;EAC7C,MAAM,SAAS,KAAK,cAAc,IAAI,WAAW,MAAM;EACvD,MAAM,UAAU,KAAK,WAAW;EAChC,IAAI,CAAC,UAAU,CAAC,SAAS;EACzB,MAAM,UAAU,OAAO,QAAQ,SAAS,WAAW;EACnD,IAAI,CAAC,SAAS;EACd,MAAM,QAA+B;GACnC,KAAK;GACL,WAAW,WAAW;GACtB,SAAS,WAAW;GACpB,GAAI,WAAW,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,WAAW,MAAM;EACtE;EACA,QAAa,QAAQ,QAAQ,KAAK,CAAC,CAAC,CACjC,OAAO,UAAmB,OAAO,QAAQ,QAAQ,OAAO,WAAW,QAAQ,OAAO,CAAC,CAAC,CACpF,cAAc;GACb,IAAI,KAAK,cAAc,IAAI,WAAW,MAAM,CAAC,EAAE,UAAU,OAAO,OAAO,SAAO,KAAK,SAAS;EAC9F,CAAC;CACL;CAEA,UAAU,UAAgC;EACxC,KAAK,UAAU,IAAI,QAAQ;EAC3B,aAAa,KAAK,UAAU,OAAO,QAAQ;CAC7C;CAEA,UAAgB;EACd,KAAK,cAAc,MAAM;EACzB,SAAO,KAAK,SAAS;EACrB,KAAK,UAAU,MAAM;CACvB;AACF;AAeA,SAAgB,gBAAgB,EAAE,gBAAgB,qBAAkE;CAClH,IAAI;CACJ,MAAM,oCAAoB,IAAI,IAAoB;CAClD,MAAM,iCAAiB,IAAI,IAGzB;CACF,MAAM,SAAS,IAAI,kBAAkB;CACrC,MAAM,SAAS,IAAI,wBAAwB,aAAa;CAExD,OAAO;EACL;EACA;EACA,eAAe,cAAc;GAC3B,MAAM,QAAQ,OAAO,aAAa,MAAM;GACxC,MAAM,WAAW,aAA6C;IAE5D,kBADe,eAAe,SAAS;KAAE,QAAQ,aAAa;KAAQ,UAAU,aAAa,QAAQ;IAAE,CAChF,CAAC,CAAC,WAAW;GACtC;GACA,QAAQ,aAAa,QAAQ;GAC7B,kBAAkB,IAAI,aAAa,QAAQ,KAAK;GAChD,IAAI,WAAW;GACf,OAAO;IACL,OAAO,UAAU;KACf,IAAI,YAAY,kBAAkB,IAAI,aAAa,MAAM,MAAM,OAAO;KACtE,QAAQ,QAAQ;IAClB;IACA,UAAU;KACR,IAAI,UAAU;KACd,WAAW;KACX,IAAI,kBAAkB,IAAI,aAAa,MAAM,MAAM,OAAO;KAC1D,kBAAkB,OAAO,aAAa,MAAM;KAC5C,QAAQ,CAAC,CAAC;IACZ;GACF;EACF;EACA,sBAAsB,SAAS;GAC7B,MAAM,QAAQ,OAAO,QAAQ,MAAM;GACnC,eAAe,IAAI,QAAQ,QAAQ;IACjC;IACS;GACX,CAAC;GACD,IAAI,WAAW;GACf,aAAa;IACX,IAAI,UAAU;IACd,WAAW;IACX,IAAI,eAAe,IAAI,QAAQ,MAAM,CAAC,EAAE,UAAU,OAAO,eAAe,OAAO,QAAQ,MAAM;GAC/F;EACF;EACA,iBAAiB,eAAe,OAAO,SAAS,UAAU;EAC1D,iBAAiB,YAAY,OAAO,SAAS,OAAO;EACpD,WAAW,SAAS;GAClB,gBAAgB;EAClB;EACA,mBAAmB,QAAQ,QAAQ;GACjC,MAAM,UAAU;GAChB,MAAM,SAAS,eAAe,IAAI,MAAM;GACxC,IAAI,CAAC,WAAW,CAAC,QAAQ;GACzB,MAAM,UAAU,OAAO,QAAQ,SAAS;GACxC,IAAI,CAAC,SAAS;GACd,QAAa,QAAQ,QAAQ,OAAO,CAAC,CAAC,CAAC,OAAO,UAAmB,OAAO,QAAQ,QAAQ,OAAO,QAAQ,OAAO,CAAC;EACjH;EACA,UAAU;GACR,gBAAgB,KAAA;GAChB,eAAe,MAAM;GACrB,kBAAkB,MAAM;GACxB,OAAO,QAAQ;GACf,OAAO,QAAQ;EACjB;CACF;AACF;;;AC3PA,SAAS,OAAO,QAAiB,SAA2B,MAAc,OAAoC;CAC5G,MAAM,WAAA,GAAUC,oCAAAA,4BAAAA,CAA4B,MAAM;CAClD,IAAI,SAAS;EACX,IAAI;GACF,QAAa,QAAQ,QAAQ,QAAQ;IAAE;IAAM;GAAM,CAAC,CAAC,CAAC,CAAC,YAAY,KAAA,CAAS;EAC9E,QAAQ,CAER;EACA;CACF;CACA,QAAQ,GAAG,OAAO,MAAM,KAAK;AAC/B;AAEA,SAAS,mBAAmB,SAAiB,KAAiC;CAC5E,MAAM,oBAAoB,QAAQ,KAAK,CAAC,CAAC,QAAQ,QAAQ,GAAG;CAC5D,IAAI,CAAC,mBAAmB,OAAO,KAAA;CAC/B,MAAM,eAAe,kBAAkB,MAAM,GAAA,EAA2B,CAAC,CAAC,QAAQ;CAClF,OAAO,GAAGC,WAAAA,aAAa,KAAK,aAAa,KAAKC,UAAAA,QAAK,SAAS,GAAG,KAAK;AACtE;AAeA,SAAgB,gBAAgB,QAAiB,EAAE,IAAI,aAAyC;CAC9F,IAAI,WAAW;CACf,MAAM,UAAU,IAAIC,gBAAAA,YAAY;CAChC,MAAM,iBAAiB,IAAIC,uBAAAA,mBAAmB;CAC9C,MAAM,qCAAqB,IAAI,IAAY;CAC3C,IAAI;CACJ,IAAI;CACJ,IAAI,oBAAoB;CACxB,IAAI,oBAAoB;CACxB,IAAI;;;;;;;CAQJ,MAAM,wBAAA,GAA+DC,iCAAAA,kBAAAA,CAAkB,MAAM,CAAC,EAAE,YAAY,CAAC,CAAC;CAE9G,MAAM,qBAAqB,gBAAuD;EAChF,KAAK,MAAM,cAAc,aAAa;GACpC,MAAM,UAAU,WAAW,YAAY,KAAK,WAAW,UAAU,KAAK;GACtE,MAAM,UAAU,4BAA4B,WAAW,SAAS,QAAQ,IAAI,WAAW;GACvF,IAAI,mBAAmB,IAAI,OAAO,GAAG;GACrC,mBAAmB,IAAI,OAAO;GAG9B,UAAe,cAAcC,kBAAAA,SAAS,4BAA4B,WAAW,SAAS;IACpF,iBAAiB,WAAW;IAC5B,GAAI,WAAW,YAAY,EAAE,qBAAqB,WAAW,UAAU,IAAI,CAAC;GAC9E,CAAC;GACD,IAAI,eAAe,SAAA,OAAmB,OAAO,QAAQ,eAAe,SAASC,WAAAA,aAAa;EAC5F;CACF;CAEA,MAAM,MAAM,gBAAgB;EAAE;EAAgB;CAAkB,CAAC;CACjE,OAAO;EACL;EACA;EACA,MAAM,UAAU;GACd,IAAI,UAAU;GACd,WAAW;GACX,MAAM,UAAU;GAChB,EAAE;GACF,gBAAgB,KAAA;GAChB,IAAI,WAAW,KAAA,CAAS;GACxB,aAAa,KAAA;GACb,YAAY,KAAK;GACjB,aAAa,KAAA;GACb,IAAI,QAAQ;GACZ,QAAQ,MAAM;GACd,IAAI,SAAS,SAAA,OACX,QAAQ,GAAG,UAAUC,WAAAA,mBAAmB,KAAA,GAAW,EAAE,WAAWC,WAAAA,iBAAiB,CAAC;GAEpF,MAAM,UAAU,SAAS;EAC3B;EACA,UAAU,CACR,CACEC,WAAAA,eACA;GACE,aAAa;GACb,SAAS,OAAO,OAAO,QAAQ;IAG7B,MAAM,aAAa,eAAe;IAClC,MAAM,WAAA,GAAUC,qCAAAA,iBAAAA,CAAiB;KAC/B,OAAO,GAAG,YAAY;KACtB,aAAa,GAAG,eAAe;KAC/B,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;KACnC,sBAAsBC,wBAAAA;KACtB,6BAA6BC,wBAAAA;KAC7B,6BAA6B,aAAaC,wBAAAA,oBAAoB,IAAI,QAAQ;IAC5E,CAAC;IACD,MAAMC,qBAAAA,iBAAiB,KAAK,OAAO;GACrC;EACF,CACF,GAEA,CACEC,WAAAA,gBACA;GACE,aAAa;GACb,SAAS,OAAO,OAAO,QAAQ;IAI7B,MAAMC,sBAAAA,kBAAkB,KAAK,IAAI,MAAM;GACzC;EACF,CACF,CACF;EACA,QAAQ;IACLC,WAAAA,uBAAuB,QAAQ,QAAQ;IACtC,gBAAgB;IAChB,IAAI,WAAW,GAAG;IAClB,MAAM,mBAAmB,EAAE;IAC3B,kBAAkB,eAAe,MAAM,CAAC;IACxC,oBAAoB,IAAI,eAAe,WAAW,CAAC,CAAC,MAAM,UAAU,MAAM,SAASC,WAAAA,qBAAqB;IACxG,IAAI,IAAI,SAAA,OAAmB;IAC3B,KAAK,MAAM,WAAW,oBAAoB,OAAO,QAAQ,KAAK,SAASZ,WAAAA,aAAa;IAIpF,YAAY,KAAK;IACjB,aAAa,0BAA0B,UAAU;KAC/C,UAAe,cAAcD,kBAAAA,SAAS,kBAAkB,0BAA0B,OAAO,KAAK,EAAE,MAAM,EACpG,QAAQ,MACV,CAAC;IACH,CAAC;IAED,MAAM,YAAY,QAAQ,IAAA,mBAAA;IAC1B,MAAM,cAAc,IAAI,GAAG,SAAS,SAAS;IAC7C,IAAI,CAAC,YAAY,SAAS;KACxB,OAAO,QAAQ,KAAK,kCAAkC,YAAY,SAASC,WAAAA,aAAa;KACxF,UAAe,cAAcD,kBAAAA,SAAS,kBAAkB,YAAY,SAAS,uBAAuB,EAClG,YAAY,UACd,CAAC;IACH;IAEA,IAAI,GAAG,SAAS,GAAGL,WAAAA,aAAa,KAAKC,UAAAA,QAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,aAAa;IACpF,IAAI,GAAG,WAAW,KAAK,UAAU,IAAIkB,mBAAAA,WAAW,OAAO,IAAI,KAAK,KAAA,GAAW,WAAW,IAAI,SAAS,IAAI,CAAC;IACxG,IAAI,GAAG,WAAW,KAAK,OAAO,SAAS;KACrC,aAAa;KACb,OAAO,IAAIC,mBAAAA,WAAW,KAAK,OAAO,KAAK,MAAM,IAAI,QAAQ,OAAO;IAClE,CAAC;IACD,IAAI,GAAG,oBACJ,KAAK,aAAa,gBACjB,IAAIC,mBAAAA,WACF,KACA,aACA,aACA,UACC,aAA6B;KAC5B,IAAI,CAAC,SAAS,QAAQ;MACpB,IAAI,GAAG,UAAUd,WAAAA,mBAAmB,KAAA,GAAW,EAAE,WAAWC,WAAAA,iBAAiB,CAAC;MAC9E;KACF;KACA,IAAI,GAAG,UACLD,WAAAA,oBACC,YAAY,gBACX,IAAIe,oBAAAA,YAAY,aAAa,UAAU,KAAK,YAAY,QAAQ,SAAS,CAAC,GAC5E,EAAE,WAAWd,WAAAA,iBAAiB,CAChC;IACF,GACA,KAAA,GACA,IAAI,GAAG,OACP;KACE,UAAU;KACV,qBAAqB,gBACnBe,WAAAA,wBAAwB,SAAS,WAAW,KAC5C,GAAG,YAAY,CAAC,CAAC,MAAM,YAAY,QAAQ,SAAS,WAAW;KACjE,iBAAiB,QAAQ,WAAW;MAClC,IAAI,kBAAkB,OAAO,sBAAsB,kBAAkB;OACnE,OAAO,QAAQ,KAAK,iBAAiB,OAAO,mBAAmBjB,WAAAA,aAAa;OAC5E;MACF;MACA,IAAI,mBAAmB,QAAQ,MAAM;KACvC;KACA,uBAAuB,gBAAgB;MACrC,UAAe,cACbD,kBAAAA,SAAS,0BACT,mBAAmB,YAAY,mBAC/B,EAAE,WAAW,UAAU,CACzB;MACA,OAAO,QAAQ,KAAK,mBAAmB,YAAY,mBAAmBC,WAAAA,aAAa;KACrF;KACA,sBAAsB,WAAW;MAC/B,UAAe,cACbD,kBAAAA,SAAS,yBACT,iBAAiB,OAAO,mBACxB,EACE,WAAW,SACb,CACF;MACA,OAAO,QAAQ,KAAK,iBAAiB,OAAO,mBAAmBC,WAAAA,aAAa;KAC9E;IACF,CACF,CACJ;IAEA,UAAe,YAAYD,kBAAAA,SAAS,gBAAgB;KAClD,YAAY;KACZ,oBAAoB,YAAY;KAChC,yBAAyB,eAAe,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,UAAU;IAC1E,CAAC;GACH;IAECmB,WAAAA,eAAe,OAAO,QAAQ;IAC7B,IAAI,IAAI,SAAA,SAAqB,MAAM,WAAA,iBAAuC,mBAAmB;IAC7F,oBAAoB;IACpB,MAAM,QAAQ,mBAAmB,MAAM,MAAM,IAAI,GAAG;IACpD,IAAI,OAAO,IAAI,GAAG,SAAS,KAAK;GAClC;EACF;CACF;AACF;;;AC5PA,IAAA,oBAAA,GAAeC,qCAAAA,WAAAA,EAAY,EAAE,SAAS,IAAI,SAAS,cAA4C;CAC7F,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,yDAAyD;CACvF,MAAM,KAAK,gBAAgB,SAAS;EAAE;EAAI,WAAW,WAAWC,kBAAAA,kBAAkB;CAAE,CAAC;CACrF,MAAM,QAAQ,mBAAmB,QAAQ,IAAI,CAAC;CAC9C,MAAM,WAAW,UAAsC;EACrD,MAAM,QAAQC,6BAAAA,qBAAqB,GAAG,GAAG;EACzC,MAAM,OAAO,CAACC,6BAAAA,+BAA+B,IAAI,gBAAgB;GAC/D,MAAM,WAAA,GAAUC,6BAAAA,6BAAAA,EAAAA,GAA6BC,6BAAAA,wBAAAA,CAAwB,WAAW,CAAC;GACjF,MAAM,eAAqB,GAAG,QAAQ,SAASC,gBAAAA,wBAAwB,QAAQ,KAAK,CAAC,CAAC;GACtF,MAAM,cAAc,QAAQ,UAAU,MAAM;GAC5C,OAAO;GACP,aAAa;IACX,YAAY;IACZ,GAAG,QAAQ,SAAS,CAAC,CAAC;GACxB;EACF,CAAC;CACH;CACA,OAAO;EACL,OAAO;GAAE;GAAI;GAAO;EAAQ;EAC5B,UAAU,CAAC,OAAO;EAClB,cAAc,GAAG,QAAQ;EACzB,iBAAiB,GAAG,QAAQ;CAC9B;AACF,CAAC;;;ACjCD,IAAA,sBAAA,GAAeC,qCAAAA,iBAAAA,EACZ,YAA2D,QAAQ,KAAK,GAAG,SAAS,EACvF;;;ACFA,IAAA,qBAAA,GAAeC,qCAAAA,iBAAAA,EACZ,YAA2D,QAAQ,KAAK,GAAG,SAAS,EACvF;;;ACFA,IAAA,qBAAA,GAAeC,qCAAAA,cAAAA,EAAe,YAA2D,QAAQ,KAAK,GAAG,OAAO,KAAM;;;ACAtH,IAAA,4BAAA,GAAeC,qCAAAA,cAAAA,EACZ,YAA2D,QAAQ,KAAK,GAAG,OAAO,aACrF;;;ACFA,IAAA,oBAAA,GAAeC,qCAAAA,cAAAA,EAAe,YAA8E;CAC1G,MAAM,OAAO,QAAQ,KAAK,MAAM,MAAM,cAAc,UAAU,SAAS,MAAM;CAC7E,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,6BAA6B;CACxD,OAAO;EAAE,GAAG;EAAM,WAAW,QAAQ,KAAK,QAAQ,SAAS;CAAW;AACxE,CAAC;;;ACJD,IAAA,oBAAA,GAAeC,qCAAAA,cAAAA,EAAe,YAA8E;CAC1G,MAAM,OAAO,QAAQ,KAAK,MAAM,MAAM,cAAc,UAAU,SAAS,MAAM;CAC7E,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,6BAA6B;CACxD,OAAO;EAAE,GAAG;EAAM,WAAW,QAAQ,KAAK,QAAQ,SAAS;CAAW;AACxE,CAAC;;;ACJD,IAAA,oBAAA,GAAeC,qCAAAA,cAAAA,EAAe,YAA8E;CAC1G,MAAM,OAAO,QAAQ,KAAK,MAAM,MAAM,cAAc,UAAU,SAAS,MAAM;CAC7E,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,6BAA6B;CACxD,OAAO;EAAE,GAAG;EAAM,WAAW,QAAQ,KAAK,QAAQ,SAAS;CAAW;AACxE,CAAC;;;ACJD,IAAA,kBAAA,GAAeC,qCAAAA,cAAAA,EAAe,YAA8E;CAC1G,MAAM,OAAO,QAAQ,KAAK,MAAM,MAAM,cAAc,UAAU,SAAS,IAAI;CAC3E,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,2BAA2B;CACtD,OAAO;EAAE,GAAG;EAAM,WAAW,QAAQ,KAAK,QAAQ,SAAS;CAAW;AACxE,CAAC;;;ACJD,IAAA,oBAAA,GAAeC,qCAAAA,cAAAA,EAAe,YAA8E;CAC1G,MAAM,OAAO,QAAQ,KAAK,MAAM,MAAM,cAAc,UAAU,SAAS,MAAM;CAC7E,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,6BAA6B;CACxD,OAAO;EAAE,GAAG;EAAM,WAAW,QAAQ,KAAK,QAAQ,SAAS;CAAW;AACxE,CAAC;;;ACJD,IAAA,qBAAA,GAAeC,qCAAAA,cAAAA,EAAe,YAA8E;CAC1G,MAAM,OAAO,QAAQ,KAAK,MAAM,MAAM,cAAc,UAAU,SAAS,OAAO;CAC9E,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,8BAA8B;CACzD,OAAO;EAAE,GAAG;EAAM,WAAW,QAAQ,KAAK,QAAQ,SAAS;CAAW;AACxE,CAAC;;;ACcD,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AACpE,MAAM,OAAU,UAAmC,WAAuB;CAAE,GAAG;CAAU,GAAI;AAAiB;AAE9G,MAAa,aAAA,GAAYC,mCAAAA,kBAAAA,CAAoC,wBAAwB,OAAO,YAAY;CACtG,MAAM,eAAe,MAAMC,iBAAY,OAAO;CAC9C,MAAM,iBAAiB;EAAE,GAAG;EAAS,MAAM,aAAa;CAAM;CAC9D,OAAO;EACL,IAAA,GAAGC,qCAAAA,iBAAAA,CAAiB,YAAY;EAChC,IAAI,WAA8C;GAAE,OAAO,CAAC,GAAGC,oBAAe,cAAc,GAAG,GAAGC,mBAAc,cAAc,CAAC;EAAG;EAClI,QAAQ;GACN,OAAO,GAAGC,mBAAW,cAAc;GACnC,eAAe,GAAGC,0BAAkB,cAAc;EACpD;EACA,IAAA,GAAGC,mCAAAA,oBAAAA,CAAoB,wBAAwB;GAAC,IAAI,EAAE,MAAM,OAAO,GAAG,GAAGC,kBAAU,cAAc,CAAC;GAAG,IAAI,EAAE,MAAM,OAAO,GAAG,GAAGC,kBAAU,cAAc,CAAC;GAAG,IAAI,EAAE,MAAM,OAAO,GAAG,GAAGC,kBAAU,cAAc,CAAC;GAAG,IAAI,EAAE,MAAM,KAAK,GAAG,GAAGC,gBAAQ,cAAc,CAAC;GAAG,IAAI,EAAE,MAAM,OAAO,GAAG,GAAGC,kBAAU,cAAc,CAAC;GAAG,IAAI,EAAE,MAAM,QAAQ,GAAG,GAAGC,mBAAW,cAAc,CAAC;EAAC,CAAC;EAC3W,UAAU,CAAC,GAAI,aAAa,YAAY,CAAC,CAAE;CAC7C;AACF,CAAC"}
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi.d.mts","names":[],"sources":["../../generated/pi.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"pi.d.mts","names":[],"sources":["../../generated/pi.ts"],"mappings":";;;qBA4Ba,+DAAS,mBAAT"}
|
package/dist/extensions/pi.mjs
CHANGED
|
@@ -730,10 +730,10 @@ var write_cli_default = defineCliTool((context) => {
|
|
|
730
730
|
//#endregion
|
|
731
731
|
//#region generated/pi.ts
|
|
732
732
|
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
733
|
-
const via = (identity, value) =>
|
|
733
|
+
const via = (identity, value) => value === void 0 ? void 0 : {
|
|
734
734
|
...identity,
|
|
735
735
|
...value
|
|
736
|
-
}
|
|
736
|
+
};
|
|
737
737
|
const extension = definePiExtension("@agimon-ai/doompi-ui", async (context) => {
|
|
738
738
|
const scopeSession = await root_cli_default(context);
|
|
739
739
|
const contextSession = {
|
|
@@ -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 => ({ ...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/**\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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"}
|
|
@@ -51,10 +51,10 @@ var tools_server_default = (0, _agimon_ai_doompi_core_extensionFile.defineServer
|
|
|
51
51
|
//#endregion
|
|
52
52
|
//#region generated/server.ts
|
|
53
53
|
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
54
|
-
const via = (identity, value) =>
|
|
54
|
+
const via = (identity, value) => value === void 0 ? void 0 : {
|
|
55
55
|
...identity,
|
|
56
56
|
...value
|
|
57
|
-
}
|
|
57
|
+
};
|
|
58
58
|
const facet = (0, _agimon_ai_doompi_core_serverFacet.defineServerPlugin)({
|
|
59
59
|
name: "@agimon-ai/doompi-ui",
|
|
60
60
|
session: (context) => ({ get commands() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.cjs","names":["TOOLS_COMMAND","defineServerCommand","defineServerPlugin","commandTools"],"sources":["../../src/services/sessionToolInventory/index.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/sessionInventory.ts","../../src/extensions/workspaces/sessions/(backend)/command/tools.server.ts","../../generated/server.ts"],"sourcesContent":["export function toolNames(entries: readonly Record<string, unknown>[]): string[] {\n const names = new Set<string>();\n for (const entry of entries) {\n const message = entry.message;\n if (!message || typeof message !== 'object' || Array.isArray(message)) continue;\n const content = (message as { content?: unknown }).content;\n if (!Array.isArray(content)) continue;\n for (const block of content) {\n if (!block || typeof block !== 'object' || Array.isArray(block)) continue;\n const name = (block as { name?: unknown }).name;\n if (typeof name === 'string' && name) names.add(name);\n }\n }\n return [...names].sort();\n}\n","import type { DoomHeadlessCommand } from '@agimon-ai/doompi-core/headless';\nimport type { DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { TOOLS_COMMAND } from '../../../../../constants/ui';\nimport { toolNames } from '../../../../../services/sessionToolInventory';\n\n/**\n * The TUI shell itself stays Pi-only. Inventory is the shared part and is exposed\n * from session data rather than silently installing a fake editor/widget host.\n *\n * Inventory is a command, never a context resource. It reports the tools observed\n * in the transcript, which is not the tool surface the current selection exposes:\n * as a prompt section it listed tools the session had since gated out, directly\n * contradicting the `Available tools:` block, and it grew for the whole session.\n */\nexport function createUiServerContributions(): DoomServerSessionPlugin {\n return {\n commands: [\n {\n name: TOOLS_COMMAND,\n description: 'Show tools observed in this headless session. TUI rendering remains unavailable.',\n async execute(_args, execution) {\n await execution.client.notify({\n title: 'DoomPi tools',\n body:\n toolNames(await execution.session.entries({ type: 'message' })).join('\\n') ||\n '(no tool calls recorded in this session)',\n level: 'info',\n });\n },\n } satisfies DoomHeadlessCommand,\n ],\n };\n}\n","import { defineServerCommand } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { createUiServerContributions } from '../_lib/sessionInventory';\n\nexport default defineServerCommand(createUiServerContributions().commands![0]!);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\n\nimport commandTools from '../src/extensions/workspaces/sessions/(backend)/command/tools.server';\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
|
|
1
|
+
{"version":3,"file":"server.cjs","names":["TOOLS_COMMAND","defineServerCommand","defineServerPlugin","commandTools"],"sources":["../../src/services/sessionToolInventory/index.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/sessionInventory.ts","../../src/extensions/workspaces/sessions/(backend)/command/tools.server.ts","../../generated/server.ts"],"sourcesContent":["export function toolNames(entries: readonly Record<string, unknown>[]): string[] {\n const names = new Set<string>();\n for (const entry of entries) {\n const message = entry.message;\n if (!message || typeof message !== 'object' || Array.isArray(message)) continue;\n const content = (message as { content?: unknown }).content;\n if (!Array.isArray(content)) continue;\n for (const block of content) {\n if (!block || typeof block !== 'object' || Array.isArray(block)) continue;\n const name = (block as { name?: unknown }).name;\n if (typeof name === 'string' && name) names.add(name);\n }\n }\n return [...names].sort();\n}\n","import type { DoomHeadlessCommand } from '@agimon-ai/doompi-core/headless';\nimport type { DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { TOOLS_COMMAND } from '../../../../../constants/ui';\nimport { toolNames } from '../../../../../services/sessionToolInventory';\n\n/**\n * The TUI shell itself stays Pi-only. Inventory is the shared part and is exposed\n * from session data rather than silently installing a fake editor/widget host.\n *\n * Inventory is a command, never a context resource. It reports the tools observed\n * in the transcript, which is not the tool surface the current selection exposes:\n * as a prompt section it listed tools the session had since gated out, directly\n * contradicting the `Available tools:` block, and it grew for the whole session.\n */\nexport function createUiServerContributions(): DoomServerSessionPlugin {\n return {\n commands: [\n {\n name: TOOLS_COMMAND,\n description: 'Show tools observed in this headless session. TUI rendering remains unavailable.',\n async execute(_args, execution) {\n await execution.client.notify({\n title: 'DoomPi tools',\n body:\n toolNames(await execution.session.entries({ type: 'message' })).join('\\n') ||\n '(no tool calls recorded in this session)',\n level: 'info',\n });\n },\n } satisfies DoomHeadlessCommand,\n ],\n };\n}\n","import { defineServerCommand } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { createUiServerContributions } from '../_lib/sessionInventory';\n\nexport default defineServerCommand(createUiServerContributions().commands![0]!);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\n\nimport commandTools from '../src/extensions/workspaces/sessions/(backend)/command/tools.server';\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 facet = defineServerPlugin({\n name: '@agimon-ai/doompi-ui',\n session: (context) => ({\n get commands(): DoomServerSessionPlugin['commands'] { return [via({ name: 'tools' }, at(commandTools, context))]; },\n }),\n});\n\nexport default facet;\n"],"mappings":";;;;;;;;AAAA,SAAgB,UAAU,SAAuD;CAC/E,MAAM,wBAAQ,IAAI,IAAY;CAC9B,KAAK,MAAM,SAAS,SAAS;EAC3B,MAAM,UAAU,MAAM;EACtB,IAAI,CAAC,WAAW,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,GAAG;EACvE,MAAM,UAAW,QAAkC;EACnD,IAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;EAC7B,KAAK,MAAM,SAAS,SAAS;GAC3B,IAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;GACjE,MAAM,OAAQ,MAA6B;GAC3C,IAAI,OAAO,SAAS,YAAY,MAAM,MAAM,IAAI,IAAI;EACtD;CACF;CACA,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK;AACzB;;;;;;;;;;;;ACCA,SAAgB,8BAAuD;CACrE,OAAO,EACL,UAAU,CACR;EACE,MAAMA,WAAAA;EACN,aAAa;EACb,MAAM,QAAQ,OAAO,WAAW;GAC9B,MAAM,UAAU,OAAO,OAAO;IAC5B,OAAO;IACP,MACE,UAAU,MAAM,UAAU,QAAQ,QAAQ,EAAE,MAAM,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,KACzE;IACF,OAAO;GACT,CAAC;EACH;CACF,CACF,EACF;AACF;;;AC7BA,IAAA,wBAAA,GAAeC,qCAAAA,oBAAAA,CAAoB,4BAA4B,CAAC,CAAC,SAAU,EAAG;;;ACE9E,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,SAAA,GAAQC,mCAAAA,mBAAAA,CAAmB;CACtC,MAAM;CACN,UAAU,aAAa,EACrB,IAAI,WAAgD;EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,QAAQ,GAAG,GAAGC,sBAAc,OAAO,CAAC,CAAC;CAAG,EACpH;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.mts","names":[],"sources":["../../generated/server.ts"],"mappings":";
|
|
1
|
+
{"version":3,"file":"server.d.mts","names":[],"sources":["../../generated/server.ts"],"mappings":";qBAWa,oDAAK"}
|
|
@@ -47,10 +47,10 @@ var tools_server_default = defineServerCommand(createUiServerContributions().com
|
|
|
47
47
|
//#endregion
|
|
48
48
|
//#region generated/server.ts
|
|
49
49
|
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
50
|
-
const via = (identity, value) =>
|
|
50
|
+
const via = (identity, value) => value === void 0 ? void 0 : {
|
|
51
51
|
...identity,
|
|
52
52
|
...value
|
|
53
|
-
}
|
|
53
|
+
};
|
|
54
54
|
const facet = defineServerPlugin({
|
|
55
55
|
name: "@agimon-ai/doompi-ui",
|
|
56
56
|
session: (context) => ({ get commands() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.mjs","names":["commandTools"],"sources":["../../src/services/sessionToolInventory/index.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/sessionInventory.ts","../../src/extensions/workspaces/sessions/(backend)/command/tools.server.ts","../../generated/server.ts"],"sourcesContent":["export function toolNames(entries: readonly Record<string, unknown>[]): string[] {\n const names = new Set<string>();\n for (const entry of entries) {\n const message = entry.message;\n if (!message || typeof message !== 'object' || Array.isArray(message)) continue;\n const content = (message as { content?: unknown }).content;\n if (!Array.isArray(content)) continue;\n for (const block of content) {\n if (!block || typeof block !== 'object' || Array.isArray(block)) continue;\n const name = (block as { name?: unknown }).name;\n if (typeof name === 'string' && name) names.add(name);\n }\n }\n return [...names].sort();\n}\n","import type { DoomHeadlessCommand } from '@agimon-ai/doompi-core/headless';\nimport type { DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { TOOLS_COMMAND } from '../../../../../constants/ui';\nimport { toolNames } from '../../../../../services/sessionToolInventory';\n\n/**\n * The TUI shell itself stays Pi-only. Inventory is the shared part and is exposed\n * from session data rather than silently installing a fake editor/widget host.\n *\n * Inventory is a command, never a context resource. It reports the tools observed\n * in the transcript, which is not the tool surface the current selection exposes:\n * as a prompt section it listed tools the session had since gated out, directly\n * contradicting the `Available tools:` block, and it grew for the whole session.\n */\nexport function createUiServerContributions(): DoomServerSessionPlugin {\n return {\n commands: [\n {\n name: TOOLS_COMMAND,\n description: 'Show tools observed in this headless session. TUI rendering remains unavailable.',\n async execute(_args, execution) {\n await execution.client.notify({\n title: 'DoomPi tools',\n body:\n toolNames(await execution.session.entries({ type: 'message' })).join('\\n') ||\n '(no tool calls recorded in this session)',\n level: 'info',\n });\n },\n } satisfies DoomHeadlessCommand,\n ],\n };\n}\n","import { defineServerCommand } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { createUiServerContributions } from '../_lib/sessionInventory';\n\nexport default defineServerCommand(createUiServerContributions().commands![0]!);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\n\nimport commandTools from '../src/extensions/workspaces/sessions/(backend)/command/tools.server';\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
|
|
1
|
+
{"version":3,"file":"server.mjs","names":["commandTools"],"sources":["../../src/services/sessionToolInventory/index.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/sessionInventory.ts","../../src/extensions/workspaces/sessions/(backend)/command/tools.server.ts","../../generated/server.ts"],"sourcesContent":["export function toolNames(entries: readonly Record<string, unknown>[]): string[] {\n const names = new Set<string>();\n for (const entry of entries) {\n const message = entry.message;\n if (!message || typeof message !== 'object' || Array.isArray(message)) continue;\n const content = (message as { content?: unknown }).content;\n if (!Array.isArray(content)) continue;\n for (const block of content) {\n if (!block || typeof block !== 'object' || Array.isArray(block)) continue;\n const name = (block as { name?: unknown }).name;\n if (typeof name === 'string' && name) names.add(name);\n }\n }\n return [...names].sort();\n}\n","import type { DoomHeadlessCommand } from '@agimon-ai/doompi-core/headless';\nimport type { DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { TOOLS_COMMAND } from '../../../../../constants/ui';\nimport { toolNames } from '../../../../../services/sessionToolInventory';\n\n/**\n * The TUI shell itself stays Pi-only. Inventory is the shared part and is exposed\n * from session data rather than silently installing a fake editor/widget host.\n *\n * Inventory is a command, never a context resource. It reports the tools observed\n * in the transcript, which is not the tool surface the current selection exposes:\n * as a prompt section it listed tools the session had since gated out, directly\n * contradicting the `Available tools:` block, and it grew for the whole session.\n */\nexport function createUiServerContributions(): DoomServerSessionPlugin {\n return {\n commands: [\n {\n name: TOOLS_COMMAND,\n description: 'Show tools observed in this headless session. TUI rendering remains unavailable.',\n async execute(_args, execution) {\n await execution.client.notify({\n title: 'DoomPi tools',\n body:\n toolNames(await execution.session.entries({ type: 'message' })).join('\\n') ||\n '(no tool calls recorded in this session)',\n level: 'info',\n });\n },\n } satisfies DoomHeadlessCommand,\n ],\n };\n}\n","import { defineServerCommand } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { createUiServerContributions } from '../_lib/sessionInventory';\n\nexport default defineServerCommand(createUiServerContributions().commands![0]!);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\n\nimport commandTools from '../src/extensions/workspaces/sessions/(backend)/command/tools.server';\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 facet = defineServerPlugin({\n name: '@agimon-ai/doompi-ui',\n session: (context) => ({\n get commands(): DoomServerSessionPlugin['commands'] { return [via({ name: 'tools' }, at(commandTools, context))]; },\n }),\n});\n\nexport default facet;\n"],"mappings":";;;;AAAA,SAAgB,UAAU,SAAuD;CAC/E,MAAM,wBAAQ,IAAI,IAAY;CAC9B,KAAK,MAAM,SAAS,SAAS;EAC3B,MAAM,UAAU,MAAM;EACtB,IAAI,CAAC,WAAW,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,GAAG;EACvE,MAAM,UAAW,QAAkC;EACnD,IAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;EAC7B,KAAK,MAAM,SAAS,SAAS;GAC3B,IAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;GACjE,MAAM,OAAQ,MAA6B;GAC3C,IAAI,OAAO,SAAS,YAAY,MAAM,MAAM,IAAI,IAAI;EACtD;CACF;CACA,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK;AACzB;;;;;;;;;;;;ACCA,SAAgB,8BAAuD;CACrE,OAAO,EACL,UAAU,CACR;EACE,MAAM;EACN,aAAa;EACb,MAAM,QAAQ,OAAO,WAAW;GAC9B,MAAM,UAAU,OAAO,OAAO;IAC5B,OAAO;IACP,MACE,UAAU,MAAM,UAAU,QAAQ,QAAQ,EAAE,MAAM,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,KACzE;IACF,OAAO;GACT,CAAC;EACH;CACF,CACF,EACF;AACF;;;AC7BA,IAAA,uBAAe,oBAAoB,4BAA4B,CAAC,CAAC,SAAU,EAAG;;;ACE9E,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,QAAQ,mBAAmB;CACtC,MAAM;CACN,UAAU,aAAa,EACrB,IAAI,WAAgD;EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,QAAQ,GAAG,GAAGA,sBAAc,OAAO,CAAC,CAAC;CAAG,EACpH;AACF,CAAC"}
|
package/dist/extensions/web.mjs
CHANGED
|
@@ -312,10 +312,10 @@ function WriteToolMessage({ args, result, output, running, isError, fileTabFor,
|
|
|
312
312
|
var write_web_default = defineToolRenderer({ message: WriteToolMessage });
|
|
313
313
|
//#endregion
|
|
314
314
|
//#region generated/web.ts
|
|
315
|
-
const via = (identity, value) =>
|
|
315
|
+
const via = (identity, value) => value === void 0 ? void 0 : {
|
|
316
316
|
...identity,
|
|
317
317
|
...value
|
|
318
|
-
}
|
|
318
|
+
};
|
|
319
319
|
const webPlugin = defineWebPlugin({
|
|
320
320
|
id: "builtin-tools",
|
|
321
321
|
session: { get toolRenderers() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.mjs","names":["LIMIT_KEY","LIMIT_UNIT","toolFind","toolLs","toolWrite"],"sources":["../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/builtinToolView.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/ListingBody.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/FindToolMessage.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/find.web.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/LsToolMessage.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/ls.web.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/WriteToolMessage.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/write.web.tsx","../../generated/web.ts"],"sourcesContent":["import type { ToolResultView } from '@agimon-ai/doompi-core/web';\n\n/** The TUI's collapsed budgets: ten preview lines for a write, twenty for a listing. */\nexport const WRITE_COLLAPSED_LINES = 10;\nexport const LIST_COLLAPSED_LINES = 20;\n/** Pi's default output cap, the size its truncation warning names when details omit one. */\nconst DEFAULT_MAX_BYTES = 50 * 1024;\nconst KIBIBYTE = 1024;\n\nexport interface NumberedLine {\n readonly number: number;\n readonly text: string;\n}\n\nexport interface WriteCallView {\n readonly path: string;\n /** `N chars`, the size the TUI's call heading shows. */\n readonly size: string;\n readonly preview: readonly NumberedLine[];\n readonly hidden: number;\n /** Widest shown line number, in characters. */\n readonly gutter: number;\n}\n\nexport interface SearchCallView {\n readonly primary: string;\n readonly details: readonly string[];\n}\n\nexport interface ListResultView {\n readonly lines: readonly string[];\n readonly hidden: number;\n /** Pi's `[Truncated: ...]` warning, when the listing hit a limit. */\n readonly truncated: string | undefined;\n}\n\nfunction compactDetails(values: ReadonlyArray<string | undefined>): string[] {\n return values.filter((value): value is string => value !== undefined && value.length > 0);\n}\n\nfunction optionalCount(value: unknown, unit: string): string | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? `${value} ${unit}` : undefined;\n}\n\nfunction pathOrDot(value: unknown): string {\n return typeof value === 'string' && value.length > 0 ? value : '.';\n}\n\n/** Pi's size formatter, so the web warning names the same figure the TUI does. */\nexport function formatSize(bytes: number): string {\n if (bytes < KIBIBYTE) return `${bytes}B`;\n if (bytes < KIBIBYTE * KIBIBYTE) return `${(bytes / KIBIBYTE).toFixed(1)}KB`;\n return `${(bytes / (KIBIBYTE * KIBIBYTE)).toFixed(1)}MB`;\n}\n\n/** What the write call shows: the path, the content size, and a numbered preview of the file. */\nexport function writeCallView(args: Readonly<Record<string, unknown>>, expanded: boolean): WriteCallView {\n const content = typeof args.content === 'string' ? args.content : '';\n const path = typeof args.path === 'string' ? args.path : '';\n const size = `${content.length.toLocaleString('en-US')} chars`;\n if (content.length === 0) return { path, size, preview: [], hidden: 0, gutter: 1 };\n const lines = content.replaceAll('\\t', ' ').replaceAll('\\r\\n', '\\n').split('\\n');\n while (lines.at(-1) === '') lines.pop();\n const visible = expanded ? lines : lines.slice(0, WRITE_COLLAPSED_LINES);\n const preview = visible.map((text, index) => ({ number: index + 1, text }));\n return { path, size, preview, hidden: lines.length - visible.length, gutter: String(visible.length).length };\n}\n\n/** `pattern · path · N results`, as the find call heading lists them. */\nexport function findCallView(args: Readonly<Record<string, unknown>>): SearchCallView {\n return {\n primary: typeof args.pattern === 'string' ? args.pattern : '',\n details: compactDetails([pathOrDot(args.path), optionalCount(args.limit, 'results')]),\n };\n}\n\n/** `path · N entries`, as the ls call heading lists them. */\nexport function lsCallView(args: Readonly<Record<string, unknown>>): SearchCallView {\n return { primary: pathOrDot(args.path), details: compactDetails([optionalCount(args.limit, 'entries')]) };\n}\n\n/** The result's text, from its blocks when the view exists and from the joined output otherwise. */\nexport function resultText(result: ToolResultView | null, output: string): string {\n if (result === null) return output;\n return result.content\n .flatMap((block) => {\n const record = typeof block === 'object' && block !== null ? (block as { type?: unknown; text?: unknown }) : {};\n return record.type === 'text' && typeof record.text === 'string' ? [record.text] : [];\n })\n .join('\\n');\n}\n\n/**\n * A find or ls listing the way Pi's own renderer shows it: the lines,\n * collapsed to twenty, and the limit warning its details carry. `limitKey`\n * names the per-tool counter (resultLimitReached, entryLimitReached).\n */\nexport function listResultView(\n result: ToolResultView | null,\n output: string,\n expanded: boolean,\n limitKey: string,\n limitUnit: string,\n): ListResultView {\n const text = resultText(result, output).trim();\n const all = text.length === 0 ? [] : text.split('\\n');\n const lines = expanded ? all : all.slice(0, LIST_COLLAPSED_LINES);\n const details =\n typeof result?.details === 'object' && result.details !== null ? (result.details as Record<string, unknown>) : {};\n const limit = details[limitKey];\n const truncation =\n typeof details.truncation === 'object' && details.truncation !== null\n ? (details.truncation as Record<string, unknown>)\n : undefined;\n const warnings: string[] = [];\n if (typeof limit === 'number' && limit > 0) warnings.push(`${limit} ${limitUnit} limit`);\n if (truncation?.truncated === true) {\n warnings.push(\n `${formatSize(typeof truncation.maxBytes === 'number' ? truncation.maxBytes : DEFAULT_MAX_BYTES)} limit`,\n );\n }\n return {\n lines,\n hidden: all.length - lines.length,\n truncated: warnings.length > 0 ? `[Truncated: ${warnings.join(', ')}]` : undefined,\n };\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/doompi-core/web';\nimport { MessageItemBody, MessageItemStatus } from '@agimon-ai/doompi-web-components';\n\nimport { listResultView, resultText } from '../_lib/builtinToolView';\n\n/**\n * The body shared by find and ls: Pi's listing lines, collapsed to twenty\n * until the item expands, with the limit warning its details carry.\n */\nexport function ListingBody({\n tool,\n limitKey,\n limitUnit,\n expanded,\n props,\n}: {\n tool: string;\n limitKey: string;\n limitUnit: string;\n expanded: boolean;\n props: ToolMessageRenderProps;\n}) {\n const { result, output, running, isError } = props;\n if (isError) {\n return (\n <MessageItemBody data-testid={`tool-result-${tool}`} className=\"flex flex-col\">\n <MessageItemStatus tone=\"error\">failed</MessageItemStatus>\n <span className=\"whitespace-pre-wrap break-words text-doom-red\">{resultText(result, output)}</span>\n </MessageItemBody>\n );\n }\n if (result === null) {\n return running ? (\n <MessageItemBody data-testid={`tool-result-${tool}`}>\n <MessageItemStatus tone=\"running\">running</MessageItemStatus>\n </MessageItemBody>\n ) : null;\n }\n const view = listResultView(result, output, expanded, limitKey, limitUnit);\n if (view.lines.length === 0 && view.truncated === undefined) return null;\n return (\n <MessageItemBody data-testid={`tool-result-${tool}`} className=\"flex flex-col font-mono\">\n {view.lines.map((line, index) => (\n <span key={`${String(index)}-${line}`} className=\"whitespace-pre-wrap break-words text-doom-text\">\n {line}\n </span>\n ))}\n {view.hidden > 0 ? <MessageItemStatus expands>{view.hidden} more lines</MessageItemStatus> : null}\n {view.truncated !== undefined ? <span className=\"text-doom-yellow\">{view.truncated}</span> : null}\n </MessageItemBody>\n );\n}\n\n/** Whether the listing hides lines while collapsed, so the item can offer its toggle. */\nexport function listingExpandable(props: ToolMessageRenderProps, limitKey: string, limitUnit: string): boolean {\n if (props.result === null || props.isError) return false;\n return listResultView(props.result, props.output, false, limitKey, limitUnit).hidden > 0;\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/doompi-core/web';\nimport { MessageItem, MessageItemHeader, toolTone } from '@agimon-ai/doompi-web-components';\n\nimport { findCallView } from '../_lib/builtinToolView';\nimport { ListingBody, listingExpandable } from './ListingBody';\n\nconst LIMIT_KEY = 'resultLimitReached';\nconst LIMIT_UNIT = 'results';\n\n/** The find tool's timeline item: `pattern · path · N results` over Pi's listing lines. */\nexport function FindToolMessage(props: ToolMessageRenderProps) {\n const view = findCallView(props.args);\n return (\n <MessageItem\n tone={toolTone({ running: props.running, isError: props.isError })}\n expandable={listingExpandable(props, LIMIT_KEY, LIMIT_UNIT)}\n >\n {({ expanded }) => (\n <>\n <MessageItemHeader title=\"find\">\n <span data-testid=\"tool-call-find\" className=\"flex min-w-0 flex-1 items-center gap-2\">\n <span className=\"truncate text-doom-text\">{view.primary}</span>\n {view.details.length > 0 ? (\n <span className=\"shrink-0 text-doom-faint\">· {view.details.join(' · ')}</span>\n ) : null}\n </span>\n </MessageItemHeader>\n <ListingBody tool=\"find\" limitKey={LIMIT_KEY} limitUnit={LIMIT_UNIT} expanded={expanded} props={props} />\n </>\n )}\n </MessageItem>\n );\n}\n","import { defineToolRenderer } from '@agimon-ai/doompi-core/web';\n\nimport { FindToolMessage } from './_components/FindToolMessage';\n\nexport default defineToolRenderer({ message: FindToolMessage });\n","import type { ToolMessageRenderProps } from '@agimon-ai/doompi-core/web';\nimport { MessageItem, MessageItemHeader, toolTone } from '@agimon-ai/doompi-web-components';\n\nimport { lsCallView } from '../_lib/builtinToolView';\nimport { ListingBody, listingExpandable } from './ListingBody';\n\nconst LIMIT_KEY = 'entryLimitReached';\nconst LIMIT_UNIT = 'entries';\n\n/** The ls tool's timeline item: `path · N entries` over Pi's listing lines. */\nexport function LsToolMessage(props: ToolMessageRenderProps) {\n const view = lsCallView(props.args);\n return (\n <MessageItem\n tone={toolTone({ running: props.running, isError: props.isError })}\n expandable={listingExpandable(props, LIMIT_KEY, LIMIT_UNIT)}\n >\n {({ expanded }) => (\n <>\n <MessageItemHeader title=\"ls\">\n <span data-testid=\"tool-call-ls\" className=\"flex min-w-0 flex-1 items-center gap-2\">\n <span className=\"truncate text-doom-text\">{view.primary}</span>\n {view.details.length > 0 ? (\n <span className=\"shrink-0 text-doom-faint\">· {view.details.join(' · ')}</span>\n ) : null}\n </span>\n </MessageItemHeader>\n <ListingBody tool=\"ls\" limitKey={LIMIT_KEY} limitUnit={LIMIT_UNIT} expanded={expanded} props={props} />\n </>\n )}\n </MessageItem>\n );\n}\n","import { defineToolRenderer } from '@agimon-ai/doompi-core/web';\n\nimport { LsToolMessage } from './_components/LsToolMessage';\n\nexport default defineToolRenderer({ message: LsToolMessage });\n","import type { ToolMessageRenderProps } from '@agimon-ai/doompi-core/web';\nimport {\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n SyntaxLine,\n ToolPathLink,\n toolTone,\n useSyntaxLines,\n} from '@agimon-ai/doompi-web-components';\n\nimport { resultText, type WriteCallView, writeCallView } from '../_lib/builtinToolView';\n\n/**\n * The numbered preview, coloured as the file it is about to become.\n *\n * Its own component so the highlighting hook has somewhere to live: the body\n * around it is picked inside a render prop. The preview is a prefix of the\n * content, so it parses as the file it came from up to wherever it was cut.\n */\nfunction WritePreview({ view, path }: { view: WriteCallView; path: string }) {\n const spans = useSyntaxLines(view.preview.map((line) => line.text).join('\\n'), { path });\n return (\n <>\n {view.preview.map((line, index) => (\n <span key={line.number} className=\"flex gap-2\">\n <span className=\"shrink-0 text-right text-doom-faint\" style={{ width: `${String(view.gutter)}ch` }}>\n {line.number}\n </span>\n <SyntaxLine\n spans={spans?.[index]}\n text={line.text}\n className=\"min-w-0 whitespace-pre-wrap break-words text-doom-text\"\n />\n </span>\n ))}\n </>\n );\n}\n\n/**\n * The write tool's timeline item: `path · N chars` in the header. Pi's write\n * result is silent on success, so the body shows the numbered preview the\n * TUI folds into its call: ten lines, or all of them once the item expands.\n * A failure shows the tool's message in red instead.\n */\nexport function WriteToolMessage({\n args,\n result,\n output,\n running,\n isError,\n fileTabFor,\n openTransientTab,\n}: ToolMessageRenderProps) {\n const collapsed = writeCallView(args, false);\n // The header names a file the tool is writing, so the reader can open it\n // rather than hunt for it; nothing installed to show files leaves it as text.\n const tab = fileTabFor(collapsed.path);\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={collapsed.hidden > 0}>\n {({ expanded }) => {\n const view = expanded ? writeCallView(args, true) : collapsed;\n return (\n <>\n <MessageItemHeader title=\"write\">\n <span data-testid=\"tool-call-write\" className=\"flex min-w-0 flex-1 items-center gap-2\">\n <ToolPathLink\n path={view.path}\n {...(tab === undefined ? {} : { onOpen: () => openTransientTab(tab) })}\n />\n <span className=\"shrink-0 text-doom-faint\">· {view.size}</span>\n </span>\n </MessageItemHeader>\n {isError ? (\n <MessageItemBody data-testid=\"tool-result-write\" className=\"flex flex-col\">\n <MessageItemStatus tone=\"error\">failed</MessageItemStatus>\n <span className=\"whitespace-pre-wrap break-words text-doom-red\">{resultText(result, output)}</span>\n </MessageItemBody>\n ) : view.preview.length === 0 ? (\n running ? (\n <MessageItemBody data-testid=\"tool-result-write\">\n <MessageItemStatus tone=\"running\">running</MessageItemStatus>\n </MessageItemBody>\n ) : null\n ) : (\n <MessageItemBody data-testid=\"tool-result-write\" className=\"flex flex-col font-mono\">\n <WritePreview view={view} path={view.path} />\n {view.hidden > 0 ? <MessageItemStatus expands>{view.hidden} more lines</MessageItemStatus> : null}\n {running ? <MessageItemStatus tone=\"running\">running</MessageItemStatus> : null}\n </MessageItemBody>\n )}\n </>\n );\n }}\n </MessageItem>\n );\n}\n","import { defineToolRenderer } from '@agimon-ai/doompi-core/web';\n\nimport { WriteToolMessage } from './_components/WriteToolMessage';\n\nexport default defineToolRenderer({ message: WriteToolMessage });\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineWebPlugin, type WebPluginContributions } from '@agimon-ai/doompi-core/web';\n\nimport toolFind from '../src/extensions/workspaces/sessions/(frontend)/tool/find.web';\nimport toolLs from '../src/extensions/workspaces/sessions/(frontend)/tool/ls.web';\nimport toolWrite from '../src/extensions/workspaces/sessions/(frontend)/tool/write.web';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T => ({ ...identity, ...(value as object) }) as T;\n\nexport const webPlugin = defineWebPlugin({\n id: 'builtin-tools',\n session: {\n get toolRenderers(): WebPluginContributions['toolRenderers'] { return [via({ tools: ['find'] }, toolFind), via({ tools: ['ls'] }, toolLs), via({ tools: ['write'] }, toolWrite)]; },\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"web.mjs","names":["LIMIT_KEY","LIMIT_UNIT","toolFind","toolLs","toolWrite"],"sources":["../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/builtinToolView.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/ListingBody.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/FindToolMessage.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/find.web.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/LsToolMessage.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/ls.web.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/WriteToolMessage.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/write.web.tsx","../../generated/web.ts"],"sourcesContent":["import type { ToolResultView } from '@agimon-ai/doompi-core/web';\n\n/** The TUI's collapsed budgets: ten preview lines for a write, twenty for a listing. */\nexport const WRITE_COLLAPSED_LINES = 10;\nexport const LIST_COLLAPSED_LINES = 20;\n/** Pi's default output cap, the size its truncation warning names when details omit one. */\nconst DEFAULT_MAX_BYTES = 50 * 1024;\nconst KIBIBYTE = 1024;\n\nexport interface NumberedLine {\n readonly number: number;\n readonly text: string;\n}\n\nexport interface WriteCallView {\n readonly path: string;\n /** `N chars`, the size the TUI's call heading shows. */\n readonly size: string;\n readonly preview: readonly NumberedLine[];\n readonly hidden: number;\n /** Widest shown line number, in characters. */\n readonly gutter: number;\n}\n\nexport interface SearchCallView {\n readonly primary: string;\n readonly details: readonly string[];\n}\n\nexport interface ListResultView {\n readonly lines: readonly string[];\n readonly hidden: number;\n /** Pi's `[Truncated: ...]` warning, when the listing hit a limit. */\n readonly truncated: string | undefined;\n}\n\nfunction compactDetails(values: ReadonlyArray<string | undefined>): string[] {\n return values.filter((value): value is string => value !== undefined && value.length > 0);\n}\n\nfunction optionalCount(value: unknown, unit: string): string | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? `${value} ${unit}` : undefined;\n}\n\nfunction pathOrDot(value: unknown): string {\n return typeof value === 'string' && value.length > 0 ? value : '.';\n}\n\n/** Pi's size formatter, so the web warning names the same figure the TUI does. */\nexport function formatSize(bytes: number): string {\n if (bytes < KIBIBYTE) return `${bytes}B`;\n if (bytes < KIBIBYTE * KIBIBYTE) return `${(bytes / KIBIBYTE).toFixed(1)}KB`;\n return `${(bytes / (KIBIBYTE * KIBIBYTE)).toFixed(1)}MB`;\n}\n\n/** What the write call shows: the path, the content size, and a numbered preview of the file. */\nexport function writeCallView(args: Readonly<Record<string, unknown>>, expanded: boolean): WriteCallView {\n const content = typeof args.content === 'string' ? args.content : '';\n const path = typeof args.path === 'string' ? args.path : '';\n const size = `${content.length.toLocaleString('en-US')} chars`;\n if (content.length === 0) return { path, size, preview: [], hidden: 0, gutter: 1 };\n const lines = content.replaceAll('\\t', ' ').replaceAll('\\r\\n', '\\n').split('\\n');\n while (lines.at(-1) === '') lines.pop();\n const visible = expanded ? lines : lines.slice(0, WRITE_COLLAPSED_LINES);\n const preview = visible.map((text, index) => ({ number: index + 1, text }));\n return { path, size, preview, hidden: lines.length - visible.length, gutter: String(visible.length).length };\n}\n\n/** `pattern · path · N results`, as the find call heading lists them. */\nexport function findCallView(args: Readonly<Record<string, unknown>>): SearchCallView {\n return {\n primary: typeof args.pattern === 'string' ? args.pattern : '',\n details: compactDetails([pathOrDot(args.path), optionalCount(args.limit, 'results')]),\n };\n}\n\n/** `path · N entries`, as the ls call heading lists them. */\nexport function lsCallView(args: Readonly<Record<string, unknown>>): SearchCallView {\n return { primary: pathOrDot(args.path), details: compactDetails([optionalCount(args.limit, 'entries')]) };\n}\n\n/** The result's text, from its blocks when the view exists and from the joined output otherwise. */\nexport function resultText(result: ToolResultView | null, output: string): string {\n if (result === null) return output;\n return result.content\n .flatMap((block) => {\n const record = typeof block === 'object' && block !== null ? (block as { type?: unknown; text?: unknown }) : {};\n return record.type === 'text' && typeof record.text === 'string' ? [record.text] : [];\n })\n .join('\\n');\n}\n\n/**\n * A find or ls listing the way Pi's own renderer shows it: the lines,\n * collapsed to twenty, and the limit warning its details carry. `limitKey`\n * names the per-tool counter (resultLimitReached, entryLimitReached).\n */\nexport function listResultView(\n result: ToolResultView | null,\n output: string,\n expanded: boolean,\n limitKey: string,\n limitUnit: string,\n): ListResultView {\n const text = resultText(result, output).trim();\n const all = text.length === 0 ? [] : text.split('\\n');\n const lines = expanded ? all : all.slice(0, LIST_COLLAPSED_LINES);\n const details =\n typeof result?.details === 'object' && result.details !== null ? (result.details as Record<string, unknown>) : {};\n const limit = details[limitKey];\n const truncation =\n typeof details.truncation === 'object' && details.truncation !== null\n ? (details.truncation as Record<string, unknown>)\n : undefined;\n const warnings: string[] = [];\n if (typeof limit === 'number' && limit > 0) warnings.push(`${limit} ${limitUnit} limit`);\n if (truncation?.truncated === true) {\n warnings.push(\n `${formatSize(typeof truncation.maxBytes === 'number' ? truncation.maxBytes : DEFAULT_MAX_BYTES)} limit`,\n );\n }\n return {\n lines,\n hidden: all.length - lines.length,\n truncated: warnings.length > 0 ? `[Truncated: ${warnings.join(', ')}]` : undefined,\n };\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/doompi-core/web';\nimport { MessageItemBody, MessageItemStatus } from '@agimon-ai/doompi-web-components';\n\nimport { listResultView, resultText } from '../_lib/builtinToolView';\n\n/**\n * The body shared by find and ls: Pi's listing lines, collapsed to twenty\n * until the item expands, with the limit warning its details carry.\n */\nexport function ListingBody({\n tool,\n limitKey,\n limitUnit,\n expanded,\n props,\n}: {\n tool: string;\n limitKey: string;\n limitUnit: string;\n expanded: boolean;\n props: ToolMessageRenderProps;\n}) {\n const { result, output, running, isError } = props;\n if (isError) {\n return (\n <MessageItemBody data-testid={`tool-result-${tool}`} className=\"flex flex-col\">\n <MessageItemStatus tone=\"error\">failed</MessageItemStatus>\n <span className=\"whitespace-pre-wrap break-words text-doom-red\">{resultText(result, output)}</span>\n </MessageItemBody>\n );\n }\n if (result === null) {\n return running ? (\n <MessageItemBody data-testid={`tool-result-${tool}`}>\n <MessageItemStatus tone=\"running\">running</MessageItemStatus>\n </MessageItemBody>\n ) : null;\n }\n const view = listResultView(result, output, expanded, limitKey, limitUnit);\n if (view.lines.length === 0 && view.truncated === undefined) return null;\n return (\n <MessageItemBody data-testid={`tool-result-${tool}`} className=\"flex flex-col font-mono\">\n {view.lines.map((line, index) => (\n <span key={`${String(index)}-${line}`} className=\"whitespace-pre-wrap break-words text-doom-text\">\n {line}\n </span>\n ))}\n {view.hidden > 0 ? <MessageItemStatus expands>{view.hidden} more lines</MessageItemStatus> : null}\n {view.truncated !== undefined ? <span className=\"text-doom-yellow\">{view.truncated}</span> : null}\n </MessageItemBody>\n );\n}\n\n/** Whether the listing hides lines while collapsed, so the item can offer its toggle. */\nexport function listingExpandable(props: ToolMessageRenderProps, limitKey: string, limitUnit: string): boolean {\n if (props.result === null || props.isError) return false;\n return listResultView(props.result, props.output, false, limitKey, limitUnit).hidden > 0;\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/doompi-core/web';\nimport { MessageItem, MessageItemHeader, toolTone } from '@agimon-ai/doompi-web-components';\n\nimport { findCallView } from '../_lib/builtinToolView';\nimport { ListingBody, listingExpandable } from './ListingBody';\n\nconst LIMIT_KEY = 'resultLimitReached';\nconst LIMIT_UNIT = 'results';\n\n/** The find tool's timeline item: `pattern · path · N results` over Pi's listing lines. */\nexport function FindToolMessage(props: ToolMessageRenderProps) {\n const view = findCallView(props.args);\n return (\n <MessageItem\n tone={toolTone({ running: props.running, isError: props.isError })}\n expandable={listingExpandable(props, LIMIT_KEY, LIMIT_UNIT)}\n >\n {({ expanded }) => (\n <>\n <MessageItemHeader title=\"find\">\n <span data-testid=\"tool-call-find\" className=\"flex min-w-0 flex-1 items-center gap-2\">\n <span className=\"truncate text-doom-text\">{view.primary}</span>\n {view.details.length > 0 ? (\n <span className=\"shrink-0 text-doom-faint\">· {view.details.join(' · ')}</span>\n ) : null}\n </span>\n </MessageItemHeader>\n <ListingBody tool=\"find\" limitKey={LIMIT_KEY} limitUnit={LIMIT_UNIT} expanded={expanded} props={props} />\n </>\n )}\n </MessageItem>\n );\n}\n","import { defineToolRenderer } from '@agimon-ai/doompi-core/web';\n\nimport { FindToolMessage } from './_components/FindToolMessage';\n\nexport default defineToolRenderer({ message: FindToolMessage });\n","import type { ToolMessageRenderProps } from '@agimon-ai/doompi-core/web';\nimport { MessageItem, MessageItemHeader, toolTone } from '@agimon-ai/doompi-web-components';\n\nimport { lsCallView } from '../_lib/builtinToolView';\nimport { ListingBody, listingExpandable } from './ListingBody';\n\nconst LIMIT_KEY = 'entryLimitReached';\nconst LIMIT_UNIT = 'entries';\n\n/** The ls tool's timeline item: `path · N entries` over Pi's listing lines. */\nexport function LsToolMessage(props: ToolMessageRenderProps) {\n const view = lsCallView(props.args);\n return (\n <MessageItem\n tone={toolTone({ running: props.running, isError: props.isError })}\n expandable={listingExpandable(props, LIMIT_KEY, LIMIT_UNIT)}\n >\n {({ expanded }) => (\n <>\n <MessageItemHeader title=\"ls\">\n <span data-testid=\"tool-call-ls\" className=\"flex min-w-0 flex-1 items-center gap-2\">\n <span className=\"truncate text-doom-text\">{view.primary}</span>\n {view.details.length > 0 ? (\n <span className=\"shrink-0 text-doom-faint\">· {view.details.join(' · ')}</span>\n ) : null}\n </span>\n </MessageItemHeader>\n <ListingBody tool=\"ls\" limitKey={LIMIT_KEY} limitUnit={LIMIT_UNIT} expanded={expanded} props={props} />\n </>\n )}\n </MessageItem>\n );\n}\n","import { defineToolRenderer } from '@agimon-ai/doompi-core/web';\n\nimport { LsToolMessage } from './_components/LsToolMessage';\n\nexport default defineToolRenderer({ message: LsToolMessage });\n","import type { ToolMessageRenderProps } from '@agimon-ai/doompi-core/web';\nimport {\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n SyntaxLine,\n ToolPathLink,\n toolTone,\n useSyntaxLines,\n} from '@agimon-ai/doompi-web-components';\n\nimport { resultText, type WriteCallView, writeCallView } from '../_lib/builtinToolView';\n\n/**\n * The numbered preview, coloured as the file it is about to become.\n *\n * Its own component so the highlighting hook has somewhere to live: the body\n * around it is picked inside a render prop. The preview is a prefix of the\n * content, so it parses as the file it came from up to wherever it was cut.\n */\nfunction WritePreview({ view, path }: { view: WriteCallView; path: string }) {\n const spans = useSyntaxLines(view.preview.map((line) => line.text).join('\\n'), { path });\n return (\n <>\n {view.preview.map((line, index) => (\n <span key={line.number} className=\"flex gap-2\">\n <span className=\"shrink-0 text-right text-doom-faint\" style={{ width: `${String(view.gutter)}ch` }}>\n {line.number}\n </span>\n <SyntaxLine\n spans={spans?.[index]}\n text={line.text}\n className=\"min-w-0 whitespace-pre-wrap break-words text-doom-text\"\n />\n </span>\n ))}\n </>\n );\n}\n\n/**\n * The write tool's timeline item: `path · N chars` in the header. Pi's write\n * result is silent on success, so the body shows the numbered preview the\n * TUI folds into its call: ten lines, or all of them once the item expands.\n * A failure shows the tool's message in red instead.\n */\nexport function WriteToolMessage({\n args,\n result,\n output,\n running,\n isError,\n fileTabFor,\n openTransientTab,\n}: ToolMessageRenderProps) {\n const collapsed = writeCallView(args, false);\n // The header names a file the tool is writing, so the reader can open it\n // rather than hunt for it; nothing installed to show files leaves it as text.\n const tab = fileTabFor(collapsed.path);\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={collapsed.hidden > 0}>\n {({ expanded }) => {\n const view = expanded ? writeCallView(args, true) : collapsed;\n return (\n <>\n <MessageItemHeader title=\"write\">\n <span data-testid=\"tool-call-write\" className=\"flex min-w-0 flex-1 items-center gap-2\">\n <ToolPathLink\n path={view.path}\n {...(tab === undefined ? {} : { onOpen: () => openTransientTab(tab) })}\n />\n <span className=\"shrink-0 text-doom-faint\">· {view.size}</span>\n </span>\n </MessageItemHeader>\n {isError ? (\n <MessageItemBody data-testid=\"tool-result-write\" className=\"flex flex-col\">\n <MessageItemStatus tone=\"error\">failed</MessageItemStatus>\n <span className=\"whitespace-pre-wrap break-words text-doom-red\">{resultText(result, output)}</span>\n </MessageItemBody>\n ) : view.preview.length === 0 ? (\n running ? (\n <MessageItemBody data-testid=\"tool-result-write\">\n <MessageItemStatus tone=\"running\">running</MessageItemStatus>\n </MessageItemBody>\n ) : null\n ) : (\n <MessageItemBody data-testid=\"tool-result-write\" className=\"flex flex-col font-mono\">\n <WritePreview view={view} path={view.path} />\n {view.hidden > 0 ? <MessageItemStatus expands>{view.hidden} more lines</MessageItemStatus> : null}\n {running ? <MessageItemStatus tone=\"running\">running</MessageItemStatus> : null}\n </MessageItemBody>\n )}\n </>\n );\n }}\n </MessageItem>\n );\n}\n","import { defineToolRenderer } from '@agimon-ai/doompi-core/web';\n\nimport { WriteToolMessage } from './_components/WriteToolMessage';\n\nexport default defineToolRenderer({ message: WriteToolMessage });\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineWebPlugin, type WebPluginContributions } from '@agimon-ai/doompi-core/web';\n\nimport toolFind from '../src/extensions/workspaces/sessions/(frontend)/tool/find.web';\nimport toolLs from '../src/extensions/workspaces/sessions/(frontend)/tool/ls.web';\nimport toolWrite from '../src/extensions/workspaces/sessions/(frontend)/tool/write.web';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const webPlugin = defineWebPlugin({\n id: 'builtin-tools',\n session: {\n get toolRenderers(): WebPluginContributions['toolRenderers'] { return [via({ tools: ['find'] }, toolFind), via({ tools: ['ls'] }, toolLs), via({ tools: ['write'] }, toolWrite)]; },\n },\n});\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.84",
|
|
4
4
|
"description": "Leader-key menus, themes, and TUI components for DoomPi and Pi extensions.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -170,18 +170,18 @@
|
|
|
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.84",
|
|
174
|
+
"@agimon-ai/doompi-hashline": "0.0.1-alpha.52",
|
|
175
|
+
"@agimon-ai/doompi-minor-mode": "0.0.1-alpha.84",
|
|
176
|
+
"@agimon-ai/doompi-telemetry": "0.0.1-alpha.80",
|
|
177
177
|
"@deepseek-ai/cordis": "4.0.2",
|
|
178
178
|
"@earendil-works/pi-tui": "0.87.1",
|
|
179
179
|
"yaml": "2.9.1"
|
|
180
180
|
},
|
|
181
181
|
"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.
|
|
182
|
+
"@agimon-ai/doompi-build": "0.0.1-alpha.12",
|
|
183
|
+
"@agimon-ai/doompi-core": "0.0.1-alpha.84",
|
|
184
|
+
"@agimon-ai/doompi-web-components": "0.0.1-alpha.42",
|
|
185
185
|
"@earendil-works/pi-coding-agent": "0.87.1",
|
|
186
186
|
"@tanstack/react-store": "0.11.1",
|
|
187
187
|
"@tanstack/store": "0.11.1",
|
|
@@ -195,8 +195,8 @@
|
|
|
195
195
|
"vitest": "5.0.1"
|
|
196
196
|
},
|
|
197
197
|
"peerDependencies": {
|
|
198
|
-
"@agimon-ai/doompi-core": "0.0.1-alpha.
|
|
199
|
-
"@agimon-ai/doompi-web-components": "0.0.1-alpha.
|
|
198
|
+
"@agimon-ai/doompi-core": "0.0.1-alpha.84",
|
|
199
|
+
"@agimon-ai/doompi-web-components": "0.0.1-alpha.42",
|
|
200
200
|
"@earendil-works/pi-coding-agent": "0.87.1"
|
|
201
201
|
},
|
|
202
202
|
"peerDependenciesMeta": {
|