@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,27 @@
|
|
|
1
|
+
import type { IFrameClient } from "../messages/IFrameClient.js";
|
|
2
|
+
import { EditorOpenFile } from "../messages/index.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Editor namespace for editor operations.
|
|
6
|
+
* This class is not part of the public SDK API.
|
|
7
|
+
*/
|
|
8
|
+
export class EditorNamespace {
|
|
9
|
+
private readonly client: IFrameClient;
|
|
10
|
+
|
|
11
|
+
constructor(client: IFrameClient) {
|
|
12
|
+
this.client = client;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async openFile(path: string): Promise<void> {
|
|
16
|
+
const response = await this.client.sendAndWait(
|
|
17
|
+
"editor.openFile",
|
|
18
|
+
{ path },
|
|
19
|
+
EditorOpenFile.Request,
|
|
20
|
+
EditorOpenFile.Response
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
if (!response.success) {
|
|
24
|
+
throw new Error(response.error);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { safeParse } from "valibot";
|
|
2
|
+
import type { IFrameClient } from "../messages/IFrameClient.js";
|
|
3
|
+
import {
|
|
4
|
+
FsSubscribe,
|
|
5
|
+
FsUnsubscribe,
|
|
6
|
+
FsFileChangedSchema,
|
|
7
|
+
type FsFileChanged,
|
|
8
|
+
} from "../messages/index.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* File system namespace for file watching operations.
|
|
12
|
+
* This class is not part of the public SDK API.
|
|
13
|
+
*/
|
|
14
|
+
export class FsNamespace {
|
|
15
|
+
private readonly client: IFrameClient;
|
|
16
|
+
|
|
17
|
+
constructor(client: IFrameClient) {
|
|
18
|
+
this.client = client;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Subscribe to file system change events.
|
|
23
|
+
* Requires the "fs.watch" permission in the plugin manifest.
|
|
24
|
+
*/
|
|
25
|
+
async subscribe(): Promise<void> {
|
|
26
|
+
const response = await this.client.sendAndWait(
|
|
27
|
+
"fs.subscribe",
|
|
28
|
+
{},
|
|
29
|
+
FsSubscribe.Request,
|
|
30
|
+
FsSubscribe.Response
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
if (!response.success) {
|
|
34
|
+
throw new Error(response.error);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Unsubscribe from file system change events.
|
|
40
|
+
*/
|
|
41
|
+
async unsubscribe(): Promise<void> {
|
|
42
|
+
const response = await this.client.sendAndWait(
|
|
43
|
+
"fs.unsubscribe",
|
|
44
|
+
{},
|
|
45
|
+
FsUnsubscribe.Request,
|
|
46
|
+
FsUnsubscribe.Response
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
if (!response.success) {
|
|
50
|
+
throw new Error(response.error);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Listen for file change events.
|
|
56
|
+
* Must call fs.subscribe() first.
|
|
57
|
+
* @param callback Function called when a file changes
|
|
58
|
+
* @returns Unsubscribe function
|
|
59
|
+
*/
|
|
60
|
+
onFileChanged(callback: (event: FsFileChanged) => void): () => void {
|
|
61
|
+
return this.client.subscribe((evt) => {
|
|
62
|
+
const { type } = evt.data || {};
|
|
63
|
+
if (type !== "fs.fileChanged") {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const result = safeParse(FsFileChangedSchema, evt.data);
|
|
68
|
+
|
|
69
|
+
if (!result.success) {
|
|
70
|
+
console.error("[SDK] Invalid fs.fileChanged payload:", result.issues);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
callback(result.output);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { IFrameClient } from "../messages/IFrameClient.js";
|
|
2
|
+
import { NativeCall } from "../messages/index.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Native namespace for calling native plugin modules.
|
|
6
|
+
* This class is not part of the public SDK API.
|
|
7
|
+
*/
|
|
8
|
+
export class NativeNamespace {
|
|
9
|
+
private readonly client: IFrameClient;
|
|
10
|
+
|
|
11
|
+
constructor(client: IFrameClient) {
|
|
12
|
+
this.client = client;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async call(
|
|
16
|
+
pluginId: string,
|
|
17
|
+
moduleId: string,
|
|
18
|
+
command: string,
|
|
19
|
+
args: unknown
|
|
20
|
+
): Promise<unknown> {
|
|
21
|
+
const response = await this.client.sendAndWait(
|
|
22
|
+
"native.call",
|
|
23
|
+
{ pluginId, moduleId, command, args },
|
|
24
|
+
NativeCall.Request,
|
|
25
|
+
NativeCall.Response
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
if (!response.success) {
|
|
29
|
+
throw new Error(response.error);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return response.data;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { safeParse } from "valibot";
|
|
2
|
+
import type { IFrameClient } from "../messages/IFrameClient.js";
|
|
3
|
+
import {
|
|
4
|
+
PluginSendMessage,
|
|
5
|
+
PluginMessage,
|
|
6
|
+
PluginSendBroadcast,
|
|
7
|
+
PluginBroadcast,
|
|
8
|
+
} from "../messages/index.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Intra-plugin messaging namespace.
|
|
12
|
+
* This class is not part of the public SDK API.
|
|
13
|
+
*
|
|
14
|
+
* Allows modules within the same plugin to communicate with each other.
|
|
15
|
+
* Messages are routed through the host - modules cannot communicate directly.
|
|
16
|
+
*
|
|
17
|
+
* Use cases:
|
|
18
|
+
* - A panel module sending commands to a backgroundService module
|
|
19
|
+
* - A backgroundService module notifying UI modules of state changes
|
|
20
|
+
* - Coordinating work between multiple UI modules
|
|
21
|
+
*/
|
|
22
|
+
export class PluginNamespace {
|
|
23
|
+
private readonly client: IFrameClient;
|
|
24
|
+
|
|
25
|
+
constructor(client: IFrameClient) {
|
|
26
|
+
this.client = client;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Send a message to a specific sibling module within the same plugin.
|
|
31
|
+
* Returns a promise that resolves with the response from the target module.
|
|
32
|
+
*
|
|
33
|
+
* @param targetModuleId - The module ID to send the message to
|
|
34
|
+
* @param message - The message payload (any serializable value)
|
|
35
|
+
* @returns Promise resolving to the response data from the target module
|
|
36
|
+
* @throws Error if the target module doesn't exist or fails to respond
|
|
37
|
+
*/
|
|
38
|
+
async sendMessage<T = unknown>(
|
|
39
|
+
targetModuleId: string,
|
|
40
|
+
message: unknown
|
|
41
|
+
): Promise<T> {
|
|
42
|
+
const response = await this.client.sendAndWait(
|
|
43
|
+
"plugin.sendMessage",
|
|
44
|
+
{ targetModuleId, message },
|
|
45
|
+
PluginSendMessage.Request,
|
|
46
|
+
PluginSendMessage.Response
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
if (!response.success) {
|
|
50
|
+
throw new Error(response.error || "Failed to send message");
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return response.data as T;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Listen for incoming messages from sibling modules.
|
|
58
|
+
* The handler should return a response that will be sent back to the sender.
|
|
59
|
+
* Supports both sync and async handlers.
|
|
60
|
+
*
|
|
61
|
+
* @param handler - Function that handles incoming messages and returns a response (sync or async)
|
|
62
|
+
* @returns Unsubscribe function
|
|
63
|
+
*/
|
|
64
|
+
onMessage(
|
|
65
|
+
handler: (
|
|
66
|
+
payload: PluginMessage.HandlerPayload
|
|
67
|
+
) => unknown | Promise<unknown>
|
|
68
|
+
): () => void {
|
|
69
|
+
return this.client.subscribe((evt) => {
|
|
70
|
+
const { type } = evt.data || {};
|
|
71
|
+
if (type !== "plugin.message") {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const result = safeParse(PluginMessage.Request, evt.data);
|
|
76
|
+
|
|
77
|
+
if (!result.success) {
|
|
78
|
+
console.error("[SDK] Invalid plugin.message payload:", result.issues);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const requestId = result.output.payload.requestId;
|
|
83
|
+
|
|
84
|
+
// Wrap in Promise.resolve to handle both sync and async handlers
|
|
85
|
+
Promise.resolve()
|
|
86
|
+
.then(() => handler(result.output.payload))
|
|
87
|
+
.then((responseData) => {
|
|
88
|
+
this.client.send({
|
|
89
|
+
type: "plugin.message.response",
|
|
90
|
+
payload: {
|
|
91
|
+
requestId,
|
|
92
|
+
success: true,
|
|
93
|
+
data: responseData,
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
})
|
|
97
|
+
.catch((error) => {
|
|
98
|
+
console.error("[SDK] Error in plugin.onMessage handler:", error);
|
|
99
|
+
this.client.send({
|
|
100
|
+
type: "plugin.message.response",
|
|
101
|
+
payload: {
|
|
102
|
+
requestId,
|
|
103
|
+
success: false,
|
|
104
|
+
error: error instanceof Error ? error.message : String(error),
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Broadcast a message to all sibling modules within the same plugin.
|
|
113
|
+
* This is fire-and-forget - no response is expected.
|
|
114
|
+
*
|
|
115
|
+
* @param message - The message payload (any serializable value)
|
|
116
|
+
*/
|
|
117
|
+
async sendBroadcast(message: unknown): Promise<void> {
|
|
118
|
+
const response = await this.client.sendAndWait(
|
|
119
|
+
"plugin.sendBroadcast",
|
|
120
|
+
{ message },
|
|
121
|
+
PluginSendBroadcast.Request,
|
|
122
|
+
PluginSendBroadcast.Response
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
if (!response.success) {
|
|
126
|
+
throw new Error(response.error || "Failed to send broadcast");
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Listen for broadcast messages from sibling modules.
|
|
132
|
+
* Broadcasts are fire-and-forget - no response is expected.
|
|
133
|
+
*
|
|
134
|
+
* @param handler - Function that handles incoming broadcasts
|
|
135
|
+
* @returns Unsubscribe function
|
|
136
|
+
*/
|
|
137
|
+
onBroadcast(
|
|
138
|
+
handler: (payload: { fromModuleId: string; message: unknown }) => void
|
|
139
|
+
): () => void {
|
|
140
|
+
return this.client.subscribe((evt) => {
|
|
141
|
+
const { type } = evt.data || {};
|
|
142
|
+
if (type !== "plugin.broadcast") {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const result = safeParse(PluginBroadcast.Event, evt.data);
|
|
147
|
+
|
|
148
|
+
if (!result.success) {
|
|
149
|
+
console.error("[SDK] Invalid plugin.broadcast payload:", result.issues);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
handler(result.output.payload);
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import type { IFrameClient } from "../messages/IFrameClient.js";
|
|
2
|
+
import {
|
|
3
|
+
StorageGet,
|
|
4
|
+
StorageSet,
|
|
5
|
+
StorageDelete,
|
|
6
|
+
StorageGetSecret,
|
|
7
|
+
StorageSetSecret,
|
|
8
|
+
StorageDeleteSecret,
|
|
9
|
+
} from "../messages/index.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Encode Uint8Array to base64 string.
|
|
13
|
+
*/
|
|
14
|
+
function encodeBase64(bytes: Uint8Array): string {
|
|
15
|
+
let binary = "";
|
|
16
|
+
const len = bytes.length;
|
|
17
|
+
for (let i = 0; i < len; i++) {
|
|
18
|
+
binary += String.fromCharCode(bytes[i]!);
|
|
19
|
+
}
|
|
20
|
+
return btoa(binary);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Decode base64 string to Uint8Array.
|
|
25
|
+
*/
|
|
26
|
+
function decodeBase64(base64: string): Uint8Array {
|
|
27
|
+
const binary = atob(base64);
|
|
28
|
+
const len = binary.length;
|
|
29
|
+
const bytes = new Uint8Array(len);
|
|
30
|
+
for (let i = 0; i < len; i++) {
|
|
31
|
+
bytes[i] = binary.charCodeAt(i);
|
|
32
|
+
}
|
|
33
|
+
return bytes;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Storage namespace for plugin data and secrets.
|
|
38
|
+
*
|
|
39
|
+
* Provides two storage types:
|
|
40
|
+
* - `get`/`set`/`delete`: Non-secret storage for any binary data
|
|
41
|
+
* - `getSecret`/`setSecret`/`deleteSecret`: Encrypted storage for sensitive data
|
|
42
|
+
*
|
|
43
|
+
* Both use Uint8Array for values to support any binary data.
|
|
44
|
+
* Data is isolated per plugin (plugins cannot access each other's storage).
|
|
45
|
+
*/
|
|
46
|
+
export class StorageNamespace {
|
|
47
|
+
private readonly client: IFrameClient;
|
|
48
|
+
|
|
49
|
+
constructor(client: IFrameClient) {
|
|
50
|
+
this.client = client;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// ===========================================================================
|
|
54
|
+
// Non-secret storage (raw bytes, unencrypted)
|
|
55
|
+
// ===========================================================================
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Get a value from storage.
|
|
59
|
+
*
|
|
60
|
+
* @param key - The storage key
|
|
61
|
+
* @returns The value as Uint8Array, or null if not found
|
|
62
|
+
*/
|
|
63
|
+
async get(key: string): Promise<Uint8Array | null> {
|
|
64
|
+
const response = await this.client.sendAndWait(
|
|
65
|
+
"storage.get",
|
|
66
|
+
{ key },
|
|
67
|
+
StorageGet.Request,
|
|
68
|
+
StorageGet.Response
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
if (!response.success) {
|
|
72
|
+
throw new Error(response.error || "Failed to get value");
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (response.value === null) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return decodeBase64(response.value);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Set a value in storage.
|
|
84
|
+
*
|
|
85
|
+
* @param key - The storage key
|
|
86
|
+
* @param value - The value to store as Uint8Array
|
|
87
|
+
*/
|
|
88
|
+
async set(key: string, value: Uint8Array): Promise<void> {
|
|
89
|
+
const base64 = encodeBase64(value);
|
|
90
|
+
const response = await this.client.sendAndWait(
|
|
91
|
+
"storage.set",
|
|
92
|
+
{ key, value: base64 },
|
|
93
|
+
StorageSet.Request,
|
|
94
|
+
StorageSet.Response
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
if (!response.success) {
|
|
98
|
+
throw new Error(response.error || "Failed to set value");
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Delete a value from storage.
|
|
104
|
+
*
|
|
105
|
+
* @param key - The storage key to delete
|
|
106
|
+
*/
|
|
107
|
+
async delete(key: string): Promise<void> {
|
|
108
|
+
const response = await this.client.sendAndWait(
|
|
109
|
+
"storage.delete",
|
|
110
|
+
{ key },
|
|
111
|
+
StorageDelete.Request,
|
|
112
|
+
StorageDelete.Response
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
if (!response.success) {
|
|
116
|
+
throw new Error(response.error || "Failed to delete value");
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// ===========================================================================
|
|
121
|
+
// Secret storage (encrypted at rest)
|
|
122
|
+
// ===========================================================================
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Get a secret value for this plugin.
|
|
126
|
+
*
|
|
127
|
+
* @param key - The secret key (e.g., "apiKey", "token")
|
|
128
|
+
* @returns The secret value as Uint8Array, or null if not found
|
|
129
|
+
*/
|
|
130
|
+
async getSecret(key: string): Promise<Uint8Array | null> {
|
|
131
|
+
const response = await this.client.sendAndWait(
|
|
132
|
+
"storage.getSecret",
|
|
133
|
+
{ key },
|
|
134
|
+
StorageGetSecret.Request,
|
|
135
|
+
StorageGetSecret.Response
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
if (!response.success) {
|
|
139
|
+
throw new Error(response.error || "Failed to get secret");
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (response.value === null) {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return decodeBase64(response.value);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Set a secret value for this plugin.
|
|
151
|
+
*
|
|
152
|
+
* @param key - The secret key (e.g., "apiKey", "token")
|
|
153
|
+
* @param value - The secret value to store as Uint8Array
|
|
154
|
+
*/
|
|
155
|
+
async setSecret(key: string, value: Uint8Array): Promise<void> {
|
|
156
|
+
const base64 = encodeBase64(value);
|
|
157
|
+
const response = await this.client.sendAndWait(
|
|
158
|
+
"storage.setSecret",
|
|
159
|
+
{ key, value: base64 },
|
|
160
|
+
StorageSetSecret.Request,
|
|
161
|
+
StorageSetSecret.Response
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
if (!response.success) {
|
|
165
|
+
throw new Error(response.error || "Failed to set secret");
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Delete a secret value for this plugin.
|
|
171
|
+
*
|
|
172
|
+
* @param key - The secret key to delete
|
|
173
|
+
*/
|
|
174
|
+
async deleteSecret(key: string): Promise<void> {
|
|
175
|
+
const response = await this.client.sendAndWait(
|
|
176
|
+
"storage.deleteSecret",
|
|
177
|
+
{ key },
|
|
178
|
+
StorageDeleteSecret.Request,
|
|
179
|
+
StorageDeleteSecret.Response
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
if (!response.success) {
|
|
183
|
+
throw new Error(response.error || "Failed to delete secret");
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import type { IFrameClient } from "../messages/IFrameClient.js";
|
|
2
|
+
import {
|
|
3
|
+
VfsCreateDir,
|
|
4
|
+
VfsDelete,
|
|
5
|
+
VfsExists,
|
|
6
|
+
VfsGetAbsolutePath,
|
|
7
|
+
VfsReadDir,
|
|
8
|
+
VfsReadFile,
|
|
9
|
+
VfsRename,
|
|
10
|
+
VfsWriteFile,
|
|
11
|
+
} from "../messages/index.js";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Virtual file system namespace for file operations.
|
|
15
|
+
* This class is not part of the public SDK API.
|
|
16
|
+
*/
|
|
17
|
+
export class VfsNamespace {
|
|
18
|
+
private readonly client: IFrameClient;
|
|
19
|
+
|
|
20
|
+
constructor(client: IFrameClient) {
|
|
21
|
+
this.client = client;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async exists(path: string) {
|
|
25
|
+
const response = await this.client.sendAndWait(
|
|
26
|
+
"vfs.exists",
|
|
27
|
+
{ path },
|
|
28
|
+
VfsExists.Request,
|
|
29
|
+
VfsExists.Response
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
if (!response.success) {
|
|
33
|
+
throw new Error(response.error);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return response.data;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async readDir(path: string) {
|
|
40
|
+
const response = await this.client.sendAndWait(
|
|
41
|
+
"vfs.readDir",
|
|
42
|
+
{ path },
|
|
43
|
+
VfsReadDir.Request,
|
|
44
|
+
VfsReadDir.Response
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
if (!response.success) {
|
|
48
|
+
throw new Error(response.error);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return response.data;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async readFile(path: string): Promise<string> {
|
|
55
|
+
const response = await this.client.sendAndWait(
|
|
56
|
+
"vfs.readFile",
|
|
57
|
+
{ path },
|
|
58
|
+
VfsReadFile.Request,
|
|
59
|
+
VfsReadFile.Response
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
if (!response.success) {
|
|
63
|
+
throw new Error(response.error);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return response.data;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async writeFile(path: string, content: string): Promise<void> {
|
|
70
|
+
const response = await this.client.sendAndWait(
|
|
71
|
+
"vfs.writeFile",
|
|
72
|
+
{ path, content },
|
|
73
|
+
VfsWriteFile.Request,
|
|
74
|
+
VfsWriteFile.Response
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
if (!response.success) {
|
|
78
|
+
throw new Error(response.error);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async getAbsolutePath(path: string): Promise<string> {
|
|
83
|
+
const response = await this.client.sendAndWait(
|
|
84
|
+
"vfs.getAbsolutePath",
|
|
85
|
+
{ path },
|
|
86
|
+
VfsGetAbsolutePath.Request,
|
|
87
|
+
VfsGetAbsolutePath.Response
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
if (!response.success) {
|
|
91
|
+
throw new Error(response.error);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return response.data.absolutePath;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async rename(oldPath: string, newPath: string): Promise<void> {
|
|
98
|
+
const response = await this.client.sendAndWait(
|
|
99
|
+
"vfs.rename",
|
|
100
|
+
{ oldPath, newPath },
|
|
101
|
+
VfsRename.Request,
|
|
102
|
+
VfsRename.Response
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
if (!response.success) {
|
|
106
|
+
throw new Error(response.error);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
async delete(path: string): Promise<void> {
|
|
111
|
+
const response = await this.client.sendAndWait(
|
|
112
|
+
"vfs.delete",
|
|
113
|
+
{ path },
|
|
114
|
+
VfsDelete.Request,
|
|
115
|
+
VfsDelete.Response
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
if (!response.success) {
|
|
119
|
+
throw new Error(response.error);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
async createDir(path: string): Promise<void> {
|
|
124
|
+
const response = await this.client.sendAndWait(
|
|
125
|
+
"vfs.createDir",
|
|
126
|
+
{ path },
|
|
127
|
+
VfsCreateDir.Request,
|
|
128
|
+
VfsCreateDir.Response
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
if (!response.success) {
|
|
132
|
+
throw new Error(response.error);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { safeParse } from "valibot";
|
|
2
|
+
import type { IFrameClient } from "../messages/IFrameClient.js";
|
|
3
|
+
import {
|
|
4
|
+
WorkspaceGetDetails,
|
|
5
|
+
WorkspaceOpen,
|
|
6
|
+
WorkspaceChangedSchema,
|
|
7
|
+
type WorkspaceChanged,
|
|
8
|
+
type WorkspaceDetails,
|
|
9
|
+
} from "../messages/index.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Workspace namespace for workspace operations.
|
|
13
|
+
* This class is not part of the public SDK API.
|
|
14
|
+
*/
|
|
15
|
+
export class WorkspaceNamespace {
|
|
16
|
+
private readonly client: IFrameClient;
|
|
17
|
+
|
|
18
|
+
constructor(client: IFrameClient) {
|
|
19
|
+
this.client = client;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async getDetails(): Promise<WorkspaceDetails> {
|
|
23
|
+
const response = await this.client.sendAndWait(
|
|
24
|
+
"workspace.getDetails",
|
|
25
|
+
{},
|
|
26
|
+
WorkspaceGetDetails.Request,
|
|
27
|
+
WorkspaceGetDetails.Response
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
if (!response.success) {
|
|
31
|
+
throw new Error(response.error);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return response.data;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
onChanged(callback: (payload: WorkspaceChanged) => void): () => void {
|
|
38
|
+
return this.client.subscribe((evt) => {
|
|
39
|
+
const { type, payload } = evt.data || {};
|
|
40
|
+
|
|
41
|
+
if (type !== "workspace.changed") {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const result = safeParse(WorkspaceChangedSchema, {
|
|
46
|
+
type,
|
|
47
|
+
...payload,
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
if (!result.success) {
|
|
51
|
+
console.error(
|
|
52
|
+
"[SDK] Invalid workspace.changed payload:",
|
|
53
|
+
result.issues
|
|
54
|
+
);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
callback(result.output);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Open a folder picker dialog to select a workspace.
|
|
64
|
+
* @returns The selected workspace path, or null if cancelled
|
|
65
|
+
*/
|
|
66
|
+
async open(): Promise<string | null> {
|
|
67
|
+
const response = await this.client.sendAndWait(
|
|
68
|
+
"workspace.open",
|
|
69
|
+
{},
|
|
70
|
+
WorkspaceOpen.Request,
|
|
71
|
+
WorkspaceOpen.Response
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
if (!response.success) {
|
|
75
|
+
throw new Error(response.error);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return response.path;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { VfsNamespace } from "./VfsNamespace.js";
|
|
2
|
+
export { WorkspaceNamespace } from "./WorkspaceNamespace.js";
|
|
3
|
+
export { EditorNamespace } from "./EditorNamespace.js";
|
|
4
|
+
export { NativeNamespace } from "./NativeNamespace.js";
|
|
5
|
+
export { FsNamespace } from "./FsNamespace.js";
|
|
6
|
+
export { DocumentNamespace } from "./DocumentNamespace.js";
|
|
7
|
+
export { PluginNamespace } from "./PluginNamespace.js";
|
|
8
|
+
export { StorageNamespace } from "./StorageNamespace.js";
|