skybridge 0.0.0-dev.c210709 → 0.0.0-dev.c269e58

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 (180) hide show
  1. package/dist/src/server/devtoolsStaticServer.d.ts +15 -0
  2. package/dist/src/server/devtoolsStaticServer.js +38 -0
  3. package/dist/src/server/devtoolsStaticServer.js.map +1 -0
  4. package/dist/src/server/index.d.ts +3 -2
  5. package/dist/src/server/index.js +1 -0
  6. package/dist/src/server/index.js.map +1 -1
  7. package/dist/src/server/inferUtilityTypes.d.ts +22 -6
  8. package/dist/src/server/server.d.ts +55 -16
  9. package/dist/src/server/server.js +54 -34
  10. package/dist/src/server/server.js.map +1 -1
  11. package/dist/src/server/templateHelper.d.ts +3 -0
  12. package/dist/src/server/templateHelper.js +5 -4
  13. package/dist/src/server/templateHelper.js.map +1 -1
  14. package/dist/src/server/templates/development.hbs +3 -2
  15. package/dist/src/server/templates/production.hbs +1 -0
  16. package/dist/src/server/widgetsDevServer.js +3 -3
  17. package/dist/src/server/widgetsDevServer.js.map +1 -1
  18. package/dist/src/test/utils.d.ts +54 -8
  19. package/dist/src/test/utils.js +86 -8
  20. package/dist/src/test/utils.js.map +1 -1
  21. package/dist/src/test/widget.test.js +83 -27
  22. package/dist/src/test/widget.test.js.map +1 -1
  23. package/dist/src/web/bridges/apps-sdk-adapter.d.ts +2 -0
  24. package/dist/src/web/bridges/apps-sdk-adapter.js +4 -0
  25. package/dist/src/web/bridges/apps-sdk-adapter.js.map +1 -0
  26. package/dist/src/web/bridges/apps-sdk-bridge.d.ts +8 -0
  27. package/dist/src/web/bridges/apps-sdk-bridge.js +41 -0
  28. package/dist/src/web/bridges/apps-sdk-bridge.js.map +1 -0
  29. package/dist/src/web/bridges/get-bridge-methods.d.ts +2 -0
  30. package/dist/src/web/bridges/get-bridge-methods.js +8 -0
  31. package/dist/src/web/bridges/get-bridge-methods.js.map +1 -0
  32. package/dist/src/web/bridges/hooks/types.d.ts +6 -0
  33. package/dist/src/web/bridges/hooks/types.js +2 -0
  34. package/dist/src/web/bridges/hooks/types.js.map +1 -0
  35. package/dist/src/web/bridges/hooks/use-apps-sdk-bridge.d.ts +2 -0
  36. package/dist/src/web/bridges/hooks/use-apps-sdk-bridge.js +7 -0
  37. package/dist/src/web/bridges/hooks/use-apps-sdk-bridge.js.map +1 -0
  38. package/dist/src/web/bridges/hooks/use-bridge.d.ts +2 -0
  39. package/dist/src/web/bridges/hooks/use-bridge.js +19 -0
  40. package/dist/src/web/bridges/hooks/use-bridge.js.map +1 -0
  41. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.d.ts +4 -0
  42. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.js +7 -0
  43. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.js.map +1 -0
  44. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.test.js +58 -0
  45. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.test.js.map +1 -0
  46. package/dist/src/web/bridges/index.d.ts +4 -0
  47. package/dist/src/web/bridges/index.js +5 -0
  48. package/dist/src/web/bridges/index.js.map +1 -0
  49. package/dist/src/web/bridges/mcp-app-adapter.d.ts +4 -0
  50. package/dist/src/web/bridges/mcp-app-adapter.js +44 -0
  51. package/dist/src/web/bridges/mcp-app-adapter.js.map +1 -0
  52. package/dist/src/web/bridges/mcp-app-bridge.d.ts +30 -0
  53. package/dist/src/web/bridges/mcp-app-bridge.js +139 -0
  54. package/dist/src/web/bridges/mcp-app-bridge.js.map +1 -0
  55. package/dist/src/web/bridges/types.d.ts +32 -0
  56. package/dist/src/web/bridges/types.js +2 -0
  57. package/dist/src/web/bridges/types.js.map +1 -0
  58. package/dist/src/web/create-store.d.ts +3 -0
  59. package/dist/src/web/create-store.js +25 -0
  60. package/dist/src/web/create-store.js.map +1 -0
  61. package/dist/src/web/create-store.test.js +70 -0
  62. package/dist/src/web/create-store.test.js.map +1 -0
  63. package/dist/src/web/data-llm.d.ts +14 -0
  64. package/dist/src/web/data-llm.js +68 -0
  65. package/dist/src/web/data-llm.js.map +1 -0
  66. package/dist/src/web/data-llm.test.js +76 -0
  67. package/dist/src/web/data-llm.test.js.map +1 -0
  68. package/dist/src/web/generate-helpers.d.ts +21 -18
  69. package/dist/src/web/generate-helpers.js +10 -6
  70. package/dist/src/web/generate-helpers.js.map +1 -1
  71. package/dist/src/web/generate-helpers.test-d.js +117 -1
  72. package/dist/src/web/generate-helpers.test-d.js.map +1 -1
  73. package/dist/src/web/generate-helpers.test.js +1 -1
  74. package/dist/src/web/generate-helpers.test.js.map +1 -1
  75. package/dist/src/web/helpers/state.d.ts +7 -0
  76. package/dist/src/web/helpers/state.js +40 -0
  77. package/dist/src/web/helpers/state.js.map +1 -0
  78. package/dist/src/web/helpers/state.test.d.ts +1 -0
  79. package/dist/src/web/helpers/state.test.js +53 -0
  80. package/dist/src/web/helpers/state.test.js.map +1 -0
  81. package/dist/src/web/hooks/index.d.ts +4 -7
  82. package/dist/src/web/hooks/index.js +4 -7
  83. package/dist/src/web/hooks/index.js.map +1 -1
  84. package/dist/src/web/hooks/use-call-tool.d.ts +21 -20
  85. package/dist/src/web/hooks/use-call-tool.js +7 -15
  86. package/dist/src/web/hooks/use-call-tool.js.map +1 -1
  87. package/dist/src/web/hooks/use-call-tool.test-d.d.ts +1 -0
  88. package/dist/src/web/hooks/use-call-tool.test-d.js +104 -0
  89. package/dist/src/web/hooks/use-call-tool.test-d.js.map +1 -0
  90. package/dist/src/web/hooks/use-call-tool.test.js +14 -12
  91. package/dist/src/web/hooks/use-call-tool.test.js.map +1 -1
  92. package/dist/src/web/hooks/use-display-mode.d.ts +2 -2
  93. package/dist/src/web/hooks/use-display-mode.js +6 -3
  94. package/dist/src/web/hooks/use-display-mode.js.map +1 -1
  95. package/dist/src/web/hooks/use-display-mode.test.js +3 -2
  96. package/dist/src/web/hooks/use-display-mode.test.js.map +1 -1
  97. package/dist/src/web/hooks/use-files.test.js +1 -1
  98. package/dist/src/web/hooks/use-files.test.js.map +1 -1
  99. package/dist/src/web/hooks/use-layout.d.ts +22 -0
  100. package/dist/src/web/hooks/use-layout.js +23 -0
  101. package/dist/src/web/hooks/use-layout.js.map +1 -0
  102. package/dist/src/web/hooks/use-layout.test.d.ts +1 -0
  103. package/dist/src/web/hooks/use-layout.test.js +46 -0
  104. package/dist/src/web/hooks/use-layout.test.js.map +1 -0
  105. package/dist/src/web/hooks/use-open-external.test.js +2 -2
  106. package/dist/src/web/hooks/use-open-external.test.js.map +1 -1
  107. package/dist/src/web/hooks/use-openai-global.d.ts +3 -2
  108. package/dist/src/web/hooks/use-openai-global.js +3 -20
  109. package/dist/src/web/hooks/use-openai-global.js.map +1 -1
  110. package/dist/src/web/hooks/use-request-modal.d.ts +6 -3
  111. package/dist/src/web/hooks/use-request-modal.js +6 -1
  112. package/dist/src/web/hooks/use-request-modal.js.map +1 -1
  113. package/dist/src/web/hooks/use-request-modal.test.js +37 -4
  114. package/dist/src/web/hooks/use-request-modal.test.js.map +1 -1
  115. package/dist/src/web/hooks/use-tool-info.d.ts +1 -1
  116. package/dist/src/web/hooks/use-tool-info.js +5 -7
  117. package/dist/src/web/hooks/use-tool-info.js.map +1 -1
  118. package/dist/src/web/hooks/use-tool-info.test-d.js +0 -1
  119. package/dist/src/web/hooks/use-tool-info.test-d.js.map +1 -1
  120. package/dist/src/web/hooks/use-tool-info.test.js +3 -2
  121. package/dist/src/web/hooks/use-tool-info.test.js.map +1 -1
  122. package/dist/src/web/hooks/use-user.d.ts +18 -0
  123. package/dist/src/web/hooks/use-user.js +19 -0
  124. package/dist/src/web/hooks/use-user.js.map +1 -0
  125. package/dist/src/web/hooks/use-user.test.d.ts +1 -0
  126. package/dist/src/web/hooks/use-user.test.js +44 -0
  127. package/dist/src/web/hooks/use-user.test.js.map +1 -0
  128. package/dist/src/web/hooks/use-widget-state.js +11 -9
  129. package/dist/src/web/hooks/use-widget-state.js.map +1 -1
  130. package/dist/src/web/hooks/use-widget-state.test.js +3 -2
  131. package/dist/src/web/hooks/use-widget-state.test.js.map +1 -1
  132. package/dist/src/web/index.d.ts +7 -4
  133. package/dist/src/web/index.js +7 -4
  134. package/dist/src/web/index.js.map +1 -1
  135. package/dist/src/web/plugin/data-llm.test.d.ts +1 -0
  136. package/dist/src/web/plugin/data-llm.test.js +81 -0
  137. package/dist/src/web/plugin/data-llm.test.js.map +1 -0
  138. package/dist/src/web/plugin/plugin.js +39 -0
  139. package/dist/src/web/plugin/plugin.js.map +1 -0
  140. package/dist/src/web/plugin/transform-data-llm.d.ts +12 -0
  141. package/dist/src/web/plugin/transform-data-llm.js +93 -0
  142. package/dist/src/web/plugin/transform-data-llm.js.map +1 -0
  143. package/dist/src/web/plugin/transform-data-llm.test.d.ts +1 -0
  144. package/dist/src/web/plugin/transform-data-llm.test.js +81 -0
  145. package/dist/src/web/plugin/transform-data-llm.test.js.map +1 -0
  146. package/dist/src/web/proxy.js +6 -1
  147. package/dist/src/web/proxy.js.map +1 -1
  148. package/dist/src/web/types.d.ts +36 -8
  149. package/dist/src/web/types.js +1 -0
  150. package/dist/src/web/types.js.map +1 -1
  151. package/package.json +19 -9
  152. package/LICENSE +0 -674
  153. package/README.md +0 -371
  154. package/dist/src/web/hooks/use-locale.d.ts +0 -1
  155. package/dist/src/web/hooks/use-locale.js +0 -5
  156. package/dist/src/web/hooks/use-locale.js.map +0 -1
  157. package/dist/src/web/hooks/use-locale.test.js +0 -21
  158. package/dist/src/web/hooks/use-locale.test.js.map +0 -1
  159. package/dist/src/web/hooks/use-theme.d.ts +0 -1
  160. package/dist/src/web/hooks/use-theme.js +0 -5
  161. package/dist/src/web/hooks/use-theme.js.map +0 -1
  162. package/dist/src/web/hooks/use-theme.test.js +0 -26
  163. package/dist/src/web/hooks/use-theme.test.js.map +0 -1
  164. package/dist/src/web/hooks/use-tool-output.d.ts +0 -4
  165. package/dist/src/web/hooks/use-tool-output.js +0 -9
  166. package/dist/src/web/hooks/use-tool-output.js.map +0 -1
  167. package/dist/src/web/hooks/use-tool-response-metadata.d.ts +0 -4
  168. package/dist/src/web/hooks/use-tool-response-metadata.js +0 -8
  169. package/dist/src/web/hooks/use-tool-response-metadata.js.map +0 -1
  170. package/dist/src/web/hooks/use-user-agent.d.ts +0 -1
  171. package/dist/src/web/hooks/use-user-agent.js +0 -5
  172. package/dist/src/web/hooks/use-user-agent.js.map +0 -1
  173. package/dist/src/web/hooks/use-user-agent.test.js +0 -31
  174. package/dist/src/web/hooks/use-user-agent.test.js.map +0 -1
  175. package/dist/src/web/plugin.js +0 -28
  176. package/dist/src/web/plugin.js.map +0 -1
  177. /package/dist/src/web/{hooks/use-locale.test.d.ts → bridges/hooks/use-mcp-app-bridge.test.d.ts} +0 -0
  178. /package/dist/src/web/{hooks/use-theme.test.d.ts → create-store.test.d.ts} +0 -0
  179. /package/dist/src/web/{hooks/use-user-agent.test.d.ts → data-llm.test.d.ts} +0 -0
  180. /package/dist/src/web/{plugin.d.ts → plugin/plugin.d.ts} +0 -0
