@super_studio/ecforce-ai-agent-react 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -280,7 +280,9 @@ export function CartToolRegistration() {
280
280
  <div>
281
281
  <p>selectedSku: {selectedSku}</p>
282
282
  <p>isPinned: {String(isPinned)}</p>
283
- <button onClick={() => setSelectedSku("sku_002")}>SKU を切り替える</button>
283
+ <button onClick={() => setSelectedSku("sku_002")}>
284
+ SKU を切り替える
285
+ </button>
284
286
  </div>
285
287
  );
286
288
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client-tools.mjs","names":[],"sources":["../../src/lib/client-tools.ts"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport type { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport { useChatbot } from \"../components/provider/chatbot-provider\";\n\nexport type ClientToolJsonSchema = Record<string, unknown>;\nconst CLIENT_TOOL_NAME_PREFIX = \"page_\";\n\nexport type ClientToolDefinition = {\n name: string;\n displayName: string;\n description: string;\n summary?: string;\n requireConfirmation?: boolean;\n parameters: ClientToolJsonSchema;\n};\n\nexport type ClientToolExecuteRequest = {\n callId: string;\n name: string;\n args: unknown;\n};\n\nexport type RegisteredClientTool = {\n definition: ClientToolDefinition;\n execute: (args: unknown) => Promise<unknown> | unknown;\n};\n\nexport type UseClientToolOptions<TParameters extends z.ZodTypeAny> = {\n /** ツール名です。`page_`のプレフィックスが自動で追加されます。 */\n name: string;\n /** UI上に表示するツール名です。 */\n displayName: string;\n /** LLMが見れるツールの詳細説明です。 */\n description: string;\n /** ユーザーに表示するツールの要約です。 */\n summary?: string;\n /** 実行前にユーザー確認を要求するかを指定します。 */\n requireConfirmation?: boolean;\n /** ツールの引数を定義するZodスキーマです。 */\n parameters: TParameters;\n /** 検証済み引数を受け取り、ツール本体の処理を実行します。 */\n execute: (args: z.output<TParameters>) => Promise<unknown> | unknown;\n};\n\nfunction normalizeClientToolName(name: string) {\n if (name.startsWith(CLIENT_TOOL_NAME_PREFIX)) {\n return name;\n }\n\n return `${CLIENT_TOOL_NAME_PREFIX}${name}`;\n}\n\nfunction isZodV4Schema(parameters: z.ZodTypeAny) {\n return \"_zod\" in (parameters as object);\n}\n\nfunction parametersToJsonSchema(\n parameters: z.ZodTypeAny,\n zodModule?: typeof import(\"zod\"),\n): ClientToolJsonSchema {\n if (zodModule && isZodV4Schema(parameters)) {\n const nativeToJsonSchema = (\n zodModule.z as typeof zodModule.z & {\n toJSONSchema?: (schema: z.ZodTypeAny) => ClientToolJsonSchema;\n }\n ).toJSONSchema;\n\n if (typeof nativeToJsonSchema === \"function\") {\n return nativeToJsonSchema(parameters);\n }\n }\n\n return zodToJsonSchema(\n parameters as unknown as Parameters<typeof zodToJsonSchema>[0],\n {\n $refStrategy: \"none\",\n },\n ) as ClientToolJsonSchema;\n}\n\n/**\n * チャットボットから呼び出せるクライアントツールを登録します。\n *\n * @example\n * ```tsx\n * import { z } from \"zod\";\n * import { useClientTool } from \"@super_studio/ecforce-ai-agent-react\";\n *\n * export function InventoryToolRegistration() {\n * useClientTool({\n * name: \"lookup_inventory\",\n * displayName: \"在庫確認\",\n * description: \"商品コードから在庫数を取得します。\",\n * summary: \"商品在庫を返します。\",\n * parameters: z.object({\n * sku: z.string().describe(\"商品コード\"),\n * }),\n * execute: async ({ sku }) => {\n * return { sku, available: true };\n * },\n * });\n *\n * return null;\n * }\n * ```\n */\nexport function useClientTool<TParameters extends z.ZodTypeAny>({\n name,\n displayName,\n description,\n summary,\n requireConfirmation = false,\n parameters,\n execute,\n}: UseClientToolOptions<TParameters>) {\n const { registerClientTool, unregisterClientTool } = useChatbot();\n const executeRef = React.useRef(execute);\n const normalizedName = React.useMemo(\n () => normalizeClientToolName(name),\n [name],\n );\n\n React.useEffect(() => {\n executeRef.current = execute;\n }, [execute]);\n\n React.useEffect(() => {\n let isCancelled = false;\n\n void (async () => {\n const zodModule = isZodV4Schema(parameters) ? await import(\"zod\") : undefined;\n if (isCancelled) {\n return;\n }\n\n registerClientTool({\n definition: {\n name: normalizedName,\n displayName,\n description,\n summary,\n requireConfirmation,\n parameters: parametersToJsonSchema(parameters, zodModule),\n },\n execute: (args) => executeRef.current(args as z.output<TParameters>),\n });\n })();\n\n return () => {\n isCancelled = true;\n unregisterClientTool(normalizedName);\n };\n }, [\n description,\n displayName,\n normalizedName,\n parameters,\n registerClientTool,\n requireConfirmation,\n summary,\n unregisterClientTool,\n ]);\n}\n"],"mappings":";;;;;;;AAQA,MAAM,0BAA0B;AAuChC,SAAS,wBAAwB,MAAc;AAC7C,KAAI,KAAK,WAAW,wBAAwB,CAC1C,QAAO;AAGT,QAAO,GAAG,0BAA0B;;AAGtC,SAAS,cAAc,YAA0B;AAC/C,QAAO,UAAW;;AAGpB,SAAS,uBACP,YACA,WACsB;AACtB,KAAI,aAAa,cAAc,WAAW,EAAE;EAC1C,MAAM,qBACJ,UAAU,EAGV;AAEF,MAAI,OAAO,uBAAuB,WAChC,QAAO,mBAAmB,WAAW;;AAIzC,QAAO,gBACL,YACA,EACE,cAAc,QACf,CACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BH,SAAgB,cAAgD,EAC9D,MACA,aACA,aACA,SACA,sBAAsB,OACtB,YACA,WACoC;CACpC,MAAM,EAAE,oBAAoB,yBAAyB,YAAY;CACjE,MAAM,aAAa,MAAM,OAAO,QAAQ;CACxC,MAAM,iBAAiB,MAAM,cACrB,wBAAwB,KAAK,EACnC,CAAC,KAAK,CACP;AAED,OAAM,gBAAgB;AACpB,aAAW,UAAU;IACpB,CAAC,QAAQ,CAAC;AAEb,OAAM,gBAAgB;EACpB,IAAI,cAAc;AAElB,GAAM,YAAY;GAChB,MAAM,YAAY,cAAc,WAAW,GAAG,MAAM,OAAO,SAAS;AACpE,OAAI,YACF;AAGF,sBAAmB;IACjB,YAAY;KACV,MAAM;KACN;KACA;KACA;KACA;KACA,YAAY,uBAAuB,YAAY,UAAU;KAC1D;IACD,UAAU,SAAS,WAAW,QAAQ,KAA8B;IACrE,CAAC;MACA;AAEJ,eAAa;AACX,iBAAc;AACd,wBAAqB,eAAe;;IAErC;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC"}
1
+ {"version":3,"file":"client-tools.mjs","names":[],"sources":["../../src/lib/client-tools.ts"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport type { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport { useChatbot } from \"../components/provider/chatbot-provider\";\n\nexport type ClientToolJsonSchema = Record<string, unknown>;\nconst CLIENT_TOOL_NAME_PREFIX = \"page_\";\n\nexport type ClientToolDefinition = {\n name: string;\n displayName: string;\n description: string;\n summary?: string;\n requireConfirmation?: boolean;\n parameters: ClientToolJsonSchema;\n};\n\nexport type ClientToolExecuteRequest = {\n callId: string;\n name: string;\n args: unknown;\n};\n\nexport type RegisteredClientTool = {\n definition: ClientToolDefinition;\n execute: (args: unknown) => Promise<unknown> | unknown;\n};\n\nexport type UseClientToolOptions<TParameters extends z.ZodTypeAny> = {\n /** ツール名です。`page_`のプレフィックスが自動で追加されます。 */\n name: string;\n /** UI上に表示するツール名です。 */\n displayName: string;\n /** LLMが見れるツールの詳細説明です。 */\n description: string;\n /** ユーザーに表示するツールの要約です。 */\n summary?: string;\n /** 実行前にユーザー確認を要求するかを指定します。 */\n requireConfirmation?: boolean;\n /** ツールの引数を定義するZodスキーマです。 */\n parameters: TParameters;\n /** 検証済み引数を受け取り、ツール本体の処理を実行します。 */\n execute: (args: z.output<TParameters>) => Promise<unknown> | unknown;\n};\n\nfunction normalizeClientToolName(name: string) {\n if (name.startsWith(CLIENT_TOOL_NAME_PREFIX)) {\n return name;\n }\n\n return `${CLIENT_TOOL_NAME_PREFIX}${name}`;\n}\n\nfunction isZodV4Schema(parameters: z.ZodTypeAny) {\n return \"_zod\" in (parameters as object);\n}\n\nfunction parametersToJsonSchema(\n parameters: z.ZodTypeAny,\n zodModule?: typeof import(\"zod\"),\n): ClientToolJsonSchema {\n if (zodModule && isZodV4Schema(parameters)) {\n const nativeToJsonSchema = (\n zodModule.z as typeof zodModule.z & {\n toJSONSchema?: (schema: z.ZodTypeAny) => ClientToolJsonSchema;\n }\n ).toJSONSchema;\n\n if (typeof nativeToJsonSchema === \"function\") {\n return nativeToJsonSchema(parameters);\n }\n }\n\n return zodToJsonSchema(\n parameters as unknown as Parameters<typeof zodToJsonSchema>[0],\n {\n $refStrategy: \"none\",\n },\n ) as ClientToolJsonSchema;\n}\n\n/**\n * チャットボットから呼び出せるクライアントツールを登録します。\n *\n * @example\n * ```tsx\n * import { z } from \"zod\";\n * import { useClientTool } from \"@super_studio/ecforce-ai-agent-react\";\n *\n * export function InventoryToolRegistration() {\n * useClientTool({\n * name: \"lookup_inventory\",\n * displayName: \"在庫確認\",\n * description: \"商品コードから在庫数を取得します。\",\n * summary: \"商品在庫を返します。\",\n * parameters: z.object({\n * sku: z.string().describe(\"商品コード\"),\n * }),\n * execute: async ({ sku }) => {\n * return { sku, available: true };\n * },\n * });\n *\n * return null;\n * }\n * ```\n */\nexport function useClientTool<TParameters extends z.ZodTypeAny>({\n name,\n displayName,\n description,\n summary,\n requireConfirmation = false,\n parameters,\n execute,\n}: UseClientToolOptions<TParameters>) {\n const { registerClientTool, unregisterClientTool } = useChatbot();\n const executeRef = React.useRef(execute);\n const normalizedName = React.useMemo(\n () => normalizeClientToolName(name),\n [name],\n );\n\n React.useEffect(() => {\n executeRef.current = execute;\n }, [execute]);\n\n React.useEffect(() => {\n let isCancelled = false;\n\n void (async () => {\n const zodModule = isZodV4Schema(parameters)\n ? await import(\"zod\")\n : undefined;\n if (isCancelled) {\n return;\n }\n\n registerClientTool({\n definition: {\n name: normalizedName,\n displayName,\n description,\n summary,\n requireConfirmation,\n parameters: parametersToJsonSchema(parameters, zodModule),\n },\n execute: (args) => executeRef.current(args as z.output<TParameters>),\n });\n })();\n\n return () => {\n isCancelled = true;\n unregisterClientTool(normalizedName);\n };\n }, [\n description,\n displayName,\n normalizedName,\n parameters,\n registerClientTool,\n requireConfirmation,\n summary,\n unregisterClientTool,\n ]);\n}\n"],"mappings":";;;;;;;AAQA,MAAM,0BAA0B;AAuChC,SAAS,wBAAwB,MAAc;AAC7C,KAAI,KAAK,WAAW,wBAAwB,CAC1C,QAAO;AAGT,QAAO,GAAG,0BAA0B;;AAGtC,SAAS,cAAc,YAA0B;AAC/C,QAAO,UAAW;;AAGpB,SAAS,uBACP,YACA,WACsB;AACtB,KAAI,aAAa,cAAc,WAAW,EAAE;EAC1C,MAAM,qBACJ,UAAU,EAGV;AAEF,MAAI,OAAO,uBAAuB,WAChC,QAAO,mBAAmB,WAAW;;AAIzC,QAAO,gBACL,YACA,EACE,cAAc,QACf,CACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BH,SAAgB,cAAgD,EAC9D,MACA,aACA,aACA,SACA,sBAAsB,OACtB,YACA,WACoC;CACpC,MAAM,EAAE,oBAAoB,yBAAyB,YAAY;CACjE,MAAM,aAAa,MAAM,OAAO,QAAQ;CACxC,MAAM,iBAAiB,MAAM,cACrB,wBAAwB,KAAK,EACnC,CAAC,KAAK,CACP;AAED,OAAM,gBAAgB;AACpB,aAAW,UAAU;IACpB,CAAC,QAAQ,CAAC;AAEb,OAAM,gBAAgB;EACpB,IAAI,cAAc;AAElB,GAAM,YAAY;GAChB,MAAM,YAAY,cAAc,WAAW,GACvC,MAAM,OAAO,SACb;AACJ,OAAI,YACF;AAGF,sBAAmB;IACjB,YAAY;KACV,MAAM;KACN;KACA;KACA;KACA;KACA,YAAY,uBAAuB,YAAY,UAAU;KAC1D;IACD,UAAU,SAAS,WAAW,QAAQ,KAA8B;IACrE,CAAC;MACA;AAEJ,eAAa;AACX,iBAAc;AACd,wBAAqB,eAAe;;IAErC;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@super_studio/ecforce-ai-agent-react",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "main": "./dist/index.mjs",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.mts",
@@ -131,7 +131,9 @@ export function useClientTool<TParameters extends z.ZodTypeAny>({
131
131
  let isCancelled = false;
132
132
 
133
133
  void (async () => {
134
- const zodModule = isZodV4Schema(parameters) ? await import("zod") : undefined;
134
+ const zodModule = isZodV4Schema(parameters)
135
+ ? await import("zod")
136
+ : undefined;
135
137
  if (isCancelled) {
136
138
  return;
137
139
  }