pi-extensions-tool-display 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -3
- package/README.zh-CN.md +14 -4
- package/config.example.json +40 -0
- package/index.ts +6 -0
- package/package.json +16 -5
- package/src/agent-dir.ts +32 -0
- package/src/ansi-utils.ts +116 -0
- package/src/bash-display.ts +191 -0
- package/src/capabilities.ts +85 -0
- package/src/config-modal.ts +540 -0
- package/src/config-store.ts +303 -0
- package/src/debug-logger.ts +150 -0
- package/src/diff-presentation.ts +72 -0
- package/src/diff-renderer.ts +2517 -0
- package/src/disposable.ts +34 -0
- package/src/extension-lifecycle.ts +14 -0
- package/src/index.ts +126 -86
- package/src/line-width-safety.ts +93 -0
- package/src/modal-icons.ts +57 -0
- package/src/pending-diff-preview.ts +371 -0
- package/src/presets.ts +108 -0
- package/src/render-utils.ts +186 -0
- package/src/result-render-middleware.ts +98 -0
- package/src/settings-inspector-modal.ts +475 -0
- package/src/thinking-label.ts +343 -0
- package/src/tool-metadata.ts +139 -0
- package/src/tool-overrides.ts +2237 -0
- package/src/types.ts +105 -0
- package/src/user-message-box-markdown.ts +64 -0
- package/src/user-message-box-native.ts +66 -0
- package/src/user-message-box-patch.ts +72 -0
- package/src/user-message-box-renderer.ts +419 -0
- package/src/user-message-box-utils.ts +106 -0
- package/src/write-display-utils.ts +31 -0
- package/src/zellij-modal.ts +1027 -0
- package/tool-display-api-consumer.d.ts +68 -0
- package/tool-display-api-consumer.js +82 -0
- package/tsconfig.json +1 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export type RuntimeToolDefinition = Record<string, unknown>;
|
|
2
|
+
|
|
3
|
+
export interface ToolDisplayAdapter {
|
|
4
|
+
kind?: "read" | "edit" | "mcp" | "generic";
|
|
5
|
+
overrideExistingRenderers?: boolean;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface ToolDisplayApi {
|
|
9
|
+
version: 1;
|
|
10
|
+
decorateTool<T extends RuntimeToolDefinition>(tool: T, adapter?: ToolDisplayAdapter | Record<string, unknown>): T;
|
|
11
|
+
registerResultRenderMiddleware(registration: ToolResultRenderMiddlewareRegistration): string;
|
|
12
|
+
unregisterResultRenderMiddleware(id: string): boolean;
|
|
13
|
+
hasResultRenderMiddleware(id: string): boolean;
|
|
14
|
+
isResultRenderPipelineActive(toolName: string): boolean;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface ToolResultRenderMiddlewareContext {
|
|
18
|
+
toolName: string;
|
|
19
|
+
result: unknown;
|
|
20
|
+
options: Record<string, unknown>;
|
|
21
|
+
theme: {
|
|
22
|
+
fg(color: string, text: string): string;
|
|
23
|
+
bold(text: string): string;
|
|
24
|
+
};
|
|
25
|
+
renderContext?: unknown;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export type ToolResultRenderMiddleware = (
|
|
29
|
+
context: ToolResultRenderMiddlewareContext,
|
|
30
|
+
next: () => unknown,
|
|
31
|
+
) => unknown;
|
|
32
|
+
|
|
33
|
+
export interface ToolResultRenderMiddlewareRegistration {
|
|
34
|
+
id?: string;
|
|
35
|
+
toolName: string;
|
|
36
|
+
middleware: ToolResultRenderMiddleware;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface ToolResultRenderMiddlewareOptions {
|
|
40
|
+
id?: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface DecorateToolForDisplayOptions {
|
|
44
|
+
suppressDecorateErrors?: boolean;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export declare function getToolDisplayApi(): ToolDisplayApi | undefined;
|
|
48
|
+
|
|
49
|
+
export declare function queueToolDisplayDecoration<T extends RuntimeToolDefinition>(
|
|
50
|
+
tool: T,
|
|
51
|
+
adapter?: ToolDisplayAdapter | Record<string, unknown>,
|
|
52
|
+
): void;
|
|
53
|
+
|
|
54
|
+
export declare function decorateToolForDisplay<T extends object>(
|
|
55
|
+
tool: T,
|
|
56
|
+
adapter?: ToolDisplayAdapter | Record<string, unknown>,
|
|
57
|
+
options?: DecorateToolForDisplayOptions,
|
|
58
|
+
): T;
|
|
59
|
+
|
|
60
|
+
export declare function decorateMcpToolForDisplay<T extends RuntimeToolDefinition>(tool: T): T;
|
|
61
|
+
|
|
62
|
+
export declare function registerToolResultRenderMiddleware(
|
|
63
|
+
toolName: string,
|
|
64
|
+
middleware: ToolResultRenderMiddleware,
|
|
65
|
+
options?: ToolResultRenderMiddlewareOptions,
|
|
66
|
+
): string;
|
|
67
|
+
|
|
68
|
+
export declare function unregisterToolResultRenderMiddleware(id: string): boolean;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
const TOOL_DISPLAY_API_KEY = Symbol.for("pi-tool-display.api.v1");
|
|
2
|
+
const TOOL_DISPLAY_PENDING_DECORATIONS_KEY = Symbol.for("pi-tool-display.pendingDecorations.v1");
|
|
3
|
+
const TOOL_DISPLAY_PENDING_RESULT_MIDDLEWARES_KEY = Symbol.for("pi-tool-display.pendingResultRenderMiddlewares.v1");
|
|
4
|
+
let nextResultMiddlewareId = 0;
|
|
5
|
+
|
|
6
|
+
export function getToolDisplayApi() {
|
|
7
|
+
const api = globalThis[TOOL_DISPLAY_API_KEY];
|
|
8
|
+
if (
|
|
9
|
+
api?.version !== 1 ||
|
|
10
|
+
typeof api.decorateTool !== "function"
|
|
11
|
+
) {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
return api;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function queueToolDisplayDecoration(tool, adapter) {
|
|
19
|
+
const existing = globalThis[TOOL_DISPLAY_PENDING_DECORATIONS_KEY];
|
|
20
|
+
const queue = Array.isArray(existing) ? existing : [];
|
|
21
|
+
queue.push({ tool, adapter });
|
|
22
|
+
globalThis[TOOL_DISPLAY_PENDING_DECORATIONS_KEY] = queue;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function decorateToolForDisplay(tool, adapter, options = {}) {
|
|
26
|
+
const api = getToolDisplayApi();
|
|
27
|
+
if (!api) {
|
|
28
|
+
queueToolDisplayDecoration(tool, adapter);
|
|
29
|
+
return tool;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
try {
|
|
33
|
+
return api.decorateTool(tool, adapter);
|
|
34
|
+
} catch (error) {
|
|
35
|
+
if (options.suppressDecorateErrors) {
|
|
36
|
+
return tool;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function decorateMcpToolForDisplay(tool) {
|
|
44
|
+
return decorateToolForDisplay(tool, { kind: "mcp", overrideExistingRenderers: true });
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function registerToolResultRenderMiddleware(toolName, middleware, options = {}) {
|
|
48
|
+
if (typeof toolName !== "string" || !toolName.trim()) {
|
|
49
|
+
throw new TypeError("toolName must be a non-empty string");
|
|
50
|
+
}
|
|
51
|
+
if (typeof middleware !== "function") {
|
|
52
|
+
throw new TypeError("middleware must be a function");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const id = options.id || `external-result-middleware-${++nextResultMiddlewareId}`;
|
|
56
|
+
const api = getToolDisplayApi();
|
|
57
|
+
if (typeof api?.registerResultRenderMiddleware === "function") {
|
|
58
|
+
return api.registerResultRenderMiddleware({ id, toolName, middleware });
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const existing = globalThis[TOOL_DISPLAY_PENDING_RESULT_MIDDLEWARES_KEY];
|
|
62
|
+
const queue = Array.isArray(existing) ? existing : [];
|
|
63
|
+
const registration = { id, toolName, middleware };
|
|
64
|
+
const index = queue.findIndex((entry) => entry?.id === id);
|
|
65
|
+
if (index >= 0) queue[index] = registration;
|
|
66
|
+
else queue.push(registration);
|
|
67
|
+
globalThis[TOOL_DISPLAY_PENDING_RESULT_MIDDLEWARES_KEY] = queue;
|
|
68
|
+
return id;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function unregisterToolResultRenderMiddleware(id) {
|
|
72
|
+
const api = getToolDisplayApi();
|
|
73
|
+
const removedActive = typeof api?.unregisterResultRenderMiddleware === "function"
|
|
74
|
+
? api.unregisterResultRenderMiddleware(id)
|
|
75
|
+
: false;
|
|
76
|
+
const queue = globalThis[TOOL_DISPLAY_PENDING_RESULT_MIDDLEWARES_KEY];
|
|
77
|
+
if (!Array.isArray(queue)) return removedActive;
|
|
78
|
+
const index = queue.findIndex((entry) => entry?.id === id);
|
|
79
|
+
if (index < 0) return removedActive;
|
|
80
|
+
queue.splice(index, 1);
|
|
81
|
+
return true;
|
|
82
|
+
}
|