@practicalkit/plugin-sdk 0.0.2
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 +5 -0
- package/dist/src/PracticalKitSdk.d.ts +184 -0
- package/dist/src/PracticalKitSdk.d.ts.map +1 -0
- package/dist/src/PracticalKitSdk.js +230 -0
- package/dist/src/PracticalKitSdk.js.map +1 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +6 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/keyboard/KeyboardShortcutForwarder.d.ts +18 -0
- package/dist/src/keyboard/KeyboardShortcutForwarder.d.ts.map +1 -0
- package/dist/src/keyboard/KeyboardShortcutForwarder.js +36 -0
- package/dist/src/keyboard/KeyboardShortcutForwarder.js.map +1 -0
- package/dist/src/keyboard/index.d.ts +2 -0
- package/dist/src/keyboard/index.d.ts.map +1 -0
- package/dist/src/keyboard/index.js +2 -0
- package/dist/src/keyboard/index.js.map +1 -0
- package/dist/src/llm/ToolRegistry.d.ts +49 -0
- package/dist/src/llm/ToolRegistry.d.ts.map +1 -0
- package/dist/src/llm/ToolRegistry.js +126 -0
- package/dist/src/llm/ToolRegistry.js.map +1 -0
- package/dist/src/logs/channel/IFrameLogChannelAdapter.d.ts +8 -0
- package/dist/src/logs/channel/IFrameLogChannelAdapter.d.ts.map +1 -0
- package/dist/src/logs/channel/IFrameLogChannelAdapter.js +34 -0
- package/dist/src/logs/channel/IFrameLogChannelAdapter.js.map +1 -0
- package/dist/src/logs/channel/ILogChannelAdapter.d.ts +5 -0
- package/dist/src/logs/channel/ILogChannelAdapter.d.ts.map +1 -0
- package/dist/src/logs/channel/ILogChannelAdapter.js +2 -0
- package/dist/src/logs/channel/ILogChannelAdapter.js.map +1 -0
- package/dist/src/logs/channel/LogChannel.d.ts +21 -0
- package/dist/src/logs/channel/LogChannel.d.ts.map +1 -0
- package/dist/src/logs/channel/LogChannel.js +41 -0
- package/dist/src/logs/channel/LogChannel.js.map +1 -0
- package/dist/src/logs/outputs/types.d.ts +18 -0
- package/dist/src/logs/outputs/types.d.ts.map +1 -0
- package/dist/src/logs/outputs/types.js +2 -0
- package/dist/src/logs/outputs/types.js.map +1 -0
- package/dist/src/messages/IFrameClient.d.ts +33 -0
- package/dist/src/messages/IFrameClient.d.ts.map +1 -0
- package/dist/src/messages/IFrameClient.js +88 -0
- package/dist/src/messages/IFrameClient.js.map +1 -0
- package/dist/src/messages/IFrameMessageBus.d.ts +10 -0
- package/dist/src/messages/IFrameMessageBus.d.ts.map +1 -0
- package/dist/src/messages/IFrameMessageBus.js +24 -0
- package/dist/src/messages/IFrameMessageBus.js.map +1 -0
- package/dist/src/messages/base/index.d.ts +8 -0
- package/dist/src/messages/base/index.d.ts.map +1 -0
- package/dist/src/messages/base/index.js +9 -0
- package/dist/src/messages/base/index.js.map +1 -0
- package/dist/src/messages/document/index.d.ts +5 -0
- package/dist/src/messages/document/index.d.ts.map +1 -0
- package/dist/src/messages/document/index.js +5 -0
- package/dist/src/messages/document/index.js.map +1 -0
- package/dist/src/messages/document/requestContent/message.schemas.d.ts +34 -0
- package/dist/src/messages/document/requestContent/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/document/requestContent/message.schemas.js +21 -0
- package/dist/src/messages/document/requestContent/message.schemas.js.map +1 -0
- package/dist/src/messages/document/save/index.d.ts +2 -0
- package/dist/src/messages/document/save/index.d.ts.map +1 -0
- package/dist/src/messages/document/save/index.js +2 -0
- package/dist/src/messages/document/save/index.js.map +1 -0
- package/dist/src/messages/document/save/message.schemas.d.ts +34 -0
- package/dist/src/messages/document/save/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/document/save/message.schemas.js +21 -0
- package/dist/src/messages/document/save/message.schemas.js.map +1 -0
- package/dist/src/messages/document/saveRequested/message.schemas.d.ts +41 -0
- package/dist/src/messages/document/saveRequested/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/document/saveRequested/message.schemas.js +28 -0
- package/dist/src/messages/document/saveRequested/message.schemas.js.map +1 -0
- package/dist/src/messages/document/saved/message.schemas.d.ts +39 -0
- package/dist/src/messages/document/saved/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/document/saved/message.schemas.js +26 -0
- package/dist/src/messages/document/saved/message.schemas.js.map +1 -0
- package/dist/src/messages/editor/index.d.ts +2 -0
- package/dist/src/messages/editor/index.d.ts.map +1 -0
- package/dist/src/messages/editor/index.js +2 -0
- package/dist/src/messages/editor/index.js.map +1 -0
- package/dist/src/messages/editor/openFile/message.schemas.d.ts +30 -0
- package/dist/src/messages/editor/openFile/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/editor/openFile/message.schemas.js +17 -0
- package/dist/src/messages/editor/openFile/message.schemas.js.map +1 -0
- package/dist/src/messages/fs/fileChanged/message.schemas.d.ts +10 -0
- package/dist/src/messages/fs/fileChanged/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/fs/fileChanged/message.schemas.js +10 -0
- package/dist/src/messages/fs/fileChanged/message.schemas.js.map +1 -0
- package/dist/src/messages/fs/index.d.ts +3 -0
- package/dist/src/messages/fs/index.d.ts.map +1 -0
- package/dist/src/messages/fs/index.js +3 -0
- package/dist/src/messages/fs/index.js.map +1 -0
- package/dist/src/messages/fs/subscribe/message.schemas.d.ts +54 -0
- package/dist/src/messages/fs/subscribe/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/fs/subscribe/message.schemas.js +27 -0
- package/dist/src/messages/fs/subscribe/message.schemas.js.map +1 -0
- package/dist/src/messages/index.d.ts +15 -0
- package/dist/src/messages/index.d.ts.map +1 -0
- package/dist/src/messages/index.js +29 -0
- package/dist/src/messages/index.js.map +1 -0
- package/dist/src/messages/llm/index.d.ts +148 -0
- package/dist/src/messages/llm/index.d.ts.map +1 -0
- package/dist/src/messages/llm/index.js +124 -0
- package/dist/src/messages/llm/index.js.map +1 -0
- package/dist/src/messages/logs/index.d.ts +26 -0
- package/dist/src/messages/logs/index.d.ts.map +1 -0
- package/dist/src/messages/logs/index.js +24 -0
- package/dist/src/messages/logs/index.js.map +1 -0
- package/dist/src/messages/native/call/message.schemas.d.ts +34 -0
- package/dist/src/messages/native/call/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/native/call/message.schemas.js +22 -0
- package/dist/src/messages/native/call/message.schemas.js.map +1 -0
- package/dist/src/messages/native/index.d.ts +2 -0
- package/dist/src/messages/native/index.d.ts.map +1 -0
- package/dist/src/messages/native/index.js +2 -0
- package/dist/src/messages/native/index.js.map +1 -0
- package/dist/src/messages/plugin/index.d.ts +78 -0
- package/dist/src/messages/plugin/index.d.ts.map +1 -0
- package/dist/src/messages/plugin/index.js +72 -0
- package/dist/src/messages/plugin/index.js.map +1 -0
- package/dist/src/messages/storage/index.d.ts +126 -0
- package/dist/src/messages/storage/index.d.ts.map +1 -0
- package/dist/src/messages/storage/index.js +109 -0
- package/dist/src/messages/storage/index.js.map +1 -0
- package/dist/src/messages/ui/UiChannel.d.ts +68 -0
- package/dist/src/messages/ui/UiChannel.d.ts.map +1 -0
- package/dist/src/messages/ui/UiChannel.js +81 -0
- package/dist/src/messages/ui/UiChannel.js.map +1 -0
- package/dist/src/messages/ui/confirm/index.d.ts +2 -0
- package/dist/src/messages/ui/confirm/index.d.ts.map +1 -0
- package/dist/src/messages/ui/confirm/index.js +2 -0
- package/dist/src/messages/ui/confirm/index.js.map +1 -0
- package/dist/src/messages/ui/confirm/message.schemas.d.ts +39 -0
- package/dist/src/messages/ui/confirm/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/ui/confirm/message.schemas.js +25 -0
- package/dist/src/messages/ui/confirm/message.schemas.js.map +1 -0
- package/dist/src/messages/ui/getState/message.schemas.d.ts +38 -0
- package/dist/src/messages/ui/getState/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/ui/getState/message.schemas.js +21 -0
- package/dist/src/messages/ui/getState/message.schemas.js.map +1 -0
- package/dist/src/messages/ui/index.d.ts +8 -0
- package/dist/src/messages/ui/index.d.ts.map +1 -0
- package/dist/src/messages/ui/index.js +8 -0
- package/dist/src/messages/ui/index.js.map +1 -0
- package/dist/src/messages/ui/setCollapseState/message.schemas.d.ts +33 -0
- package/dist/src/messages/ui/setCollapseState/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/ui/setCollapseState/message.schemas.js +19 -0
- package/dist/src/messages/ui/setCollapseState/message.schemas.js.map +1 -0
- package/dist/src/messages/ui/showContextMenu/message.schemas.d.ts +61 -0
- package/dist/src/messages/ui/showContextMenu/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/ui/showContextMenu/message.schemas.js +37 -0
- package/dist/src/messages/ui/showContextMenu/message.schemas.js.map +1 -0
- package/dist/src/messages/ui/showNotification/message.schemas.d.ts +38 -0
- package/dist/src/messages/ui/showNotification/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/ui/showNotification/message.schemas.js +29 -0
- package/dist/src/messages/ui/showNotification/message.schemas.js.map +1 -0
- package/dist/src/messages/ui/tabsChanged/message.schemas.d.ts +24 -0
- package/dist/src/messages/ui/tabsChanged/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/ui/tabsChanged/message.schemas.js +15 -0
- package/dist/src/messages/ui/tabsChanged/message.schemas.js.map +1 -0
- package/dist/src/messages/vfs/createDir/message.schemas.d.ts +30 -0
- package/dist/src/messages/vfs/createDir/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/vfs/createDir/message.schemas.js +17 -0
- package/dist/src/messages/vfs/createDir/message.schemas.js.map +1 -0
- package/dist/src/messages/vfs/delete/message.schemas.d.ts +30 -0
- package/dist/src/messages/vfs/delete/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/vfs/delete/message.schemas.js +17 -0
- package/dist/src/messages/vfs/delete/message.schemas.js.map +1 -0
- package/dist/src/messages/vfs/exists/message.schemas.d.ts +34 -0
- package/dist/src/messages/vfs/exists/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/vfs/exists/message.schemas.js +21 -0
- package/dist/src/messages/vfs/exists/message.schemas.js.map +1 -0
- package/dist/src/messages/vfs/getAbsolutePath/message.schemas.d.ts +33 -0
- package/dist/src/messages/vfs/getAbsolutePath/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/vfs/getAbsolutePath/message.schemas.js +20 -0
- package/dist/src/messages/vfs/getAbsolutePath/message.schemas.js.map +1 -0
- package/dist/src/messages/vfs/index.d.ts +9 -0
- package/dist/src/messages/vfs/index.d.ts.map +1 -0
- package/dist/src/messages/vfs/index.js +9 -0
- package/dist/src/messages/vfs/index.js.map +1 -0
- package/dist/src/messages/vfs/readDir/message.schemas.d.ts +41 -0
- package/dist/src/messages/vfs/readDir/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/vfs/readDir/message.schemas.js +23 -0
- package/dist/src/messages/vfs/readDir/message.schemas.js.map +1 -0
- package/dist/src/messages/vfs/readFile/message.schemas.d.ts +31 -0
- package/dist/src/messages/vfs/readFile/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/vfs/readFile/message.schemas.js +18 -0
- package/dist/src/messages/vfs/readFile/message.schemas.js.map +1 -0
- package/dist/src/messages/vfs/rename/message.schemas.d.ts +31 -0
- package/dist/src/messages/vfs/rename/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/vfs/rename/message.schemas.js +18 -0
- package/dist/src/messages/vfs/rename/message.schemas.js.map +1 -0
- package/dist/src/messages/vfs/writeFile/message.schemas.d.ts +31 -0
- package/dist/src/messages/vfs/writeFile/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/vfs/writeFile/message.schemas.js +18 -0
- package/dist/src/messages/vfs/writeFile/message.schemas.js.map +1 -0
- package/dist/src/messages/workspace/changed/message.schemas.d.ts +9 -0
- package/dist/src/messages/workspace/changed/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/workspace/changed/message.schemas.js +9 -0
- package/dist/src/messages/workspace/changed/message.schemas.js.map +1 -0
- package/dist/src/messages/workspace/getDetails/message.schemas.d.ts +39 -0
- package/dist/src/messages/workspace/getDetails/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/workspace/getDetails/message.schemas.js +22 -0
- package/dist/src/messages/workspace/getDetails/message.schemas.js.map +1 -0
- package/dist/src/messages/workspace/index.d.ts +4 -0
- package/dist/src/messages/workspace/index.d.ts.map +1 -0
- package/dist/src/messages/workspace/index.js +4 -0
- package/dist/src/messages/workspace/index.js.map +1 -0
- package/dist/src/messages/workspace/open/message.schemas.d.ts +29 -0
- package/dist/src/messages/workspace/open/message.schemas.d.ts.map +1 -0
- package/dist/src/messages/workspace/open/message.schemas.js +16 -0
- package/dist/src/messages/workspace/open/message.schemas.js.map +1 -0
- package/dist/src/namespaces/DocumentNamespace.d.ts +56 -0
- package/dist/src/namespaces/DocumentNamespace.d.ts.map +1 -0
- package/dist/src/namespaces/DocumentNamespace.js +129 -0
- package/dist/src/namespaces/DocumentNamespace.js.map +1 -0
- package/dist/src/namespaces/EditorNamespace.d.ts +11 -0
- package/dist/src/namespaces/EditorNamespace.d.ts.map +1 -0
- package/dist/src/namespaces/EditorNamespace.js +18 -0
- package/dist/src/namespaces/EditorNamespace.js.map +1 -0
- package/dist/src/namespaces/FsNamespace.d.ts +27 -0
- package/dist/src/namespaces/FsNamespace.d.ts.map +1 -0
- package/dist/src/namespaces/FsNamespace.js +52 -0
- package/dist/src/namespaces/FsNamespace.js.map +1 -0
- package/dist/src/namespaces/NativeNamespace.d.ts +11 -0
- package/dist/src/namespaces/NativeNamespace.d.ts.map +1 -0
- package/dist/src/namespaces/NativeNamespace.js +19 -0
- package/dist/src/namespaces/NativeNamespace.js.map +1 -0
- package/dist/src/namespaces/PluginNamespace.d.ts +56 -0
- package/dist/src/namespaces/PluginNamespace.d.ts.map +1 -0
- package/dist/src/namespaces/PluginNamespace.js +116 -0
- package/dist/src/namespaces/PluginNamespace.js.map +1 -0
- package/dist/src/namespaces/StorageNamespace.d.ts +56 -0
- package/dist/src/namespaces/StorageNamespace.d.ts.map +1 -0
- package/dist/src/namespaces/StorageNamespace.js +127 -0
- package/dist/src/namespaces/StorageNamespace.js.map +1 -0
- package/dist/src/namespaces/VfsNamespace.d.ts +25 -0
- package/dist/src/namespaces/VfsNamespace.d.ts.map +1 -0
- package/dist/src/namespaces/VfsNamespace.js +64 -0
- package/dist/src/namespaces/VfsNamespace.js.map +1 -0
- package/dist/src/namespaces/WorkspaceNamespace.d.ts +18 -0
- package/dist/src/namespaces/WorkspaceNamespace.d.ts.map +1 -0
- package/dist/src/namespaces/WorkspaceNamespace.js +48 -0
- package/dist/src/namespaces/WorkspaceNamespace.js.map +1 -0
- package/dist/src/namespaces/index.d.ts +9 -0
- package/dist/src/namespaces/index.d.ts.map +1 -0
- package/dist/src/namespaces/index.js +9 -0
- package/dist/src/namespaces/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/eslint.config.js +25 -0
- package/package.json +28 -0
- package/src/PracticalKitSdk.ts +325 -0
- package/src/index.ts +10 -0
- package/src/keyboard/KeyboardShortcutForwarder.ts +35 -0
- package/src/keyboard/index.ts +1 -0
- package/src/llm/ToolRegistry.ts +186 -0
- package/src/logs/channel/IFrameLogChannelAdapter.ts +44 -0
- package/src/logs/channel/ILogChannelAdapter.ts +5 -0
- package/src/logs/channel/LogChannel.ts +49 -0
- package/src/logs/outputs/types.ts +21 -0
- package/src/messages/IFrameClient.ts +113 -0
- package/src/messages/IFrameMessageBus.ts +28 -0
- package/src/messages/base/index.ts +16 -0
- package/src/messages/document/index.ts +4 -0
- package/src/messages/document/requestContent/message.schemas.ts +28 -0
- package/src/messages/document/save/index.ts +1 -0
- package/src/messages/document/save/message.schemas.ts +24 -0
- package/src/messages/document/saveRequested/message.schemas.ts +35 -0
- package/src/messages/document/saved/message.schemas.ts +29 -0
- package/src/messages/editor/index.ts +1 -0
- package/src/messages/editor/openFile/message.schemas.ts +22 -0
- package/src/messages/fs/fileChanged/message.schemas.ts +12 -0
- package/src/messages/fs/index.ts +2 -0
- package/src/messages/fs/subscribe/message.schemas.ts +33 -0
- package/src/messages/index.ts +41 -0
- package/src/messages/llm/index.ts +158 -0
- package/src/messages/logs/index.ts +39 -0
- package/src/messages/native/call/message.schemas.ts +25 -0
- package/src/messages/native/index.ts +1 -0
- package/src/messages/plugin/index.ts +95 -0
- package/src/messages/storage/index.ts +140 -0
- package/src/messages/ui/UiChannel.ts +156 -0
- package/src/messages/ui/confirm/index.ts +1 -0
- package/src/messages/ui/confirm/message.schemas.ts +36 -0
- package/src/messages/ui/getState/message.schemas.ts +33 -0
- package/src/messages/ui/index.ts +7 -0
- package/src/messages/ui/setCollapseState/message.schemas.ts +34 -0
- package/src/messages/ui/showContextMenu/message.schemas.ts +64 -0
- package/src/messages/ui/showNotification/message.schemas.ts +41 -0
- package/src/messages/ui/tabsChanged/message.schemas.ts +25 -0
- package/src/messages/vfs/createDir/message.schemas.ts +20 -0
- package/src/messages/vfs/delete/message.schemas.ts +20 -0
- package/src/messages/vfs/exists/message.schemas.ts +32 -0
- package/src/messages/vfs/getAbsolutePath/message.schemas.ts +27 -0
- package/src/messages/vfs/index.ts +8 -0
- package/src/messages/vfs/readDir/message.schemas.ts +36 -0
- package/src/messages/vfs/readFile/message.schemas.ts +21 -0
- package/src/messages/vfs/rename/message.schemas.ts +21 -0
- package/src/messages/vfs/writeFile/message.schemas.ts +21 -0
- package/src/messages/workspace/changed/message.schemas.ts +18 -0
- package/src/messages/workspace/getDetails/message.schemas.ts +39 -0
- package/src/messages/workspace/index.ts +3 -0
- package/src/messages/workspace/open/message.schemas.ts +27 -0
- package/src/namespaces/DocumentNamespace.ts +164 -0
- package/src/namespaces/EditorNamespace.ts +27 -0
- package/src/namespaces/FsNamespace.ts +77 -0
- package/src/namespaces/NativeNamespace.ts +34 -0
- package/src/namespaces/PluginNamespace.ts +156 -0
- package/src/namespaces/StorageNamespace.ts +186 -0
- package/src/namespaces/VfsNamespace.ts +135 -0
- package/src/namespaces/WorkspaceNamespace.ts +80 -0
- package/src/namespaces/index.ts +8 -0
- package/tsconfig.json +41 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { safeParse } from "valibot";
|
|
2
|
+
import type { IFrameClient } from "../messages/IFrameClient.js";
|
|
3
|
+
import {
|
|
4
|
+
LlmToolList,
|
|
5
|
+
LlmToolExecute,
|
|
6
|
+
LlmToolRegister,
|
|
7
|
+
LlmToolUnregister,
|
|
8
|
+
LlmToolCall,
|
|
9
|
+
type LlmToolDefinitionType,
|
|
10
|
+
} from "../messages/index.js";
|
|
11
|
+
|
|
12
|
+
/** Handler function for a registered tool */
|
|
13
|
+
export type LlmToolHandler = (args: unknown) => unknown | Promise<unknown>;
|
|
14
|
+
|
|
15
|
+
/** Options for registering an LLM tool */
|
|
16
|
+
export interface LlmToolRegistration {
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
parameters: {
|
|
20
|
+
type: "object";
|
|
21
|
+
properties: Record<string, unknown>;
|
|
22
|
+
required?: string[];
|
|
23
|
+
};
|
|
24
|
+
timeoutMs?: number;
|
|
25
|
+
handler: LlmToolHandler;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Internal tool registry that manages LLM tool registration and execution.
|
|
30
|
+
* This class is not part of the public SDK API.
|
|
31
|
+
*/
|
|
32
|
+
export class ToolRegistry {
|
|
33
|
+
private readonly client: IFrameClient;
|
|
34
|
+
// Local storage for tool handlers (keyed by tool name)
|
|
35
|
+
private readonly toolHandlers: Map<string, LlmToolHandler> = new Map();
|
|
36
|
+
// Unsubscribe function for tool call listener
|
|
37
|
+
private toolCallUnsubscribe: (() => void) | null = null;
|
|
38
|
+
|
|
39
|
+
constructor(client: IFrameClient) {
|
|
40
|
+
this.client = client;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* List all registered LLM tools from all plugins
|
|
45
|
+
*/
|
|
46
|
+
async listTools(): Promise<LlmToolDefinitionType[]> {
|
|
47
|
+
const response = await this.client.sendAndWait(
|
|
48
|
+
"llm.tool.list",
|
|
49
|
+
{},
|
|
50
|
+
LlmToolList.Request,
|
|
51
|
+
LlmToolList.Response
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
if (!response.success) {
|
|
55
|
+
throw new Error(response.error || "Failed to list tools");
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return response.tools;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Execute an LLM tool by ID
|
|
63
|
+
*/
|
|
64
|
+
async executeTool(toolId: string, args: unknown): Promise<unknown> {
|
|
65
|
+
const response = await this.client.sendAndWait(
|
|
66
|
+
"llm.tool.execute",
|
|
67
|
+
{ toolId, arguments: args },
|
|
68
|
+
LlmToolExecute.Request,
|
|
69
|
+
LlmToolExecute.Response
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
if (!response.success) {
|
|
73
|
+
throw new Error(response.error || "Failed to execute tool");
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return response.result;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Register a tool that can be called by the LLM.
|
|
81
|
+
* The handler is stored locally and invoked when the host routes a tool call here.
|
|
82
|
+
*/
|
|
83
|
+
async registerTool(registration: LlmToolRegistration): Promise<string> {
|
|
84
|
+
// Store handler locally
|
|
85
|
+
this.toolHandlers.set(registration.name, registration.handler);
|
|
86
|
+
|
|
87
|
+
// Ensure we're listening for tool calls
|
|
88
|
+
this.ensureToolCallListener();
|
|
89
|
+
|
|
90
|
+
// Register metadata with host
|
|
91
|
+
const response = await this.client.sendAndWait(
|
|
92
|
+
"llm.tool.register",
|
|
93
|
+
{
|
|
94
|
+
name: registration.name,
|
|
95
|
+
description: registration.description,
|
|
96
|
+
parameters: registration.parameters,
|
|
97
|
+
timeoutMs: registration.timeoutMs,
|
|
98
|
+
},
|
|
99
|
+
LlmToolRegister.Request,
|
|
100
|
+
LlmToolRegister.Response
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
if (!response.success || !response.toolId) {
|
|
104
|
+
this.toolHandlers.delete(registration.name);
|
|
105
|
+
throw new Error(response.error || "Failed to register tool");
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return response.toolId;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Unregister a previously registered tool
|
|
113
|
+
*/
|
|
114
|
+
async unregisterTool(name: string): Promise<void> {
|
|
115
|
+
const response = await this.client.sendAndWait(
|
|
116
|
+
"llm.tool.unregister",
|
|
117
|
+
{ name },
|
|
118
|
+
LlmToolUnregister.Request,
|
|
119
|
+
LlmToolUnregister.Response
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
if (!response.success) {
|
|
123
|
+
throw new Error(response.error || "Failed to unregister tool");
|
|
124
|
+
}
|
|
125
|
+
this.toolHandlers.delete(name);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Ensure we have a listener for incoming tool call requests from the host.
|
|
130
|
+
* This is called automatically when registering a tool.
|
|
131
|
+
*/
|
|
132
|
+
private ensureToolCallListener(): void {
|
|
133
|
+
if (this.toolCallUnsubscribe) {
|
|
134
|
+
return; // Already listening
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
this.toolCallUnsubscribe = this.client.subscribe(async (evt) => {
|
|
138
|
+
const { type } = evt.data || {};
|
|
139
|
+
|
|
140
|
+
if (type !== "llm.tool.call") {
|
|
141
|
+
return; // Not a tool call event
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const result = safeParse(LlmToolCall.Request, evt.data);
|
|
145
|
+
if (result.success) {
|
|
146
|
+
const { toolName, arguments: args } = result.output.payload;
|
|
147
|
+
const requestId = result.output.payload.requestId;
|
|
148
|
+
const handler = this.toolHandlers.get(toolName);
|
|
149
|
+
|
|
150
|
+
if (handler) {
|
|
151
|
+
try {
|
|
152
|
+
const toolResult = await Promise.resolve(handler(args));
|
|
153
|
+
this.client.send({
|
|
154
|
+
type: "llm.tool.call.response",
|
|
155
|
+
payload: {
|
|
156
|
+
requestId,
|
|
157
|
+
success: true,
|
|
158
|
+
result: toolResult,
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
} catch (error) {
|
|
162
|
+
this.client.send({
|
|
163
|
+
type: "llm.tool.call.response",
|
|
164
|
+
payload: {
|
|
165
|
+
requestId,
|
|
166
|
+
success: false,
|
|
167
|
+
error: error instanceof Error ? error.message : String(error),
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
} else {
|
|
172
|
+
this.client.send({
|
|
173
|
+
type: "llm.tool.call.response",
|
|
174
|
+
payload: {
|
|
175
|
+
requestId,
|
|
176
|
+
success: false,
|
|
177
|
+
error: `No handler registered for tool: ${toolName}`,
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
} else {
|
|
182
|
+
console.error("[SDK] Invalid llm.tool.call payload:", result.issues);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import {
|
|
2
|
+
LogsWrite,
|
|
3
|
+
type IFrameClient,
|
|
4
|
+
type LogLevel,
|
|
5
|
+
} from "../../messages/index.js";
|
|
6
|
+
import type { ILogChannelAdapter } from "./ILogChannelAdapter.js";
|
|
7
|
+
|
|
8
|
+
export class IFrameLogChannelAdapter implements ILogChannelAdapter {
|
|
9
|
+
constructor(private readonly client: IFrameClient) {}
|
|
10
|
+
|
|
11
|
+
public writeLog(
|
|
12
|
+
channelName: string,
|
|
13
|
+
level: LogLevel,
|
|
14
|
+
...args: unknown[]
|
|
15
|
+
): void {
|
|
16
|
+
// just stringify the args for transmission
|
|
17
|
+
const messageString: string = args
|
|
18
|
+
.map((arg) => {
|
|
19
|
+
if (typeof arg === "string") {
|
|
20
|
+
return arg;
|
|
21
|
+
} else if (arg instanceof Error) {
|
|
22
|
+
return `Error: ${arg.message}\n${arg.stack}`;
|
|
23
|
+
} else {
|
|
24
|
+
try {
|
|
25
|
+
return JSON.stringify(arg);
|
|
26
|
+
} catch {
|
|
27
|
+
return String(arg);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
})
|
|
31
|
+
.join(" ");
|
|
32
|
+
|
|
33
|
+
this.client
|
|
34
|
+
.sendAndWait(
|
|
35
|
+
"logs.write",
|
|
36
|
+
{ level, channelName, args: [messageString] },
|
|
37
|
+
LogsWrite.Request,
|
|
38
|
+
LogsWrite.Response
|
|
39
|
+
)
|
|
40
|
+
.catch((error) => {
|
|
41
|
+
console.error("Failed to write log:", error);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A log channel for categorizing log messages.
|
|
3
|
+
* Created via `sdk.logs.createChannel("channelName")`.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { type LogLevel } from "../../messages/index.js";
|
|
7
|
+
import type { ILogChannelAdapter } from "./ILogChannelAdapter.js";
|
|
8
|
+
|
|
9
|
+
export class LogChannel {
|
|
10
|
+
constructor(
|
|
11
|
+
private readonly channelName: string,
|
|
12
|
+
private readonly logChannelAdapters: ILogChannelAdapter[]
|
|
13
|
+
) {}
|
|
14
|
+
|
|
15
|
+
/** Write a log message at the specified level */
|
|
16
|
+
private writeLog(
|
|
17
|
+
channelName: string,
|
|
18
|
+
level: LogLevel,
|
|
19
|
+
args: unknown[]
|
|
20
|
+
): void {
|
|
21
|
+
for (const logChannelAdapter of this.logChannelAdapters) {
|
|
22
|
+
try {
|
|
23
|
+
logChannelAdapter.writeLog(channelName, level, ...args);
|
|
24
|
+
} catch (error) {
|
|
25
|
+
console.error(`LogChannel failed to write log via adapter: ${error}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Log at debug level */
|
|
31
|
+
debug(...args: unknown[]): void {
|
|
32
|
+
this.writeLog(this.channelName, "debug", args);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Log at info level */
|
|
36
|
+
info(...args: unknown[]): void {
|
|
37
|
+
this.writeLog(this.channelName, "info", args);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Log at warn level */
|
|
41
|
+
warn(...args: unknown[]): void {
|
|
42
|
+
this.writeLog(this.channelName, "warn", args);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Log at error level */
|
|
46
|
+
error(...args: unknown[]): void {
|
|
47
|
+
this.writeLog(this.channelName, "error", args);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type LogLine = {
|
|
2
|
+
timestamp: number;
|
|
3
|
+
message: string;
|
|
4
|
+
level: "info" | "warn" | "error" | "debug";
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
export type LogSource =
|
|
8
|
+
| {
|
|
9
|
+
owner: "host";
|
|
10
|
+
source: "frontend" | "backend";
|
|
11
|
+
}
|
|
12
|
+
| {
|
|
13
|
+
owner: "plugin";
|
|
14
|
+
pluginId: string;
|
|
15
|
+
channelName: string;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export type LogCollection = {
|
|
19
|
+
source: LogSource;
|
|
20
|
+
lines: LogLine[];
|
|
21
|
+
};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { v4 } from "uuid";
|
|
2
|
+
import { safeParse, type GenericSchema, type InferOutput } from "valibot";
|
|
3
|
+
import { IFrameMessageBus } from "./IFrameMessageBus.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* A typed request/response client for iframe communication.
|
|
7
|
+
* Handles message correlation, schema validation, and async coordination.
|
|
8
|
+
*/
|
|
9
|
+
export class IFrameClient {
|
|
10
|
+
private messageBus: IFrameMessageBus;
|
|
11
|
+
private pendingRequests = new Map<string, (response: any) => void>();
|
|
12
|
+
|
|
13
|
+
constructor() {
|
|
14
|
+
this.messageBus = new IFrameMessageBus();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
init() {
|
|
18
|
+
this.messageBus.init();
|
|
19
|
+
this.messageBus.subscribeToParentWindow(this.handleMessage);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
destroy() {
|
|
23
|
+
this.messageBus.destroy();
|
|
24
|
+
this.pendingRequests.clear();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Subscribe to raw messages from the host.
|
|
29
|
+
* Used for event-based messages (not request/response).
|
|
30
|
+
*/
|
|
31
|
+
subscribe(callback: (evt: MessageEvent) => void): () => void {
|
|
32
|
+
return this.messageBus.subscribeToParentWindow(callback);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Send a raw message to the host (no response expected).
|
|
37
|
+
*/
|
|
38
|
+
send(message: any): void {
|
|
39
|
+
this.messageBus.sendToParentWindow(message);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Send a validated request and wait for a validated response.
|
|
44
|
+
*
|
|
45
|
+
* @param type - Message type (e.g., "vfs.readFile")
|
|
46
|
+
* @param payload - Request payload (without requestId)
|
|
47
|
+
* @param reqSchema - Valibot schema for request validation
|
|
48
|
+
* @param resSchema - Valibot schema for response validation
|
|
49
|
+
* @returns Promise resolving to the validated response payload
|
|
50
|
+
*/
|
|
51
|
+
async sendAndWait<
|
|
52
|
+
TReqSchema extends GenericSchema<any, any>,
|
|
53
|
+
TResSchema extends GenericSchema<any, any>
|
|
54
|
+
>(
|
|
55
|
+
type: string,
|
|
56
|
+
payload: any,
|
|
57
|
+
reqSchema: TReqSchema,
|
|
58
|
+
resSchema: TResSchema
|
|
59
|
+
): Promise<InferOutput<TResSchema>["payload"]> {
|
|
60
|
+
const requestId = v4();
|
|
61
|
+
const message = {
|
|
62
|
+
type,
|
|
63
|
+
payload: {
|
|
64
|
+
requestId,
|
|
65
|
+
...payload,
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
console.log(`[SDK] Sending request ${type}:`, message);
|
|
70
|
+
|
|
71
|
+
// Validate Request
|
|
72
|
+
const reqResult = safeParse(reqSchema, message);
|
|
73
|
+
if (!reqResult.success) {
|
|
74
|
+
console.error(
|
|
75
|
+
`[SDK] Invalid request shape for ${type}:`,
|
|
76
|
+
reqResult.issues
|
|
77
|
+
);
|
|
78
|
+
throw new Error(`Invalid request shape for ${type}`);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return new Promise((resolve, reject) => {
|
|
82
|
+
this.pendingRequests.set(requestId, (response: any) => {
|
|
83
|
+
// Validate Response
|
|
84
|
+
const resResult = safeParse(resSchema, response);
|
|
85
|
+
if (!resResult.success) {
|
|
86
|
+
console.error(
|
|
87
|
+
`[SDK] Invalid response shape for ${type}:`,
|
|
88
|
+
resResult.issues
|
|
89
|
+
);
|
|
90
|
+
reject(new Error(`Invalid response shape for ${type}`));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
resolve(resResult.output.payload);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
this.messageBus.sendToParentWindow(message);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
private handleMessage = (evt: MessageEvent) => {
|
|
101
|
+
console.log("Received message:", evt.data);
|
|
102
|
+
const { type, payload } = evt.data || {};
|
|
103
|
+
if (!type) return;
|
|
104
|
+
|
|
105
|
+
if (type.endsWith(".response") && payload?.requestId) {
|
|
106
|
+
const resolve = this.pendingRequests.get(payload.requestId);
|
|
107
|
+
if (resolve) {
|
|
108
|
+
resolve({ type, payload });
|
|
109
|
+
this.pendingRequests.delete(payload.requestId);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export class IFrameMessageBus {
|
|
2
|
+
private subscribers = new Set<(evt: MessageEvent) => void>();
|
|
3
|
+
private handleMessage = (evt: MessageEvent) => {
|
|
4
|
+
this.subscribers.forEach((sub) => sub(evt));
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
constructor() {}
|
|
8
|
+
|
|
9
|
+
init() {
|
|
10
|
+
window.addEventListener("message", this.handleMessage);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
destroy() {
|
|
14
|
+
window.removeEventListener("message", this.handleMessage);
|
|
15
|
+
this.subscribers.clear();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
subscribeToParentWindow(callback: (evt: MessageEvent) => void) {
|
|
19
|
+
this.subscribers.add(callback);
|
|
20
|
+
return () => {
|
|
21
|
+
this.subscribers.delete(callback);
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
sendToParentWindow(message: any) {
|
|
26
|
+
window.parent.postMessage(message, "*");
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { object, string, literal, type ObjectEntries } from "valibot";
|
|
2
|
+
|
|
3
|
+
export const respondableMessage = <
|
|
4
|
+
TType extends string,
|
|
5
|
+
T extends ObjectEntries
|
|
6
|
+
>(
|
|
7
|
+
type: TType,
|
|
8
|
+
entries: T
|
|
9
|
+
) =>
|
|
10
|
+
object({
|
|
11
|
+
type: literal(type),
|
|
12
|
+
payload: object({
|
|
13
|
+
requestId: string(),
|
|
14
|
+
...entries,
|
|
15
|
+
}),
|
|
16
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
import { respondableMessage } from "../../base/index.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* document.requestContent - Plugin → Host
|
|
6
|
+
* Plugin requests initial content when ready.
|
|
7
|
+
*/
|
|
8
|
+
export const DocumentRequestContent = {
|
|
9
|
+
Request: respondableMessage("document.requestContent", {}),
|
|
10
|
+
Response: v.union([
|
|
11
|
+
respondableMessage("document.requestContent.response", {
|
|
12
|
+
success: v.literal(true),
|
|
13
|
+
content: v.string(),
|
|
14
|
+
hash: v.string(),
|
|
15
|
+
}),
|
|
16
|
+
respondableMessage("document.requestContent.response", {
|
|
17
|
+
success: v.literal(false),
|
|
18
|
+
error: v.string(),
|
|
19
|
+
}),
|
|
20
|
+
]),
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export type DocumentRequestContentRequest = v.InferOutput<
|
|
24
|
+
typeof DocumentRequestContent.Request
|
|
25
|
+
>;
|
|
26
|
+
export type DocumentRequestContentResponse = v.InferOutput<
|
|
27
|
+
typeof DocumentRequestContent.Response
|
|
28
|
+
>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./message.schemas.js";
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { string, literal, union, type InferOutput } from "valibot";
|
|
2
|
+
import { respondableMessage } from "../../base/index.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* document.save - Plugin → Host
|
|
6
|
+
* Plugin requests the host to save the current document.
|
|
7
|
+
* Used when user presses Ctrl+S inside the plugin iframe.
|
|
8
|
+
*/
|
|
9
|
+
export const DocumentSave = {
|
|
10
|
+
Request: respondableMessage("document.save", {}),
|
|
11
|
+
Response: union([
|
|
12
|
+
respondableMessage("document.save.response", {
|
|
13
|
+
success: literal(true),
|
|
14
|
+
hash: string(),
|
|
15
|
+
}),
|
|
16
|
+
respondableMessage("document.save.response", {
|
|
17
|
+
success: literal(false),
|
|
18
|
+
error: string(),
|
|
19
|
+
}),
|
|
20
|
+
]),
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export type DocumentSaveRequest = InferOutput<typeof DocumentSave.Request>;
|
|
24
|
+
export type DocumentSaveResponse = InferOutput<typeof DocumentSave.Response>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { string, literal, union, type InferOutput } from "valibot";
|
|
2
|
+
import { respondableMessage } from "../../base/index.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* document.saveRequested - Host → Plugin
|
|
6
|
+
* Sent when the host wants to save the document.
|
|
7
|
+
* The plugin should respond with the current content.
|
|
8
|
+
*/
|
|
9
|
+
export const DocumentSaveRequested = {
|
|
10
|
+
/**
|
|
11
|
+
* Host sends this to request the current document content for saving.
|
|
12
|
+
*/
|
|
13
|
+
Request: respondableMessage("document.saveRequested", {}),
|
|
14
|
+
/**
|
|
15
|
+
* Plugin responds with the current content to be saved.
|
|
16
|
+
*/
|
|
17
|
+
Response: union([
|
|
18
|
+
respondableMessage("document.saveRequested.response", {
|
|
19
|
+
success: literal(true),
|
|
20
|
+
/** The current document content to save */
|
|
21
|
+
content: string(),
|
|
22
|
+
}),
|
|
23
|
+
respondableMessage("document.saveRequested.response", {
|
|
24
|
+
success: literal(false),
|
|
25
|
+
error: string(),
|
|
26
|
+
}),
|
|
27
|
+
]),
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export type DocumentSaveRequestedRequest = InferOutput<
|
|
31
|
+
typeof DocumentSaveRequested.Request
|
|
32
|
+
>;
|
|
33
|
+
export type DocumentSaveRequestedResponse = InferOutput<
|
|
34
|
+
typeof DocumentSaveRequested.Response
|
|
35
|
+
>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { string, literal, union, type InferOutput } from "valibot";
|
|
2
|
+
import { respondableMessage } from "../../base/index.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* document.saved - Host → Plugin
|
|
6
|
+
* Sent after the host has successfully saved the document.
|
|
7
|
+
* The plugin can use this to update its internal state (e.g., clear undo history marker).
|
|
8
|
+
*/
|
|
9
|
+
export const DocumentSaved = {
|
|
10
|
+
/**
|
|
11
|
+
* Host sends this to notify the plugin that the save was successful.
|
|
12
|
+
*/
|
|
13
|
+
Request: respondableMessage("document.saved", {
|
|
14
|
+
/** The hash of the saved content */
|
|
15
|
+
hash: string(),
|
|
16
|
+
}),
|
|
17
|
+
Response: union([
|
|
18
|
+
respondableMessage("document.saved.response", {
|
|
19
|
+
success: literal(true),
|
|
20
|
+
}),
|
|
21
|
+
respondableMessage("document.saved.response", {
|
|
22
|
+
success: literal(false),
|
|
23
|
+
error: string(),
|
|
24
|
+
}),
|
|
25
|
+
]),
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export type DocumentSavedRequest = InferOutput<typeof DocumentSaved.Request>;
|
|
29
|
+
export type DocumentSavedResponse = InferOutput<typeof DocumentSaved.Response>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./openFile/message.schemas.js";
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { string, type InferOutput, literal, union } from "valibot";
|
|
2
|
+
import { respondableMessage } from "../../base/index.js";
|
|
3
|
+
|
|
4
|
+
export const EditorOpenFile = {
|
|
5
|
+
Request: respondableMessage("editor.openFile", {
|
|
6
|
+
path: string(),
|
|
7
|
+
}),
|
|
8
|
+
Response: union([
|
|
9
|
+
respondableMessage("editor.openFile.response", {
|
|
10
|
+
success: literal(true),
|
|
11
|
+
}),
|
|
12
|
+
respondableMessage("editor.openFile.response", {
|
|
13
|
+
success: literal(false),
|
|
14
|
+
error: string(),
|
|
15
|
+
}),
|
|
16
|
+
]),
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export type EditorOpenFileRequest = InferOutput<typeof EditorOpenFile.Request>;
|
|
20
|
+
export type EditorOpenFileResponse = InferOutput<
|
|
21
|
+
typeof EditorOpenFile.Response
|
|
22
|
+
>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { string, type InferOutput, object, union, literal } from "valibot";
|
|
2
|
+
|
|
3
|
+
// Broadcast message for file change events
|
|
4
|
+
export const FsFileChangedSchema = object({
|
|
5
|
+
type: literal("fs.fileChanged"),
|
|
6
|
+
payload: object({
|
|
7
|
+
path: string(),
|
|
8
|
+
kind: union([literal("created"), literal("modified"), literal("deleted")]),
|
|
9
|
+
}),
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
export type FsFileChanged = InferOutput<typeof FsFileChangedSchema>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { string, type InferOutput, literal, union } from "valibot";
|
|
2
|
+
import { respondableMessage } from "../../base/index.js";
|
|
3
|
+
|
|
4
|
+
export const FsSubscribe = {
|
|
5
|
+
Request: respondableMessage("fs.subscribe", {}),
|
|
6
|
+
Response: union([
|
|
7
|
+
respondableMessage("fs.subscribe.response", {
|
|
8
|
+
success: literal(true),
|
|
9
|
+
}),
|
|
10
|
+
respondableMessage("fs.subscribe.response", {
|
|
11
|
+
success: literal(false),
|
|
12
|
+
error: string(),
|
|
13
|
+
}),
|
|
14
|
+
]),
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export const FsUnsubscribe = {
|
|
18
|
+
Request: respondableMessage("fs.unsubscribe", {}),
|
|
19
|
+
Response: union([
|
|
20
|
+
respondableMessage("fs.unsubscribe.response", {
|
|
21
|
+
success: literal(true),
|
|
22
|
+
}),
|
|
23
|
+
respondableMessage("fs.unsubscribe.response", {
|
|
24
|
+
success: literal(false),
|
|
25
|
+
error: string(),
|
|
26
|
+
}),
|
|
27
|
+
]),
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export type FsSubscribeRequest = InferOutput<typeof FsSubscribe.Request>;
|
|
31
|
+
export type FsSubscribeResponse = InferOutput<typeof FsSubscribe.Response>;
|
|
32
|
+
export type FsUnsubscribeRequest = InferOutput<typeof FsUnsubscribe.Request>;
|
|
33
|
+
export type FsUnsubscribeResponse = InferOutput<typeof FsUnsubscribe.Response>;
|