@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.
Files changed (310) hide show
  1. package/README.md +5 -0
  2. package/dist/src/PracticalKitSdk.d.ts +184 -0
  3. package/dist/src/PracticalKitSdk.d.ts.map +1 -0
  4. package/dist/src/PracticalKitSdk.js +230 -0
  5. package/dist/src/PracticalKitSdk.js.map +1 -0
  6. package/dist/src/index.d.ts +5 -0
  7. package/dist/src/index.d.ts.map +1 -0
  8. package/dist/src/index.js +6 -0
  9. package/dist/src/index.js.map +1 -0
  10. package/dist/src/keyboard/KeyboardShortcutForwarder.d.ts +18 -0
  11. package/dist/src/keyboard/KeyboardShortcutForwarder.d.ts.map +1 -0
  12. package/dist/src/keyboard/KeyboardShortcutForwarder.js +36 -0
  13. package/dist/src/keyboard/KeyboardShortcutForwarder.js.map +1 -0
  14. package/dist/src/keyboard/index.d.ts +2 -0
  15. package/dist/src/keyboard/index.d.ts.map +1 -0
  16. package/dist/src/keyboard/index.js +2 -0
  17. package/dist/src/keyboard/index.js.map +1 -0
  18. package/dist/src/llm/ToolRegistry.d.ts +49 -0
  19. package/dist/src/llm/ToolRegistry.d.ts.map +1 -0
  20. package/dist/src/llm/ToolRegistry.js +126 -0
  21. package/dist/src/llm/ToolRegistry.js.map +1 -0
  22. package/dist/src/logs/channel/IFrameLogChannelAdapter.d.ts +8 -0
  23. package/dist/src/logs/channel/IFrameLogChannelAdapter.d.ts.map +1 -0
  24. package/dist/src/logs/channel/IFrameLogChannelAdapter.js +34 -0
  25. package/dist/src/logs/channel/IFrameLogChannelAdapter.js.map +1 -0
  26. package/dist/src/logs/channel/ILogChannelAdapter.d.ts +5 -0
  27. package/dist/src/logs/channel/ILogChannelAdapter.d.ts.map +1 -0
  28. package/dist/src/logs/channel/ILogChannelAdapter.js +2 -0
  29. package/dist/src/logs/channel/ILogChannelAdapter.js.map +1 -0
  30. package/dist/src/logs/channel/LogChannel.d.ts +21 -0
  31. package/dist/src/logs/channel/LogChannel.d.ts.map +1 -0
  32. package/dist/src/logs/channel/LogChannel.js +41 -0
  33. package/dist/src/logs/channel/LogChannel.js.map +1 -0
  34. package/dist/src/logs/outputs/types.d.ts +18 -0
  35. package/dist/src/logs/outputs/types.d.ts.map +1 -0
  36. package/dist/src/logs/outputs/types.js +2 -0
  37. package/dist/src/logs/outputs/types.js.map +1 -0
  38. package/dist/src/messages/IFrameClient.d.ts +33 -0
  39. package/dist/src/messages/IFrameClient.d.ts.map +1 -0
  40. package/dist/src/messages/IFrameClient.js +88 -0
  41. package/dist/src/messages/IFrameClient.js.map +1 -0
  42. package/dist/src/messages/IFrameMessageBus.d.ts +10 -0
  43. package/dist/src/messages/IFrameMessageBus.d.ts.map +1 -0
  44. package/dist/src/messages/IFrameMessageBus.js +24 -0
  45. package/dist/src/messages/IFrameMessageBus.js.map +1 -0
  46. package/dist/src/messages/base/index.d.ts +8 -0
  47. package/dist/src/messages/base/index.d.ts.map +1 -0
  48. package/dist/src/messages/base/index.js +9 -0
  49. package/dist/src/messages/base/index.js.map +1 -0
  50. package/dist/src/messages/document/index.d.ts +5 -0
  51. package/dist/src/messages/document/index.d.ts.map +1 -0
  52. package/dist/src/messages/document/index.js +5 -0
  53. package/dist/src/messages/document/index.js.map +1 -0
  54. package/dist/src/messages/document/requestContent/message.schemas.d.ts +34 -0
  55. package/dist/src/messages/document/requestContent/message.schemas.d.ts.map +1 -0
  56. package/dist/src/messages/document/requestContent/message.schemas.js +21 -0
  57. package/dist/src/messages/document/requestContent/message.schemas.js.map +1 -0
  58. package/dist/src/messages/document/save/index.d.ts +2 -0
  59. package/dist/src/messages/document/save/index.d.ts.map +1 -0
  60. package/dist/src/messages/document/save/index.js +2 -0
  61. package/dist/src/messages/document/save/index.js.map +1 -0
  62. package/dist/src/messages/document/save/message.schemas.d.ts +34 -0
  63. package/dist/src/messages/document/save/message.schemas.d.ts.map +1 -0
  64. package/dist/src/messages/document/save/message.schemas.js +21 -0
  65. package/dist/src/messages/document/save/message.schemas.js.map +1 -0
  66. package/dist/src/messages/document/saveRequested/message.schemas.d.ts +41 -0
  67. package/dist/src/messages/document/saveRequested/message.schemas.d.ts.map +1 -0
  68. package/dist/src/messages/document/saveRequested/message.schemas.js +28 -0
  69. package/dist/src/messages/document/saveRequested/message.schemas.js.map +1 -0
  70. package/dist/src/messages/document/saved/message.schemas.d.ts +39 -0
  71. package/dist/src/messages/document/saved/message.schemas.d.ts.map +1 -0
  72. package/dist/src/messages/document/saved/message.schemas.js +26 -0
  73. package/dist/src/messages/document/saved/message.schemas.js.map +1 -0
  74. package/dist/src/messages/editor/index.d.ts +2 -0
  75. package/dist/src/messages/editor/index.d.ts.map +1 -0
  76. package/dist/src/messages/editor/index.js +2 -0
  77. package/dist/src/messages/editor/index.js.map +1 -0
  78. package/dist/src/messages/editor/openFile/message.schemas.d.ts +30 -0
  79. package/dist/src/messages/editor/openFile/message.schemas.d.ts.map +1 -0
  80. package/dist/src/messages/editor/openFile/message.schemas.js +17 -0
  81. package/dist/src/messages/editor/openFile/message.schemas.js.map +1 -0
  82. package/dist/src/messages/fs/fileChanged/message.schemas.d.ts +10 -0
  83. package/dist/src/messages/fs/fileChanged/message.schemas.d.ts.map +1 -0
  84. package/dist/src/messages/fs/fileChanged/message.schemas.js +10 -0
  85. package/dist/src/messages/fs/fileChanged/message.schemas.js.map +1 -0
  86. package/dist/src/messages/fs/index.d.ts +3 -0
  87. package/dist/src/messages/fs/index.d.ts.map +1 -0
  88. package/dist/src/messages/fs/index.js +3 -0
  89. package/dist/src/messages/fs/index.js.map +1 -0
  90. package/dist/src/messages/fs/subscribe/message.schemas.d.ts +54 -0
  91. package/dist/src/messages/fs/subscribe/message.schemas.d.ts.map +1 -0
  92. package/dist/src/messages/fs/subscribe/message.schemas.js +27 -0
  93. package/dist/src/messages/fs/subscribe/message.schemas.js.map +1 -0
  94. package/dist/src/messages/index.d.ts +15 -0
  95. package/dist/src/messages/index.d.ts.map +1 -0
  96. package/dist/src/messages/index.js +29 -0
  97. package/dist/src/messages/index.js.map +1 -0
  98. package/dist/src/messages/llm/index.d.ts +148 -0
  99. package/dist/src/messages/llm/index.d.ts.map +1 -0
  100. package/dist/src/messages/llm/index.js +124 -0
  101. package/dist/src/messages/llm/index.js.map +1 -0
  102. package/dist/src/messages/logs/index.d.ts +26 -0
  103. package/dist/src/messages/logs/index.d.ts.map +1 -0
  104. package/dist/src/messages/logs/index.js +24 -0
  105. package/dist/src/messages/logs/index.js.map +1 -0
  106. package/dist/src/messages/native/call/message.schemas.d.ts +34 -0
  107. package/dist/src/messages/native/call/message.schemas.d.ts.map +1 -0
  108. package/dist/src/messages/native/call/message.schemas.js +22 -0
  109. package/dist/src/messages/native/call/message.schemas.js.map +1 -0
  110. package/dist/src/messages/native/index.d.ts +2 -0
  111. package/dist/src/messages/native/index.d.ts.map +1 -0
  112. package/dist/src/messages/native/index.js +2 -0
  113. package/dist/src/messages/native/index.js.map +1 -0
  114. package/dist/src/messages/plugin/index.d.ts +78 -0
  115. package/dist/src/messages/plugin/index.d.ts.map +1 -0
  116. package/dist/src/messages/plugin/index.js +72 -0
  117. package/dist/src/messages/plugin/index.js.map +1 -0
  118. package/dist/src/messages/storage/index.d.ts +126 -0
  119. package/dist/src/messages/storage/index.d.ts.map +1 -0
  120. package/dist/src/messages/storage/index.js +109 -0
  121. package/dist/src/messages/storage/index.js.map +1 -0
  122. package/dist/src/messages/ui/UiChannel.d.ts +68 -0
  123. package/dist/src/messages/ui/UiChannel.d.ts.map +1 -0
  124. package/dist/src/messages/ui/UiChannel.js +81 -0
  125. package/dist/src/messages/ui/UiChannel.js.map +1 -0
  126. package/dist/src/messages/ui/confirm/index.d.ts +2 -0
  127. package/dist/src/messages/ui/confirm/index.d.ts.map +1 -0
  128. package/dist/src/messages/ui/confirm/index.js +2 -0
  129. package/dist/src/messages/ui/confirm/index.js.map +1 -0
  130. package/dist/src/messages/ui/confirm/message.schemas.d.ts +39 -0
  131. package/dist/src/messages/ui/confirm/message.schemas.d.ts.map +1 -0
  132. package/dist/src/messages/ui/confirm/message.schemas.js +25 -0
  133. package/dist/src/messages/ui/confirm/message.schemas.js.map +1 -0
  134. package/dist/src/messages/ui/getState/message.schemas.d.ts +38 -0
  135. package/dist/src/messages/ui/getState/message.schemas.d.ts.map +1 -0
  136. package/dist/src/messages/ui/getState/message.schemas.js +21 -0
  137. package/dist/src/messages/ui/getState/message.schemas.js.map +1 -0
  138. package/dist/src/messages/ui/index.d.ts +8 -0
  139. package/dist/src/messages/ui/index.d.ts.map +1 -0
  140. package/dist/src/messages/ui/index.js +8 -0
  141. package/dist/src/messages/ui/index.js.map +1 -0
  142. package/dist/src/messages/ui/setCollapseState/message.schemas.d.ts +33 -0
  143. package/dist/src/messages/ui/setCollapseState/message.schemas.d.ts.map +1 -0
  144. package/dist/src/messages/ui/setCollapseState/message.schemas.js +19 -0
  145. package/dist/src/messages/ui/setCollapseState/message.schemas.js.map +1 -0
  146. package/dist/src/messages/ui/showContextMenu/message.schemas.d.ts +61 -0
  147. package/dist/src/messages/ui/showContextMenu/message.schemas.d.ts.map +1 -0
  148. package/dist/src/messages/ui/showContextMenu/message.schemas.js +37 -0
  149. package/dist/src/messages/ui/showContextMenu/message.schemas.js.map +1 -0
  150. package/dist/src/messages/ui/showNotification/message.schemas.d.ts +38 -0
  151. package/dist/src/messages/ui/showNotification/message.schemas.d.ts.map +1 -0
  152. package/dist/src/messages/ui/showNotification/message.schemas.js +29 -0
  153. package/dist/src/messages/ui/showNotification/message.schemas.js.map +1 -0
  154. package/dist/src/messages/ui/tabsChanged/message.schemas.d.ts +24 -0
  155. package/dist/src/messages/ui/tabsChanged/message.schemas.d.ts.map +1 -0
  156. package/dist/src/messages/ui/tabsChanged/message.schemas.js +15 -0
  157. package/dist/src/messages/ui/tabsChanged/message.schemas.js.map +1 -0
  158. package/dist/src/messages/vfs/createDir/message.schemas.d.ts +30 -0
  159. package/dist/src/messages/vfs/createDir/message.schemas.d.ts.map +1 -0
  160. package/dist/src/messages/vfs/createDir/message.schemas.js +17 -0
  161. package/dist/src/messages/vfs/createDir/message.schemas.js.map +1 -0
  162. package/dist/src/messages/vfs/delete/message.schemas.d.ts +30 -0
  163. package/dist/src/messages/vfs/delete/message.schemas.d.ts.map +1 -0
  164. package/dist/src/messages/vfs/delete/message.schemas.js +17 -0
  165. package/dist/src/messages/vfs/delete/message.schemas.js.map +1 -0
  166. package/dist/src/messages/vfs/exists/message.schemas.d.ts +34 -0
  167. package/dist/src/messages/vfs/exists/message.schemas.d.ts.map +1 -0
  168. package/dist/src/messages/vfs/exists/message.schemas.js +21 -0
  169. package/dist/src/messages/vfs/exists/message.schemas.js.map +1 -0
  170. package/dist/src/messages/vfs/getAbsolutePath/message.schemas.d.ts +33 -0
  171. package/dist/src/messages/vfs/getAbsolutePath/message.schemas.d.ts.map +1 -0
  172. package/dist/src/messages/vfs/getAbsolutePath/message.schemas.js +20 -0
  173. package/dist/src/messages/vfs/getAbsolutePath/message.schemas.js.map +1 -0
  174. package/dist/src/messages/vfs/index.d.ts +9 -0
  175. package/dist/src/messages/vfs/index.d.ts.map +1 -0
  176. package/dist/src/messages/vfs/index.js +9 -0
  177. package/dist/src/messages/vfs/index.js.map +1 -0
  178. package/dist/src/messages/vfs/readDir/message.schemas.d.ts +41 -0
  179. package/dist/src/messages/vfs/readDir/message.schemas.d.ts.map +1 -0
  180. package/dist/src/messages/vfs/readDir/message.schemas.js +23 -0
  181. package/dist/src/messages/vfs/readDir/message.schemas.js.map +1 -0
  182. package/dist/src/messages/vfs/readFile/message.schemas.d.ts +31 -0
  183. package/dist/src/messages/vfs/readFile/message.schemas.d.ts.map +1 -0
  184. package/dist/src/messages/vfs/readFile/message.schemas.js +18 -0
  185. package/dist/src/messages/vfs/readFile/message.schemas.js.map +1 -0
  186. package/dist/src/messages/vfs/rename/message.schemas.d.ts +31 -0
  187. package/dist/src/messages/vfs/rename/message.schemas.d.ts.map +1 -0
  188. package/dist/src/messages/vfs/rename/message.schemas.js +18 -0
  189. package/dist/src/messages/vfs/rename/message.schemas.js.map +1 -0
  190. package/dist/src/messages/vfs/writeFile/message.schemas.d.ts +31 -0
  191. package/dist/src/messages/vfs/writeFile/message.schemas.d.ts.map +1 -0
  192. package/dist/src/messages/vfs/writeFile/message.schemas.js +18 -0
  193. package/dist/src/messages/vfs/writeFile/message.schemas.js.map +1 -0
  194. package/dist/src/messages/workspace/changed/message.schemas.d.ts +9 -0
  195. package/dist/src/messages/workspace/changed/message.schemas.d.ts.map +1 -0
  196. package/dist/src/messages/workspace/changed/message.schemas.js +9 -0
  197. package/dist/src/messages/workspace/changed/message.schemas.js.map +1 -0
  198. package/dist/src/messages/workspace/getDetails/message.schemas.d.ts +39 -0
  199. package/dist/src/messages/workspace/getDetails/message.schemas.d.ts.map +1 -0
  200. package/dist/src/messages/workspace/getDetails/message.schemas.js +22 -0
  201. package/dist/src/messages/workspace/getDetails/message.schemas.js.map +1 -0
  202. package/dist/src/messages/workspace/index.d.ts +4 -0
  203. package/dist/src/messages/workspace/index.d.ts.map +1 -0
  204. package/dist/src/messages/workspace/index.js +4 -0
  205. package/dist/src/messages/workspace/index.js.map +1 -0
  206. package/dist/src/messages/workspace/open/message.schemas.d.ts +29 -0
  207. package/dist/src/messages/workspace/open/message.schemas.d.ts.map +1 -0
  208. package/dist/src/messages/workspace/open/message.schemas.js +16 -0
  209. package/dist/src/messages/workspace/open/message.schemas.js.map +1 -0
  210. package/dist/src/namespaces/DocumentNamespace.d.ts +56 -0
  211. package/dist/src/namespaces/DocumentNamespace.d.ts.map +1 -0
  212. package/dist/src/namespaces/DocumentNamespace.js +129 -0
  213. package/dist/src/namespaces/DocumentNamespace.js.map +1 -0
  214. package/dist/src/namespaces/EditorNamespace.d.ts +11 -0
  215. package/dist/src/namespaces/EditorNamespace.d.ts.map +1 -0
  216. package/dist/src/namespaces/EditorNamespace.js +18 -0
  217. package/dist/src/namespaces/EditorNamespace.js.map +1 -0
  218. package/dist/src/namespaces/FsNamespace.d.ts +27 -0
  219. package/dist/src/namespaces/FsNamespace.d.ts.map +1 -0
  220. package/dist/src/namespaces/FsNamespace.js +52 -0
  221. package/dist/src/namespaces/FsNamespace.js.map +1 -0
  222. package/dist/src/namespaces/NativeNamespace.d.ts +11 -0
  223. package/dist/src/namespaces/NativeNamespace.d.ts.map +1 -0
  224. package/dist/src/namespaces/NativeNamespace.js +19 -0
  225. package/dist/src/namespaces/NativeNamespace.js.map +1 -0
  226. package/dist/src/namespaces/PluginNamespace.d.ts +56 -0
  227. package/dist/src/namespaces/PluginNamespace.d.ts.map +1 -0
  228. package/dist/src/namespaces/PluginNamespace.js +116 -0
  229. package/dist/src/namespaces/PluginNamespace.js.map +1 -0
  230. package/dist/src/namespaces/StorageNamespace.d.ts +56 -0
  231. package/dist/src/namespaces/StorageNamespace.d.ts.map +1 -0
  232. package/dist/src/namespaces/StorageNamespace.js +127 -0
  233. package/dist/src/namespaces/StorageNamespace.js.map +1 -0
  234. package/dist/src/namespaces/VfsNamespace.d.ts +25 -0
  235. package/dist/src/namespaces/VfsNamespace.d.ts.map +1 -0
  236. package/dist/src/namespaces/VfsNamespace.js +64 -0
  237. package/dist/src/namespaces/VfsNamespace.js.map +1 -0
  238. package/dist/src/namespaces/WorkspaceNamespace.d.ts +18 -0
  239. package/dist/src/namespaces/WorkspaceNamespace.d.ts.map +1 -0
  240. package/dist/src/namespaces/WorkspaceNamespace.js +48 -0
  241. package/dist/src/namespaces/WorkspaceNamespace.js.map +1 -0
  242. package/dist/src/namespaces/index.d.ts +9 -0
  243. package/dist/src/namespaces/index.d.ts.map +1 -0
  244. package/dist/src/namespaces/index.js +9 -0
  245. package/dist/src/namespaces/index.js.map +1 -0
  246. package/dist/tsconfig.tsbuildinfo +1 -0
  247. package/eslint.config.js +25 -0
  248. package/package.json +28 -0
  249. package/src/PracticalKitSdk.ts +325 -0
  250. package/src/index.ts +10 -0
  251. package/src/keyboard/KeyboardShortcutForwarder.ts +35 -0
  252. package/src/keyboard/index.ts +1 -0
  253. package/src/llm/ToolRegistry.ts +186 -0
  254. package/src/logs/channel/IFrameLogChannelAdapter.ts +44 -0
  255. package/src/logs/channel/ILogChannelAdapter.ts +5 -0
  256. package/src/logs/channel/LogChannel.ts +49 -0
  257. package/src/logs/outputs/types.ts +21 -0
  258. package/src/messages/IFrameClient.ts +113 -0
  259. package/src/messages/IFrameMessageBus.ts +28 -0
  260. package/src/messages/base/index.ts +16 -0
  261. package/src/messages/document/index.ts +4 -0
  262. package/src/messages/document/requestContent/message.schemas.ts +28 -0
  263. package/src/messages/document/save/index.ts +1 -0
  264. package/src/messages/document/save/message.schemas.ts +24 -0
  265. package/src/messages/document/saveRequested/message.schemas.ts +35 -0
  266. package/src/messages/document/saved/message.schemas.ts +29 -0
  267. package/src/messages/editor/index.ts +1 -0
  268. package/src/messages/editor/openFile/message.schemas.ts +22 -0
  269. package/src/messages/fs/fileChanged/message.schemas.ts +12 -0
  270. package/src/messages/fs/index.ts +2 -0
  271. package/src/messages/fs/subscribe/message.schemas.ts +33 -0
  272. package/src/messages/index.ts +41 -0
  273. package/src/messages/llm/index.ts +158 -0
  274. package/src/messages/logs/index.ts +39 -0
  275. package/src/messages/native/call/message.schemas.ts +25 -0
  276. package/src/messages/native/index.ts +1 -0
  277. package/src/messages/plugin/index.ts +95 -0
  278. package/src/messages/storage/index.ts +140 -0
  279. package/src/messages/ui/UiChannel.ts +156 -0
  280. package/src/messages/ui/confirm/index.ts +1 -0
  281. package/src/messages/ui/confirm/message.schemas.ts +36 -0
  282. package/src/messages/ui/getState/message.schemas.ts +33 -0
  283. package/src/messages/ui/index.ts +7 -0
  284. package/src/messages/ui/setCollapseState/message.schemas.ts +34 -0
  285. package/src/messages/ui/showContextMenu/message.schemas.ts +64 -0
  286. package/src/messages/ui/showNotification/message.schemas.ts +41 -0
  287. package/src/messages/ui/tabsChanged/message.schemas.ts +25 -0
  288. package/src/messages/vfs/createDir/message.schemas.ts +20 -0
  289. package/src/messages/vfs/delete/message.schemas.ts +20 -0
  290. package/src/messages/vfs/exists/message.schemas.ts +32 -0
  291. package/src/messages/vfs/getAbsolutePath/message.schemas.ts +27 -0
  292. package/src/messages/vfs/index.ts +8 -0
  293. package/src/messages/vfs/readDir/message.schemas.ts +36 -0
  294. package/src/messages/vfs/readFile/message.schemas.ts +21 -0
  295. package/src/messages/vfs/rename/message.schemas.ts +21 -0
  296. package/src/messages/vfs/writeFile/message.schemas.ts +21 -0
  297. package/src/messages/workspace/changed/message.schemas.ts +18 -0
  298. package/src/messages/workspace/getDetails/message.schemas.ts +39 -0
  299. package/src/messages/workspace/index.ts +3 -0
  300. package/src/messages/workspace/open/message.schemas.ts +27 -0
  301. package/src/namespaces/DocumentNamespace.ts +164 -0
  302. package/src/namespaces/EditorNamespace.ts +27 -0
  303. package/src/namespaces/FsNamespace.ts +77 -0
  304. package/src/namespaces/NativeNamespace.ts +34 -0
  305. package/src/namespaces/PluginNamespace.ts +156 -0
  306. package/src/namespaces/StorageNamespace.ts +186 -0
  307. package/src/namespaces/VfsNamespace.ts +135 -0
  308. package/src/namespaces/WorkspaceNamespace.ts +80 -0
  309. package/src/namespaces/index.ts +8 -0
  310. 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,5 @@
1
+ import type { LogLevel } from "../../messages/index.js";
2
+
3
+ export interface ILogChannelAdapter {
4
+ writeLog(channelName: string, level: LogLevel, ...args: unknown[]): void;
5
+ }
@@ -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,4 @@
1
+ export * from "./requestContent/message.schemas.js";
2
+ export * from "./save/message.schemas.js";
3
+ export * from "./saveRequested/message.schemas.js";
4
+ export * from "./saved/message.schemas.js";
@@ -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,2 @@
1
+ export * from "./subscribe/message.schemas.js";
2
+ export * from "./fileChanged/message.schemas.js";
@@ -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>;