@@ -1,16 +1,15 @@
1
- import { type CallToolState } from "./hooks/use-call-tool.js";
1
+ import type { InferTools, ToolInput, ToolOutput, ToolResponseMetadata } from "../server/index.js";
2
+ import { type CallToolAsyncFn, type CallToolFn, type CallToolState } from "./hooks/use-call-tool.js";
2
3
  import { type ToolState } from "./hooks/use-tool-info.js";
3
- import type { McpServer, InferTools, AnyToolRegistry, ToolInput, ToolOutput } from "../server/index.js";
4
- import type { CallToolResponse, Prettify, Objectify } from "./types.js";
5
- type TypedCallToolReturn<TInput, TOutput> = Prettify<CallToolState<CallToolResponse & {
4
+ import type { CallToolResponse, Objectify, Prettify } from "./types.js";
5
+ type TypedCallToolResponse<TOutput> = CallToolResponse & {
6
6
  structuredContent: TOutput;
7
- }> & {
8
- callTool: (args: TInput) => void;
9
- callToolAsync: (args: TInput) => Promise<CallToolResponse & {
10
- structuredContent: TOutput;
11
- }>;
7
+ };
8
+ type TypedCallToolReturn<TInput, TOutput> = Prettify<CallToolState<TypedCallToolResponse<TOutput>> & {
9
+ callTool: CallToolFn<TInput, TypedCallToolResponse<TOutput>>;
10
+ callToolAsync: CallToolAsyncFn<TInput, TypedCallToolResponse<TOutput>>;
12
11
  }>;
13
- type TypedToolInfoReturn<TInput, TOutput> = ToolState<Objectify<TInput>, Objectify<TOutput>, Objectify<{}>>;
12
+ type TypedToolInfoReturn<TInput, TOutput, TResponseMetadata> = ToolState<Objectify<TInput>, Objectify<TOutput>, Objectify<TResponseMetadata>>;
14
13
  /**
15
14
  * Creates typed versions of skybridge hooks with full type inference
16
15
  * for tool names, inputs, and outputs.
@@ -18,7 +17,9 @@ type TypedToolInfoReturn<TInput, TOutput> = ToolState<Objectify<TInput>, Objecti
18
17
  * This is the recommended way to use skybridge hooks in your widgets.
19
18
  * Set this up once in a dedicated file and export the typed hooks for use across your app.
20
19
  *
21
- * @typeParam T - The type of your McpServer instance. Use `typeof server`.
20
+ * @typeParam ServerType - The type of your McpServer instance (use `typeof server`).
21
+ * Must be a server instance created with method chaining.
22
+ * TypeScript will validate that tools can be inferred from this type.
22
23
  *
23
24
  * @example
24
25
  * ```typescript
@@ -57,11 +58,11 @@ type TypedToolInfoReturn<TInput, TOutput> = ToolState<Objectify<TInput>, Objecti
57
58
  * const toolInfo = useToolInfo<"search-voyage">();
58
59
  * // ^ autocomplete for widget names
59
60
  * // toolInfo.input is typed based on widget input schema
60
- * // toolInfo.output is typed based on widget output schema
61
+ * // toolInfo.output.structuredContent is typed based on widget output schema
61
62
  * }
62
63
  * ```
63
64
  */
64
- export declare function generateHelpers<T extends McpServer<AnyToolRegistry>>(): {
65
+ export declare function generateHelpers<ServerType = never>(): {
65
66
  /**
66
67
  * Typed version of `useCallTool` that provides autocomplete for tool names
67
68
  * and type inference for inputs and outputs.
@@ -81,7 +82,7 @@ export declare function generateHelpers<T extends McpServer<AnyToolRegistry>>():
81
82
  * }
82
83
  * ```
83
84
  */
84
- useCallTool: <K extends keyof InferTools<T> & string>(name: K) => TypedCallToolReturn<InferTools<T>[K]["input"], InferTools<T>[K]["output"]>;
85
+ useCallTool: <ToolName extends keyof InferTools<ServerType> & string>(name: ToolName) => TypedCallToolReturn<ToolInput<ServerType, ToolName>, ToolOutput<ServerType, ToolName>>;
85
86
  /**
86
87
  * Typed version of `useToolInfo` that provides autocomplete for widget names
87
88
  * and type inference for inputs, outputs, and responseMetadata.
@@ -93,20 +94,22 @@ export declare function generateHelpers<T extends McpServer<AnyToolRegistry>>():
93
94
  * ```typescript
94
95
  * const toolInfo = useToolInfo<"search-voyage">();
95
96
  * // toolInfo.input is typed as { destination: string; ... }
96
- * // toolInfo.output is typed as { results: Array<...>; ... } | undefined
97
+ * // toolInfo.output is typed as { results: Array<...>; ... }
98
+ * // toolInfo.responseMetadata is typed based on _meta in callback return
97
99
  * // toolInfo.status narrows correctly: "pending" | "success"
98
100
  *
99
101
  * if (toolInfo.isPending) {
100
- * // TypeScript knows output is undefined here
102
+ * // TypeScript knows output and responseMetadata are undefined here
101
103
  * console.log(toolInfo.input.destination);
102
104
  * }
103
105
  *
104
106
  * if (toolInfo.isSuccess) {
105
- * // TypeScript knows output is defined here
107
+ * // TypeScript knows output and responseMetadata are defined here
106
108
  * console.log(toolInfo.output.results);
109
+ * console.log(toolInfo.responseMetadata);
107
110
  * }
108
111
  * ```
109
112
  */
110
- useToolInfo: <K extends keyof InferTools<T> & string>() => TypedToolInfoReturn<ToolInput<T, K>, ToolOutput<T, K>>;
113
+ useToolInfo: <ToolName extends keyof InferTools<ServerType> & string>() => TypedToolInfoReturn<ToolInput<ServerType, ToolName>, ToolOutput<ServerType, ToolName>, ToolResponseMetadata<ServerType, ToolName>>;
111
114
  };
112
115
  export {};
@@ -1,4 +1,4 @@
1
- import { useCallTool } from "./hooks/use-call-tool.js";
1
+ import { useCallTool, } from "./hooks/use-call-tool.js";
2
2
  import { useToolInfo } from "./hooks/use-tool-info.js";
3
3
  /**
4
4
  * Creates typed versions of skybridge hooks with full type inference
@@ -7,7 +7,9 @@ import { useToolInfo } from "./hooks/use-tool-info.js";
7
7
  * This is the recommended way to use skybridge hooks in your widgets.
8
8
  * Set this up once in a dedicated file and export the typed hooks for use across your app.
9
9
  *
10
- * @typeParam T - The type of your McpServer instance. Use `typeof server`.
10
+ * @typeParam ServerType - The type of your McpServer instance (use `typeof server`).
11
+ * Must be a server instance created with method chaining.
12
+ * TypeScript will validate that tools can be inferred from this type.
11
13
  *
12
14
  * @example
13
15
  * ```typescript
@@ -46,7 +48,7 @@ import { useToolInfo } from "./hooks/use-tool-info.js";
46
48
  * const toolInfo = useToolInfo<"search-voyage">();
47
49
  * // ^ autocomplete for widget names
48
50
  * // toolInfo.input is typed based on widget input schema
49
- * // toolInfo.output is typed based on widget output schema
51
+ * // toolInfo.output.structuredContent is typed based on widget output schema
50
52
  * }
51
53
  * ```
52
54
  */
@@ -85,17 +87,19 @@ export function generateHelpers() {
85
87
  * ```typescript
86
88
  * const toolInfo = useToolInfo<"search-voyage">();
87
89
  * // toolInfo.input is typed as { destination: string; ... }
88
- * // toolInfo.output is typed as { results: Array<...>; ... } | undefined
90
+ * // toolInfo.output is typed as { results: Array<...>; ... }
91
+ * // toolInfo.responseMetadata is typed based on _meta in callback return
89
92
  * // toolInfo.status narrows correctly: "pending" | "success"
90
93
  *
91
94
  * if (toolInfo.isPending) {
92
- * // TypeScript knows output is undefined here
95
+ * // TypeScript knows output and responseMetadata are undefined here
93
96
  * console.log(toolInfo.input.destination);
94
97
  * }
95
98
  *
96
99
  * if (toolInfo.isSuccess) {
97
- * // TypeScript knows output is defined here
100
+ * // TypeScript knows output and responseMetadata are defined here
98
101
  * console.log(toolInfo.output.results);
102
+ * console.log(toolInfo.responseMetadata);
99
103
  * }
100
104
  * ```
101
105
  */
@@ -1 +1 @@
1
- {"version":3,"file":"generate-helpers.js","sourceRoot":"","sources":["../../../src/web/generate-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAsB,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAkB,MAAM,0BAA0B,CAAC;AAuBvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,MAAM,UAAU,eAAe;IAI7B,OAAO;QACL;;;;;;;;;;;;;;;;;;WAkBG;QACH,WAAW,EAAE,CACX,IAAO,EACqD,EAAE;YAC9D,OAAO,WAAW,CAAC,IAAI,CAGtB,CAAC;QACJ,CAAC;QAED;;;;;;;;;;;;;;;;;;;;;;;;WAwBG;QACH,WAAW,EAAE,GAGX,EAAE;YACF,OAAO,WAAW,EAGjB,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"generate-helpers.js","sourceRoot":"","sources":["../../../src/web/generate-helpers.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAkB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAoBvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,MAAM,UAAU,eAAe;IAI7B,OAAO;QACL;;;;;;;;;;;;;;;;;;WAkBG;QACH,WAAW,EAAE,CACX,IAAc,EAId,EAAE;YACF,OAAO,WAAW,CAAC,IAAI,CAGtB,CAAC;QACJ,CAAC;QAED;;;;;;;;;;;;;;;;;;;;;;;;;;WA0BG;QACH,WAAW,EAAE,GAIX,EAAE;YACF,OAAO,WAAW,EAIjB,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,7 +1,8 @@
1
1
  import { expectTypeOf, test } from "vitest";
2
+ import { createInterfaceTestServer, createTestServer } from "../test/utils.js";
2
3
  import { generateHelpers } from "./generate-helpers.js";
3
- import { createTestServer } from "../test/utils.js";
4
4
  const server = createTestServer();
5
+ const interfaceServer = createInterfaceTestServer();
5
6
  test("InferTools extracts the tool registry type (widgets + registerTool)", () => {
6
7
  expectTypeOf().toHaveProperty("search-voyage");
7
8
  expectTypeOf().toHaveProperty("get-trip-details");
@@ -9,6 +10,9 @@ test("InferTools extracts the tool registry type (widgets + registerTool)", () =
9
10
  expectTypeOf().toHaveProperty("calculate-price");
10
11
  expectTypeOf().toHaveProperty("inferred-output-widget");
11
12
  expectTypeOf().toHaveProperty("inferred-tool");
13
+ expectTypeOf().toHaveProperty("widget-with-metadata");
14
+ expectTypeOf().toHaveProperty("tool-with-metadata");
15
+ expectTypeOf().toHaveProperty("widget-with-mixed-returns");
12
16
  });
13
17
  test("ToolNames returns a union of tool name literals (widgets + registerTool)", () => {
14
18
  expectTypeOf().toEqualTypeOf();
@@ -36,6 +40,9 @@ test("generateHelpers provides autocomplete for tool names (widgets + registerTo
36
40
  useCallTool("calculate-price");
37
41
  useCallTool("inferred-output-widget");
38
42
  useCallTool("inferred-tool");
43
+ useCallTool("widget-with-metadata");
44
+ useCallTool("tool-with-metadata");
45
+ useCallTool("widget-with-mixed-returns");
39
46
  // @ts-expect-error - "invalid-name" is not a valid tool name
40
47
  useCallTool("invalid-name");
41
48
  });
@@ -48,6 +55,68 @@ test("useCallTool returns correctly typed callTool function", () => {
48
55
  const { callTool: calculateTool } = useCallTool("calculate-price");
49
56
  calculateTool({ tripId: "123", passengers: 2 });
50
57
  });
58
+ test("callTool can be called without args for tools with no required inputs", () => {
59
+ const { useCallTool } = generateHelpers();
60
+ const { callTool, callToolAsync } = useCallTool("no-input-widget");
61
+ callTool();
62
+ callTool({});
63
+ callToolAsync();
64
+ callToolAsync({});
65
+ });
66
+ test("callTool requires args for tools with required inputs", () => {
67
+ const { useCallTool } = generateHelpers();
68
+ const { callTool } = useCallTool("search-voyage");
69
+ // @ts-expect-error - "destination" is required
70
+ callTool();
71
+ // @ts-expect-error - "destination" is required
72
+ callTool({});
73
+ // This should work
74
+ callTool({ destination: "Spain" });
75
+ });
76
+ test("callTool supports sideEffects for tools with required inputs", () => {
77
+ const { useCallTool } = generateHelpers();
78
+ const { callTool } = useCallTool("search-voyage");
79
+ callTool({ destination: "Spain" }, {
80
+ onSuccess: (response, args) => {
81
+ expectTypeOf(response.structuredContent.results).toBeArray();
82
+ expectTypeOf(args.destination).toBeString();
83
+ },
84
+ onError: (error, args) => {
85
+ expectTypeOf(error).toBeUnknown();
86
+ expectTypeOf(args.destination).toBeString();
87
+ },
88
+ onSettled: (response, error, args) => {
89
+ if (response) {
90
+ expectTypeOf(response.structuredContent.totalCount).toBeNumber();
91
+ }
92
+ expectTypeOf(error).toBeUnknown();
93
+ expectTypeOf(args.destination).toBeString();
94
+ },
95
+ });
96
+ });
97
+ test("callTool supports sideEffects for tools with no required inputs", () => {
98
+ const { useCallTool } = generateHelpers();
99
+ const { callTool } = useCallTool("no-input-widget");
100
+ callTool({
101
+ onSuccess: (response) => {
102
+ expectTypeOf(response).toHaveProperty("structuredContent");
103
+ },
104
+ });
105
+ callTool({}, {
106
+ onSuccess: (response) => {
107
+ expectTypeOf(response).toHaveProperty("structuredContent");
108
+ },
109
+ });
110
+ });
111
+ test("callToolAsync returns correctly typed promise", () => {
112
+ const { useCallTool } = generateHelpers();
113
+ const { callToolAsync: searchAsync } = useCallTool("search-voyage");
114
+ const searchPromise = searchAsync({ destination: "Spain" });
115
+ expectTypeOf(searchPromise).resolves.toHaveProperty("structuredContent");
116
+ const { callToolAsync: noInputAsync } = useCallTool("no-input-widget");
117
+ const noInputPromise = noInputAsync();
118
+ expectTypeOf(noInputPromise).resolves.toHaveProperty("structuredContent");
119
+ });
51
120
  test("useCallTool returns correctly typed data", () => {
52
121
  const { useCallTool } = generateHelpers();
53
122
  const { data } = useCallTool("search-voyage");
@@ -76,6 +145,9 @@ test("generateHelpers provides autocomplete for tool names in useToolInfo (widge
76
145
  useToolInfo();
77
146
  useToolInfo();
78
147
  useToolInfo();
148
+ useToolInfo();
149
+ useToolInfo();
150
+ useToolInfo();
79
151
  // @ts-expect-error - "invalid-name" is not a valid tool name
80
152
  useToolInfo();
81
153
  });
@@ -85,6 +157,50 @@ test("useToolInfo infers input and output types", () => {
85
157
  expectTypeOf(toolInfo.input).toExtend();
86
158
  if (toolInfo.status === "success") {
87
159
  expectTypeOf(toolInfo.output).toExtend();
160
+ expectTypeOf(toolInfo.output.results).toBeArray();
161
+ expectTypeOf(toolInfo.output.totalCount).toBeNumber();
162
+ }
163
+ });
164
+ test("ToolResponseMetadata extracts _meta type from callback", () => {
165
+ expectTypeOf().toEqualTypeOf();
166
+ expectTypeOf().toEqualTypeOf();
167
+ expectTypeOf().toBeUnknown();
168
+ });
169
+ test("useToolInfo infers responseMetadata type from generateHelpers", () => {
170
+ const { useToolInfo } = generateHelpers();
171
+ const toolInfo = useToolInfo();
172
+ if (toolInfo.isSuccess) {
173
+ expectTypeOf(toolInfo.responseMetadata.requestId).toBeString();
174
+ expectTypeOf(toolInfo.responseMetadata.timestamp).toBeNumber();
175
+ expectTypeOf(toolInfo.responseMetadata.cached).toBeBoolean();
176
+ }
177
+ });
178
+ test("ToolResponseMetadata extracts _meta from mixed return paths", () => {
179
+ expectTypeOf().toEqualTypeOf();
180
+ });
181
+ test("ToolOutput extracts correct type when using interface declaration", () => {
182
+ expectTypeOf().toHaveProperty("itemName");
183
+ expectTypeOf().toBeString();
184
+ expectTypeOf().toBeNumber();
185
+ });
186
+ test("ToolResponseMetadata extracts correct type when using interface declaration", () => {
187
+ expectTypeOf().toHaveProperty("processedBy");
188
+ expectTypeOf().toBeString();
189
+ expectTypeOf().toBeNumber();
190
+ });
191
+ test("generateHelpers works with interface-typed server", () => {
192
+ const { useCallTool, useToolInfo } = generateHelpers();
193
+ const { data } = useCallTool("interface-widget");
194
+ if (data) {
195
+ expectTypeOf(data.structuredContent.itemName).toBeString();
196
+ expectTypeOf(data.structuredContent.quantity).toBeNumber();
197
+ }
198
+ const toolInfo = useToolInfo();
199
+ if (toolInfo.isSuccess) {
200
+ expectTypeOf(toolInfo.output.itemName).toBeString();
201
+ expectTypeOf(toolInfo.output.quantity).toBeNumber();
202
+ expectTypeOf(toolInfo.responseMetadata.processedBy).toBeString();
203
+ expectTypeOf(toolInfo.responseMetadata.version).toBeNumber();
88
204
  }
89
205
  });
90
206
  //# sourceMappingURL=generate-helpers.test-d.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate-helpers.test-d.js","sourceRoot":"","sources":["../../../src/web/generate-helpers.test-d.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate-helpers.test-d.js","sourceRoot":"","sources":["../../../src/web/generate-helpers.test-d.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { generateHelpers } from "./generate-helpers.js";
3
2
  import { createMinimalTestServer } from "../test/utils.js";
3
+ import { generateHelpers } from "./generate-helpers.js";
4
4
  const server = createMinimalTestServer();
5
5
  describe("generateHelpers", () => {
6
6
  it("should return an object with useCallTool hook", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"generate-helpers.test.js","sourceRoot":"","sources":["../../../src/web/generate-helpers.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,MAAM,MAAM,GAAG,uBAAuB,EAAE,CAAC;AAGzC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,KAAK,GAAG,eAAe,EAAc,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,KAAK,GAAG,eAAe,EAAc,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"generate-helpers.test.js","sourceRoot":"","sources":["../../../src/web/generate-helpers.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,MAAM,GAAG,uBAAuB,EAAE,CAAC;AAGzC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,KAAK,GAAG,eAAe,EAAc,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,KAAK,GAAG,eAAe,EAAc,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type SuperJSONResult } from "superjson";
2
+ import type { UnknownObject } from "../types.js";
3
+ export declare function filterWidgetContext<T extends UnknownObject>(state?: T | null): T | null;
4
+ export declare function injectWidgetContext<T extends UnknownObject>(newState: T | null): T | null;
5
+ export declare function serializeState(value: UnknownObject): unknown;
6
+ export declare function deserializeState(value: SuperJSONResult): unknown;
7
+ export declare function getInitialState<State extends UnknownObject>(defaultState?: State | (() => State)): State | null;
@@ -0,0 +1,40 @@
1
+ import superjson, {} from "superjson";
2
+ import { WIDGET_CONTEXT_KEY } from "../data-llm.js";
3
+ export function filterWidgetContext(state) {
4
+ if (state === null || state === undefined) {
5
+ return null;
6
+ }
7
+ const { [WIDGET_CONTEXT_KEY]: _, ...filteredState } = state;
8
+ return filteredState;
9
+ }
10
+ export function injectWidgetContext(newState) {
11
+ if (newState === null) {
12
+ return null;
13
+ }
14
+ const currentWindowState = window.openai?.widgetState;
15
+ if (currentWindowState !== null &&
16
+ currentWindowState !== undefined &&
17
+ WIDGET_CONTEXT_KEY in currentWindowState) {
18
+ return {
19
+ ...newState,
20
+ [WIDGET_CONTEXT_KEY]: currentWindowState[WIDGET_CONTEXT_KEY],
21
+ };
22
+ }
23
+ return newState;
24
+ }
25
+ export function serializeState(value) {
26
+ return superjson.parse(superjson.stringify(value)); // Strips functions
27
+ }
28
+ export function deserializeState(value) {
29
+ return superjson.deserialize(value);
30
+ }
31
+ export function getInitialState(defaultState) {
32
+ const widgetStateFromWindow = window.openai?.widgetState;
33
+ if (widgetStateFromWindow !== null && widgetStateFromWindow !== undefined) {
34
+ return filterWidgetContext(widgetStateFromWindow);
35
+ }
36
+ return typeof defaultState === "function"
37
+ ? defaultState()
38
+ : (defaultState ?? null);
39
+ }
40
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../src/web/helpers/state.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAwB,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGpD,MAAM,UAAU,mBAAmB,CACjC,KAAgB;IAEhB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,EAAE,GAAG,aAAa,EAAE,GAAG,KAErD,CAAC;IAEF,OAAO,aAAkB,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,QAAkB;IAElB,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,WAG7B,CAAC;IAEd,IACE,kBAAkB,KAAK,IAAI;QAC3B,kBAAkB,KAAK,SAAS;QAChC,kBAAkB,IAAI,kBAAkB,EACxC,CAAC;QACD,OAAO;YACL,GAAG,QAAQ;YACX,CAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,kBAAkB,CAAC;SACxD,CAAC;IACT,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAoB;IACjD,OAAO,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,mBAAmB;AACzE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAsB;IACrD,OAAO,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,YAAoC;IAEpC,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,WAGhC,CAAC;IAEd,IAAI,qBAAqB,KAAK,IAAI,IAAI,qBAAqB,KAAK,SAAS,EAAE,CAAC;QAC1E,OAAO,mBAAmB,CAAC,qBAAqB,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,OAAO,YAAY,KAAK,UAAU;QACvC,CAAC,CAAC,YAAY,EAAE;QAChB,CAAC,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,53 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { WIDGET_CONTEXT_KEY } from "../data-llm.js";
3
+ import { filterWidgetContext, serializeState } from "./state.js";
4
+ describe("state helpers", () => {
5
+ describe("filterWidgetContext", () => {
6
+ it("should return null when state is null", () => {
7
+ expect(filterWidgetContext(null)).toBe(null);
8
+ });
9
+ it("should return null when state is undefined", () => {
10
+ expect(filterWidgetContext(undefined)).toBe(null);
11
+ });
12
+ it("should correctly filter WIDGET_CONTEXT_KEY and preserve other properties", () => {
13
+ const stateWithContextAndOthers = {
14
+ a: 1,
15
+ b: "two",
16
+ c: { nested: true },
17
+ [WIDGET_CONTEXT_KEY]: "context",
18
+ };
19
+ const filteredWithContextAndOthers = filterWidgetContext(stateWithContextAndOthers);
20
+ expect(filteredWithContextAndOthers).toEqual({
21
+ a: 1,
22
+ b: "two",
23
+ c: { nested: true },
24
+ });
25
+ const stateNoContext = { count: 5, name: "test" };
26
+ const filteredNoContext = filterWidgetContext(stateNoContext);
27
+ expect(filteredNoContext).toEqual(stateNoContext);
28
+ });
29
+ });
30
+ describe("serializeState", () => {
31
+ it("should serialize plain objects", () => {
32
+ const array = [1, "two", { three: 3 }];
33
+ const date = new Date("2023-01-01T00:00:00Z");
34
+ const object = {
35
+ a: 1,
36
+ b: "test",
37
+ c: true,
38
+ array,
39
+ date,
40
+ function: () => "test",
41
+ };
42
+ const result = serializeState(object);
43
+ expect(result).toEqual({
44
+ a: 1,
45
+ b: "test",
46
+ c: true,
47
+ array: [1, "two", { three: 3 }],
48
+ date: new Date("2023-01-01T00:00:00.000Z"),
49
+ });
50
+ });
51
+ });
52
+ });
53
+ //# sourceMappingURL=state.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.test.js","sourceRoot":"","sources":["../../../../src/web/helpers/state.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjE,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;YAClF,MAAM,yBAAyB,GAAG;gBAChC,CAAC,EAAE,CAAC;gBACJ,CAAC,EAAE,KAAK;gBACR,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;gBACnB,CAAC,kBAAkB,CAAC,EAAE,SAAS;aAChC,CAAC;YACF,MAAM,4BAA4B,GAAG,mBAAmB,CACtD,yBAAyB,CAC1B,CAAC;YACF,MAAM,CAAC,4BAA4B,CAAC,CAAC,OAAO,CAAC;gBAC3C,CAAC,EAAE,CAAC;gBACJ,CAAC,EAAE,KAAK;gBACR,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;aACpB,CAAC,CAAC;YAEH,MAAM,cAAc,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAClD,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;YAC9D,MAAM,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG;gBACb,CAAC,EAAE,CAAC;gBACJ,CAAC,EAAE,MAAM;gBACT,CAAC,EAAE,IAAI;gBACP,KAAK;gBACL,IAAI;gBACJ,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM;aACvB,CAAC;YACF,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;YAEtC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,CAAC,EAAE,CAAC;gBACJ,CAAC,EAAE,MAAM;gBACT,CAAC,EAAE,IAAI;gBACP,KAAK,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;gBAC/B,IAAI,EAAE,IAAI,IAAI,CAAC,0BAA0B,CAAC;aAC3C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,14 +1,11 @@
1
- export { useCallTool } from "./use-call-tool.js";
1
+ export { type CallToolAsyncFn, type CallToolFn, type CallToolState, type SideEffects, useCallTool, } from "./use-call-tool.js";
2
2
  export { useDisplayMode } from "./use-display-mode.js";
3
3
  export { useFiles } from "./use-files.js";
4
- export { useLocale } from "./use-locale.js";
5
- export { useOpenAiGlobal } from "./use-openai-global.js";
4
+ export { type LayoutState, useLayout } from "./use-layout.js";
6
5
  export { useOpenExternal } from "./use-open-external.js";
6
+ export { useOpenAiGlobal } from "./use-openai-global.js";
7
7
  export { useRequestModal } from "./use-request-modal.js";
8
8
  export { useSendFollowUpMessage } from "./use-send-follow-up-message.js";
9
- export { useTheme } from "./use-theme.js";
10
9
  export { useToolInfo } from "./use-tool-info.js";
11
- export { useToolOutput } from "./use-tool-output.js";
12
- export { useToolResponseMetadata } from "./use-tool-response-metadata.js";
13
- export { useUserAgent } from "./use-user-agent.js";
10
+ export { type UserState, useUser } from "./use-user.js";
14
11
  export { useWidgetState } from "./use-widget-state.js";
@@ -1,15 +1,12 @@
1
- export { useCallTool } from "./use-call-tool.js";
1
+ export { useCallTool, } from "./use-call-tool.js";
2
2
  export { useDisplayMode } from "./use-display-mode.js";
3
3
  export { useFiles } from "./use-files.js";
4
- export { useLocale } from "./use-locale.js";
5
- export { useOpenAiGlobal } from "./use-openai-global.js";
4
+ export { useLayout } from "./use-layout.js";
6
5
  export { useOpenExternal } from "./use-open-external.js";
6
+ export { useOpenAiGlobal } from "./use-openai-global.js";
7
7
  export { useRequestModal } from "./use-request-modal.js";
8
8
  export { useSendFollowUpMessage } from "./use-send-follow-up-message.js";
9
- export { useTheme } from "./use-theme.js";
10
9
  export { useToolInfo } from "./use-tool-info.js";
11
- export { useToolOutput } from "./use-tool-output.js";
12
- export { useToolResponseMetadata } from "./use-tool-response-metadata.js";
13
- export { useUserAgent } from "./use-user-agent.js";
10
+ export { useUser } from "./use-user.js";
14
11
  export { useWidgetState } from "./use-widget-state.js";
15
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/web/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/web/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAoB,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAkB,OAAO,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { CallToolArgs, CallToolResponse } from "../types.js";
1
+ import type { CallToolArgs, CallToolResponse, HasRequiredKeys } from "../types.js";
2
2
  type CallToolIdleState = {
3
3
  status: "idle";
4
4
  isIdle: true;
@@ -36,18 +36,28 @@ type CallToolErrorState = {
36
36
  error: unknown;
37
37
  };
38
38
  export type CallToolState<TData extends CallToolResponse = CallToolResponse> = CallToolIdleState | CallToolPendingState | CallToolSuccessState<TData> | CallToolErrorState;
39
- type SideEffects<ToolArgs, ToolResponse> = {
39
+ export type SideEffects<ToolArgs, ToolResponse> = {
40
40
  onSuccess?: (data: ToolResponse, toolArgs: ToolArgs) => void;
41
41
  onError?: (error: unknown, toolArgs: ToolArgs) => void;
42
42
  onSettled?: (data: ToolResponse | undefined, error: unknown | undefined, toolArgs: ToolArgs) => void;
43
43
  };
44
- type CallToolAsyncFn<ToolArgs, ToolResponse> = ToolArgs extends null ? () => Promise<ToolResponse> : (toolArgs: ToolArgs) => Promise<ToolResponse>;
44
+ type IsArgsOptional<T> = [T] extends [null] ? true : HasRequiredKeys<T> extends false ? true : false;
45
+ export type CallToolFn<TArgs, TResponse> = IsArgsOptional<TArgs> extends true ? {
46
+ (): void;
47
+ (sideEffects: SideEffects<TArgs, TResponse>): void;
48
+ (args: TArgs): void;
49
+ (args: TArgs, sideEffects: SideEffects<TArgs, TResponse>): void;
50
+ } : {
51
+ (args: TArgs): void;
52
+ (args: TArgs, sideEffects: SideEffects<TArgs, TResponse>): void;
53
+ };
54
+ export type CallToolAsyncFn<TArgs, TResponse> = IsArgsOptional<TArgs> extends true ? {
55
+ (): Promise<TResponse>;
56
+ (args: TArgs): Promise<TResponse>;
57
+ } : (args: TArgs) => Promise<TResponse>;
45
58
  type ToolResponseSignature = Pick<CallToolResponse, "structuredContent" | "meta">;
46
- export declare const useCallTool: <ToolArgs extends CallToolArgs = null, ToolResponse extends Partial<ToolResponseSignature> = {}>(name: string) => {
47
- callTool: {
48
- (sideEffects?: SideEffects<ToolArgs, CallToolResponse & ToolResponse>): void;
49
- (toolArgs: ToolArgs, sideEffects?: SideEffects<ToolArgs, CallToolResponse & ToolResponse>): void;
50
- };
59
+ export declare const useCallTool: <ToolArgs extends CallToolArgs = null, ToolResponse extends Partial<ToolResponseSignature> = Record<string, never>>(name: string) => {
60
+ callTool: CallToolFn<ToolArgs, CallToolResponse & ToolResponse>;
51
61
  callToolAsync: CallToolAsyncFn<ToolArgs, CallToolResponse & ToolResponse>;
52
62
  status: "idle";
53
63
  isIdle: true;
@@ -57,10 +67,7 @@ export declare const useCallTool: <ToolArgs extends CallToolArgs = null, ToolRes
57
67
  data: undefined;
58
68
  error: undefined;
59
69
  } | {
60
- callTool: {
61
- (sideEffects?: SideEffects<ToolArgs, CallToolResponse & ToolResponse>): void;
62
- (toolArgs: ToolArgs, sideEffects?: SideEffects<ToolArgs, CallToolResponse & ToolResponse>): void;
63
- };
70
+ callTool: CallToolFn<ToolArgs, CallToolResponse & ToolResponse>;
64
71
  callToolAsync: CallToolAsyncFn<ToolArgs, CallToolResponse & ToolResponse>;
65
72
  status: "pending";
66
73
  isIdle: false;
@@ -70,10 +77,7 @@ export declare const useCallTool: <ToolArgs extends CallToolArgs = null, ToolRes
70
77
  data: undefined;
71
78
  error: undefined;
72
79
  } | {
73
- callTool: {
74
- (sideEffects?: SideEffects<ToolArgs, CallToolResponse & ToolResponse>): void;
75
- (toolArgs: ToolArgs, sideEffects?: SideEffects<ToolArgs, CallToolResponse & ToolResponse>): void;
76
- };
80
+ callTool: CallToolFn<ToolArgs, CallToolResponse & ToolResponse>;
77
81
  callToolAsync: CallToolAsyncFn<ToolArgs, CallToolResponse & ToolResponse>;
78
82
  status: "error";
79
83
  isIdle: false;
@@ -83,10 +87,7 @@ export declare const useCallTool: <ToolArgs extends CallToolArgs = null, ToolRes
83
87
  data: undefined;
84
88
  error: unknown;
85
89
  } | {
86
- callTool: {
87
- (sideEffects?: SideEffects<ToolArgs, CallToolResponse & ToolResponse>): void;
88
- (toolArgs: ToolArgs, sideEffects?: SideEffects<ToolArgs, CallToolResponse & ToolResponse>): void;
89
- };
90
+ callTool: CallToolFn<ToolArgs, CallToolResponse & ToolResponse>;
90
91
  callToolAsync: CallToolAsyncFn<ToolArgs, CallToolResponse & ToolResponse>;
91
92
  status: "success";
92
93
  isIdle: false;
@@ -13,13 +13,13 @@ export const useCallTool = (name) => {
13
13
  throw error;
14
14
  }
15
15
  };
16
- const callToolAsync = (async (toolArgs) => {
16
+ const callToolAsync = ((toolArgs) => {
17
17
  if (toolArgs === undefined) {
18
18
  return execute(null);
19
19
  }
20
20
  return execute(toolArgs);
21
21
  });
22
- function callTool(firstArg, sideEffects) {
22
+ const callTool = ((firstArg, sideEffects) => {
23
23
  let toolArgs;
24
24
  if (firstArg &&
25
25
  typeof firstArg === "object" &&
@@ -34,22 +34,14 @@ export const useCallTool = (name) => {
34
34
  }
35
35
  execute(toolArgs)
36
36
  .then((data) => {
37
- if (sideEffects?.onSuccess) {
38
- sideEffects.onSuccess(data, toolArgs);
39
- }
40
- if (sideEffects?.onSettled) {
41
- sideEffects.onSettled(data, undefined, toolArgs);
42
- }
37
+ sideEffects?.onSuccess?.(data, toolArgs);
38
+ sideEffects?.onSettled?.(data, undefined, toolArgs);
43
39
  })
44
40
  .catch((error) => {
45
- if (sideEffects?.onError) {
46
- sideEffects.onError(error, toolArgs);
47
- }
48
- if (sideEffects?.onSettled) {
49
- sideEffects.onSettled(undefined, error, toolArgs);
50
- }
41
+ sideEffects?.onError?.(error, toolArgs);
42
+ sideEffects?.onSettled?.(undefined, error, toolArgs);
51
43
  });
52
- }
44
+ });
53
45
  const callToolState = {
54
46
  status,
55
47
  data,