@harperfast/harper 5.1.0-beta.3 → 5.1.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/bin/copyDb.ts +16 -3
- package/dist/bin/copyDb.js +16 -3
- package/dist/bin/copyDb.js.map +1 -1
- package/dist/resources/Table.js +43 -4
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/databases.js +135 -41
- package/dist/resources/databases.js.map +1 -1
- package/dist/resources/graphql.js +3 -0
- package/dist/resources/graphql.js.map +1 -1
- package/dist/resources/replayLogs.d.ts +1 -0
- package/dist/resources/replayLogs.js +100 -40
- package/dist/resources/replayLogs.js.map +1 -1
- package/dist/resources/replayLogsGuards.d.ts +25 -8
- package/dist/resources/replayLogsGuards.js +50 -10
- package/dist/resources/replayLogsGuards.js.map +1 -1
- package/dist/server/nodeName.js +9 -3
- package/dist/server/nodeName.js.map +1 -1
- package/dist/server/operationsServer.js +20 -0
- package/dist/server/operationsServer.js.map +1 -1
- package/dist/utility/install/installer.js +12 -6
- package/dist/utility/install/installer.js.map +1 -1
- package/package.json +3 -3
- package/resources/Table.ts +41 -4
- package/resources/databases.ts +134 -42
- package/resources/graphql.ts +3 -0
- package/resources/replayLogs.ts +114 -42
- package/resources/replayLogsGuards.ts +58 -9
- package/server/nodeName.ts +9 -3
- package/server/operationsServer.ts +17 -0
- package/studio/web/assets/{Chat-BdFickL8.js → Chat-DMBW4pI2.js} +2 -2
- package/studio/web/assets/{Chat-BdFickL8.js.map → Chat-DMBW4pI2.js.map} +1 -1
- package/studio/web/assets/{FloatingChat-CaAoco8I.js → FloatingChat-DTmhPsrm.js} +4 -4
- package/studio/web/assets/{FloatingChat-CaAoco8I.js.map → FloatingChat-DTmhPsrm.js.map} +1 -1
- package/studio/web/assets/{applications-C3y3xwyG.js → applications-CigxJarn.js} +2 -2
- package/studio/web/assets/{applications-C3y3xwyG.js.map → applications-CigxJarn.js.map} +1 -1
- package/studio/web/assets/{index-Cd3Zh3nK.js → index-oRZw5GW3.js} +6 -6
- package/studio/web/assets/index-oRZw5GW3.js.map +1 -0
- package/studio/web/assets/{index.lazy-0hLbh5Fo.js → index.lazy-DY3VcR86.js} +4 -4
- package/studio/web/assets/{index.lazy-0hLbh5Fo.js.map → index.lazy-DY3VcR86.js.map} +1 -1
- package/studio/web/assets/{profile-CwBWGuVt.js → profile-DiV60L50.js} +2 -2
- package/studio/web/assets/{profile-CwBWGuVt.js.map → profile-DiV60L50.js.map} +1 -1
- package/studio/web/assets/{setComponentFile-Dhrmd8eR.js → setComponentFile-Bz6WI4jy.js} +2 -2
- package/studio/web/assets/{setComponentFile-Dhrmd8eR.js.map → setComponentFile-Bz6WI4jy.js.map} +1 -1
- package/studio/web/assets/{status-Bykq6QcD.js → status-fW6PBpPM.js} +2 -2
- package/studio/web/assets/{status-Bykq6QcD.js.map → status-fW6PBpPM.js.map} +1 -1
- package/studio/web/assets/{swagger-ui-react-CF94s29D.js → swagger-ui-react-DRYf7G3J.js} +2 -2
- package/studio/web/assets/{swagger-ui-react-CF94s29D.js.map → swagger-ui-react-DRYf7G3J.js.map} +1 -1
- package/studio/web/assets/{useEntityRestURL-D7vuaG2W.js → useEntityRestURL-14jWKu9J.js} +2 -2
- package/studio/web/assets/{useEntityRestURL-D7vuaG2W.js.map → useEntityRestURL-14jWKu9J.js.map} +1 -1
- package/studio/web/index.html +1 -1
- package/utility/install/installer.ts +12 -5
- package/studio/web/assets/index-Cd3Zh3nK.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chat-BdFickL8.js","names":["__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","marker","symbol","_a","_b","name","marker2","symbol2","_a2","name2","marker3","symbol3","_a3","name3","marker4","symbol4","_a4","name4","marker5","symbol5","_a5","name5","marker6","symbol6","_a6","name6","marker7","symbol7","_a7","name7","marker8","symbol8","_a8","name8","marker9","symbol9","_a9","name9","marker10","symbol10","_a10","name10","marker11","symbol11","_a11","name11","marker12","symbol12","_a12","name12","marker13","symbol13","_a13","name13","marker14","symbol14","_a14","name","marker","symbol","_a","ZodFirstPartyTypeKind2","ZodFirstPartyTypeKind3","z4.toJSONSchema","z4.safeParseAsync","TypeValidationError2","AISDKError8","AISDKError16","DownloadError2","z.union","z.string","z.instanceof","z.custom","z2.lazy","z2.union","z2.null","z2.string","z2.number","z2.boolean","z2.record","z2.array","z3.record","z3.string","z4.object","z4.literal","z4.string","z4.union","z4.instanceof","z4.unknown","z4.boolean","z4.discriminatedUnion","z4.array","z4.record","z5.object","z5.literal","z5.string","z5.union","z5.array","asSchema2","safeParseJSON2","safeValidateTypes2","TypeValidationError2","z7.record","z7.string","z7.union","z7.strictObject","z7.literal","z7.boolean","z7.unknown","z7.custom","z7.enum","createIdGenerator2","z8.record","z8.string","lazySchema2","zodSchema2","z8.array","z8.object","z8.enum","z8.unknown","z8.union","z8.literal","z8.boolean","z8.never","createIdGenerator3","createIdGenerator4","resolve2","parseJsonEventStream2","generateIdFunc2","Chat","inputSchema","z.object","z\n .string","z.string","serverSchema","inputSchema","z.object","z.string","z.enum","serverSchema","inputSchema","z.object","z.string","z.array","serverSchema","inputSchema","z.object","z.string","serverSchema","inputSchema","z.object","z.string","z\n .number","serverSchema","inputSchema","z.object","z.string","serverSchema","inputSchema","z.object","serverSchema","inputSchema","z.object","serverSchema","inputSchema","z.object","z.string","serverSchema","inputSchema","z.object","serverSchema","inputSchema","z.object","z.string","z.array","z.any","serverSchema","inputSchema","z.object","z.enum","z\n .number","serverSchema","inputSchema","z.object","z.enum","serverSchema","inputSchema","z.object","z.enum","z.string","z.null","z\n .enum","serverSchema","inputSchema","z.object","z.string","z.number","z.array","z.enum","z.any","z.boolean","serverSchema","inputSchema","z.object","serverSchema","inputSchema","z.object","z.string","z.enum","serverSchema","z.object","z.string","z.array","z.any"],"sources":["../../node_modules/.pnpm/lucide-react@1.17.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/between-horizontal-start.mjs","../../node_modules/.pnpm/lucide-react@1.17.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/book.mjs","../../node_modules/.pnpm/lucide-react@1.17.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/chart-area.mjs","../../node_modules/.pnpm/lucide-react@1.17.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/circle-x.mjs","../../node_modules/.pnpm/lucide-react@1.17.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/file-pen.mjs","../../node_modules/.pnpm/lucide-react@1.17.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/logs.mjs","../../node_modules/.pnpm/lucide-react@1.17.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/message-square-heart.mjs","../../node_modules/.pnpm/lucide-react@1.17.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/send.mjs","../../src/integrations/api/chat/clearChatMessages.ts","../../src/features/instance/applications/components/Chat/components/ClearChat.tsx","../../src/integrations/api/chat/getChatMessages.ts","../../node_modules/.pnpm/@ai-sdk+provider@3.0.10/node_modules/@ai-sdk/provider/dist/index.mjs","../../node_modules/.pnpm/eventsource-parser@3.1.0/node_modules/eventsource-parser/dist/index.js","../../node_modules/.pnpm/eventsource-parser@3.1.0/node_modules/eventsource-parser/dist/stream.js","../../node_modules/.pnpm/@ai-sdk+provider-utils@4.0.27_zod@4.4.3/node_modules/@ai-sdk/provider-utils/dist/index.mjs","../../node_modules/.pnpm/ai@6.0.197_zod@4.4.3/node_modules/ai/dist/index.mjs","../../src/integrations/api/chat/getChatTransport.ts","../../node_modules/.pnpm/throttleit@2.1.0/node_modules/throttleit/index.js","../../node_modules/.pnpm/@ai-sdk+react@3.0.199_react@19.2.7_zod@4.4.3/node_modules/@ai-sdk/react/dist/index.mjs","../../src/features/instance/applications/components/Chat/components/ChatInput.tsx","../../src/features/instance/applications/components/Chat/components/LoadingState.tsx","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/collectFeedback/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/collectFeedback/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/collectFeedback/execute.ts","../../src/features/instance/applications/components/Chat/tools/collectFeedback/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/createApp/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/createApp/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/createApp/execute.ts","../../src/features/instance/applications/components/Chat/tools/createApp/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/deleteTableRecords/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/deleteTableRecords/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/deleteTableRecords/execute.ts","../../src/features/instance/applications/components/Chat/tools/deleteTableRecords/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/dropComponentFile/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/dropComponentFile/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/dropComponentFile/execute.ts","../../src/features/instance/applications/components/Chat/tools/dropComponentFile/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getAnalytics/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getAnalytics/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/getAnalytics/execute.ts","../../src/features/instance/applications/components/Chat/tools/getAnalytics/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getComponentFile/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getComponentFile/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/getComponentFile/execute.ts","../../src/features/instance/applications/components/Chat/tools/getComponentFile/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getComponents/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getComponents/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/getComponents/execute.ts","../../src/features/instance/applications/components/Chat/tools/getComponents/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getDescribeAll/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getDescribeAll/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/getDescribeAll/execute.ts","../../src/features/instance/applications/components/Chat/tools/getDescribeAll/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getDescribeTable/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getDescribeTable/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/getDescribeTable/execute.ts","../../src/features/instance/applications/components/Chat/tools/getDescribeTable/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getUserContext/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getUserContext/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/getUserContext/execute.ts","../../src/features/instance/applications/components/Chat/tools/getUserContext/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/insertTableRecords/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/insertTableRecords/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/insertTableRecords/execute.ts","../../src/features/instance/applications/components/Chat/tools/insertTableRecords/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/listAnalyticsMetrics/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/listAnalyticsMetrics/serverSchema.js","../../src/integrations/api/instance/status/listAnalyticsMetrics.ts","../../src/features/instance/applications/components/Chat/tools/listAnalyticsMetrics/execute.ts","../../src/features/instance/applications/components/Chat/tools/listAnalyticsMetrics/clientTool.ts","../../node_modules/.pnpm/@harperfast+skills@1.9.1/node_modules/@harperfast/skills/dist/index.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/readHarperSkill/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/readHarperSkill/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/readHarperSkill/execute.ts","../../src/features/instance/applications/components/Chat/tools/readHarperSkill/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/readLogs/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/readLogs/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/readLogs/execute.ts","../../src/features/instance/applications/components/Chat/tools/readLogs/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/readTableRecords/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/readTableRecords/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/readTableRecords/execute.ts","../../src/features/instance/applications/components/Chat/tools/readTableRecords/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/restartHTTPService/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/restartHTTPService/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/restartHTTPService/execute.ts","../../src/features/instance/applications/components/Chat/tools/restartHTTPService/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/setComponentFile/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/setComponentFile/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/setComponentFile/execute.ts","../../src/features/instance/applications/components/Chat/tools/setComponentFile/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/updateTableRecords/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/updateTableRecords/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/updateTableRecords/execute.ts","../../src/features/instance/applications/components/Chat/tools/updateTableRecords/clientTool.ts","../../src/features/instance/applications/components/Chat/tools/clientTools.ts","../../src/features/instance/applications/components/Chat/components/ToolInvocation.tsx","../../src/features/instance/applications/components/Chat/components/MessageBubble.tsx","../../src/integrations/api/chat/getChatUsage.ts","../../src/features/instance/applications/components/Chat/components/UsageBar.tsx","../../src/features/instance/applications/components/Chat/index.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"13\", height: \"7\", x: \"8\", y: \"3\", rx: \"1\", key: \"pkso9a\" }],\n [\"path\", { d: \"m2 9 3 3-3 3\", key: \"1agib5\" }],\n [\"rect\", { width: \"13\", height: \"7\", x: \"8\", y: \"14\", rx: \"1\", key: \"1q5fc1\" }]\n];\nconst BetweenHorizontalStart = createLucideIcon(\"between-horizontal-start\", __iconNode);\n\nexport { __iconNode, BetweenHorizontalStart as default };\n//# sourceMappingURL=between-horizontal-start.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20\",\n key: \"k3hazp\"\n }\n ]\n];\nconst Book = createLucideIcon(\"book\", __iconNode);\n\nexport { __iconNode, Book as default };\n//# sourceMappingURL=book.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 3v16a2 2 0 0 0 2 2h16\", key: \"c24i48\" }],\n [\n \"path\",\n {\n d: \"M7 11.207a.5.5 0 0 1 .146-.353l2-2a.5.5 0 0 1 .708 0l3.292 3.292a.5.5 0 0 0 .708 0l4.292-4.292a.5.5 0 0 1 .854.353V16a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z\",\n key: \"q0gr47\"\n }\n ]\n];\nconst ChartArea = createLucideIcon(\"chart-area\", __iconNode);\n\nexport { __iconNode, ChartArea as default };\n//# sourceMappingURL=chart-area.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m15 9-6 6\", key: \"1uzhvr\" }],\n [\"path\", { d: \"m9 9 6 6\", key: \"z0biqf\" }]\n];\nconst CircleX = createLucideIcon(\"circle-x\", __iconNode);\n\nexport { __iconNode, CircleX as default };\n//# sourceMappingURL=circle-x.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M12.659 22H18a2 2 0 0 0 2-2V8a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v9.34\",\n key: \"o6klzx\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\n \"path\",\n {\n d: \"M10.378 12.622a1 1 0 0 1 3 3.003L8.36 20.637a2 2 0 0 1-.854.506l-2.867.837a.5.5 0 0 1-.62-.62l.836-2.869a2 2 0 0 1 .506-.853z\",\n key: \"zhnas1\"\n }\n ]\n];\nconst FilePen = createLucideIcon(\"file-pen\", __iconNode);\n\nexport { __iconNode, FilePen as default };\n//# sourceMappingURL=file-pen.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 5h1\", key: \"1mv5vm\" }],\n [\"path\", { d: \"M3 12h1\", key: \"lp3yf2\" }],\n [\"path\", { d: \"M3 19h1\", key: \"w6f3n9\" }],\n [\"path\", { d: \"M8 5h1\", key: \"1nxr5w\" }],\n [\"path\", { d: \"M8 12h1\", key: \"1con00\" }],\n [\"path\", { d: \"M8 19h1\", key: \"k7p10e\" }],\n [\"path\", { d: \"M13 5h8\", key: \"a7qcls\" }],\n [\"path\", { d: \"M13 12h8\", key: \"h98zly\" }],\n [\"path\", { d: \"M13 19h8\", key: \"c3s6r1\" }]\n];\nconst Logs = createLucideIcon(\"logs\", __iconNode);\n\nexport { __iconNode, Logs as default };\n//# sourceMappingURL=logs.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z\",\n key: \"18887p\"\n }\n ],\n [\n \"path\",\n {\n d: \"M7.5 9.5c0 .687.265 1.383.697 1.844l3.009 3.264a1.14 1.14 0 0 0 .407.314 1 1 0 0 0 .783-.004 1.14 1.14 0 0 0 .398-.31l3.008-3.264A2.77 2.77 0 0 0 16.5 9.5 2.5 2.5 0 0 0 12 8a2.5 2.5 0 0 0-4.5 1.5\",\n key: \"1faxuh\"\n }\n ]\n];\nconst MessageSquareHeart = createLucideIcon(\"message-square-heart\", __iconNode);\n\nexport { __iconNode, MessageSquareHeart as default };\n//# sourceMappingURL=message-square-heart.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z\",\n key: \"1ffxy3\"\n }\n ],\n [\"path\", { d: \"m21.854 2.147-10.94 10.939\", key: \"12cjpa\" }]\n];\nconst Send = createLucideIcon(\"send\", __iconNode);\n\nexport { __iconNode, Send as default };\n//# sourceMappingURL=send.mjs.map\n","import { apiClient } from '@/config/apiClient';\n\nexport async function clearChatMessages() {\n\tawait apiClient.delete('/Chat/Messages/' as any);\n}\n","import { clearChatMessages } from '@/integrations/api/chat/clearChatMessages';\nimport { RefreshCw, Trash2 } from 'lucide-react';\nimport { useCallback, useState } from 'react';\n\nexport function ClearChat({ setMessages }: { setMessages: (messages: []) => void }) {\n\tconst [isClearing, setIsClearing] = useState(false);\n\n\tconst handleClearChat = useCallback(async () => {\n\t\tif (isClearing) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetIsClearing(true);\n\t\ttry {\n\t\t\tawait clearChatMessages();\n\t\t\tsetMessages([]);\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to clear chat:', error);\n\t\t} finally {\n\t\t\tsetIsClearing(false);\n\t\t}\n\t}, [isClearing, setMessages]);\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclassName=\"clear-chat-button gap-1\"\n\t\t\tonClick={handleClearChat}\n\t\t\tdisabled={isClearing}\n\t\t\ttitle=\"Clear chat\"\n\t\t>\n\t\t\t{isClearing ? <RefreshCw className=\"animate-spin\" size={18} /> : <Trash2 size={18} />}\n\t\t\tClear\n\t\t</button>\n\t);\n}\n","import { apiClient } from '@/config/apiClient';\n\nexport async function getChatMessages() {\n\tconst { data } = await apiClient.get('/Chat/Messages/' as any);\n\treturn data;\n}\n","// src/errors/ai-sdk-error.ts\nvar marker = \"vercel.ai.error\";\nvar symbol = Symbol.for(marker);\nvar _a, _b;\nvar AISDKError = class _AISDKError extends (_b = Error, _a = symbol, _b) {\n /**\n * Creates an AI SDK Error.\n *\n * @param {Object} params - The parameters for creating the error.\n * @param {string} params.name - The name of the error.\n * @param {string} params.message - The error message.\n * @param {unknown} [params.cause] - The underlying cause of the error.\n */\n constructor({\n name: name14,\n message,\n cause\n }) {\n super(message);\n this[_a] = true;\n this.name = name14;\n this.cause = cause;\n }\n /**\n * Checks if the given error is an AI SDK Error.\n * @param {unknown} error - The error to check.\n * @returns {boolean} True if the error is an AI SDK Error, false otherwise.\n */\n static isInstance(error) {\n return _AISDKError.hasMarker(error, marker);\n }\n static hasMarker(error, marker15) {\n const markerSymbol = Symbol.for(marker15);\n return error != null && typeof error === \"object\" && markerSymbol in error && typeof error[markerSymbol] === \"boolean\" && error[markerSymbol] === true;\n }\n};\n\n// src/errors/api-call-error.ts\nvar name = \"AI_APICallError\";\nvar marker2 = `vercel.ai.error.${name}`;\nvar symbol2 = Symbol.for(marker2);\nvar _a2, _b2;\nvar APICallError = class extends (_b2 = AISDKError, _a2 = symbol2, _b2) {\n constructor({\n message,\n url,\n requestBodyValues,\n statusCode,\n responseHeaders,\n responseBody,\n cause,\n isRetryable = statusCode != null && (statusCode === 408 || // request timeout\n statusCode === 409 || // conflict\n statusCode === 429 || // too many requests\n statusCode >= 500),\n // server error\n data\n }) {\n super({ name, message, cause });\n this[_a2] = true;\n this.url = url;\n this.requestBodyValues = requestBodyValues;\n this.statusCode = statusCode;\n this.responseHeaders = responseHeaders;\n this.responseBody = responseBody;\n this.isRetryable = isRetryable;\n this.data = data;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker2);\n }\n};\n\n// src/errors/empty-response-body-error.ts\nvar name2 = \"AI_EmptyResponseBodyError\";\nvar marker3 = `vercel.ai.error.${name2}`;\nvar symbol3 = Symbol.for(marker3);\nvar _a3, _b3;\nvar EmptyResponseBodyError = class extends (_b3 = AISDKError, _a3 = symbol3, _b3) {\n // used in isInstance\n constructor({ message = \"Empty response body\" } = {}) {\n super({ name: name2, message });\n this[_a3] = true;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker3);\n }\n};\n\n// src/errors/get-error-message.ts\nfunction getErrorMessage(error) {\n if (error == null) {\n return \"unknown error\";\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return JSON.stringify(error);\n}\n\n// src/errors/invalid-argument-error.ts\nvar name3 = \"AI_InvalidArgumentError\";\nvar marker4 = `vercel.ai.error.${name3}`;\nvar symbol4 = Symbol.for(marker4);\nvar _a4, _b4;\nvar InvalidArgumentError = class extends (_b4 = AISDKError, _a4 = symbol4, _b4) {\n constructor({\n message,\n cause,\n argument\n }) {\n super({ name: name3, message, cause });\n this[_a4] = true;\n this.argument = argument;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker4);\n }\n};\n\n// src/errors/invalid-prompt-error.ts\nvar name4 = \"AI_InvalidPromptError\";\nvar marker5 = `vercel.ai.error.${name4}`;\nvar symbol5 = Symbol.for(marker5);\nvar _a5, _b5;\nvar InvalidPromptError = class extends (_b5 = AISDKError, _a5 = symbol5, _b5) {\n constructor({\n prompt,\n message,\n cause\n }) {\n super({ name: name4, message: `Invalid prompt: ${message}`, cause });\n this[_a5] = true;\n this.prompt = prompt;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker5);\n }\n};\n\n// src/errors/invalid-response-data-error.ts\nvar name5 = \"AI_InvalidResponseDataError\";\nvar marker6 = `vercel.ai.error.${name5}`;\nvar symbol6 = Symbol.for(marker6);\nvar _a6, _b6;\nvar InvalidResponseDataError = class extends (_b6 = AISDKError, _a6 = symbol6, _b6) {\n constructor({\n data,\n message = `Invalid response data: ${JSON.stringify(data)}.`\n }) {\n super({ name: name5, message });\n this[_a6] = true;\n this.data = data;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker6);\n }\n};\n\n// src/errors/json-parse-error.ts\nvar name6 = \"AI_JSONParseError\";\nvar marker7 = `vercel.ai.error.${name6}`;\nvar symbol7 = Symbol.for(marker7);\nvar _a7, _b7;\nvar JSONParseError = class extends (_b7 = AISDKError, _a7 = symbol7, _b7) {\n constructor({ text, cause }) {\n super({\n name: name6,\n message: `JSON parsing failed: Text: ${text}.\nError message: ${getErrorMessage(cause)}`,\n cause\n });\n this[_a7] = true;\n this.text = text;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker7);\n }\n};\n\n// src/errors/load-api-key-error.ts\nvar name7 = \"AI_LoadAPIKeyError\";\nvar marker8 = `vercel.ai.error.${name7}`;\nvar symbol8 = Symbol.for(marker8);\nvar _a8, _b8;\nvar LoadAPIKeyError = class extends (_b8 = AISDKError, _a8 = symbol8, _b8) {\n // used in isInstance\n constructor({ message }) {\n super({ name: name7, message });\n this[_a8] = true;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker8);\n }\n};\n\n// src/errors/load-setting-error.ts\nvar name8 = \"AI_LoadSettingError\";\nvar marker9 = `vercel.ai.error.${name8}`;\nvar symbol9 = Symbol.for(marker9);\nvar _a9, _b9;\nvar LoadSettingError = class extends (_b9 = AISDKError, _a9 = symbol9, _b9) {\n // used in isInstance\n constructor({ message }) {\n super({ name: name8, message });\n this[_a9] = true;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker9);\n }\n};\n\n// src/errors/no-content-generated-error.ts\nvar name9 = \"AI_NoContentGeneratedError\";\nvar marker10 = `vercel.ai.error.${name9}`;\nvar symbol10 = Symbol.for(marker10);\nvar _a10, _b10;\nvar NoContentGeneratedError = class extends (_b10 = AISDKError, _a10 = symbol10, _b10) {\n // used in isInstance\n constructor({\n message = \"No content generated.\"\n } = {}) {\n super({ name: name9, message });\n this[_a10] = true;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker10);\n }\n};\n\n// src/errors/no-such-model-error.ts\nvar name10 = \"AI_NoSuchModelError\";\nvar marker11 = `vercel.ai.error.${name10}`;\nvar symbol11 = Symbol.for(marker11);\nvar _a11, _b11;\nvar NoSuchModelError = class extends (_b11 = AISDKError, _a11 = symbol11, _b11) {\n constructor({\n errorName = name10,\n modelId,\n modelType,\n message = `No such ${modelType}: ${modelId}`\n }) {\n super({ name: errorName, message });\n this[_a11] = true;\n this.modelId = modelId;\n this.modelType = modelType;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker11);\n }\n};\n\n// src/errors/too-many-embedding-values-for-call-error.ts\nvar name11 = \"AI_TooManyEmbeddingValuesForCallError\";\nvar marker12 = `vercel.ai.error.${name11}`;\nvar symbol12 = Symbol.for(marker12);\nvar _a12, _b12;\nvar TooManyEmbeddingValuesForCallError = class extends (_b12 = AISDKError, _a12 = symbol12, _b12) {\n constructor(options) {\n super({\n name: name11,\n message: `Too many values for a single embedding call. The ${options.provider} model \"${options.modelId}\" can only embed up to ${options.maxEmbeddingsPerCall} values per call, but ${options.values.length} values were provided.`\n });\n this[_a12] = true;\n this.provider = options.provider;\n this.modelId = options.modelId;\n this.maxEmbeddingsPerCall = options.maxEmbeddingsPerCall;\n this.values = options.values;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker12);\n }\n};\n\n// src/errors/type-validation-error.ts\nvar name12 = \"AI_TypeValidationError\";\nvar marker13 = `vercel.ai.error.${name12}`;\nvar symbol13 = Symbol.for(marker13);\nvar _a13, _b13;\nvar TypeValidationError = class _TypeValidationError extends (_b13 = AISDKError, _a13 = symbol13, _b13) {\n constructor({\n value,\n cause,\n context\n }) {\n let contextPrefix = \"Type validation failed\";\n if (context == null ? void 0 : context.field) {\n contextPrefix += ` for ${context.field}`;\n }\n if ((context == null ? void 0 : context.entityName) || (context == null ? void 0 : context.entityId)) {\n contextPrefix += \" (\";\n const parts = [];\n if (context.entityName) {\n parts.push(context.entityName);\n }\n if (context.entityId) {\n parts.push(`id: \"${context.entityId}\"`);\n }\n contextPrefix += parts.join(\", \");\n contextPrefix += \")\";\n }\n super({\n name: name12,\n message: `${contextPrefix}: Value: ${JSON.stringify(value)}.\nError message: ${getErrorMessage(cause)}`,\n cause\n });\n this[_a13] = true;\n this.value = value;\n this.context = context;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker13);\n }\n /**\n * Wraps an error into a TypeValidationError.\n * If the cause is already a TypeValidationError with the same value and context, it returns the cause.\n * Otherwise, it creates a new TypeValidationError.\n *\n * @param {Object} params - The parameters for wrapping the error.\n * @param {unknown} params.value - The value that failed validation.\n * @param {unknown} params.cause - The original error or cause of the validation failure.\n * @param {TypeValidationContext} params.context - Optional context about what is being validated.\n * @returns {TypeValidationError} A TypeValidationError instance.\n */\n static wrap({\n value,\n cause,\n context\n }) {\n var _a15, _b15, _c;\n if (_TypeValidationError.isInstance(cause) && cause.value === value && ((_a15 = cause.context) == null ? void 0 : _a15.field) === (context == null ? void 0 : context.field) && ((_b15 = cause.context) == null ? void 0 : _b15.entityName) === (context == null ? void 0 : context.entityName) && ((_c = cause.context) == null ? void 0 : _c.entityId) === (context == null ? void 0 : context.entityId)) {\n return cause;\n }\n return new _TypeValidationError({ value, cause, context });\n }\n};\n\n// src/errors/unsupported-functionality-error.ts\nvar name13 = \"AI_UnsupportedFunctionalityError\";\nvar marker14 = `vercel.ai.error.${name13}`;\nvar symbol14 = Symbol.for(marker14);\nvar _a14, _b14;\nvar UnsupportedFunctionalityError = class extends (_b14 = AISDKError, _a14 = symbol14, _b14) {\n constructor({\n functionality,\n message = `'${functionality}' functionality not supported.`\n }) {\n super({ name: name13, message });\n this[_a14] = true;\n this.functionality = functionality;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker14);\n }\n};\n\n// src/json-value/is-json.ts\nfunction isJSONValue(value) {\n if (value === null || typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return true;\n }\n if (Array.isArray(value)) {\n return value.every(isJSONValue);\n }\n if (typeof value === \"object\") {\n return Object.entries(value).every(\n ([key, val]) => typeof key === \"string\" && (val === void 0 || isJSONValue(val))\n );\n }\n return false;\n}\nfunction isJSONArray(value) {\n return Array.isArray(value) && value.every(isJSONValue);\n}\nfunction isJSONObject(value) {\n return value != null && typeof value === \"object\" && Object.entries(value).every(\n ([key, val]) => typeof key === \"string\" && (val === void 0 || isJSONValue(val))\n );\n}\nexport {\n AISDKError,\n APICallError,\n EmptyResponseBodyError,\n InvalidArgumentError,\n InvalidPromptError,\n InvalidResponseDataError,\n JSONParseError,\n LoadAPIKeyError,\n LoadSettingError,\n NoContentGeneratedError,\n NoSuchModelError,\n TooManyEmbeddingValuesForCallError,\n TypeValidationError,\n UnsupportedFunctionalityError,\n getErrorMessage,\n isJSONArray,\n isJSONObject,\n isJSONValue\n};\n//# sourceMappingURL=index.mjs.map","class ParseError extends Error {\n constructor(message, options) {\n super(message), this.name = \"ParseError\", this.type = options.type, this.field = options.field, this.value = options.value, this.line = options.line;\n }\n}\nconst LF = 10, CR = 13, SPACE = 32;\nfunction noop(_arg) {\n}\nfunction createParser(config) {\n if (typeof config == \"function\")\n throw new TypeError(\n \"`config` must be an object, got a function instead. Did you mean `createParser({onEvent: fn})`?\"\n );\n const { onEvent = noop, onError = noop, onRetry = noop, onComment, maxBufferSize } = config, pendingFragments = [];\n let pendingFragmentsLength = 0, isFirstChunk = !0, id, data = \"\", dataLines = 0, eventType, terminated = !1;\n function feed(chunk) {\n if (terminated)\n throw new Error(\n \"Cannot feed parser: it was terminated after exceeding the configured max buffer size. Call `reset()` to resume parsing.\"\n );\n if (isFirstChunk && (isFirstChunk = !1, chunk.charCodeAt(0) === 239 && chunk.charCodeAt(1) === 187 && chunk.charCodeAt(2) === 191 && (chunk = chunk.slice(3))), pendingFragments.length === 0) {\n const trailing2 = processLines(chunk);\n trailing2 !== \"\" && (pendingFragments.push(trailing2), pendingFragmentsLength = trailing2.length), checkBufferSize();\n return;\n }\n if (chunk.indexOf(`\n`) === -1 && chunk.indexOf(\"\\r\") === -1) {\n pendingFragments.push(chunk), pendingFragmentsLength += chunk.length, checkBufferSize();\n return;\n }\n pendingFragments.push(chunk);\n const input = pendingFragments.join(\"\");\n pendingFragments.length = 0, pendingFragmentsLength = 0;\n const trailing = processLines(input);\n trailing !== \"\" && (pendingFragments.push(trailing), pendingFragmentsLength = trailing.length), checkBufferSize();\n }\n function checkBufferSize() {\n maxBufferSize !== void 0 && (pendingFragmentsLength + data.length <= maxBufferSize || (terminated = !0, pendingFragments.length = 0, pendingFragmentsLength = 0, id = void 0, data = \"\", dataLines = 0, eventType = void 0, onError(\n new ParseError(`Buffered data exceeded max buffer size of ${maxBufferSize} characters`, {\n type: \"max-buffer-size-exceeded\"\n })\n )));\n }\n function processLines(chunk) {\n let searchIndex = 0;\n if (chunk.indexOf(\"\\r\") === -1) {\n let lfIndex = chunk.indexOf(`\n`, searchIndex);\n for (; lfIndex !== -1; ) {\n if (searchIndex === lfIndex) {\n dataLines > 0 && onEvent({ id, event: eventType, data }), id = void 0, data = \"\", dataLines = 0, eventType = void 0, searchIndex = lfIndex + 1, lfIndex = chunk.indexOf(`\n`, searchIndex);\n continue;\n }\n const firstCharCode = chunk.charCodeAt(searchIndex);\n if (isDataPrefix(chunk, searchIndex, firstCharCode)) {\n const valueStart = chunk.charCodeAt(searchIndex + 5) === SPACE ? searchIndex + 6 : searchIndex + 5, value = chunk.slice(valueStart, lfIndex);\n if (dataLines === 0 && chunk.charCodeAt(lfIndex + 1) === LF) {\n onEvent({ id, event: eventType, data: value }), id = void 0, data = \"\", eventType = void 0, searchIndex = lfIndex + 2, lfIndex = chunk.indexOf(`\n`, searchIndex);\n continue;\n }\n data = dataLines === 0 ? value : `${data}\n${value}`, dataLines++;\n } else isEventPrefix(chunk, searchIndex, firstCharCode) ? eventType = chunk.slice(\n chunk.charCodeAt(searchIndex + 6) === SPACE ? searchIndex + 7 : searchIndex + 6,\n lfIndex\n ) || void 0 : parseLine(chunk, searchIndex, lfIndex);\n searchIndex = lfIndex + 1, lfIndex = chunk.indexOf(`\n`, searchIndex);\n }\n return chunk.slice(searchIndex);\n }\n for (; searchIndex < chunk.length; ) {\n const crIndex = chunk.indexOf(\"\\r\", searchIndex), lfIndex = chunk.indexOf(`\n`, searchIndex);\n let lineEnd = -1;\n if (crIndex !== -1 && lfIndex !== -1 ? lineEnd = crIndex < lfIndex ? crIndex : lfIndex : crIndex !== -1 ? crIndex === chunk.length - 1 ? lineEnd = -1 : lineEnd = crIndex : lfIndex !== -1 && (lineEnd = lfIndex), lineEnd === -1)\n break;\n parseLine(chunk, searchIndex, lineEnd), searchIndex = lineEnd + 1, chunk.charCodeAt(searchIndex - 1) === CR && chunk.charCodeAt(searchIndex) === LF && searchIndex++;\n }\n return chunk.slice(searchIndex);\n }\n function parseLine(chunk, start, end) {\n if (start === end) {\n dispatchEvent();\n return;\n }\n const firstCharCode = chunk.charCodeAt(start);\n if (isDataPrefix(chunk, start, firstCharCode)) {\n const valueStart = chunk.charCodeAt(start + 5) === SPACE ? start + 6 : start + 5, value2 = chunk.slice(valueStart, end);\n data = dataLines === 0 ? value2 : `${data}\n${value2}`, dataLines++;\n return;\n }\n if (isEventPrefix(chunk, start, firstCharCode)) {\n eventType = chunk.slice(chunk.charCodeAt(start + 6) === SPACE ? start + 7 : start + 6, end) || void 0;\n return;\n }\n if (firstCharCode === 105 && chunk.charCodeAt(start + 1) === 100 && chunk.charCodeAt(start + 2) === 58) {\n const value2 = chunk.slice(chunk.charCodeAt(start + 3) === SPACE ? start + 4 : start + 3, end);\n id = value2.includes(\"\\0\") ? void 0 : value2;\n return;\n }\n if (firstCharCode === 58) {\n if (onComment) {\n const line2 = chunk.slice(start, end);\n onComment(line2.slice(chunk.charCodeAt(start + 1) === SPACE ? 2 : 1));\n }\n return;\n }\n const line = chunk.slice(start, end), fieldSeparatorIndex = line.indexOf(\":\");\n if (fieldSeparatorIndex === -1) {\n processField(line, \"\", line);\n return;\n }\n const field = line.slice(0, fieldSeparatorIndex), offset = line.charCodeAt(fieldSeparatorIndex + 1) === SPACE ? 2 : 1, value = line.slice(fieldSeparatorIndex + offset);\n processField(field, value, line);\n }\n function processField(field, value, line) {\n switch (field) {\n case \"event\":\n eventType = value || void 0;\n break;\n case \"data\":\n data = dataLines === 0 ? value : `${data}\n${value}`, dataLines++;\n break;\n case \"id\":\n id = value.includes(\"\\0\") ? void 0 : value;\n break;\n case \"retry\":\n /^\\d+$/.test(value) ? onRetry(parseInt(value, 10)) : onError(\n new ParseError(`Invalid \\`retry\\` value: \"${value}\"`, {\n type: \"invalid-retry\",\n value,\n line\n })\n );\n break;\n default:\n onError(\n new ParseError(\n `Unknown field \"${field.length > 20 ? `${field.slice(0, 20)}\\u2026` : field}\"`,\n { type: \"unknown-field\", field, value, line }\n )\n );\n break;\n }\n }\n function dispatchEvent() {\n dataLines > 0 && onEvent({\n id,\n event: eventType,\n data\n }), id = void 0, data = \"\", dataLines = 0, eventType = void 0;\n }\n function reset(options = {}) {\n if (options.consume && pendingFragments.length > 0) {\n const incompleteLine = pendingFragments.join(\"\");\n parseLine(incompleteLine, 0, incompleteLine.length);\n }\n isFirstChunk = !0, id = void 0, data = \"\", dataLines = 0, eventType = void 0, pendingFragments.length = 0, pendingFragmentsLength = 0, terminated = !1;\n }\n return { feed, reset };\n}\nfunction isDataPrefix(chunk, i, firstCharCode) {\n return firstCharCode === 100 && chunk.charCodeAt(i + 1) === 97 && chunk.charCodeAt(i + 2) === 116 && chunk.charCodeAt(i + 3) === 97 && chunk.charCodeAt(i + 4) === 58;\n}\nfunction isEventPrefix(chunk, i, firstCharCode) {\n return firstCharCode === 101 && chunk.charCodeAt(i + 1) === 118 && chunk.charCodeAt(i + 2) === 101 && chunk.charCodeAt(i + 3) === 110 && chunk.charCodeAt(i + 4) === 116 && chunk.charCodeAt(i + 5) === 58;\n}\nexport {\n ParseError,\n createParser\n};\n//# sourceMappingURL=index.js.map\n","import { createParser } from \"./index.js\";\nimport { ParseError } from \"./index.js\";\nclass EventSourceParserStream extends TransformStream {\n constructor({ onError, onRetry, onComment, maxBufferSize } = {}) {\n let parser;\n super({\n start(controller) {\n parser = createParser({\n onEvent: (event) => {\n controller.enqueue(event);\n },\n onError(error) {\n typeof onError == \"function\" && onError(error), (onError === \"terminate\" || error.type === \"max-buffer-size-exceeded\") && controller.error(error);\n },\n onRetry,\n onComment,\n maxBufferSize\n });\n },\n transform(chunk) {\n parser.feed(chunk);\n }\n });\n }\n}\nexport {\n EventSourceParserStream,\n ParseError\n};\n//# sourceMappingURL=stream.js.map\n","// src/combine-headers.ts\nfunction combineHeaders(...headers) {\n return headers.reduce(\n (combinedHeaders, currentHeaders) => ({\n ...combinedHeaders,\n ...currentHeaders != null ? currentHeaders : {}\n }),\n {}\n );\n}\n\n// src/convert-async-iterator-to-readable-stream.ts\nfunction convertAsyncIteratorToReadableStream(iterator) {\n let cancelled = false;\n return new ReadableStream({\n /**\n * Called when the consumer wants to pull more data from the stream.\n *\n * @param {ReadableStreamDefaultController<T>} controller - The controller to enqueue data into the stream.\n * @returns {Promise<void>}\n */\n async pull(controller) {\n if (cancelled) return;\n try {\n const { value, done } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n } catch (error) {\n controller.error(error);\n }\n },\n /**\n * Called when the consumer cancels the stream.\n */\n async cancel(reason) {\n cancelled = true;\n if (iterator.return) {\n try {\n await iterator.return(reason);\n } catch (e) {\n }\n }\n }\n });\n}\n\n// src/create-tool-name-mapping.ts\nfunction createToolNameMapping({\n tools = [],\n providerToolNames,\n resolveProviderToolName\n}) {\n var _a2;\n const customToolNameToProviderToolName = {};\n const providerToolNameToCustomToolName = {};\n for (const tool2 of tools) {\n if (tool2.type === \"provider\") {\n const providerToolName = (_a2 = resolveProviderToolName == null ? void 0 : resolveProviderToolName(tool2)) != null ? _a2 : tool2.id in providerToolNames ? providerToolNames[tool2.id] : void 0;\n if (providerToolName == null) {\n continue;\n }\n customToolNameToProviderToolName[tool2.name] = providerToolName;\n providerToolNameToCustomToolName[providerToolName] = tool2.name;\n }\n }\n return {\n toProviderToolName: (customToolName) => {\n var _a3;\n return (_a3 = customToolNameToProviderToolName[customToolName]) != null ? _a3 : customToolName;\n },\n toCustomToolName: (providerToolName) => {\n var _a3;\n return (_a3 = providerToolNameToCustomToolName[providerToolName]) != null ? _a3 : providerToolName;\n }\n };\n}\n\n// src/delay.ts\nasync function delay(delayInMs, options) {\n if (delayInMs == null) {\n return Promise.resolve();\n }\n const signal = options == null ? void 0 : options.abortSignal;\n return new Promise((resolve2, reject) => {\n if (signal == null ? void 0 : signal.aborted) {\n reject(createAbortError());\n return;\n }\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve2();\n }, delayInMs);\n const cleanup = () => {\n clearTimeout(timeoutId);\n signal == null ? void 0 : signal.removeEventListener(\"abort\", onAbort);\n };\n const onAbort = () => {\n cleanup();\n reject(createAbortError());\n };\n signal == null ? void 0 : signal.addEventListener(\"abort\", onAbort);\n });\n}\nfunction createAbortError() {\n return new DOMException(\"Delay was aborted\", \"AbortError\");\n}\n\n// src/delayed-promise.ts\nvar DelayedPromise = class {\n constructor() {\n this.status = { type: \"pending\" };\n this._resolve = void 0;\n this._reject = void 0;\n }\n get promise() {\n if (this._promise) {\n return this._promise;\n }\n this._promise = new Promise((resolve2, reject) => {\n if (this.status.type === \"resolved\") {\n resolve2(this.status.value);\n } else if (this.status.type === \"rejected\") {\n reject(this.status.error);\n }\n this._resolve = resolve2;\n this._reject = reject;\n });\n return this._promise;\n }\n resolve(value) {\n var _a2;\n this.status = { type: \"resolved\", value };\n if (this._promise) {\n (_a2 = this._resolve) == null ? void 0 : _a2.call(this, value);\n }\n }\n reject(error) {\n var _a2;\n this.status = { type: \"rejected\", error };\n if (this._promise) {\n (_a2 = this._reject) == null ? void 0 : _a2.call(this, error);\n }\n }\n isResolved() {\n return this.status.type === \"resolved\";\n }\n isRejected() {\n return this.status.type === \"rejected\";\n }\n isPending() {\n return this.status.type === \"pending\";\n }\n};\n\n// src/extract-response-headers.ts\nfunction extractResponseHeaders(response) {\n return Object.fromEntries([...response.headers]);\n}\n\n// src/uint8-utils.ts\nvar { btoa, atob } = globalThis;\nfunction convertBase64ToUint8Array(base64String) {\n const base64Url = base64String.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const latin1string = atob(base64Url);\n return Uint8Array.from(latin1string, (byte) => byte.codePointAt(0));\n}\nfunction convertUint8ArrayToBase64(array) {\n let latin1string = \"\";\n for (let i = 0; i < array.length; i++) {\n latin1string += String.fromCodePoint(array[i]);\n }\n return btoa(latin1string);\n}\nfunction convertToBase64(value) {\n return value instanceof Uint8Array ? convertUint8ArrayToBase64(value) : value;\n}\n\n// src/convert-image-model-file-to-data-uri.ts\nfunction convertImageModelFileToDataUri(file) {\n if (file.type === \"url\") return file.url;\n return `data:${file.mediaType};base64,${typeof file.data === \"string\" ? file.data : convertUint8ArrayToBase64(file.data)}`;\n}\n\n// src/convert-to-form-data.ts\nfunction convertToFormData(input, options = {}) {\n const { useArrayBrackets = true } = options;\n const formData = new FormData();\n for (const [key, value] of Object.entries(input)) {\n if (value == null) {\n continue;\n }\n if (Array.isArray(value)) {\n if (value.length === 1) {\n formData.append(key, value[0]);\n continue;\n }\n const arrayKey = useArrayBrackets ? `${key}[]` : key;\n for (const item of value) {\n formData.append(arrayKey, item);\n }\n continue;\n }\n formData.append(key, value);\n }\n return formData;\n}\n\n// src/download-error.ts\nimport { AISDKError } from \"@ai-sdk/provider\";\nvar name = \"AI_DownloadError\";\nvar marker = `vercel.ai.error.${name}`;\nvar symbol = Symbol.for(marker);\nvar _a, _b;\nvar DownloadError = class extends (_b = AISDKError, _a = symbol, _b) {\n constructor({\n url,\n statusCode,\n statusText,\n cause,\n message = cause == null ? `Failed to download ${url}: ${statusCode} ${statusText}` : `Failed to download ${url}: ${cause}`\n }) {\n super({ name, message, cause });\n this[_a] = true;\n this.url = url;\n this.statusCode = statusCode;\n this.statusText = statusText;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker);\n }\n};\n\n// src/read-response-with-size-limit.ts\nvar DEFAULT_MAX_DOWNLOAD_SIZE = 2 * 1024 * 1024 * 1024;\nasync function readResponseWithSizeLimit({\n response,\n url,\n maxBytes = DEFAULT_MAX_DOWNLOAD_SIZE\n}) {\n const contentLength = response.headers.get(\"content-length\");\n if (contentLength != null) {\n const length = parseInt(contentLength, 10);\n if (!isNaN(length) && length > maxBytes) {\n throw new DownloadError({\n url,\n message: `Download of ${url} exceeded maximum size of ${maxBytes} bytes (Content-Length: ${length}).`\n });\n }\n }\n const body = response.body;\n if (body == null) {\n return new Uint8Array(0);\n }\n const reader = body.getReader();\n const chunks = [];\n let totalBytes = 0;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n totalBytes += value.length;\n if (totalBytes > maxBytes) {\n throw new DownloadError({\n url,\n message: `Download of ${url} exceeded maximum size of ${maxBytes} bytes.`\n });\n }\n chunks.push(value);\n }\n } finally {\n try {\n await reader.cancel();\n } finally {\n reader.releaseLock();\n }\n }\n const result = new Uint8Array(totalBytes);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n}\n\n// src/validate-download-url.ts\nfunction validateDownloadUrl(url) {\n let parsed;\n try {\n parsed = new URL(url);\n } catch (e) {\n throw new DownloadError({\n url,\n message: `Invalid URL: ${url}`\n });\n }\n if (parsed.protocol === \"data:\") {\n return;\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new DownloadError({\n url,\n message: `URL scheme must be http, https, or data, got ${parsed.protocol}`\n });\n }\n const hostname = parsed.hostname;\n if (!hostname) {\n throw new DownloadError({\n url,\n message: `URL must have a hostname`\n });\n }\n if (hostname === \"localhost\" || hostname.endsWith(\".local\") || hostname.endsWith(\".localhost\")) {\n throw new DownloadError({\n url,\n message: `URL with hostname ${hostname} is not allowed`\n });\n }\n if (hostname.startsWith(\"[\") && hostname.endsWith(\"]\")) {\n const ipv6 = hostname.slice(1, -1);\n if (isPrivateIPv6(ipv6)) {\n throw new DownloadError({\n url,\n message: `URL with IPv6 address ${hostname} is not allowed`\n });\n }\n return;\n }\n if (isIPv4(hostname)) {\n if (isPrivateIPv4(hostname)) {\n throw new DownloadError({\n url,\n message: `URL with IP address ${hostname} is not allowed`\n });\n }\n return;\n }\n}\nfunction isIPv4(hostname) {\n const parts = hostname.split(\".\");\n if (parts.length !== 4) return false;\n return parts.every((part) => {\n const num = Number(part);\n return Number.isInteger(num) && num >= 0 && num <= 255 && String(num) === part;\n });\n}\nfunction isPrivateIPv4(ip) {\n const parts = ip.split(\".\").map(Number);\n const [a, b] = parts;\n if (a === 0) return true;\n if (a === 10) return true;\n if (a === 127) return true;\n if (a === 169 && b === 254) return true;\n if (a === 172 && b >= 16 && b <= 31) return true;\n if (a === 192 && b === 168) return true;\n return false;\n}\nfunction isPrivateIPv6(ip) {\n const normalized = ip.toLowerCase();\n if (normalized === \"::1\") return true;\n if (normalized === \"::\") return true;\n if (normalized.startsWith(\"::ffff:\")) {\n const mappedPart = normalized.slice(7);\n if (isIPv4(mappedPart)) {\n return isPrivateIPv4(mappedPart);\n }\n const hexParts = mappedPart.split(\":\");\n if (hexParts.length === 2) {\n const high = parseInt(hexParts[0], 16);\n const low = parseInt(hexParts[1], 16);\n if (!isNaN(high) && !isNaN(low)) {\n const a = high >> 8 & 255;\n const b = high & 255;\n const c = low >> 8 & 255;\n const d = low & 255;\n return isPrivateIPv4(`${a}.${b}.${c}.${d}`);\n }\n }\n }\n if (normalized.startsWith(\"fc\") || normalized.startsWith(\"fd\")) return true;\n if (normalized.startsWith(\"fe80\")) return true;\n return false;\n}\n\n// src/download-blob.ts\nasync function downloadBlob(url, options) {\n var _a2, _b2;\n validateDownloadUrl(url);\n try {\n const response = await fetch(url, {\n signal: options == null ? void 0 : options.abortSignal\n });\n if (response.redirected) {\n validateDownloadUrl(response.url);\n }\n if (!response.ok) {\n throw new DownloadError({\n url,\n statusCode: response.status,\n statusText: response.statusText\n });\n }\n const data = await readResponseWithSizeLimit({\n response,\n url,\n maxBytes: (_a2 = options == null ? void 0 : options.maxBytes) != null ? _a2 : DEFAULT_MAX_DOWNLOAD_SIZE\n });\n const contentType = (_b2 = response.headers.get(\"content-type\")) != null ? _b2 : void 0;\n return new Blob([data], contentType ? { type: contentType } : void 0);\n } catch (error) {\n if (DownloadError.isInstance(error)) {\n throw error;\n }\n throw new DownloadError({ url, cause: error });\n }\n}\n\n// src/generate-id.ts\nimport { InvalidArgumentError } from \"@ai-sdk/provider\";\nvar createIdGenerator = ({\n prefix,\n size = 16,\n alphabet = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\",\n separator = \"-\"\n} = {}) => {\n const generator = () => {\n const alphabetLength = alphabet.length;\n const chars = new Array(size);\n for (let i = 0; i < size; i++) {\n chars[i] = alphabet[Math.random() * alphabetLength | 0];\n }\n return chars.join(\"\");\n };\n if (prefix == null) {\n return generator;\n }\n if (alphabet.includes(separator)) {\n throw new InvalidArgumentError({\n argument: \"separator\",\n message: `The separator \"${separator}\" must not be part of the alphabet \"${alphabet}\".`\n });\n }\n return () => `${prefix}${separator}${generator()}`;\n};\nvar generateId = createIdGenerator();\n\n// src/get-error-message.ts\nfunction getErrorMessage(error) {\n if (error == null) {\n return \"unknown error\";\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return JSON.stringify(error);\n}\n\n// src/get-from-api.ts\nimport { APICallError as APICallError2 } from \"@ai-sdk/provider\";\n\n// src/handle-fetch-error.ts\nimport { APICallError } from \"@ai-sdk/provider\";\n\n// src/is-abort-error.ts\nfunction isAbortError(error) {\n return (error instanceof Error || error instanceof DOMException) && (error.name === \"AbortError\" || error.name === \"ResponseAborted\" || // Next.js\n error.name === \"TimeoutError\");\n}\n\n// src/handle-fetch-error.ts\nvar FETCH_FAILED_ERROR_MESSAGES = [\"fetch failed\", \"failed to fetch\"];\nvar BUN_ERROR_CODES = [\n \"ConnectionRefused\",\n \"ConnectionClosed\",\n \"FailedToOpenSocket\",\n \"ECONNRESET\",\n \"ECONNREFUSED\",\n \"ETIMEDOUT\",\n \"EPIPE\"\n];\nfunction isBunNetworkError(error) {\n if (!(error instanceof Error)) {\n return false;\n }\n const code = error.code;\n if (typeof code === \"string\" && BUN_ERROR_CODES.includes(code)) {\n return true;\n }\n return false;\n}\nfunction handleFetchError({\n error,\n url,\n requestBodyValues\n}) {\n if (isAbortError(error)) {\n return error;\n }\n if (error instanceof TypeError && FETCH_FAILED_ERROR_MESSAGES.includes(error.message.toLowerCase())) {\n const cause = error.cause;\n if (cause != null) {\n return new APICallError({\n message: `Cannot connect to API: ${cause.message}`,\n cause,\n url,\n requestBodyValues,\n isRetryable: true\n // retry when network error\n });\n }\n }\n if (isBunNetworkError(error)) {\n return new APICallError({\n message: `Cannot connect to API: ${error.message}`,\n cause: error,\n url,\n requestBodyValues,\n isRetryable: true\n });\n }\n return error;\n}\n\n// src/get-runtime-environment-user-agent.ts\nfunction getRuntimeEnvironmentUserAgent(globalThisAny = globalThis) {\n var _a2, _b2, _c;\n if (globalThisAny.window) {\n return `runtime/browser`;\n }\n if ((_a2 = globalThisAny.navigator) == null ? void 0 : _a2.userAgent) {\n return `runtime/${globalThisAny.navigator.userAgent.toLowerCase()}`;\n }\n if ((_c = (_b2 = globalThisAny.process) == null ? void 0 : _b2.versions) == null ? void 0 : _c.node) {\n return `runtime/node.js/${globalThisAny.process.version.substring(0)}`;\n }\n if (globalThisAny.EdgeRuntime) {\n return `runtime/vercel-edge`;\n }\n return \"runtime/unknown\";\n}\n\n// src/normalize-headers.ts\nfunction normalizeHeaders(headers) {\n if (headers == null) {\n return {};\n }\n const normalized = {};\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n normalized[key.toLowerCase()] = value;\n });\n } else {\n if (!Array.isArray(headers)) {\n headers = Object.entries(headers);\n }\n for (const [key, value] of headers) {\n if (value != null) {\n normalized[key.toLowerCase()] = value;\n }\n }\n }\n return normalized;\n}\n\n// src/with-user-agent-suffix.ts\nfunction withUserAgentSuffix(headers, ...userAgentSuffixParts) {\n const normalizedHeaders = new Headers(normalizeHeaders(headers));\n const currentUserAgentHeader = normalizedHeaders.get(\"user-agent\") || \"\";\n normalizedHeaders.set(\n \"user-agent\",\n [currentUserAgentHeader, ...userAgentSuffixParts].filter(Boolean).join(\" \")\n );\n return Object.fromEntries(normalizedHeaders.entries());\n}\n\n// src/version.ts\nvar VERSION = true ? \"4.0.27\" : \"0.0.0-test\";\n\n// src/get-from-api.ts\nvar getOriginalFetch = () => globalThis.fetch;\nvar getFromApi = async ({\n url,\n headers = {},\n successfulResponseHandler,\n failedResponseHandler,\n abortSignal,\n fetch: fetch2 = getOriginalFetch()\n}) => {\n try {\n const response = await fetch2(url, {\n method: \"GET\",\n headers: withUserAgentSuffix(\n headers,\n `ai-sdk/provider-utils/${VERSION}`,\n getRuntimeEnvironmentUserAgent()\n ),\n signal: abortSignal\n });\n const responseHeaders = extractResponseHeaders(response);\n if (!response.ok) {\n let errorInformation;\n try {\n errorInformation = await failedResponseHandler({\n response,\n url,\n requestBodyValues: {}\n });\n } catch (error) {\n if (isAbortError(error) || APICallError2.isInstance(error)) {\n throw error;\n }\n throw new APICallError2({\n message: \"Failed to process error response\",\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: {}\n });\n }\n throw errorInformation.value;\n }\n try {\n return await successfulResponseHandler({\n response,\n url,\n requestBodyValues: {}\n });\n } catch (error) {\n if (error instanceof Error) {\n if (isAbortError(error) || APICallError2.isInstance(error)) {\n throw error;\n }\n }\n throw new APICallError2({\n message: \"Failed to process successful response\",\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: {}\n });\n }\n } catch (error) {\n throw handleFetchError({ error, url, requestBodyValues: {} });\n }\n};\n\n// src/inject-json-instruction.ts\nvar DEFAULT_SCHEMA_PREFIX = \"JSON schema:\";\nvar DEFAULT_SCHEMA_SUFFIX = \"You MUST answer with a JSON object that matches the JSON schema above.\";\nvar DEFAULT_GENERIC_SUFFIX = \"You MUST answer with JSON.\";\nfunction injectJsonInstruction({\n prompt,\n schema,\n schemaPrefix = schema != null ? DEFAULT_SCHEMA_PREFIX : void 0,\n schemaSuffix = schema != null ? DEFAULT_SCHEMA_SUFFIX : DEFAULT_GENERIC_SUFFIX\n}) {\n return [\n prompt != null && prompt.length > 0 ? prompt : void 0,\n prompt != null && prompt.length > 0 ? \"\" : void 0,\n // add a newline if prompt is not null\n schemaPrefix,\n schema != null ? JSON.stringify(schema) : void 0,\n schemaSuffix\n ].filter((line) => line != null).join(\"\\n\");\n}\nfunction injectJsonInstructionIntoMessages({\n messages,\n schema,\n schemaPrefix,\n schemaSuffix\n}) {\n var _a2, _b2;\n const systemMessage = ((_a2 = messages[0]) == null ? void 0 : _a2.role) === \"system\" ? { ...messages[0] } : { role: \"system\", content: \"\" };\n systemMessage.content = injectJsonInstruction({\n prompt: systemMessage.content,\n schema,\n schemaPrefix,\n schemaSuffix\n });\n return [\n systemMessage,\n ...((_b2 = messages[0]) == null ? void 0 : _b2.role) === \"system\" ? messages.slice(1) : messages\n ];\n}\n\n// src/is-non-nullable.ts\nfunction isNonNullable(value) {\n return value != null;\n}\n\n// src/is-url-supported.ts\nfunction isUrlSupported({\n mediaType,\n url,\n supportedUrls\n}) {\n url = url.toLowerCase();\n mediaType = mediaType.toLowerCase();\n return Object.entries(supportedUrls).map(([key, value]) => {\n const mediaType2 = key.toLowerCase();\n return mediaType2 === \"*\" || mediaType2 === \"*/*\" ? { mediaTypePrefix: \"\", regexes: value } : { mediaTypePrefix: mediaType2.replace(/\\*/, \"\"), regexes: value };\n }).filter(({ mediaTypePrefix }) => mediaType.startsWith(mediaTypePrefix)).flatMap(({ regexes }) => regexes).some((pattern) => pattern.test(url));\n}\n\n// src/load-api-key.ts\nimport { LoadAPIKeyError } from \"@ai-sdk/provider\";\nfunction loadApiKey({\n apiKey,\n environmentVariableName,\n apiKeyParameterName = \"apiKey\",\n description\n}) {\n if (typeof apiKey === \"string\") {\n return apiKey;\n }\n if (apiKey != null) {\n throw new LoadAPIKeyError({\n message: `${description} API key must be a string.`\n });\n }\n if (typeof process === \"undefined\") {\n throw new LoadAPIKeyError({\n message: `${description} API key is missing. Pass it using the '${apiKeyParameterName}' parameter. Environment variables are not supported in this environment.`\n });\n }\n apiKey = process.env[environmentVariableName];\n if (apiKey == null) {\n throw new LoadAPIKeyError({\n message: `${description} API key is missing. Pass it using the '${apiKeyParameterName}' parameter or the ${environmentVariableName} environment variable.`\n });\n }\n if (typeof apiKey !== \"string\") {\n throw new LoadAPIKeyError({\n message: `${description} API key must be a string. The value of the ${environmentVariableName} environment variable is not a string.`\n });\n }\n return apiKey;\n}\n\n// src/load-optional-setting.ts\nfunction loadOptionalSetting({\n settingValue,\n environmentVariableName\n}) {\n if (typeof settingValue === \"string\") {\n return settingValue;\n }\n if (settingValue != null || typeof process === \"undefined\") {\n return void 0;\n }\n settingValue = process.env[environmentVariableName];\n if (settingValue == null || typeof settingValue !== \"string\") {\n return void 0;\n }\n return settingValue;\n}\n\n// src/load-setting.ts\nimport { LoadSettingError } from \"@ai-sdk/provider\";\nfunction loadSetting({\n settingValue,\n environmentVariableName,\n settingName,\n description\n}) {\n if (typeof settingValue === \"string\") {\n return settingValue;\n }\n if (settingValue != null) {\n throw new LoadSettingError({\n message: `${description} setting must be a string.`\n });\n }\n if (typeof process === \"undefined\") {\n throw new LoadSettingError({\n message: `${description} setting is missing. Pass it using the '${settingName}' parameter. Environment variables are not supported in this environment.`\n });\n }\n settingValue = process.env[environmentVariableName];\n if (settingValue == null) {\n throw new LoadSettingError({\n message: `${description} setting is missing. Pass it using the '${settingName}' parameter or the ${environmentVariableName} environment variable.`\n });\n }\n if (typeof settingValue !== \"string\") {\n throw new LoadSettingError({\n message: `${description} setting must be a string. The value of the ${environmentVariableName} environment variable is not a string.`\n });\n }\n return settingValue;\n}\n\n// src/media-type-to-extension.ts\nfunction mediaTypeToExtension(mediaType) {\n var _a2;\n const [_type, subtype = \"\"] = mediaType.toLowerCase().split(\"/\");\n return (_a2 = {\n mpeg: \"mp3\",\n \"x-wav\": \"wav\",\n opus: \"ogg\",\n mp4: \"m4a\",\n \"x-m4a\": \"m4a\"\n }[subtype]) != null ? _a2 : subtype;\n}\n\n// src/parse-json.ts\nimport {\n JSONParseError,\n TypeValidationError as TypeValidationError3\n} from \"@ai-sdk/provider\";\n\n// src/secure-json-parse.ts\nvar suspectProtoRx = /\"(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])(?:p|\\\\u0070)(?:r|\\\\u0072)(?:o|\\\\u006[Ff])(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])\"\\s*:/;\nvar suspectConstructorRx = /\"(?:c|\\\\u0063)(?:o|\\\\u006[Ff])(?:n|\\\\u006[Ee])(?:s|\\\\u0073)(?:t|\\\\u0074)(?:r|\\\\u0072)(?:u|\\\\u0075)(?:c|\\\\u0063)(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:r|\\\\u0072)\"\\s*:/;\nfunction _parse(text) {\n const obj = JSON.parse(text);\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n if (suspectProtoRx.test(text) === false && suspectConstructorRx.test(text) === false) {\n return obj;\n }\n return filter(obj);\n}\nfunction filter(obj) {\n let next = [obj];\n while (next.length) {\n const nodes = next;\n next = [];\n for (const node of nodes) {\n if (Object.prototype.hasOwnProperty.call(node, \"__proto__\")) {\n throw new SyntaxError(\"Object contains forbidden prototype property\");\n }\n if (Object.prototype.hasOwnProperty.call(node, \"constructor\") && node.constructor !== null && typeof node.constructor === \"object\" && Object.prototype.hasOwnProperty.call(node.constructor, \"prototype\")) {\n throw new SyntaxError(\"Object contains forbidden prototype property\");\n }\n for (const key in node) {\n const value = node[key];\n if (value && typeof value === \"object\") {\n next.push(value);\n }\n }\n }\n }\n return obj;\n}\nfunction secureJsonParse(text) {\n const { stackTraceLimit } = Error;\n try {\n Error.stackTraceLimit = 0;\n } catch (e) {\n return _parse(text);\n }\n try {\n return _parse(text);\n } finally {\n Error.stackTraceLimit = stackTraceLimit;\n }\n}\n\n// src/validate-types.ts\nimport {\n TypeValidationError as TypeValidationError2\n} from \"@ai-sdk/provider\";\n\n// src/schema.ts\nimport { TypeValidationError } from \"@ai-sdk/provider\";\nimport * as z4 from \"zod/v4\";\n\n// src/add-additional-properties-to-json-schema.ts\nfunction addAdditionalPropertiesToJsonSchema(jsonSchema2) {\n if (jsonSchema2.type === \"object\" || Array.isArray(jsonSchema2.type) && jsonSchema2.type.includes(\"object\")) {\n jsonSchema2.additionalProperties = false;\n const { properties } = jsonSchema2;\n if (properties != null) {\n for (const key of Object.keys(properties)) {\n properties[key] = visit(properties[key]);\n }\n }\n }\n if (jsonSchema2.items != null) {\n jsonSchema2.items = Array.isArray(jsonSchema2.items) ? jsonSchema2.items.map(visit) : visit(jsonSchema2.items);\n }\n if (jsonSchema2.anyOf != null) {\n jsonSchema2.anyOf = jsonSchema2.anyOf.map(visit);\n }\n if (jsonSchema2.allOf != null) {\n jsonSchema2.allOf = jsonSchema2.allOf.map(visit);\n }\n if (jsonSchema2.oneOf != null) {\n jsonSchema2.oneOf = jsonSchema2.oneOf.map(visit);\n }\n const { definitions } = jsonSchema2;\n if (definitions != null) {\n for (const key of Object.keys(definitions)) {\n definitions[key] = visit(definitions[key]);\n }\n }\n return jsonSchema2;\n}\nfunction visit(def) {\n if (typeof def === \"boolean\") return def;\n return addAdditionalPropertiesToJsonSchema(def);\n}\n\n// src/to-json-schema/zod3-to-json-schema/options.ts\nvar ignoreOverride = /* @__PURE__ */ Symbol(\n \"Let zodToJsonSchema decide on which parser to use\"\n);\nvar defaultOptions = {\n name: void 0,\n $refStrategy: \"root\",\n basePath: [\"#\"],\n effectStrategy: \"input\",\n pipeStrategy: \"all\",\n dateStrategy: \"format:date-time\",\n mapStrategy: \"entries\",\n removeAdditionalStrategy: \"passthrough\",\n allowedAdditionalProperties: true,\n rejectedAdditionalProperties: false,\n definitionPath: \"definitions\",\n strictUnions: false,\n definitions: {},\n errorMessages: false,\n patternStrategy: \"escape\",\n applyRegexFlags: false,\n emailStrategy: \"format:email\",\n base64Strategy: \"contentEncoding:base64\",\n nameStrategy: \"ref\"\n};\nvar getDefaultOptions = (options) => typeof options === \"string\" ? {\n ...defaultOptions,\n name: options\n} : {\n ...defaultOptions,\n ...options\n};\n\n// src/to-json-schema/zod3-to-json-schema/select-parser.ts\nimport { ZodFirstPartyTypeKind as ZodFirstPartyTypeKind3 } from \"zod/v3\";\n\n// src/to-json-schema/zod3-to-json-schema/parsers/any.ts\nfunction parseAnyDef() {\n return {};\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/array.ts\nimport { ZodFirstPartyTypeKind } from \"zod/v3\";\nfunction parseArrayDef(def, refs) {\n var _a2, _b2, _c;\n const res = {\n type: \"array\"\n };\n if (((_a2 = def.type) == null ? void 0 : _a2._def) && ((_c = (_b2 = def.type) == null ? void 0 : _b2._def) == null ? void 0 : _c.typeName) !== ZodFirstPartyTypeKind.ZodAny) {\n res.items = parseDef(def.type._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\"]\n });\n }\n if (def.minLength) {\n res.minItems = def.minLength.value;\n }\n if (def.maxLength) {\n res.maxItems = def.maxLength.value;\n }\n if (def.exactLength) {\n res.minItems = def.exactLength.value;\n res.maxItems = def.exactLength.value;\n }\n return res;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/bigint.ts\nfunction parseBigintDef(def) {\n const res = {\n type: \"integer\",\n format: \"int64\"\n };\n if (!def.checks) return res;\n for (const check of def.checks) {\n switch (check.kind) {\n case \"min\":\n if (check.inclusive) {\n res.minimum = check.value;\n } else {\n res.exclusiveMinimum = check.value;\n }\n break;\n case \"max\":\n if (check.inclusive) {\n res.maximum = check.value;\n } else {\n res.exclusiveMaximum = check.value;\n }\n break;\n case \"multipleOf\":\n res.multipleOf = check.value;\n break;\n }\n }\n return res;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/boolean.ts\nfunction parseBooleanDef() {\n return { type: \"boolean\" };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/branded.ts\nfunction parseBrandedDef(_def, refs) {\n return parseDef(_def.type._def, refs);\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/catch.ts\nvar parseCatchDef = (def, refs) => {\n return parseDef(def.innerType._def, refs);\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/date.ts\nfunction parseDateDef(def, refs, overrideDateStrategy) {\n const strategy = overrideDateStrategy != null ? overrideDateStrategy : refs.dateStrategy;\n if (Array.isArray(strategy)) {\n return {\n anyOf: strategy.map((item, i) => parseDateDef(def, refs, item))\n };\n }\n switch (strategy) {\n case \"string\":\n case \"format:date-time\":\n return {\n type: \"string\",\n format: \"date-time\"\n };\n case \"format:date\":\n return {\n type: \"string\",\n format: \"date\"\n };\n case \"integer\":\n return integerDateParser(def);\n }\n}\nvar integerDateParser = (def) => {\n const res = {\n type: \"integer\",\n format: \"unix-time\"\n };\n for (const check of def.checks) {\n switch (check.kind) {\n case \"min\":\n res.minimum = check.value;\n break;\n case \"max\":\n res.maximum = check.value;\n break;\n }\n }\n return res;\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/default.ts\nfunction parseDefaultDef(_def, refs) {\n return {\n ...parseDef(_def.innerType._def, refs),\n default: _def.defaultValue()\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/effects.ts\nfunction parseEffectsDef(_def, refs) {\n return refs.effectStrategy === \"input\" ? parseDef(_def.schema._def, refs) : parseAnyDef();\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/enum.ts\nfunction parseEnumDef(def) {\n return {\n type: \"string\",\n enum: Array.from(def.values)\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/intersection.ts\nvar isJsonSchema7AllOfType = (type) => {\n if (\"type\" in type && type.type === \"string\") return false;\n return \"allOf\" in type;\n};\nfunction parseIntersectionDef(def, refs) {\n const allOf = [\n parseDef(def.left._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", \"0\"]\n }),\n parseDef(def.right._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", \"1\"]\n })\n ].filter((x) => !!x);\n const mergedAllOf = [];\n allOf.forEach((schema) => {\n if (isJsonSchema7AllOfType(schema)) {\n mergedAllOf.push(...schema.allOf);\n } else {\n let nestedSchema = schema;\n if (\"additionalProperties\" in schema && schema.additionalProperties === false) {\n const { additionalProperties, ...rest } = schema;\n nestedSchema = rest;\n }\n mergedAllOf.push(nestedSchema);\n }\n });\n return mergedAllOf.length ? { allOf: mergedAllOf } : void 0;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/literal.ts\nfunction parseLiteralDef(def) {\n const parsedType = typeof def.value;\n if (parsedType !== \"bigint\" && parsedType !== \"number\" && parsedType !== \"boolean\" && parsedType !== \"string\") {\n return {\n type: Array.isArray(def.value) ? \"array\" : \"object\"\n };\n }\n return {\n type: parsedType === \"bigint\" ? \"integer\" : parsedType,\n const: def.value\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/record.ts\nimport {\n ZodFirstPartyTypeKind as ZodFirstPartyTypeKind2\n} from \"zod/v3\";\n\n// src/to-json-schema/zod3-to-json-schema/parsers/string.ts\nvar emojiRegex = void 0;\nvar zodPatterns = {\n /**\n * `c` was changed to `[cC]` to replicate /i flag\n */\n cuid: /^[cC][^\\s-]{8,}$/,\n cuid2: /^[0-9a-z]+$/,\n ulid: /^[0-9A-HJKMNP-TV-Z]{26}$/,\n /**\n * `a-z` was added to replicate /i flag\n */\n email: /^(?!\\.)(?!.*\\.\\.)([a-zA-Z0-9_'+\\-\\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\\-]*\\.)+[a-zA-Z]{2,}$/,\n /**\n * Constructed a valid Unicode RegExp\n *\n * Lazily instantiate since this type of regex isn't supported\n * in all envs (e.g. React Native).\n *\n * See:\n * https://github.com/colinhacks/zod/issues/2433\n * Fix in Zod:\n * https://github.com/colinhacks/zod/commit/9340fd51e48576a75adc919bff65dbc4a5d4c99b\n */\n emoji: () => {\n if (emojiRegex === void 0) {\n emojiRegex = RegExp(\n \"^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$\",\n \"u\"\n );\n }\n return emojiRegex;\n },\n /**\n * Unused\n */\n uuid: /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/,\n /**\n * Unused\n */\n ipv4: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,\n ipv4Cidr: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/,\n /**\n * Unused\n */\n ipv6: /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,\n ipv6Cidr: /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,\n base64: /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,\n base64url: /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,\n nanoid: /^[a-zA-Z0-9_-]{21}$/,\n jwt: /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/\n};\nfunction parseStringDef(def, refs) {\n const res = {\n type: \"string\"\n };\n if (def.checks) {\n for (const check of def.checks) {\n switch (check.kind) {\n case \"min\":\n res.minLength = typeof res.minLength === \"number\" ? Math.max(res.minLength, check.value) : check.value;\n break;\n case \"max\":\n res.maxLength = typeof res.maxLength === \"number\" ? Math.min(res.maxLength, check.value) : check.value;\n break;\n case \"email\":\n switch (refs.emailStrategy) {\n case \"format:email\":\n addFormat(res, \"email\", check.message, refs);\n break;\n case \"format:idn-email\":\n addFormat(res, \"idn-email\", check.message, refs);\n break;\n case \"pattern:zod\":\n addPattern(res, zodPatterns.email, check.message, refs);\n break;\n }\n break;\n case \"url\":\n addFormat(res, \"uri\", check.message, refs);\n break;\n case \"uuid\":\n addFormat(res, \"uuid\", check.message, refs);\n break;\n case \"regex\":\n addPattern(res, check.regex, check.message, refs);\n break;\n case \"cuid\":\n addPattern(res, zodPatterns.cuid, check.message, refs);\n break;\n case \"cuid2\":\n addPattern(res, zodPatterns.cuid2, check.message, refs);\n break;\n case \"startsWith\":\n addPattern(\n res,\n RegExp(`^${escapeLiteralCheckValue(check.value, refs)}`),\n check.message,\n refs\n );\n break;\n case \"endsWith\":\n addPattern(\n res,\n RegExp(`${escapeLiteralCheckValue(check.value, refs)}$`),\n check.message,\n refs\n );\n break;\n case \"datetime\":\n addFormat(res, \"date-time\", check.message, refs);\n break;\n case \"date\":\n addFormat(res, \"date\", check.message, refs);\n break;\n case \"time\":\n addFormat(res, \"time\", check.message, refs);\n break;\n case \"duration\":\n addFormat(res, \"duration\", check.message, refs);\n break;\n case \"length\":\n res.minLength = typeof res.minLength === \"number\" ? Math.max(res.minLength, check.value) : check.value;\n res.maxLength = typeof res.maxLength === \"number\" ? Math.min(res.maxLength, check.value) : check.value;\n break;\n case \"includes\": {\n addPattern(\n res,\n RegExp(escapeLiteralCheckValue(check.value, refs)),\n check.message,\n refs\n );\n break;\n }\n case \"ip\": {\n if (check.version !== \"v6\") {\n addFormat(res, \"ipv4\", check.message, refs);\n }\n if (check.version !== \"v4\") {\n addFormat(res, \"ipv6\", check.message, refs);\n }\n break;\n }\n case \"base64url\":\n addPattern(res, zodPatterns.base64url, check.message, refs);\n break;\n case \"jwt\":\n addPattern(res, zodPatterns.jwt, check.message, refs);\n break;\n case \"cidr\": {\n if (check.version !== \"v6\") {\n addPattern(res, zodPatterns.ipv4Cidr, check.message, refs);\n }\n if (check.version !== \"v4\") {\n addPattern(res, zodPatterns.ipv6Cidr, check.message, refs);\n }\n break;\n }\n case \"emoji\":\n addPattern(res, zodPatterns.emoji(), check.message, refs);\n break;\n case \"ulid\": {\n addPattern(res, zodPatterns.ulid, check.message, refs);\n break;\n }\n case \"base64\": {\n switch (refs.base64Strategy) {\n case \"format:binary\": {\n addFormat(res, \"binary\", check.message, refs);\n break;\n }\n case \"contentEncoding:base64\": {\n res.contentEncoding = \"base64\";\n break;\n }\n case \"pattern:zod\": {\n addPattern(res, zodPatterns.base64, check.message, refs);\n break;\n }\n }\n break;\n }\n case \"nanoid\": {\n addPattern(res, zodPatterns.nanoid, check.message, refs);\n }\n case \"toLowerCase\":\n case \"toUpperCase\":\n case \"trim\":\n break;\n default:\n /* @__PURE__ */ ((_) => {\n })(check);\n }\n }\n }\n return res;\n}\nfunction escapeLiteralCheckValue(literal, refs) {\n return refs.patternStrategy === \"escape\" ? escapeNonAlphaNumeric(literal) : literal;\n}\nvar ALPHA_NUMERIC = new Set(\n \"ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789\"\n);\nfunction escapeNonAlphaNumeric(source) {\n let result = \"\";\n for (let i = 0; i < source.length; i++) {\n if (!ALPHA_NUMERIC.has(source[i])) {\n result += \"\\\\\";\n }\n result += source[i];\n }\n return result;\n}\nfunction addFormat(schema, value, message, refs) {\n var _a2;\n if (schema.format || ((_a2 = schema.anyOf) == null ? void 0 : _a2.some((x) => x.format))) {\n if (!schema.anyOf) {\n schema.anyOf = [];\n }\n if (schema.format) {\n schema.anyOf.push({\n format: schema.format\n });\n delete schema.format;\n }\n schema.anyOf.push({\n format: value,\n ...message && refs.errorMessages && { errorMessage: { format: message } }\n });\n } else {\n schema.format = value;\n }\n}\nfunction addPattern(schema, regex, message, refs) {\n var _a2;\n if (schema.pattern || ((_a2 = schema.allOf) == null ? void 0 : _a2.some((x) => x.pattern))) {\n if (!schema.allOf) {\n schema.allOf = [];\n }\n if (schema.pattern) {\n schema.allOf.push({\n pattern: schema.pattern\n });\n delete schema.pattern;\n }\n schema.allOf.push({\n pattern: stringifyRegExpWithFlags(regex, refs),\n ...message && refs.errorMessages && { errorMessage: { pattern: message } }\n });\n } else {\n schema.pattern = stringifyRegExpWithFlags(regex, refs);\n }\n}\nfunction stringifyRegExpWithFlags(regex, refs) {\n var _a2;\n if (!refs.applyRegexFlags || !regex.flags) {\n return regex.source;\n }\n const flags = {\n i: regex.flags.includes(\"i\"),\n // Case-insensitive\n m: regex.flags.includes(\"m\"),\n // `^` and `$` matches adjacent to newline characters\n s: regex.flags.includes(\"s\")\n // `.` matches newlines\n };\n const source = flags.i ? regex.source.toLowerCase() : regex.source;\n let pattern = \"\";\n let isEscaped = false;\n let inCharGroup = false;\n let inCharRange = false;\n for (let i = 0; i < source.length; i++) {\n if (isEscaped) {\n pattern += source[i];\n isEscaped = false;\n continue;\n }\n if (flags.i) {\n if (inCharGroup) {\n if (source[i].match(/[a-z]/)) {\n if (inCharRange) {\n pattern += source[i];\n pattern += `${source[i - 2]}-${source[i]}`.toUpperCase();\n inCharRange = false;\n } else if (source[i + 1] === \"-\" && ((_a2 = source[i + 2]) == null ? void 0 : _a2.match(/[a-z]/))) {\n pattern += source[i];\n inCharRange = true;\n } else {\n pattern += `${source[i]}${source[i].toUpperCase()}`;\n }\n continue;\n }\n } else if (source[i].match(/[a-z]/)) {\n pattern += `[${source[i]}${source[i].toUpperCase()}]`;\n continue;\n }\n }\n if (flags.m) {\n if (source[i] === \"^\") {\n pattern += `(^|(?<=[\\r\n]))`;\n continue;\n } else if (source[i] === \"$\") {\n pattern += `($|(?=[\\r\n]))`;\n continue;\n }\n }\n if (flags.s && source[i] === \".\") {\n pattern += inCharGroup ? `${source[i]}\\r\n` : `[${source[i]}\\r\n]`;\n continue;\n }\n pattern += source[i];\n if (source[i] === \"\\\\\") {\n isEscaped = true;\n } else if (inCharGroup && source[i] === \"]\") {\n inCharGroup = false;\n } else if (!inCharGroup && source[i] === \"[\") {\n inCharGroup = true;\n }\n }\n try {\n new RegExp(pattern);\n } catch (e) {\n console.warn(\n `Could not convert regex pattern at ${refs.currentPath.join(\n \"/\"\n )} to a flag-independent form! Falling back to the flag-ignorant source`\n );\n return regex.source;\n }\n return pattern;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/record.ts\nfunction parseRecordDef(def, refs) {\n var _a2, _b2, _c, _d, _e, _f;\n const schema = {\n type: \"object\",\n additionalProperties: (_a2 = parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"additionalProperties\"]\n })) != null ? _a2 : refs.allowedAdditionalProperties\n };\n if (((_b2 = def.keyType) == null ? void 0 : _b2._def.typeName) === ZodFirstPartyTypeKind2.ZodString && ((_c = def.keyType._def.checks) == null ? void 0 : _c.length)) {\n const { type, ...keyType } = parseStringDef(def.keyType._def, refs);\n return {\n ...schema,\n propertyNames: keyType\n };\n } else if (((_d = def.keyType) == null ? void 0 : _d._def.typeName) === ZodFirstPartyTypeKind2.ZodEnum) {\n return {\n ...schema,\n propertyNames: {\n enum: def.keyType._def.values\n }\n };\n } else if (((_e = def.keyType) == null ? void 0 : _e._def.typeName) === ZodFirstPartyTypeKind2.ZodBranded && def.keyType._def.type._def.typeName === ZodFirstPartyTypeKind2.ZodString && ((_f = def.keyType._def.type._def.checks) == null ? void 0 : _f.length)) {\n const { type, ...keyType } = parseBrandedDef(\n def.keyType._def,\n refs\n );\n return {\n ...schema,\n propertyNames: keyType\n };\n }\n return schema;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/map.ts\nfunction parseMapDef(def, refs) {\n if (refs.mapStrategy === \"record\") {\n return parseRecordDef(def, refs);\n }\n const keys = parseDef(def.keyType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", \"items\", \"0\"]\n }) || parseAnyDef();\n const values = parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", \"items\", \"1\"]\n }) || parseAnyDef();\n return {\n type: \"array\",\n maxItems: 125,\n items: {\n type: \"array\",\n items: [keys, values],\n minItems: 2,\n maxItems: 2\n }\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/native-enum.ts\nfunction parseNativeEnumDef(def) {\n const object = def.values;\n const actualKeys = Object.keys(def.values).filter((key) => {\n return typeof object[object[key]] !== \"number\";\n });\n const actualValues = actualKeys.map((key) => object[key]);\n const parsedTypes = Array.from(\n new Set(actualValues.map((values) => typeof values))\n );\n return {\n type: parsedTypes.length === 1 ? parsedTypes[0] === \"string\" ? \"string\" : \"number\" : [\"string\", \"number\"],\n enum: actualValues\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/never.ts\nfunction parseNeverDef() {\n return { not: parseAnyDef() };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/null.ts\nfunction parseNullDef() {\n return {\n type: \"null\"\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/union.ts\nvar primitiveMappings = {\n ZodString: \"string\",\n ZodNumber: \"number\",\n ZodBigInt: \"integer\",\n ZodBoolean: \"boolean\",\n ZodNull: \"null\"\n};\nfunction parseUnionDef(def, refs) {\n const options = def.options instanceof Map ? Array.from(def.options.values()) : def.options;\n if (options.every(\n (x) => x._def.typeName in primitiveMappings && (!x._def.checks || !x._def.checks.length)\n )) {\n const types = options.reduce((types2, x) => {\n const type = primitiveMappings[x._def.typeName];\n return type && !types2.includes(type) ? [...types2, type] : types2;\n }, []);\n return {\n type: types.length > 1 ? types : types[0]\n };\n } else if (options.every((x) => x._def.typeName === \"ZodLiteral\" && !x.description)) {\n const types = options.reduce(\n (acc, x) => {\n const type = typeof x._def.value;\n switch (type) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n return [...acc, type];\n case \"bigint\":\n return [...acc, \"integer\"];\n case \"object\":\n if (x._def.value === null) return [...acc, \"null\"];\n case \"symbol\":\n case \"undefined\":\n case \"function\":\n default:\n return acc;\n }\n },\n []\n );\n if (types.length === options.length) {\n const uniqueTypes = types.filter((x, i, a) => a.indexOf(x) === i);\n return {\n type: uniqueTypes.length > 1 ? uniqueTypes : uniqueTypes[0],\n enum: options.reduce(\n (acc, x) => {\n return acc.includes(x._def.value) ? acc : [...acc, x._def.value];\n },\n []\n )\n };\n }\n } else if (options.every((x) => x._def.typeName === \"ZodEnum\")) {\n return {\n type: \"string\",\n enum: options.reduce(\n (acc, x) => [\n ...acc,\n ...x._def.values.filter((x2) => !acc.includes(x2))\n ],\n []\n )\n };\n }\n return asAnyOf(def, refs);\n}\nvar asAnyOf = (def, refs) => {\n const anyOf = (def.options instanceof Map ? Array.from(def.options.values()) : def.options).map(\n (x, i) => parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"anyOf\", `${i}`]\n })\n ).filter(\n (x) => !!x && (!refs.strictUnions || typeof x === \"object\" && Object.keys(x).length > 0)\n );\n return anyOf.length ? { anyOf } : void 0;\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/nullable.ts\nfunction parseNullableDef(def, refs) {\n if ([\"ZodString\", \"ZodNumber\", \"ZodBigInt\", \"ZodBoolean\", \"ZodNull\"].includes(\n def.innerType._def.typeName\n ) && (!def.innerType._def.checks || !def.innerType._def.checks.length)) {\n return {\n type: [\n primitiveMappings[def.innerType._def.typeName],\n \"null\"\n ]\n };\n }\n const base = parseDef(def.innerType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"anyOf\", \"0\"]\n });\n return base && { anyOf: [base, { type: \"null\" }] };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/number.ts\nfunction parseNumberDef(def) {\n const res = {\n type: \"number\"\n };\n if (!def.checks) return res;\n for (const check of def.checks) {\n switch (check.kind) {\n case \"int\":\n res.type = \"integer\";\n break;\n case \"min\":\n if (check.inclusive) {\n res.minimum = check.value;\n } else {\n res.exclusiveMinimum = check.value;\n }\n break;\n case \"max\":\n if (check.inclusive) {\n res.maximum = check.value;\n } else {\n res.exclusiveMaximum = check.value;\n }\n break;\n case \"multipleOf\":\n res.multipleOf = check.value;\n break;\n }\n }\n return res;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/object.ts\nfunction parseObjectDef(def, refs) {\n const result = {\n type: \"object\",\n properties: {}\n };\n const required = [];\n const shape = def.shape();\n for (const propName in shape) {\n let propDef = shape[propName];\n if (propDef === void 0 || propDef._def === void 0) {\n continue;\n }\n const propOptional = safeIsOptional(propDef);\n const parsedDef = parseDef(propDef._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"properties\", propName],\n propertyPath: [...refs.currentPath, \"properties\", propName]\n });\n if (parsedDef === void 0) {\n continue;\n }\n result.properties[propName] = parsedDef;\n if (!propOptional) {\n required.push(propName);\n }\n }\n if (required.length) {\n result.required = required;\n }\n const additionalProperties = decideAdditionalProperties(def, refs);\n if (additionalProperties !== void 0) {\n result.additionalProperties = additionalProperties;\n }\n return result;\n}\nfunction decideAdditionalProperties(def, refs) {\n if (def.catchall._def.typeName !== \"ZodNever\") {\n return parseDef(def.catchall._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"additionalProperties\"]\n });\n }\n switch (def.unknownKeys) {\n case \"passthrough\":\n return refs.allowedAdditionalProperties;\n case \"strict\":\n return refs.rejectedAdditionalProperties;\n case \"strip\":\n return refs.removeAdditionalStrategy === \"strict\" ? refs.allowedAdditionalProperties : refs.rejectedAdditionalProperties;\n }\n}\nfunction safeIsOptional(schema) {\n try {\n return schema.isOptional();\n } catch (e) {\n return true;\n }\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/optional.ts\nvar parseOptionalDef = (def, refs) => {\n var _a2;\n if (refs.currentPath.toString() === ((_a2 = refs.propertyPath) == null ? void 0 : _a2.toString())) {\n return parseDef(def.innerType._def, refs);\n }\n const innerSchema = parseDef(def.innerType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"anyOf\", \"1\"]\n });\n return innerSchema ? { anyOf: [{ not: parseAnyDef() }, innerSchema] } : parseAnyDef();\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/pipeline.ts\nvar parsePipelineDef = (def, refs) => {\n if (refs.pipeStrategy === \"input\") {\n return parseDef(def.in._def, refs);\n } else if (refs.pipeStrategy === \"output\") {\n return parseDef(def.out._def, refs);\n }\n const a = parseDef(def.in._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", \"0\"]\n });\n const b = parseDef(def.out._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", a ? \"1\" : \"0\"]\n });\n return {\n allOf: [a, b].filter((x) => x !== void 0)\n };\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/promise.ts\nfunction parsePromiseDef(def, refs) {\n return parseDef(def.type._def, refs);\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/set.ts\nfunction parseSetDef(def, refs) {\n const items = parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\"]\n });\n const schema = {\n type: \"array\",\n uniqueItems: true,\n items\n };\n if (def.minSize) {\n schema.minItems = def.minSize.value;\n }\n if (def.maxSize) {\n schema.maxItems = def.maxSize.value;\n }\n return schema;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/tuple.ts\nfunction parseTupleDef(def, refs) {\n if (def.rest) {\n return {\n type: \"array\",\n minItems: def.items.length,\n items: def.items.map(\n (x, i) => parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", `${i}`]\n })\n ).reduce(\n (acc, x) => x === void 0 ? acc : [...acc, x],\n []\n ),\n additionalItems: parseDef(def.rest._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"additionalItems\"]\n })\n };\n } else {\n return {\n type: \"array\",\n minItems: def.items.length,\n maxItems: def.items.length,\n items: def.items.map(\n (x, i) => parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", `${i}`]\n })\n ).reduce(\n (acc, x) => x === void 0 ? acc : [...acc, x],\n []\n )\n };\n }\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/undefined.ts\nfunction parseUndefinedDef() {\n return {\n not: parseAnyDef()\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/unknown.ts\nfunction parseUnknownDef() {\n return parseAnyDef();\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/readonly.ts\nvar parseReadonlyDef = (def, refs) => {\n return parseDef(def.innerType._def, refs);\n};\n\n// src/to-json-schema/zod3-to-json-schema/select-parser.ts\nvar selectParser = (def, typeName, refs) => {\n switch (typeName) {\n case ZodFirstPartyTypeKind3.ZodString:\n return parseStringDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodNumber:\n return parseNumberDef(def);\n case ZodFirstPartyTypeKind3.ZodObject:\n return parseObjectDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodBigInt:\n return parseBigintDef(def);\n case ZodFirstPartyTypeKind3.ZodBoolean:\n return parseBooleanDef();\n case ZodFirstPartyTypeKind3.ZodDate:\n return parseDateDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodUndefined:\n return parseUndefinedDef();\n case ZodFirstPartyTypeKind3.ZodNull:\n return parseNullDef();\n case ZodFirstPartyTypeKind3.ZodArray:\n return parseArrayDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodUnion:\n case ZodFirstPartyTypeKind3.ZodDiscriminatedUnion:\n return parseUnionDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodIntersection:\n return parseIntersectionDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodTuple:\n return parseTupleDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodRecord:\n return parseRecordDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodLiteral:\n return parseLiteralDef(def);\n case ZodFirstPartyTypeKind3.ZodEnum:\n return parseEnumDef(def);\n case ZodFirstPartyTypeKind3.ZodNativeEnum:\n return parseNativeEnumDef(def);\n case ZodFirstPartyTypeKind3.ZodNullable:\n return parseNullableDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodOptional:\n return parseOptionalDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodMap:\n return parseMapDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodSet:\n return parseSetDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodLazy:\n return () => def.getter()._def;\n case ZodFirstPartyTypeKind3.ZodPromise:\n return parsePromiseDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodNaN:\n case ZodFirstPartyTypeKind3.ZodNever:\n return parseNeverDef();\n case ZodFirstPartyTypeKind3.ZodEffects:\n return parseEffectsDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodAny:\n return parseAnyDef();\n case ZodFirstPartyTypeKind3.ZodUnknown:\n return parseUnknownDef();\n case ZodFirstPartyTypeKind3.ZodDefault:\n return parseDefaultDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodBranded:\n return parseBrandedDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodReadonly:\n return parseReadonlyDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodCatch:\n return parseCatchDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodPipeline:\n return parsePipelineDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodFunction:\n case ZodFirstPartyTypeKind3.ZodVoid:\n case ZodFirstPartyTypeKind3.ZodSymbol:\n return void 0;\n default:\n return /* @__PURE__ */ ((_) => void 0)(typeName);\n }\n};\n\n// src/to-json-schema/zod3-to-json-schema/get-relative-path.ts\nvar getRelativePath = (pathA, pathB) => {\n let i = 0;\n for (; i < pathA.length && i < pathB.length; i++) {\n if (pathA[i] !== pathB[i]) break;\n }\n return [(pathA.length - i).toString(), ...pathB.slice(i)].join(\"/\");\n};\n\n// src/to-json-schema/zod3-to-json-schema/parse-def.ts\nfunction parseDef(def, refs, forceResolution = false) {\n var _a2;\n const seenItem = refs.seen.get(def);\n if (refs.override) {\n const overrideResult = (_a2 = refs.override) == null ? void 0 : _a2.call(\n refs,\n def,\n refs,\n seenItem,\n forceResolution\n );\n if (overrideResult !== ignoreOverride) {\n return overrideResult;\n }\n }\n if (seenItem && !forceResolution) {\n const seenSchema = get$ref(seenItem, refs);\n if (seenSchema !== void 0) {\n return seenSchema;\n }\n }\n const newItem = { def, path: refs.currentPath, jsonSchema: void 0 };\n refs.seen.set(def, newItem);\n const jsonSchemaOrGetter = selectParser(def, def.typeName, refs);\n const jsonSchema2 = typeof jsonSchemaOrGetter === \"function\" ? parseDef(jsonSchemaOrGetter(), refs) : jsonSchemaOrGetter;\n if (jsonSchema2) {\n addMeta(def, refs, jsonSchema2);\n }\n if (refs.postProcess) {\n const postProcessResult = refs.postProcess(jsonSchema2, def, refs);\n newItem.jsonSchema = jsonSchema2;\n return postProcessResult;\n }\n newItem.jsonSchema = jsonSchema2;\n return jsonSchema2;\n}\nvar get$ref = (item, refs) => {\n switch (refs.$refStrategy) {\n case \"root\":\n return { $ref: item.path.join(\"/\") };\n case \"relative\":\n return { $ref: getRelativePath(refs.currentPath, item.path) };\n case \"none\":\n case \"seen\": {\n if (item.path.length < refs.currentPath.length && item.path.every((value, index) => refs.currentPath[index] === value)) {\n console.warn(\n `Recursive reference detected at ${refs.currentPath.join(\n \"/\"\n )}! Defaulting to any`\n );\n return parseAnyDef();\n }\n return refs.$refStrategy === \"seen\" ? parseAnyDef() : void 0;\n }\n }\n};\nvar addMeta = (def, refs, jsonSchema2) => {\n if (def.description) {\n jsonSchema2.description = def.description;\n }\n return jsonSchema2;\n};\n\n// src/to-json-schema/zod3-to-json-schema/refs.ts\nvar getRefs = (options) => {\n const _options = getDefaultOptions(options);\n const currentPath = _options.name !== void 0 ? [..._options.basePath, _options.definitionPath, _options.name] : _options.basePath;\n return {\n ..._options,\n currentPath,\n propertyPath: void 0,\n seen: new Map(\n Object.entries(_options.definitions).map(([name2, def]) => [\n def._def,\n {\n def: def._def,\n path: [..._options.basePath, _options.definitionPath, name2],\n // Resolution of references will be forced even though seen, so it's ok that the schema is undefined here for now.\n jsonSchema: void 0\n }\n ])\n )\n };\n};\n\n// src/to-json-schema/zod3-to-json-schema/zod3-to-json-schema.ts\nvar zod3ToJsonSchema = (schema, options) => {\n var _a2;\n const refs = getRefs(options);\n let definitions = typeof options === \"object\" && options.definitions ? Object.entries(options.definitions).reduce(\n (acc, [name3, schema2]) => {\n var _a3;\n return {\n ...acc,\n [name3]: (_a3 = parseDef(\n schema2._def,\n {\n ...refs,\n currentPath: [...refs.basePath, refs.definitionPath, name3]\n },\n true\n )) != null ? _a3 : parseAnyDef()\n };\n },\n {}\n ) : void 0;\n const name2 = typeof options === \"string\" ? options : (options == null ? void 0 : options.nameStrategy) === \"title\" ? void 0 : options == null ? void 0 : options.name;\n const main = (_a2 = parseDef(\n schema._def,\n name2 === void 0 ? refs : {\n ...refs,\n currentPath: [...refs.basePath, refs.definitionPath, name2]\n },\n false\n )) != null ? _a2 : parseAnyDef();\n const title = typeof options === \"object\" && options.name !== void 0 && options.nameStrategy === \"title\" ? options.name : void 0;\n if (title !== void 0) {\n main.title = title;\n }\n const combined = name2 === void 0 ? definitions ? {\n ...main,\n [refs.definitionPath]: definitions\n } : main : {\n $ref: [\n ...refs.$refStrategy === \"relative\" ? [] : refs.basePath,\n refs.definitionPath,\n name2\n ].join(\"/\"),\n [refs.definitionPath]: {\n ...definitions,\n [name2]: main\n }\n };\n combined.$schema = \"http://json-schema.org/draft-07/schema#\";\n return combined;\n};\n\n// src/schema.ts\nvar schemaSymbol = /* @__PURE__ */ Symbol.for(\"vercel.ai.schema\");\nfunction lazySchema(createSchema) {\n let schema;\n return () => {\n if (schema == null) {\n schema = createSchema();\n }\n return schema;\n };\n}\nfunction jsonSchema(jsonSchema2, {\n validate\n} = {}) {\n return {\n [schemaSymbol]: true,\n _type: void 0,\n // should never be used directly\n get jsonSchema() {\n if (typeof jsonSchema2 === \"function\") {\n jsonSchema2 = jsonSchema2();\n }\n return jsonSchema2;\n },\n validate\n };\n}\nfunction isSchema(value) {\n return typeof value === \"object\" && value !== null && schemaSymbol in value && value[schemaSymbol] === true && \"jsonSchema\" in value && \"validate\" in value;\n}\nfunction asSchema(schema) {\n return schema == null ? jsonSchema({ properties: {}, additionalProperties: false }) : isSchema(schema) ? schema : \"~standard\" in schema ? schema[\"~standard\"].vendor === \"zod\" ? zodSchema(schema) : standardSchema(schema) : schema();\n}\nfunction standardSchema(standardSchema2) {\n return jsonSchema(\n () => addAdditionalPropertiesToJsonSchema(\n standardSchema2[\"~standard\"].jsonSchema.input({\n target: \"draft-07\"\n })\n ),\n {\n validate: async (value) => {\n const result = await standardSchema2[\"~standard\"].validate(value);\n return \"value\" in result ? { success: true, value: result.value } : {\n success: false,\n error: new TypeValidationError({\n value,\n cause: result.issues\n })\n };\n }\n }\n );\n}\nfunction zod3Schema(zodSchema2, options) {\n var _a2;\n const useReferences = (_a2 = options == null ? void 0 : options.useReferences) != null ? _a2 : false;\n return jsonSchema(\n // defer json schema creation to avoid unnecessary computation when only validation is needed\n () => zod3ToJsonSchema(zodSchema2, {\n $refStrategy: useReferences ? \"root\" : \"none\"\n }),\n {\n validate: async (value) => {\n const result = await zodSchema2.safeParseAsync(value);\n return result.success ? { success: true, value: result.data } : { success: false, error: result.error };\n }\n }\n );\n}\nfunction zod4Schema(zodSchema2, options) {\n var _a2;\n const useReferences = (_a2 = options == null ? void 0 : options.useReferences) != null ? _a2 : false;\n return jsonSchema(\n // defer json schema creation to avoid unnecessary computation when only validation is needed\n () => addAdditionalPropertiesToJsonSchema(\n z4.toJSONSchema(zodSchema2, {\n target: \"draft-7\",\n io: \"input\",\n reused: useReferences ? \"ref\" : \"inline\"\n })\n ),\n {\n validate: async (value) => {\n const result = await z4.safeParseAsync(zodSchema2, value);\n return result.success ? { success: true, value: result.data } : { success: false, error: result.error };\n }\n }\n );\n}\nfunction isZod4Schema(zodSchema2) {\n return \"_zod\" in zodSchema2;\n}\nfunction zodSchema(zodSchema2, options) {\n if (isZod4Schema(zodSchema2)) {\n return zod4Schema(zodSchema2, options);\n } else {\n return zod3Schema(zodSchema2, options);\n }\n}\n\n// src/validate-types.ts\nasync function validateTypes({\n value,\n schema,\n context\n}) {\n const result = await safeValidateTypes({ value, schema, context });\n if (!result.success) {\n throw TypeValidationError2.wrap({ value, cause: result.error, context });\n }\n return result.value;\n}\nasync function safeValidateTypes({\n value,\n schema,\n context\n}) {\n const actualSchema = asSchema(schema);\n try {\n if (actualSchema.validate == null) {\n return { success: true, value, rawValue: value };\n }\n const result = await actualSchema.validate(value);\n if (result.success) {\n return { success: true, value: result.value, rawValue: value };\n }\n return {\n success: false,\n error: TypeValidationError2.wrap({ value, cause: result.error, context }),\n rawValue: value\n };\n } catch (error) {\n return {\n success: false,\n error: TypeValidationError2.wrap({ value, cause: error, context }),\n rawValue: value\n };\n }\n}\n\n// src/parse-json.ts\nasync function parseJSON({\n text,\n schema\n}) {\n try {\n const value = secureJsonParse(text);\n if (schema == null) {\n return value;\n }\n return validateTypes({ value, schema });\n } catch (error) {\n if (JSONParseError.isInstance(error) || TypeValidationError3.isInstance(error)) {\n throw error;\n }\n throw new JSONParseError({ text, cause: error });\n }\n}\nasync function safeParseJSON({\n text,\n schema\n}) {\n try {\n const value = secureJsonParse(text);\n if (schema == null) {\n return { success: true, value, rawValue: value };\n }\n return await safeValidateTypes({ value, schema });\n } catch (error) {\n return {\n success: false,\n error: JSONParseError.isInstance(error) ? error : new JSONParseError({ text, cause: error }),\n rawValue: void 0\n };\n }\n}\nfunction isParsableJson(input) {\n try {\n secureJsonParse(input);\n return true;\n } catch (e) {\n return false;\n }\n}\n\n// src/parse-json-event-stream.ts\nimport {\n EventSourceParserStream\n} from \"eventsource-parser/stream\";\nfunction parseJsonEventStream({\n stream,\n schema\n}) {\n return stream.pipeThrough(new TextDecoderStream()).pipeThrough(new EventSourceParserStream()).pipeThrough(\n new TransformStream({\n async transform({ data }, controller) {\n if (data === \"[DONE]\") {\n return;\n }\n controller.enqueue(await safeParseJSON({ text: data, schema }));\n }\n })\n );\n}\n\n// src/parse-provider-options.ts\nimport { InvalidArgumentError as InvalidArgumentError2 } from \"@ai-sdk/provider\";\nasync function parseProviderOptions({\n provider,\n providerOptions,\n schema\n}) {\n if ((providerOptions == null ? void 0 : providerOptions[provider]) == null) {\n return void 0;\n }\n const parsedProviderOptions = await safeValidateTypes({\n value: providerOptions[provider],\n schema\n });\n if (!parsedProviderOptions.success) {\n throw new InvalidArgumentError2({\n argument: \"providerOptions\",\n message: `invalid ${provider} provider options`,\n cause: parsedProviderOptions.error\n });\n }\n return parsedProviderOptions.value;\n}\n\n// src/post-to-api.ts\nimport { APICallError as APICallError3 } from \"@ai-sdk/provider\";\nvar getOriginalFetch2 = () => globalThis.fetch;\nvar postJsonToApi = async ({\n url,\n headers,\n body,\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch: fetch2\n}) => postToApi({\n url,\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n body: {\n content: JSON.stringify(body),\n values: body\n },\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch: fetch2\n});\nvar postFormDataToApi = async ({\n url,\n headers,\n formData,\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch: fetch2\n}) => postToApi({\n url,\n headers,\n body: {\n content: formData,\n values: Object.fromEntries(formData.entries())\n },\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch: fetch2\n});\nvar postToApi = async ({\n url,\n headers = {},\n body,\n successfulResponseHandler,\n failedResponseHandler,\n abortSignal,\n fetch: fetch2 = getOriginalFetch2()\n}) => {\n try {\n const response = await fetch2(url, {\n method: \"POST\",\n headers: withUserAgentSuffix(\n headers,\n `ai-sdk/provider-utils/${VERSION}`,\n getRuntimeEnvironmentUserAgent()\n ),\n body: body.content,\n signal: abortSignal\n });\n const responseHeaders = extractResponseHeaders(response);\n if (!response.ok) {\n let errorInformation;\n try {\n errorInformation = await failedResponseHandler({\n response,\n url,\n requestBodyValues: body.values\n });\n } catch (error) {\n if (isAbortError(error) || APICallError3.isInstance(error)) {\n throw error;\n }\n throw new APICallError3({\n message: \"Failed to process error response\",\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: body.values\n });\n }\n throw errorInformation.value;\n }\n try {\n return await successfulResponseHandler({\n response,\n url,\n requestBodyValues: body.values\n });\n } catch (error) {\n if (error instanceof Error) {\n if (isAbortError(error) || APICallError3.isInstance(error)) {\n throw error;\n }\n }\n throw new APICallError3({\n message: \"Failed to process successful response\",\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: body.values\n });\n }\n } catch (error) {\n throw handleFetchError({ error, url, requestBodyValues: body.values });\n }\n};\n\n// src/types/tool.ts\nfunction tool(tool2) {\n return tool2;\n}\nfunction dynamicTool(tool2) {\n return { ...tool2, type: \"dynamic\" };\n}\n\n// src/provider-tool-factory.ts\nfunction createProviderToolFactory({\n id,\n inputSchema\n}) {\n return ({\n execute,\n outputSchema,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n ...args\n }) => tool({\n type: \"provider\",\n id,\n args,\n inputSchema,\n outputSchema,\n execute,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable\n });\n}\nfunction createProviderToolFactoryWithOutputSchema({\n id,\n inputSchema,\n outputSchema,\n supportsDeferredResults\n}) {\n return ({\n execute,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n ...args\n }) => tool({\n type: \"provider\",\n id,\n args,\n inputSchema,\n outputSchema,\n execute,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n supportsDeferredResults\n });\n}\n\n// src/remove-undefined-entries.ts\nfunction removeUndefinedEntries(record) {\n return Object.fromEntries(\n Object.entries(record).filter(([_key, value]) => value != null)\n );\n}\n\n// src/resolve.ts\nasync function resolve(value) {\n if (typeof value === \"function\") {\n value = value();\n }\n return Promise.resolve(value);\n}\n\n// src/response-handler.ts\nimport { APICallError as APICallError4, EmptyResponseBodyError } from \"@ai-sdk/provider\";\nvar createJsonErrorResponseHandler = ({\n errorSchema,\n errorToMessage,\n isRetryable\n}) => async ({ response, url, requestBodyValues }) => {\n const responseBody = await response.text();\n const responseHeaders = extractResponseHeaders(response);\n if (responseBody.trim() === \"\") {\n return {\n responseHeaders,\n value: new APICallError4({\n message: response.statusText,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n isRetryable: isRetryable == null ? void 0 : isRetryable(response)\n })\n };\n }\n try {\n const parsedError = await parseJSON({\n text: responseBody,\n schema: errorSchema\n });\n return {\n responseHeaders,\n value: new APICallError4({\n message: errorToMessage(parsedError),\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n data: parsedError,\n isRetryable: isRetryable == null ? void 0 : isRetryable(response, parsedError)\n })\n };\n } catch (parseError) {\n return {\n responseHeaders,\n value: new APICallError4({\n message: response.statusText,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n isRetryable: isRetryable == null ? void 0 : isRetryable(response)\n })\n };\n }\n};\nvar createEventSourceResponseHandler = (chunkSchema) => async ({ response }) => {\n const responseHeaders = extractResponseHeaders(response);\n if (response.body == null) {\n throw new EmptyResponseBodyError({});\n }\n return {\n responseHeaders,\n value: parseJsonEventStream({\n stream: response.body,\n schema: chunkSchema\n })\n };\n};\nvar createJsonResponseHandler = (responseSchema) => async ({ response, url, requestBodyValues }) => {\n const responseBody = await response.text();\n const parsedResult = await safeParseJSON({\n text: responseBody,\n schema: responseSchema\n });\n const responseHeaders = extractResponseHeaders(response);\n if (!parsedResult.success) {\n throw new APICallError4({\n message: \"Invalid JSON response\",\n cause: parsedResult.error,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n url,\n requestBodyValues\n });\n }\n return {\n responseHeaders,\n value: parsedResult.value,\n rawValue: parsedResult.rawValue\n };\n};\nvar createBinaryResponseHandler = () => async ({ response, url, requestBodyValues }) => {\n const responseHeaders = extractResponseHeaders(response);\n if (!response.body) {\n throw new APICallError4({\n message: \"Response body is empty\",\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody: void 0\n });\n }\n try {\n const buffer = await response.arrayBuffer();\n return {\n responseHeaders,\n value: new Uint8Array(buffer)\n };\n } catch (error) {\n throw new APICallError4({\n message: \"Failed to read response as array buffer\",\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody: void 0,\n cause: error\n });\n }\n};\nvar createStatusCodeErrorResponseHandler = () => async ({ response, url, requestBodyValues }) => {\n const responseHeaders = extractResponseHeaders(response);\n const responseBody = await response.text();\n return {\n responseHeaders,\n value: new APICallError4({\n message: response.statusText,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody\n })\n };\n};\n\n// src/strip-file-extension.ts\nfunction stripFileExtension(filename) {\n const firstDotIndex = filename.indexOf(\".\");\n return firstDotIndex === -1 ? filename : filename.slice(0, firstDotIndex);\n}\n\n// src/without-trailing-slash.ts\nfunction withoutTrailingSlash(url) {\n return url == null ? void 0 : url.replace(/\\/$/, \"\");\n}\n\n// src/is-async-iterable.ts\nfunction isAsyncIterable(obj) {\n return obj != null && typeof obj[Symbol.asyncIterator] === \"function\";\n}\n\n// src/types/execute-tool.ts\nasync function* executeTool({\n execute,\n input,\n options\n}) {\n const result = execute(input, options);\n if (isAsyncIterable(result)) {\n let lastOutput;\n for await (const output of result) {\n lastOutput = output;\n yield { type: \"preliminary\", output };\n }\n yield { type: \"final\", output: lastOutput };\n } else {\n yield { type: \"final\", output: await result };\n }\n}\n\n// src/index.ts\nimport {\n EventSourceParserStream as EventSourceParserStream2\n} from \"eventsource-parser/stream\";\nexport {\n DEFAULT_MAX_DOWNLOAD_SIZE,\n DelayedPromise,\n DownloadError,\n EventSourceParserStream2 as EventSourceParserStream,\n VERSION,\n asSchema,\n combineHeaders,\n convertAsyncIteratorToReadableStream,\n convertBase64ToUint8Array,\n convertImageModelFileToDataUri,\n convertToBase64,\n convertToFormData,\n convertUint8ArrayToBase64,\n createBinaryResponseHandler,\n createEventSourceResponseHandler,\n createIdGenerator,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n createProviderToolFactory,\n createProviderToolFactoryWithOutputSchema,\n createStatusCodeErrorResponseHandler,\n createToolNameMapping,\n delay,\n downloadBlob,\n dynamicTool,\n executeTool,\n extractResponseHeaders,\n generateId,\n getErrorMessage,\n getFromApi,\n getRuntimeEnvironmentUserAgent,\n injectJsonInstructionIntoMessages,\n isAbortError,\n isNonNullable,\n isParsableJson,\n isUrlSupported,\n jsonSchema,\n lazySchema,\n loadApiKey,\n loadOptionalSetting,\n loadSetting,\n mediaTypeToExtension,\n normalizeHeaders,\n parseJSON,\n parseJsonEventStream,\n parseProviderOptions,\n postFormDataToApi,\n postJsonToApi,\n postToApi,\n readResponseWithSizeLimit,\n removeUndefinedEntries,\n resolve,\n safeParseJSON,\n safeValidateTypes,\n stripFileExtension,\n tool,\n validateDownloadUrl,\n validateTypes,\n withUserAgentSuffix,\n withoutTrailingSlash,\n zodSchema\n};\n//# sourceMappingURL=index.mjs.map","var __defProp = Object.defineProperty;\nvar __export = (target, all) => {\n for (var name21 in all)\n __defProp(target, name21, { get: all[name21], enumerable: true });\n};\n\n// src/index.ts\nimport { createGateway, gateway as gateway2 } from \"@ai-sdk/gateway\";\nimport {\n asSchema as asSchema5,\n createIdGenerator as createIdGenerator5,\n dynamicTool,\n generateId,\n jsonSchema,\n parseJsonEventStream as parseJsonEventStream3,\n tool,\n zodSchema as zodSchema3\n} from \"@ai-sdk/provider-utils\";\n\n// src/agent/tool-loop-agent.ts\nimport { validateTypes as validateTypes2 } from \"@ai-sdk/provider-utils\";\n\n// src/generate-text/generate-text.ts\nimport {\n createIdGenerator,\n getErrorMessage as getErrorMessage5,\n withUserAgentSuffix as withUserAgentSuffix2\n} from \"@ai-sdk/provider-utils\";\n\n// src/error/index.ts\nimport {\n AISDKError as AISDKError21,\n APICallError,\n EmptyResponseBodyError,\n InvalidPromptError,\n InvalidResponseDataError,\n JSONParseError,\n LoadAPIKeyError,\n LoadSettingError,\n NoContentGeneratedError,\n NoSuchModelError,\n TooManyEmbeddingValuesForCallError,\n TypeValidationError,\n UnsupportedFunctionalityError\n} from \"@ai-sdk/provider\";\n\n// src/error/invalid-argument-error.ts\nimport { AISDKError } from \"@ai-sdk/provider\";\nvar name = \"AI_InvalidArgumentError\";\nvar marker = `vercel.ai.error.${name}`;\nvar symbol = Symbol.for(marker);\nvar _a;\nvar InvalidArgumentError = class extends AISDKError {\n constructor({\n parameter,\n value,\n message\n }) {\n super({\n name,\n message: `Invalid argument for parameter ${parameter}: ${message}`\n });\n this[_a] = true;\n this.parameter = parameter;\n this.value = value;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker);\n }\n};\n_a = symbol;\n\n// src/error/invalid-stream-part-error.ts\nimport { AISDKError as AISDKError2 } from \"@ai-sdk/provider\";\nvar name2 = \"AI_InvalidStreamPartError\";\nvar marker2 = `vercel.ai.error.${name2}`;\nvar symbol2 = Symbol.for(marker2);\nvar _a2;\nvar InvalidStreamPartError = class extends AISDKError2 {\n constructor({\n chunk,\n message\n }) {\n super({ name: name2, message });\n this[_a2] = true;\n this.chunk = chunk;\n }\n static isInstance(error) {\n return AISDKError2.hasMarker(error, marker2);\n }\n};\n_a2 = symbol2;\n\n// src/error/invalid-tool-approval-error.ts\nimport { AISDKError as AISDKError3 } from \"@ai-sdk/provider\";\nvar name3 = \"AI_InvalidToolApprovalError\";\nvar marker3 = `vercel.ai.error.${name3}`;\nvar symbol3 = Symbol.for(marker3);\nvar _a3;\nvar InvalidToolApprovalError = class extends AISDKError3 {\n constructor({ approvalId }) {\n super({\n name: name3,\n message: `Tool approval response references unknown approvalId: \"${approvalId}\". No matching tool-approval-request found in message history.`\n });\n this[_a3] = true;\n this.approvalId = approvalId;\n }\n static isInstance(error) {\n return AISDKError3.hasMarker(error, marker3);\n }\n};\n_a3 = symbol3;\n\n// src/error/invalid-tool-input-error.ts\nimport { AISDKError as AISDKError4, getErrorMessage } from \"@ai-sdk/provider\";\nvar name4 = \"AI_InvalidToolInputError\";\nvar marker4 = `vercel.ai.error.${name4}`;\nvar symbol4 = Symbol.for(marker4);\nvar _a4;\nvar InvalidToolInputError = class extends AISDKError4 {\n constructor({\n toolInput,\n toolName,\n cause,\n message = `Invalid input for tool ${toolName}: ${getErrorMessage(cause)}`\n }) {\n super({ name: name4, message, cause });\n this[_a4] = true;\n this.toolInput = toolInput;\n this.toolName = toolName;\n }\n static isInstance(error) {\n return AISDKError4.hasMarker(error, marker4);\n }\n};\n_a4 = symbol4;\n\n// src/error/tool-call-not-found-for-approval-error.ts\nimport { AISDKError as AISDKError5 } from \"@ai-sdk/provider\";\nvar name5 = \"AI_ToolCallNotFoundForApprovalError\";\nvar marker5 = `vercel.ai.error.${name5}`;\nvar symbol5 = Symbol.for(marker5);\nvar _a5;\nvar ToolCallNotFoundForApprovalError = class extends AISDKError5 {\n constructor({\n toolCallId,\n approvalId\n }) {\n super({\n name: name5,\n message: `Tool call \"${toolCallId}\" not found for approval request \"${approvalId}\".`\n });\n this[_a5] = true;\n this.toolCallId = toolCallId;\n this.approvalId = approvalId;\n }\n static isInstance(error) {\n return AISDKError5.hasMarker(error, marker5);\n }\n};\n_a5 = symbol5;\n\n// src/error/missing-tool-result-error.ts\nimport { AISDKError as AISDKError6 } from \"@ai-sdk/provider\";\nvar name6 = \"AI_MissingToolResultsError\";\nvar marker6 = `vercel.ai.error.${name6}`;\nvar symbol6 = Symbol.for(marker6);\nvar _a6;\nvar MissingToolResultsError = class extends AISDKError6 {\n constructor({ toolCallIds }) {\n super({\n name: name6,\n message: `Tool result${toolCallIds.length > 1 ? \"s are\" : \" is\"} missing for tool call${toolCallIds.length > 1 ? \"s\" : \"\"} ${toolCallIds.join(\n \", \"\n )}.`\n });\n this[_a6] = true;\n this.toolCallIds = toolCallIds;\n }\n static isInstance(error) {\n return AISDKError6.hasMarker(error, marker6);\n }\n};\n_a6 = symbol6;\n\n// src/error/no-image-generated-error.ts\nimport { AISDKError as AISDKError7 } from \"@ai-sdk/provider\";\nvar name7 = \"AI_NoImageGeneratedError\";\nvar marker7 = `vercel.ai.error.${name7}`;\nvar symbol7 = Symbol.for(marker7);\nvar _a7;\nvar NoImageGeneratedError = class extends AISDKError7 {\n constructor({\n message = \"No image generated.\",\n cause,\n responses\n }) {\n super({ name: name7, message, cause });\n this[_a7] = true;\n this.responses = responses;\n }\n static isInstance(error) {\n return AISDKError7.hasMarker(error, marker7);\n }\n};\n_a7 = symbol7;\n\n// src/error/no-object-generated-error.ts\nimport { AISDKError as AISDKError8 } from \"@ai-sdk/provider\";\nvar name8 = \"AI_NoObjectGeneratedError\";\nvar marker8 = `vercel.ai.error.${name8}`;\nvar symbol8 = Symbol.for(marker8);\nvar _a8;\nvar NoObjectGeneratedError = class extends AISDKError8 {\n constructor({\n message = \"No object generated.\",\n cause,\n text: text2,\n response,\n usage,\n finishReason\n }) {\n super({ name: name8, message, cause });\n this[_a8] = true;\n this.text = text2;\n this.response = response;\n this.usage = usage;\n this.finishReason = finishReason;\n }\n static isInstance(error) {\n return AISDKError8.hasMarker(error, marker8);\n }\n};\n_a8 = symbol8;\n\n// src/error/no-output-generated-error.ts\nimport { AISDKError as AISDKError9 } from \"@ai-sdk/provider\";\nvar name9 = \"AI_NoOutputGeneratedError\";\nvar marker9 = `vercel.ai.error.${name9}`;\nvar symbol9 = Symbol.for(marker9);\nvar _a9;\nvar NoOutputGeneratedError = class extends AISDKError9 {\n // used in isInstance\n constructor({\n message = \"No output generated.\",\n cause\n } = {}) {\n super({ name: name9, message, cause });\n this[_a9] = true;\n }\n static isInstance(error) {\n return AISDKError9.hasMarker(error, marker9);\n }\n};\n_a9 = symbol9;\n\n// src/error/no-speech-generated-error.ts\nimport { AISDKError as AISDKError10 } from \"@ai-sdk/provider\";\nvar name10 = \"AI_NoSpeechGeneratedError\";\nvar marker10 = `vercel.ai.error.${name10}`;\nvar symbol10 = Symbol.for(marker10);\nvar _a10;\nvar NoSpeechGeneratedError = class extends AISDKError10 {\n constructor(options) {\n super({\n name: name10,\n message: \"No speech audio generated.\"\n });\n this[_a10] = true;\n this.responses = options.responses;\n }\n static isInstance(error) {\n return AISDKError10.hasMarker(error, marker10);\n }\n};\n_a10 = symbol10;\n\n// src/error/no-transcript-generated-error.ts\nimport { AISDKError as AISDKError11 } from \"@ai-sdk/provider\";\nvar name11 = \"AI_NoTranscriptGeneratedError\";\nvar marker11 = `vercel.ai.error.${name11}`;\nvar symbol11 = Symbol.for(marker11);\nvar _a11;\nvar NoTranscriptGeneratedError = class extends AISDKError11 {\n constructor(options) {\n super({\n name: name11,\n message: \"No transcript generated.\"\n });\n this[_a11] = true;\n this.responses = options.responses;\n }\n static isInstance(error) {\n return AISDKError11.hasMarker(error, marker11);\n }\n};\n_a11 = symbol11;\n\n// src/error/no-video-generated-error.ts\nimport { AISDKError as AISDKError12 } from \"@ai-sdk/provider\";\nvar name12 = \"AI_NoVideoGeneratedError\";\nvar marker12 = `vercel.ai.error.${name12}`;\nvar symbol12 = Symbol.for(marker12);\nvar _a12;\nvar NoVideoGeneratedError = class extends AISDKError12 {\n constructor({\n message = \"No video generated.\",\n cause,\n responses\n }) {\n super({ name: name12, message, cause });\n this[_a12] = true;\n this.responses = responses;\n }\n static isInstance(error) {\n return AISDKError12.hasMarker(error, marker12);\n }\n /**\n * @deprecated use `isInstance` instead\n */\n static isNoVideoGeneratedError(error) {\n return error instanceof Error && error.name === name12 && typeof error.responses !== \"undefined\" ? true : false;\n }\n /**\n * @deprecated Do not use this method. It will be removed in the next major version.\n */\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n cause: this.cause,\n responses: this.responses\n };\n }\n};\n_a12 = symbol12;\n\n// src/error/no-such-tool-error.ts\nimport { AISDKError as AISDKError13 } from \"@ai-sdk/provider\";\nvar name13 = \"AI_NoSuchToolError\";\nvar marker13 = `vercel.ai.error.${name13}`;\nvar symbol13 = Symbol.for(marker13);\nvar _a13;\nvar NoSuchToolError = class extends AISDKError13 {\n constructor({\n toolName,\n availableTools = void 0,\n message = `Model tried to call unavailable tool '${toolName}'. ${availableTools === void 0 ? \"No tools are available.\" : `Available tools: ${availableTools.join(\", \")}.`}`\n }) {\n super({ name: name13, message });\n this[_a13] = true;\n this.toolName = toolName;\n this.availableTools = availableTools;\n }\n static isInstance(error) {\n return AISDKError13.hasMarker(error, marker13);\n }\n};\n_a13 = symbol13;\n\n// src/error/tool-call-repair-error.ts\nimport { AISDKError as AISDKError14, getErrorMessage as getErrorMessage2 } from \"@ai-sdk/provider\";\nvar name14 = \"AI_ToolCallRepairError\";\nvar marker14 = `vercel.ai.error.${name14}`;\nvar symbol14 = Symbol.for(marker14);\nvar _a14;\nvar ToolCallRepairError = class extends AISDKError14 {\n constructor({\n cause,\n originalError,\n message = `Error repairing tool call: ${getErrorMessage2(cause)}`\n }) {\n super({ name: name14, message, cause });\n this[_a14] = true;\n this.originalError = originalError;\n }\n static isInstance(error) {\n return AISDKError14.hasMarker(error, marker14);\n }\n};\n_a14 = symbol14;\n\n// src/error/unsupported-model-version-error.ts\nimport { AISDKError as AISDKError15 } from \"@ai-sdk/provider\";\nvar UnsupportedModelVersionError = class extends AISDKError15 {\n constructor(options) {\n super({\n name: \"AI_UnsupportedModelVersionError\",\n message: `Unsupported model version ${options.version} for provider \"${options.provider}\" and model \"${options.modelId}\". AI SDK 5 only supports models that implement specification version \"v2\".`\n });\n this.version = options.version;\n this.provider = options.provider;\n this.modelId = options.modelId;\n }\n};\n\n// src/error/ui-message-stream-error.ts\nimport { AISDKError as AISDKError16 } from \"@ai-sdk/provider\";\nvar name15 = \"AI_UIMessageStreamError\";\nvar marker15 = `vercel.ai.error.${name15}`;\nvar symbol15 = Symbol.for(marker15);\nvar _a15;\nvar UIMessageStreamError = class extends AISDKError16 {\n constructor({\n chunkType,\n chunkId,\n message\n }) {\n super({ name: name15, message });\n this[_a15] = true;\n this.chunkType = chunkType;\n this.chunkId = chunkId;\n }\n static isInstance(error) {\n return AISDKError16.hasMarker(error, marker15);\n }\n};\n_a15 = symbol15;\n\n// src/prompt/invalid-data-content-error.ts\nimport { AISDKError as AISDKError17 } from \"@ai-sdk/provider\";\nvar name16 = \"AI_InvalidDataContentError\";\nvar marker16 = `vercel.ai.error.${name16}`;\nvar symbol16 = Symbol.for(marker16);\nvar _a16;\nvar InvalidDataContentError = class extends AISDKError17 {\n constructor({\n content,\n cause,\n message = `Invalid data content. Expected a base64 string, Uint8Array, ArrayBuffer, or Buffer, but got ${typeof content}.`\n }) {\n super({ name: name16, message, cause });\n this[_a16] = true;\n this.content = content;\n }\n static isInstance(error) {\n return AISDKError17.hasMarker(error, marker16);\n }\n};\n_a16 = symbol16;\n\n// src/prompt/invalid-message-role-error.ts\nimport { AISDKError as AISDKError18 } from \"@ai-sdk/provider\";\nvar name17 = \"AI_InvalidMessageRoleError\";\nvar marker17 = `vercel.ai.error.${name17}`;\nvar symbol17 = Symbol.for(marker17);\nvar _a17;\nvar InvalidMessageRoleError = class extends AISDKError18 {\n constructor({\n role,\n message = `Invalid message role: '${role}'. Must be one of: \"system\", \"user\", \"assistant\", \"tool\".`\n }) {\n super({ name: name17, message });\n this[_a17] = true;\n this.role = role;\n }\n static isInstance(error) {\n return AISDKError18.hasMarker(error, marker17);\n }\n};\n_a17 = symbol17;\n\n// src/prompt/message-conversion-error.ts\nimport { AISDKError as AISDKError19 } from \"@ai-sdk/provider\";\nvar name18 = \"AI_MessageConversionError\";\nvar marker18 = `vercel.ai.error.${name18}`;\nvar symbol18 = Symbol.for(marker18);\nvar _a18;\nvar MessageConversionError = class extends AISDKError19 {\n constructor({\n originalMessage,\n message\n }) {\n super({ name: name18, message });\n this[_a18] = true;\n this.originalMessage = originalMessage;\n }\n static isInstance(error) {\n return AISDKError19.hasMarker(error, marker18);\n }\n};\n_a18 = symbol18;\n\n// src/error/index.ts\nimport { DownloadError } from \"@ai-sdk/provider-utils\";\n\n// src/util/retry-error.ts\nimport { AISDKError as AISDKError20 } from \"@ai-sdk/provider\";\nvar name19 = \"AI_RetryError\";\nvar marker19 = `vercel.ai.error.${name19}`;\nvar symbol19 = Symbol.for(marker19);\nvar _a19;\nvar RetryError = class extends AISDKError20 {\n constructor({\n message,\n reason,\n errors\n }) {\n super({ name: name19, message });\n this[_a19] = true;\n this.reason = reason;\n this.errors = errors;\n this.lastError = errors[errors.length - 1];\n }\n static isInstance(error) {\n return AISDKError20.hasMarker(error, marker19);\n }\n};\n_a19 = symbol19;\n\n// src/util/as-array.ts\nfunction asArray(value) {\n return value === void 0 ? [] : Array.isArray(value) ? value : [value];\n}\n\n// src/util/notify.ts\nasync function notify(options) {\n for (const callback of asArray(options.callbacks)) {\n if (callback == null)\n continue;\n try {\n await callback(options.event);\n } catch (_ignored) {\n }\n }\n}\n\n// src/logger/log-warnings.ts\nfunction formatWarning({\n warning,\n provider,\n model\n}) {\n const prefix = `AI SDK Warning (${provider} / ${model}):`;\n switch (warning.type) {\n case \"unsupported\": {\n let message = `${prefix} The feature \"${warning.feature}\" is not supported.`;\n if (warning.details) {\n message += ` ${warning.details}`;\n }\n return message;\n }\n case \"compatibility\": {\n let message = `${prefix} The feature \"${warning.feature}\" is used in a compatibility mode.`;\n if (warning.details) {\n message += ` ${warning.details}`;\n }\n return message;\n }\n case \"other\": {\n return `${prefix} ${warning.message}`;\n }\n default: {\n return `${prefix} ${JSON.stringify(warning, null, 2)}`;\n }\n }\n}\nvar FIRST_WARNING_INFO_MESSAGE = \"AI SDK Warning System: To turn off warning logging, set the AI_SDK_LOG_WARNINGS global to false.\";\nvar hasLoggedBefore = false;\nvar logWarnings = (options) => {\n if (options.warnings.length === 0) {\n return;\n }\n const logger = globalThis.AI_SDK_LOG_WARNINGS;\n if (logger === false) {\n return;\n }\n if (typeof logger === \"function\") {\n logger(options);\n return;\n }\n if (!hasLoggedBefore) {\n hasLoggedBefore = true;\n console.info(FIRST_WARNING_INFO_MESSAGE);\n }\n for (const warning of options.warnings) {\n console.warn(\n formatWarning({\n warning,\n provider: options.provider,\n model: options.model\n })\n );\n }\n};\n\n// src/model/resolve-model.ts\nimport { gateway } from \"@ai-sdk/gateway\";\n\n// src/util/log-v2-compatibility-warning.ts\nfunction logV2CompatibilityWarning({\n provider,\n modelId\n}) {\n logWarnings({\n warnings: [\n {\n type: \"compatibility\",\n feature: \"specificationVersion\",\n details: `Using v2 specification compatibility mode. Some features may not be available.`\n }\n ],\n provider,\n model: modelId\n });\n}\n\n// src/model/as-embedding-model-v3.ts\nfunction asEmbeddingModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v3\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-image-model-v3.ts\nfunction asImageModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v3\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-language-model-v3.ts\nfunction asLanguageModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n switch (prop) {\n case \"specificationVersion\":\n return \"v3\";\n case \"doGenerate\":\n return async (...args) => {\n const result = await target.doGenerate(...args);\n return {\n ...result,\n finishReason: convertV2FinishReasonToV3(result.finishReason),\n usage: convertV2UsageToV3(result.usage)\n };\n };\n case \"doStream\":\n return async (...args) => {\n const result = await target.doStream(...args);\n return {\n ...result,\n stream: convertV2StreamToV3(result.stream)\n };\n };\n default:\n return target[prop];\n }\n }\n });\n}\nfunction convertV2StreamToV3(stream) {\n return stream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"finish\":\n controller.enqueue({\n ...chunk,\n finishReason: convertV2FinishReasonToV3(chunk.finishReason),\n usage: convertV2UsageToV3(chunk.usage)\n });\n break;\n default:\n controller.enqueue(chunk);\n break;\n }\n }\n })\n );\n}\nfunction convertV2FinishReasonToV3(finishReason) {\n return {\n unified: finishReason === \"unknown\" ? \"other\" : finishReason,\n raw: void 0\n };\n}\nfunction convertV2UsageToV3(usage) {\n return {\n inputTokens: {\n total: usage.inputTokens,\n noCache: void 0,\n cacheRead: usage.cachedInputTokens,\n cacheWrite: void 0\n },\n outputTokens: {\n total: usage.outputTokens,\n text: void 0,\n reasoning: usage.reasoningTokens\n }\n };\n}\n\n// src/model/as-speech-model-v3.ts\nfunction asSpeechModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v3\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-transcription-model-v3.ts\nfunction asTranscriptionModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v3\";\n return target[prop];\n }\n });\n}\n\n// src/model/resolve-model.ts\nfunction resolveLanguageModel(model) {\n if (typeof model !== \"string\") {\n if (model.specificationVersion !== \"v3\" && model.specificationVersion !== \"v2\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asLanguageModelV3(model);\n }\n return getGlobalProvider().languageModel(model);\n}\nfunction resolveEmbeddingModel(model) {\n if (typeof model !== \"string\") {\n if (model.specificationVersion !== \"v3\" && model.specificationVersion !== \"v2\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asEmbeddingModelV3(model);\n }\n return getGlobalProvider().embeddingModel(model);\n}\nfunction resolveTranscriptionModel(model) {\n var _a21, _b;\n if (typeof model !== \"string\") {\n if (model.specificationVersion !== \"v3\" && model.specificationVersion !== \"v2\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asTranscriptionModelV3(model);\n }\n return (_b = (_a21 = getGlobalProvider()).transcriptionModel) == null ? void 0 : _b.call(_a21, model);\n}\nfunction resolveSpeechModel(model) {\n var _a21, _b;\n if (typeof model !== \"string\") {\n if (model.specificationVersion !== \"v3\" && model.specificationVersion !== \"v2\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asSpeechModelV3(model);\n }\n return (_b = (_a21 = getGlobalProvider()).speechModel) == null ? void 0 : _b.call(_a21, model);\n}\nfunction resolveImageModel(model) {\n if (typeof model !== \"string\") {\n if (model.specificationVersion !== \"v3\" && model.specificationVersion !== \"v2\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asImageModelV3(model);\n }\n return getGlobalProvider().imageModel(model);\n}\nfunction resolveVideoModel(model) {\n if (typeof model === \"string\") {\n const provider = getGlobalProvider();\n const videoModel = provider.videoModel;\n if (!videoModel) {\n throw new Error(\n 'The default provider does not support video models. Please use a Experimental_VideoModelV3 object from a provider (e.g., vertex.video(\"model-id\")).'\n );\n }\n return videoModel(model);\n }\n if (model.specificationVersion !== \"v3\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return model;\n}\nfunction resolveRerankingModel(model) {\n if (typeof model === \"string\") {\n const provider = getGlobalProvider();\n const rerankingModel = provider.rerankingModel;\n if (!rerankingModel) {\n throw new Error(\n 'The default provider does not support reranking models. Please use a RerankingModel object from a provider (e.g., gateway.rerankingModel(\"model-id\")).'\n );\n }\n return rerankingModel(model);\n }\n if (model.specificationVersion !== \"v3\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return model;\n}\nfunction getGlobalProvider() {\n var _a21;\n return (_a21 = globalThis.AI_SDK_DEFAULT_PROVIDER) != null ? _a21 : gateway;\n}\n\n// src/prompt/call-settings.ts\nfunction getTotalTimeoutMs(timeout) {\n if (timeout == null) {\n return void 0;\n }\n if (typeof timeout === \"number\") {\n return timeout;\n }\n return timeout.totalMs;\n}\nfunction getStepTimeoutMs(timeout) {\n if (timeout == null || typeof timeout === \"number\") {\n return void 0;\n }\n return timeout.stepMs;\n}\nfunction getChunkTimeoutMs(timeout) {\n if (timeout == null || typeof timeout === \"number\") {\n return void 0;\n }\n return timeout.chunkMs;\n}\n\n// src/prompt/convert-to-language-model-prompt.ts\nimport {\n isUrlSupported\n} from \"@ai-sdk/provider-utils\";\n\n// src/util/detect-media-type.ts\nimport { convertBase64ToUint8Array } from \"@ai-sdk/provider-utils\";\nvar imageMediaTypeSignatures = [\n {\n mediaType: \"image/gif\",\n bytesPrefix: [71, 73, 70]\n // GIF\n },\n {\n mediaType: \"image/png\",\n bytesPrefix: [137, 80, 78, 71]\n // PNG\n },\n {\n mediaType: \"image/jpeg\",\n bytesPrefix: [255, 216]\n // JPEG\n },\n {\n mediaType: \"image/webp\",\n bytesPrefix: [\n 82,\n 73,\n 70,\n 70,\n // \"RIFF\"\n null,\n null,\n null,\n null,\n // file size (variable)\n 87,\n 69,\n 66,\n 80\n // \"WEBP\"\n ]\n },\n {\n mediaType: \"image/bmp\",\n bytesPrefix: [66, 77]\n },\n {\n mediaType: \"image/tiff\",\n bytesPrefix: [73, 73, 42, 0]\n },\n {\n mediaType: \"image/tiff\",\n bytesPrefix: [77, 77, 0, 42]\n },\n {\n mediaType: \"image/avif\",\n bytesPrefix: [\n 0,\n 0,\n 0,\n 32,\n 102,\n 116,\n 121,\n 112,\n 97,\n 118,\n 105,\n 102\n ]\n },\n {\n mediaType: \"image/heic\",\n bytesPrefix: [\n 0,\n 0,\n 0,\n 32,\n 102,\n 116,\n 121,\n 112,\n 104,\n 101,\n 105,\n 99\n ]\n }\n];\nvar audioMediaTypeSignatures = [\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 251]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 250]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 243]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 242]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 227]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 226]\n },\n {\n mediaType: \"audio/wav\",\n bytesPrefix: [\n 82,\n // R\n 73,\n // I\n 70,\n // F\n 70,\n // F\n null,\n null,\n null,\n null,\n 87,\n // W\n 65,\n // A\n 86,\n // V\n 69\n // E\n ]\n },\n {\n mediaType: \"audio/ogg\",\n bytesPrefix: [79, 103, 103, 83]\n },\n {\n mediaType: \"audio/flac\",\n bytesPrefix: [102, 76, 97, 67]\n },\n {\n mediaType: \"audio/aac\",\n bytesPrefix: [64, 21, 0, 0]\n },\n {\n mediaType: \"audio/mp4\",\n bytesPrefix: [102, 116, 121, 112]\n },\n {\n mediaType: \"audio/webm\",\n bytesPrefix: [26, 69, 223, 163]\n }\n];\nvar videoMediaTypeSignatures = [\n {\n mediaType: \"video/mp4\",\n bytesPrefix: [\n 0,\n 0,\n 0,\n null,\n 102,\n 116,\n 121,\n 112\n // ftyp\n ]\n },\n {\n mediaType: \"video/webm\",\n bytesPrefix: [26, 69, 223, 163]\n // EBML\n },\n {\n mediaType: \"video/quicktime\",\n bytesPrefix: [\n 0,\n 0,\n 0,\n 20,\n 102,\n 116,\n 121,\n 112,\n 113,\n 116\n // ftypqt\n ]\n },\n {\n mediaType: \"video/x-msvideo\",\n bytesPrefix: [82, 73, 70, 70]\n // RIFF (AVI)\n }\n];\nvar stripID3 = (data) => {\n const bytes = typeof data === \"string\" ? convertBase64ToUint8Array(data) : data;\n const id3Size = (bytes[6] & 127) << 21 | (bytes[7] & 127) << 14 | (bytes[8] & 127) << 7 | bytes[9] & 127;\n return bytes.slice(id3Size + 10);\n};\nfunction stripID3TagsIfPresent(data) {\n const hasId3 = typeof data === \"string\" && data.startsWith(\"SUQz\") || typeof data !== \"string\" && data.length > 10 && data[0] === 73 && // 'I'\n data[1] === 68 && // 'D'\n data[2] === 51;\n return hasId3 ? stripID3(data) : data;\n}\nfunction detectMediaType({\n data,\n signatures\n}) {\n const processedData = stripID3TagsIfPresent(data);\n const bytes = typeof processedData === \"string\" ? convertBase64ToUint8Array(\n processedData.substring(0, Math.min(processedData.length, 24))\n ) : processedData;\n for (const signature of signatures) {\n if (bytes.length >= signature.bytesPrefix.length && signature.bytesPrefix.every(\n (byte, index) => byte === null || bytes[index] === byte\n )) {\n return signature.mediaType;\n }\n }\n return void 0;\n}\n\n// src/util/download/download.ts\nimport {\n DownloadError as DownloadError2,\n readResponseWithSizeLimit,\n DEFAULT_MAX_DOWNLOAD_SIZE,\n validateDownloadUrl,\n withUserAgentSuffix,\n getRuntimeEnvironmentUserAgent\n} from \"@ai-sdk/provider-utils\";\n\n// src/version.ts\nvar VERSION = true ? \"6.0.197\" : \"0.0.0-test\";\n\n// src/util/download/download.ts\nvar download = async ({\n url,\n maxBytes,\n abortSignal\n}) => {\n var _a21;\n const urlText = url.toString();\n validateDownloadUrl(urlText);\n try {\n const response = await fetch(urlText, {\n headers: withUserAgentSuffix(\n {},\n `ai-sdk/${VERSION}`,\n getRuntimeEnvironmentUserAgent()\n ),\n signal: abortSignal\n });\n if (response.redirected) {\n validateDownloadUrl(response.url);\n }\n if (!response.ok) {\n throw new DownloadError2({\n url: urlText,\n statusCode: response.status,\n statusText: response.statusText\n });\n }\n const data = await readResponseWithSizeLimit({\n response,\n url: urlText,\n maxBytes: maxBytes != null ? maxBytes : DEFAULT_MAX_DOWNLOAD_SIZE\n });\n return {\n data,\n mediaType: (_a21 = response.headers.get(\"content-type\")) != null ? _a21 : void 0\n };\n } catch (error) {\n if (DownloadError2.isInstance(error)) {\n throw error;\n }\n throw new DownloadError2({ url: urlText, cause: error });\n }\n};\n\n// src/util/download/download-function.ts\nvar createDefaultDownloadFunction = (download2 = download) => (requestedDownloads) => Promise.all(\n requestedDownloads.map(\n async (requestedDownload) => requestedDownload.isUrlSupportedByModel ? null : download2(requestedDownload)\n )\n);\n\n// src/prompt/data-content.ts\nimport { AISDKError as AISDKError22 } from \"@ai-sdk/provider\";\nimport {\n convertBase64ToUint8Array as convertBase64ToUint8Array2,\n convertUint8ArrayToBase64\n} from \"@ai-sdk/provider-utils\";\nimport { z } from \"zod/v4\";\n\n// src/prompt/split-data-url.ts\nfunction splitDataUrl(dataUrl) {\n try {\n const [header, base64Content] = dataUrl.split(\",\");\n return {\n mediaType: header.split(\";\")[0].split(\":\")[1],\n base64Content\n };\n } catch (error) {\n return {\n mediaType: void 0,\n base64Content: void 0\n };\n }\n}\n\n// src/prompt/data-content.ts\nvar dataContentSchema = z.union([\n z.string(),\n z.instanceof(Uint8Array),\n z.instanceof(ArrayBuffer),\n z.custom(\n // Buffer might not be available in some environments such as CloudFlare:\n (value) => {\n var _a21, _b;\n return (_b = (_a21 = globalThis.Buffer) == null ? void 0 : _a21.isBuffer(value)) != null ? _b : false;\n },\n { message: \"Must be a Buffer\" }\n )\n]);\nfunction convertToLanguageModelV3DataContent(content) {\n if (content instanceof Uint8Array) {\n return { data: content, mediaType: void 0 };\n }\n if (content instanceof ArrayBuffer) {\n return { data: new Uint8Array(content), mediaType: void 0 };\n }\n if (typeof content === \"string\") {\n try {\n content = new URL(content);\n } catch (error) {\n }\n }\n if (content instanceof URL && content.protocol === \"data:\") {\n const { mediaType: dataUrlMediaType, base64Content } = splitDataUrl(\n content.toString()\n );\n if (dataUrlMediaType == null || base64Content == null) {\n throw new AISDKError22({\n name: \"InvalidDataContentError\",\n message: `Invalid data URL format in content ${content.toString()}`\n });\n }\n return { data: base64Content, mediaType: dataUrlMediaType };\n }\n return { data: content, mediaType: void 0 };\n}\nfunction convertDataContentToBase64String(content) {\n if (typeof content === \"string\") {\n return content;\n }\n if (content instanceof ArrayBuffer) {\n return convertUint8ArrayToBase64(new Uint8Array(content));\n }\n return convertUint8ArrayToBase64(content);\n}\nfunction convertDataContentToUint8Array(content) {\n if (content instanceof Uint8Array) {\n return content;\n }\n if (typeof content === \"string\") {\n try {\n return convertBase64ToUint8Array2(content);\n } catch (error) {\n throw new InvalidDataContentError({\n message: \"Invalid data content. Content string is not a base64-encoded media.\",\n content,\n cause: error\n });\n }\n }\n if (content instanceof ArrayBuffer) {\n return new Uint8Array(content);\n }\n throw new InvalidDataContentError({ content });\n}\n\n// src/prompt/convert-to-language-model-prompt.ts\nasync function convertToLanguageModelPrompt({\n prompt,\n supportedUrls,\n download: download2 = createDefaultDownloadFunction()\n}) {\n const downloadedAssets = await downloadAssets(\n prompt.messages,\n download2,\n supportedUrls\n );\n const approvalIdToToolCallId = /* @__PURE__ */ new Map();\n for (const message of prompt.messages) {\n if (message.role === \"assistant\" && Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part.type === \"tool-approval-request\" && \"approvalId\" in part && \"toolCallId\" in part) {\n approvalIdToToolCallId.set(\n part.approvalId,\n part.toolCallId\n );\n }\n }\n }\n }\n const approvedToolCallIds = /* @__PURE__ */ new Set();\n for (const message of prompt.messages) {\n if (message.role === \"tool\") {\n for (const part of message.content) {\n if (part.type === \"tool-approval-response\") {\n const toolCallId = approvalIdToToolCallId.get(part.approvalId);\n if (toolCallId) {\n approvedToolCallIds.add(toolCallId);\n }\n }\n }\n }\n }\n const messages = [\n ...prompt.system != null ? typeof prompt.system === \"string\" ? [{ role: \"system\", content: prompt.system }] : asArray(prompt.system).map((message) => ({\n role: \"system\",\n content: message.content,\n providerOptions: message.providerOptions\n })) : [],\n ...prompt.messages.map(\n (message) => convertToLanguageModelMessage({ message, downloadedAssets })\n )\n ];\n const combinedMessages = [];\n for (const message of messages) {\n if (message.role !== \"tool\") {\n combinedMessages.push(message);\n continue;\n }\n const lastCombinedMessage = combinedMessages.at(-1);\n if ((lastCombinedMessage == null ? void 0 : lastCombinedMessage.role) === \"tool\") {\n lastCombinedMessage.content.push(...message.content);\n } else {\n combinedMessages.push(message);\n }\n }\n const toolCallIds = /* @__PURE__ */ new Set();\n for (const message of combinedMessages) {\n switch (message.role) {\n case \"assistant\": {\n for (const content of message.content) {\n if (content.type === \"tool-call\" && !content.providerExecuted) {\n toolCallIds.add(content.toolCallId);\n }\n }\n break;\n }\n case \"tool\": {\n for (const content of message.content) {\n if (content.type === \"tool-result\") {\n toolCallIds.delete(content.toolCallId);\n }\n }\n break;\n }\n case \"user\":\n case \"system\":\n for (const id of approvedToolCallIds) {\n toolCallIds.delete(id);\n }\n if (toolCallIds.size > 0) {\n throw new MissingToolResultsError({\n toolCallIds: Array.from(toolCallIds)\n });\n }\n break;\n }\n }\n for (const id of approvedToolCallIds) {\n toolCallIds.delete(id);\n }\n if (toolCallIds.size > 0) {\n throw new MissingToolResultsError({ toolCallIds: Array.from(toolCallIds) });\n }\n return combinedMessages.filter(\n // Filter out empty tool messages (e.g. if they only contained\n // tool-approval-response parts that were removed).\n // This prevents sending invalid empty messages to the provider.\n // Note: provider-executed tool-approval-response parts are preserved.\n (message) => message.role !== \"tool\" || message.content.length > 0\n );\n}\nfunction convertToLanguageModelMessage({\n message,\n downloadedAssets\n}) {\n const role = message.role;\n switch (role) {\n case \"system\": {\n return {\n role: \"system\",\n content: message.content,\n providerOptions: message.providerOptions\n };\n }\n case \"user\": {\n if (typeof message.content === \"string\") {\n return {\n role: \"user\",\n content: [{ type: \"text\", text: message.content }],\n providerOptions: message.providerOptions\n };\n }\n return {\n role: \"user\",\n content: message.content.map((part) => convertPartToLanguageModelPart(part, downloadedAssets)).filter((part) => part.type !== \"text\" || part.text !== \"\"),\n providerOptions: message.providerOptions\n };\n }\n case \"assistant\": {\n if (typeof message.content === \"string\") {\n return {\n role: \"assistant\",\n content: [{ type: \"text\", text: message.content }],\n providerOptions: message.providerOptions\n };\n }\n return {\n role: \"assistant\",\n content: message.content.filter(\n // remove empty text parts (no text, and no provider options):\n (part) => part.type !== \"text\" || part.text !== \"\" || part.providerOptions != null\n ).filter(\n (part) => part.type !== \"tool-approval-request\"\n ).map((part) => {\n const providerOptions = part.providerOptions;\n switch (part.type) {\n case \"file\": {\n const { data, mediaType } = convertToLanguageModelV3DataContent(\n part.data\n );\n return {\n type: \"file\",\n data,\n filename: part.filename,\n mediaType: mediaType != null ? mediaType : part.mediaType,\n providerOptions\n };\n }\n case \"reasoning\": {\n return {\n type: \"reasoning\",\n text: part.text,\n providerOptions\n };\n }\n case \"text\": {\n return {\n type: \"text\",\n text: part.text,\n providerOptions\n };\n }\n case \"tool-call\": {\n return {\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n providerExecuted: part.providerExecuted,\n providerOptions\n };\n }\n case \"tool-result\": {\n return {\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output: mapToolResultOutput({\n output: part.output,\n downloadedAssets\n }),\n providerOptions\n };\n }\n }\n }),\n providerOptions: message.providerOptions\n };\n }\n case \"tool\": {\n return {\n role: \"tool\",\n content: message.content.filter(\n // Only include tool-approval-response for provider-executed tools\n (part) => part.type !== \"tool-approval-response\" || part.providerExecuted\n ).map((part) => {\n switch (part.type) {\n case \"tool-result\": {\n return {\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output: mapToolResultOutput({\n output: part.output,\n downloadedAssets\n }),\n providerOptions: part.providerOptions\n };\n }\n case \"tool-approval-response\": {\n return {\n type: \"tool-approval-response\",\n approvalId: part.approvalId,\n approved: part.approved,\n reason: part.reason\n };\n }\n }\n }),\n providerOptions: message.providerOptions\n };\n }\n default: {\n const _exhaustiveCheck = role;\n throw new InvalidMessageRoleError({ role: _exhaustiveCheck });\n }\n }\n}\nasync function downloadAssets(messages, download2, supportedUrls) {\n var _a21;\n const downloadableFiles = [];\n for (const message of messages) {\n if (message.role === \"user\" && Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part.type === \"image\" || part.type === \"file\") {\n downloadableFiles.push({\n data: part.type === \"image\" ? part.image : part.data,\n mediaType: (_a21 = part.mediaType) != null ? _a21 : part.type === \"image\" ? \"image/*\" : void 0\n });\n }\n }\n }\n if (message.role === \"tool\" || message.role === \"assistant\") {\n if (!Array.isArray(message.content)) {\n continue;\n }\n for (const part of message.content) {\n if (part.type !== \"tool-result\") {\n continue;\n }\n if (part.output.type !== \"content\") {\n continue;\n }\n for (const contentPart of part.output.value) {\n if (contentPart.type === \"image-url\" || contentPart.type === \"file-url\") {\n downloadableFiles.push({\n data: new URL(contentPart.url),\n mediaType: contentPart.type === \"image-url\" ? \"image/*\" : void 0\n });\n }\n }\n }\n }\n }\n const plannedDownloads = downloadableFiles.map((part) => {\n const mediaType = part.mediaType;\n const { data } = convertToLanguageModelV3DataContent(part.data);\n return { mediaType, data };\n }).filter(\n (part) => part.data instanceof URL\n ).map((part) => ({\n url: part.data,\n isUrlSupportedByModel: part.mediaType != null && isUrlSupported({\n url: part.data.toString(),\n mediaType: part.mediaType,\n supportedUrls\n })\n }));\n const downloadedFiles = await download2(plannedDownloads);\n return Object.fromEntries(\n downloadedFiles.map(\n (file, index) => file == null ? null : [\n plannedDownloads[index].url.toString(),\n { data: file.data, mediaType: file.mediaType }\n ]\n ).filter((file) => file != null)\n );\n}\nfunction convertPartToLanguageModelPart(part, downloadedAssets) {\n var _a21;\n if (part.type === \"text\") {\n return {\n type: \"text\",\n text: part.text,\n providerOptions: part.providerOptions\n };\n }\n let originalData;\n const type = part.type;\n switch (type) {\n case \"image\":\n originalData = part.image;\n break;\n case \"file\":\n originalData = part.data;\n break;\n default:\n throw new Error(`Unsupported part type: ${type}`);\n }\n const { data: convertedData, mediaType: convertedMediaType } = convertToLanguageModelV3DataContent(originalData);\n let mediaType = convertedMediaType != null ? convertedMediaType : part.mediaType;\n let data = convertedData;\n if (data instanceof URL) {\n const downloadedFile = downloadedAssets[data.toString()];\n if (downloadedFile) {\n data = downloadedFile.data;\n mediaType != null ? mediaType : mediaType = downloadedFile.mediaType;\n }\n }\n switch (type) {\n case \"image\": {\n if (data instanceof Uint8Array || typeof data === \"string\") {\n mediaType = (_a21 = detectMediaType({ data, signatures: imageMediaTypeSignatures })) != null ? _a21 : mediaType;\n }\n return {\n type: \"file\",\n mediaType: mediaType != null ? mediaType : \"image/*\",\n // any image\n filename: void 0,\n data,\n providerOptions: part.providerOptions\n };\n }\n case \"file\": {\n if (mediaType == null) {\n throw new Error(`Media type is missing for file part`);\n }\n return {\n type: \"file\",\n mediaType,\n filename: part.filename,\n data,\n providerOptions: part.providerOptions\n };\n }\n }\n}\nfunction mapToolResultOutput({\n output,\n downloadedAssets\n}) {\n if (output.type !== \"content\") {\n return output;\n }\n return {\n type: \"content\",\n value: output.value.map((item) => {\n var _a21, _b;\n if (item.type === \"image-url\") {\n const downloadedFile = downloadedAssets[new URL(item.url).toString()];\n if (downloadedFile) {\n return {\n type: \"image-data\",\n data: convertDataContentToBase64String(downloadedFile.data),\n mediaType: (_a21 = downloadedFile.mediaType) != null ? _a21 : \"image/*\",\n providerOptions: item.providerOptions\n };\n }\n return item;\n }\n if (item.type === \"file-url\") {\n const downloadedFile = downloadedAssets[new URL(item.url).toString()];\n if (downloadedFile) {\n return {\n type: \"file-data\",\n data: convertDataContentToBase64String(downloadedFile.data),\n mediaType: (_b = downloadedFile.mediaType) != null ? _b : \"application/octet-stream\",\n providerOptions: item.providerOptions\n };\n }\n return item;\n }\n if (item.type !== \"media\") {\n return item;\n }\n if (item.mediaType.startsWith(\"image/\")) {\n return {\n type: \"image-data\",\n data: item.data,\n mediaType: item.mediaType\n };\n }\n return {\n type: \"file-data\",\n data: item.data,\n mediaType: item.mediaType\n };\n })\n };\n}\n\n// src/prompt/create-tool-model-output.ts\nimport { getErrorMessage as getErrorMessage3 } from \"@ai-sdk/provider\";\nasync function createToolModelOutput({\n toolCallId,\n input,\n output,\n tool: tool2,\n errorMode\n}) {\n if (errorMode === \"text\") {\n return { type: \"error-text\", value: getErrorMessage3(output) };\n } else if (errorMode === \"json\") {\n return { type: \"error-json\", value: toJSONValue(output) };\n }\n if (tool2 == null ? void 0 : tool2.toModelOutput) {\n return await tool2.toModelOutput({ toolCallId, input, output });\n }\n return typeof output === \"string\" ? { type: \"text\", value: output } : { type: \"json\", value: toJSONValue(output) };\n}\nfunction toJSONValue(value) {\n return value === void 0 ? null : value;\n}\n\n// src/prompt/prepare-call-settings.ts\nfunction prepareCallSettings({\n maxOutputTokens,\n temperature,\n topP,\n topK,\n presencePenalty,\n frequencyPenalty,\n seed,\n stopSequences\n}) {\n if (maxOutputTokens != null) {\n if (!Number.isInteger(maxOutputTokens)) {\n throw new InvalidArgumentError({\n parameter: \"maxOutputTokens\",\n value: maxOutputTokens,\n message: \"maxOutputTokens must be an integer\"\n });\n }\n if (maxOutputTokens < 1) {\n throw new InvalidArgumentError({\n parameter: \"maxOutputTokens\",\n value: maxOutputTokens,\n message: \"maxOutputTokens must be >= 1\"\n });\n }\n }\n if (temperature != null) {\n if (typeof temperature !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"temperature\",\n value: temperature,\n message: \"temperature must be a number\"\n });\n }\n }\n if (topP != null) {\n if (typeof topP !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"topP\",\n value: topP,\n message: \"topP must be a number\"\n });\n }\n }\n if (topK != null) {\n if (typeof topK !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"topK\",\n value: topK,\n message: \"topK must be a number\"\n });\n }\n }\n if (presencePenalty != null) {\n if (typeof presencePenalty !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"presencePenalty\",\n value: presencePenalty,\n message: \"presencePenalty must be a number\"\n });\n }\n }\n if (frequencyPenalty != null) {\n if (typeof frequencyPenalty !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"frequencyPenalty\",\n value: frequencyPenalty,\n message: \"frequencyPenalty must be a number\"\n });\n }\n }\n if (seed != null) {\n if (!Number.isInteger(seed)) {\n throw new InvalidArgumentError({\n parameter: \"seed\",\n value: seed,\n message: \"seed must be an integer\"\n });\n }\n }\n return {\n maxOutputTokens,\n temperature,\n topP,\n topK,\n presencePenalty,\n frequencyPenalty,\n stopSequences,\n seed\n };\n}\n\n// src/prompt/prepare-tools-and-tool-choice.ts\nimport { asSchema } from \"@ai-sdk/provider-utils\";\n\n// src/util/is-non-empty-object.ts\nfunction isNonEmptyObject(object2) {\n return object2 != null && Object.keys(object2).length > 0;\n}\n\n// src/prompt/prepare-tools-and-tool-choice.ts\nasync function prepareToolsAndToolChoice({\n tools,\n toolChoice,\n activeTools\n}) {\n if (!isNonEmptyObject(tools)) {\n return {\n tools: void 0,\n toolChoice: void 0\n };\n }\n const filteredTools = activeTools != null ? Object.entries(tools).filter(\n ([name21]) => activeTools.includes(name21)\n ) : Object.entries(tools);\n const languageModelTools = [];\n for (const [name21, tool2] of filteredTools) {\n const toolType = tool2.type;\n switch (toolType) {\n case void 0:\n case \"dynamic\":\n case \"function\":\n languageModelTools.push({\n type: \"function\",\n name: name21,\n description: tool2.description,\n inputSchema: await asSchema(tool2.inputSchema).jsonSchema,\n ...tool2.inputExamples != null ? { inputExamples: tool2.inputExamples } : {},\n providerOptions: tool2.providerOptions,\n ...tool2.strict != null ? { strict: tool2.strict } : {}\n });\n break;\n case \"provider\":\n languageModelTools.push({\n type: \"provider\",\n name: name21,\n id: tool2.id,\n args: tool2.args\n });\n break;\n default: {\n const exhaustiveCheck = toolType;\n throw new Error(`Unsupported tool type: ${exhaustiveCheck}`);\n }\n }\n }\n return {\n tools: languageModelTools,\n toolChoice: toolChoice == null ? { type: \"auto\" } : typeof toolChoice === \"string\" ? { type: toolChoice } : { type: \"tool\", toolName: toolChoice.toolName }\n };\n}\n\n// src/prompt/standardize-prompt.ts\nimport { InvalidPromptError as InvalidPromptError2 } from \"@ai-sdk/provider\";\nimport {\n safeValidateTypes\n} from \"@ai-sdk/provider-utils\";\nimport { z as z6 } from \"zod/v4\";\n\n// src/prompt/message.ts\nimport { z as z5 } from \"zod/v4\";\n\n// src/types/provider-metadata.ts\nimport { z as z3 } from \"zod/v4\";\n\n// src/types/json-value.ts\nimport { z as z2 } from \"zod/v4\";\nvar jsonValueSchema = z2.lazy(\n () => z2.union([\n z2.null(),\n z2.string(),\n z2.number(),\n z2.boolean(),\n z2.record(z2.string(), jsonValueSchema.optional()),\n z2.array(jsonValueSchema)\n ])\n);\n\n// src/types/provider-metadata.ts\nvar providerMetadataSchema = z3.record(\n z3.string(),\n z3.record(z3.string(), jsonValueSchema.optional())\n);\n\n// src/prompt/content-part.ts\nimport { z as z4 } from \"zod/v4\";\nvar textPartSchema = z4.object({\n type: z4.literal(\"text\"),\n text: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n});\nvar imagePartSchema = z4.object({\n type: z4.literal(\"image\"),\n image: z4.union([dataContentSchema, z4.instanceof(URL)]),\n mediaType: z4.string().optional(),\n providerOptions: providerMetadataSchema.optional()\n});\nvar filePartSchema = z4.object({\n type: z4.literal(\"file\"),\n data: z4.union([dataContentSchema, z4.instanceof(URL)]),\n filename: z4.string().optional(),\n mediaType: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n});\nvar reasoningPartSchema = z4.object({\n type: z4.literal(\"reasoning\"),\n text: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n});\nvar toolCallPartSchema = z4.object({\n type: z4.literal(\"tool-call\"),\n toolCallId: z4.string(),\n toolName: z4.string(),\n input: z4.unknown(),\n providerOptions: providerMetadataSchema.optional(),\n providerExecuted: z4.boolean().optional()\n});\nvar outputSchema = z4.discriminatedUnion(\n \"type\",\n [\n z4.object({\n type: z4.literal(\"text\"),\n value: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"json\"),\n value: jsonValueSchema,\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"execution-denied\"),\n reason: z4.string().optional(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"error-text\"),\n value: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"error-json\"),\n value: jsonValueSchema,\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"content\"),\n value: z4.array(\n z4.union([\n z4.object({\n type: z4.literal(\"text\"),\n text: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"media\"),\n data: z4.string(),\n mediaType: z4.string()\n }),\n z4.object({\n type: z4.literal(\"file-data\"),\n data: z4.string(),\n mediaType: z4.string(),\n filename: z4.string().optional(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"file-url\"),\n url: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"file-id\"),\n fileId: z4.union([z4.string(), z4.record(z4.string(), z4.string())]),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"image-data\"),\n data: z4.string(),\n mediaType: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"image-url\"),\n url: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"image-file-id\"),\n fileId: z4.union([z4.string(), z4.record(z4.string(), z4.string())]),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"custom\"),\n providerOptions: providerMetadataSchema.optional()\n })\n ])\n )\n })\n ]\n);\nvar toolResultPartSchema = z4.object({\n type: z4.literal(\"tool-result\"),\n toolCallId: z4.string(),\n toolName: z4.string(),\n output: outputSchema,\n providerOptions: providerMetadataSchema.optional()\n});\nvar toolApprovalRequestSchema = z4.object({\n type: z4.literal(\"tool-approval-request\"),\n approvalId: z4.string(),\n toolCallId: z4.string()\n});\nvar toolApprovalResponseSchema = z4.object({\n type: z4.literal(\"tool-approval-response\"),\n approvalId: z4.string(),\n approved: z4.boolean(),\n reason: z4.string().optional()\n});\n\n// src/prompt/message.ts\nvar systemModelMessageSchema = z5.object(\n {\n role: z5.literal(\"system\"),\n content: z5.string(),\n providerOptions: providerMetadataSchema.optional()\n }\n);\nvar userModelMessageSchema = z5.object({\n role: z5.literal(\"user\"),\n content: z5.union([\n z5.string(),\n z5.array(z5.union([textPartSchema, imagePartSchema, filePartSchema]))\n ]),\n providerOptions: providerMetadataSchema.optional()\n});\nvar assistantModelMessageSchema = z5.object({\n role: z5.literal(\"assistant\"),\n content: z5.union([\n z5.string(),\n z5.array(\n z5.union([\n textPartSchema,\n filePartSchema,\n reasoningPartSchema,\n toolCallPartSchema,\n toolResultPartSchema,\n toolApprovalRequestSchema\n ])\n )\n ]),\n providerOptions: providerMetadataSchema.optional()\n});\nvar toolModelMessageSchema = z5.object({\n role: z5.literal(\"tool\"),\n content: z5.array(z5.union([toolResultPartSchema, toolApprovalResponseSchema])),\n providerOptions: providerMetadataSchema.optional()\n});\nvar modelMessageSchema = z5.union([\n systemModelMessageSchema,\n userModelMessageSchema,\n assistantModelMessageSchema,\n toolModelMessageSchema\n]);\n\n// src/prompt/standardize-prompt.ts\nasync function standardizePrompt({\n allowSystemInMessages,\n system,\n prompt,\n messages\n}) {\n if (prompt == null && messages == null) {\n throw new InvalidPromptError2({\n prompt,\n message: \"prompt or messages must be defined\"\n });\n }\n if (prompt != null && messages != null) {\n throw new InvalidPromptError2({\n prompt,\n message: \"prompt and messages cannot be defined at the same time\"\n });\n }\n if (typeof system !== \"string\" && !asArray(system).every((message) => message.role === \"system\")) {\n throw new InvalidPromptError2({\n prompt,\n message: \"system must be a string, SystemModelMessage, or array of SystemModelMessage\"\n });\n }\n if (prompt != null && typeof prompt === \"string\") {\n messages = [{ role: \"user\", content: prompt }];\n } else if (prompt != null && Array.isArray(prompt)) {\n messages = prompt;\n } else if (messages == null) {\n throw new InvalidPromptError2({\n prompt,\n message: \"prompt or messages must be defined\"\n });\n }\n if (messages.length === 0) {\n throw new InvalidPromptError2({\n prompt,\n message: \"messages must not be empty\"\n });\n }\n if (messages.some((message) => message.role === \"system\")) {\n if (allowSystemInMessages === false) {\n throw new InvalidPromptError2({\n prompt,\n message: \"System messages are not allowed in the prompt or messages fields. Use the system option instead.\"\n });\n }\n if (allowSystemInMessages === void 0) {\n console.warn(\n \"AI SDK Warning: System messages in the prompt or messages fields can be a security risk because they may enable prompt injection attacks. Use the system option instead when possible. Set allowSystemInMessages to true to suppress this warning, or false to throw an error.\"\n );\n }\n }\n const validationResult = await safeValidateTypes({\n value: messages,\n schema: z6.array(modelMessageSchema)\n });\n if (!validationResult.success) {\n throw new InvalidPromptError2({\n prompt,\n message: \"The messages do not match the ModelMessage[] schema.\",\n cause: validationResult.error\n });\n }\n return { messages, system };\n}\n\n// src/prompt/wrap-gateway-error.ts\nimport { GatewayAuthenticationError } from \"@ai-sdk/gateway\";\nimport { AISDKError as AISDKError23 } from \"@ai-sdk/provider\";\nfunction wrapGatewayError(error) {\n if (!GatewayAuthenticationError.isInstance(error))\n return error;\n const isProductionEnv = (process == null ? void 0 : process.env.NODE_ENV) === \"production\";\n const moreInfoURL = \"https://ai-sdk.dev/unauthenticated-ai-gateway\";\n if (isProductionEnv) {\n return new AISDKError23({\n name: \"GatewayError\",\n message: `Unauthenticated. Configure AI_GATEWAY_API_KEY or use a provider module. Learn more: ${moreInfoURL}`\n });\n }\n return Object.assign(\n new Error(`\\x1B[1m\\x1B[31mUnauthenticated request to AI Gateway.\\x1B[0m\n\nTo authenticate, set the \\x1B[33mAI_GATEWAY_API_KEY\\x1B[0m environment variable with your API key.\n\nAlternatively, you can use a provider module instead of the AI Gateway.\n\nLearn more: \\x1B[34m${moreInfoURL}\\x1B[0m\n\n`),\n { name: \"GatewayAuthenticationError\" }\n );\n}\n\n// src/telemetry/assemble-operation-name.ts\nfunction assembleOperationName({\n operationId,\n telemetry\n}) {\n return {\n // standardized operation and resource name:\n \"operation.name\": `${operationId}${(telemetry == null ? void 0 : telemetry.functionId) != null ? ` ${telemetry.functionId}` : \"\"}`,\n \"resource.name\": telemetry == null ? void 0 : telemetry.functionId,\n // detailed, AI SDK specific data:\n \"ai.operationId\": operationId,\n \"ai.telemetry.functionId\": telemetry == null ? void 0 : telemetry.functionId\n };\n}\n\n// src/telemetry/get-base-telemetry-attributes.ts\nfunction getBaseTelemetryAttributes({\n model,\n settings,\n telemetry,\n headers\n}) {\n var _a21;\n return {\n \"ai.model.provider\": model.provider,\n \"ai.model.id\": model.modelId,\n // settings:\n ...Object.entries(settings).reduce((attributes, [key, value]) => {\n if (key === \"timeout\") {\n const totalTimeoutMs = getTotalTimeoutMs(\n value\n );\n if (totalTimeoutMs != null) {\n attributes[`ai.settings.${key}`] = totalTimeoutMs;\n }\n } else {\n attributes[`ai.settings.${key}`] = value;\n }\n return attributes;\n }, {}),\n // add metadata as attributes:\n ...Object.entries((_a21 = telemetry == null ? void 0 : telemetry.metadata) != null ? _a21 : {}).reduce(\n (attributes, [key, value]) => {\n attributes[`ai.telemetry.metadata.${key}`] = value;\n return attributes;\n },\n {}\n ),\n // request headers\n ...Object.entries(headers != null ? headers : {}).reduce((attributes, [key, value]) => {\n if (value !== void 0) {\n attributes[`ai.request.headers.${key}`] = value;\n }\n return attributes;\n }, {})\n };\n}\n\n// src/telemetry/get-tracer.ts\nimport { trace } from \"@opentelemetry/api\";\n\n// src/telemetry/noop-tracer.ts\nvar noopTracer = {\n startSpan() {\n return noopSpan;\n },\n startActiveSpan(name21, arg1, arg2, arg3) {\n if (typeof arg1 === \"function\") {\n return arg1(noopSpan);\n }\n if (typeof arg2 === \"function\") {\n return arg2(noopSpan);\n }\n if (typeof arg3 === \"function\") {\n return arg3(noopSpan);\n }\n }\n};\nvar noopSpan = {\n spanContext() {\n return noopSpanContext;\n },\n setAttribute() {\n return this;\n },\n setAttributes() {\n return this;\n },\n addEvent() {\n return this;\n },\n addLink() {\n return this;\n },\n addLinks() {\n return this;\n },\n setStatus() {\n return this;\n },\n updateName() {\n return this;\n },\n end() {\n return this;\n },\n isRecording() {\n return false;\n },\n recordException() {\n return this;\n }\n};\nvar noopSpanContext = {\n traceId: \"\",\n spanId: \"\",\n traceFlags: 0\n};\n\n// src/telemetry/get-tracer.ts\nfunction getTracer({\n isEnabled = false,\n tracer\n} = {}) {\n if (!isEnabled) {\n return noopTracer;\n }\n if (tracer) {\n return tracer;\n }\n return trace.getTracer(\"ai\");\n}\n\n// src/telemetry/record-span.ts\nimport {\n SpanStatusCode,\n context\n} from \"@opentelemetry/api\";\nasync function recordSpan({\n name: name21,\n tracer,\n attributes,\n fn,\n endWhenDone = true\n}) {\n return tracer.startActiveSpan(\n name21,\n { attributes: await attributes },\n async (span) => {\n const ctx = context.active();\n try {\n const result = await context.with(ctx, () => fn(span));\n if (endWhenDone) {\n span.end();\n }\n return result;\n } catch (error) {\n try {\n recordErrorOnSpan(span, error);\n } finally {\n span.end();\n }\n throw error;\n }\n }\n );\n}\nfunction recordErrorOnSpan(span, error) {\n if (error instanceof Error) {\n span.recordException({\n name: error.name,\n message: error.message,\n stack: error.stack\n });\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message\n });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n}\n\n// src/telemetry/select-telemetry-attributes.ts\nasync function selectTelemetryAttributes({\n telemetry,\n attributes\n}) {\n if ((telemetry == null ? void 0 : telemetry.isEnabled) !== true) {\n return {};\n }\n const resultAttributes = {};\n for (const [key, value] of Object.entries(attributes)) {\n if (value == null) {\n continue;\n }\n if (typeof value === \"object\" && \"input\" in value && typeof value.input === \"function\") {\n if ((telemetry == null ? void 0 : telemetry.recordInputs) === false) {\n continue;\n }\n const result = await value.input();\n if (result != null) {\n resultAttributes[key] = result;\n }\n continue;\n }\n if (typeof value === \"object\" && \"output\" in value && typeof value.output === \"function\") {\n if ((telemetry == null ? void 0 : telemetry.recordOutputs) === false) {\n continue;\n }\n const result = await value.output();\n if (result != null) {\n resultAttributes[key] = result;\n }\n continue;\n }\n resultAttributes[key] = value;\n }\n return resultAttributes;\n}\n\n// src/telemetry/stringify-for-telemetry.ts\nfunction stringifyForTelemetry(prompt) {\n return JSON.stringify(\n prompt.map((message) => ({\n ...message,\n content: typeof message.content === \"string\" ? message.content : message.content.map(\n (part) => part.type === \"file\" ? {\n ...part,\n data: part.data instanceof Uint8Array ? convertDataContentToBase64String(part.data) : part.data\n } : part\n )\n }))\n );\n}\n\n// src/telemetry/telemetry-integration-registry.ts\nfunction registerTelemetryIntegration(integration) {\n if (!globalThis.AI_SDK_TELEMETRY_INTEGRATIONS) {\n globalThis.AI_SDK_TELEMETRY_INTEGRATIONS = [];\n }\n globalThis.AI_SDK_TELEMETRY_INTEGRATIONS.push(integration);\n}\nfunction getGlobalTelemetryIntegrations() {\n var _a21;\n return (_a21 = globalThis.AI_SDK_TELEMETRY_INTEGRATIONS) != null ? _a21 : [];\n}\n\n// src/telemetry/get-global-telemetry-integration.ts\nfunction bindTelemetryIntegration(integration) {\n var _a21, _b, _c, _d, _e, _f;\n return {\n onStart: (_a21 = integration.onStart) == null ? void 0 : _a21.bind(integration),\n onStepStart: (_b = integration.onStepStart) == null ? void 0 : _b.bind(integration),\n onToolCallStart: (_c = integration.onToolCallStart) == null ? void 0 : _c.bind(integration),\n onToolCallFinish: (_d = integration.onToolCallFinish) == null ? void 0 : _d.bind(integration),\n onStepFinish: (_e = integration.onStepFinish) == null ? void 0 : _e.bind(integration),\n onFinish: (_f = integration.onFinish) == null ? void 0 : _f.bind(integration)\n };\n}\nfunction getGlobalTelemetryIntegration() {\n const globalIntegrations = getGlobalTelemetryIntegrations();\n return (integrations) => {\n const localIntegrations = asArray(integrations);\n const allIntegrations = [...globalIntegrations, ...localIntegrations];\n function createTelemetryComposite(getListenerFromIntegration) {\n const listeners = allIntegrations.map(getListenerFromIntegration).filter(Boolean);\n return async (event) => {\n for (const listener of listeners) {\n try {\n await listener(event);\n } catch (_ignored) {\n }\n }\n };\n }\n return {\n onStart: createTelemetryComposite((integration) => integration.onStart),\n onStepStart: createTelemetryComposite(\n (integration) => integration.onStepStart\n ),\n onToolCallStart: createTelemetryComposite(\n (integration) => integration.onToolCallStart\n ),\n onToolCallFinish: createTelemetryComposite(\n (integration) => integration.onToolCallFinish\n ),\n onStepFinish: createTelemetryComposite(\n (integration) => integration.onStepFinish\n ),\n onFinish: createTelemetryComposite((integration) => integration.onFinish)\n };\n };\n}\n\n// src/types/usage.ts\nfunction asLanguageModelUsage(usage) {\n return {\n inputTokens: usage.inputTokens.total,\n inputTokenDetails: {\n noCacheTokens: usage.inputTokens.noCache,\n cacheReadTokens: usage.inputTokens.cacheRead,\n cacheWriteTokens: usage.inputTokens.cacheWrite\n },\n outputTokens: usage.outputTokens.total,\n outputTokenDetails: {\n textTokens: usage.outputTokens.text,\n reasoningTokens: usage.outputTokens.reasoning\n },\n totalTokens: addTokenCounts(\n usage.inputTokens.total,\n usage.outputTokens.total\n ),\n raw: usage.raw,\n reasoningTokens: usage.outputTokens.reasoning,\n cachedInputTokens: usage.inputTokens.cacheRead\n };\n}\nfunction createNullLanguageModelUsage() {\n return {\n inputTokens: void 0,\n inputTokenDetails: {\n noCacheTokens: void 0,\n cacheReadTokens: void 0,\n cacheWriteTokens: void 0\n },\n outputTokens: void 0,\n outputTokenDetails: {\n textTokens: void 0,\n reasoningTokens: void 0\n },\n totalTokens: void 0,\n raw: void 0\n };\n}\nfunction addLanguageModelUsage(usage1, usage2) {\n var _a21, _b, _c, _d, _e, _f, _g, _h, _i, _j;\n return {\n inputTokens: addTokenCounts(usage1.inputTokens, usage2.inputTokens),\n inputTokenDetails: {\n noCacheTokens: addTokenCounts(\n (_a21 = usage1.inputTokenDetails) == null ? void 0 : _a21.noCacheTokens,\n (_b = usage2.inputTokenDetails) == null ? void 0 : _b.noCacheTokens\n ),\n cacheReadTokens: addTokenCounts(\n (_c = usage1.inputTokenDetails) == null ? void 0 : _c.cacheReadTokens,\n (_d = usage2.inputTokenDetails) == null ? void 0 : _d.cacheReadTokens\n ),\n cacheWriteTokens: addTokenCounts(\n (_e = usage1.inputTokenDetails) == null ? void 0 : _e.cacheWriteTokens,\n (_f = usage2.inputTokenDetails) == null ? void 0 : _f.cacheWriteTokens\n )\n },\n outputTokens: addTokenCounts(usage1.outputTokens, usage2.outputTokens),\n outputTokenDetails: {\n textTokens: addTokenCounts(\n (_g = usage1.outputTokenDetails) == null ? void 0 : _g.textTokens,\n (_h = usage2.outputTokenDetails) == null ? void 0 : _h.textTokens\n ),\n reasoningTokens: addTokenCounts(\n (_i = usage1.outputTokenDetails) == null ? void 0 : _i.reasoningTokens,\n (_j = usage2.outputTokenDetails) == null ? void 0 : _j.reasoningTokens\n )\n },\n totalTokens: addTokenCounts(usage1.totalTokens, usage2.totalTokens),\n reasoningTokens: addTokenCounts(\n usage1.reasoningTokens,\n usage2.reasoningTokens\n ),\n cachedInputTokens: addTokenCounts(\n usage1.cachedInputTokens,\n usage2.cachedInputTokens\n )\n };\n}\nfunction addTokenCounts(tokenCount1, tokenCount2) {\n return tokenCount1 == null && tokenCount2 == null ? void 0 : (tokenCount1 != null ? tokenCount1 : 0) + (tokenCount2 != null ? tokenCount2 : 0);\n}\nfunction addImageModelUsage(usage1, usage2) {\n return {\n inputTokens: addTokenCounts(usage1.inputTokens, usage2.inputTokens),\n outputTokens: addTokenCounts(usage1.outputTokens, usage2.outputTokens),\n totalTokens: addTokenCounts(usage1.totalTokens, usage2.totalTokens)\n };\n}\n\n// src/util/merge-objects.ts\nfunction mergeObjects(base, overrides) {\n if (base === void 0 && overrides === void 0) {\n return void 0;\n }\n if (base === void 0) {\n return overrides;\n }\n if (overrides === void 0) {\n return base;\n }\n const result = { ...base };\n for (const key in overrides) {\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") {\n continue;\n }\n if (Object.prototype.hasOwnProperty.call(overrides, key)) {\n const overridesValue = overrides[key];\n if (overridesValue === void 0)\n continue;\n const baseValue = key in base ? base[key] : void 0;\n const isSourceObject = overridesValue !== null && typeof overridesValue === \"object\" && !Array.isArray(overridesValue) && !(overridesValue instanceof Date) && !(overridesValue instanceof RegExp);\n const isTargetObject = baseValue !== null && baseValue !== void 0 && typeof baseValue === \"object\" && !Array.isArray(baseValue) && !(baseValue instanceof Date) && !(baseValue instanceof RegExp);\n if (isSourceObject && isTargetObject) {\n result[key] = mergeObjects(\n baseValue,\n overridesValue\n );\n } else {\n result[key] = overridesValue;\n }\n }\n }\n return result;\n}\n\n// src/util/retry-with-exponential-backoff.ts\nimport { APICallError as APICallError2 } from \"@ai-sdk/provider\";\nimport { GatewayError } from \"@ai-sdk/gateway\";\nimport { delay, getErrorMessage as getErrorMessage4, isAbortError } from \"@ai-sdk/provider-utils\";\nfunction getRetryDelayInMs({\n error,\n exponentialBackoffDelay\n}) {\n const headers = APICallError2.isInstance(error) ? error.responseHeaders : APICallError2.isInstance(error.cause) ? error.cause.responseHeaders : void 0;\n if (!headers)\n return exponentialBackoffDelay;\n let ms;\n const retryAfterMs = headers[\"retry-after-ms\"];\n if (retryAfterMs) {\n const timeoutMs = parseFloat(retryAfterMs);\n if (!Number.isNaN(timeoutMs)) {\n ms = timeoutMs;\n }\n }\n const retryAfter = headers[\"retry-after\"];\n if (retryAfter && ms === void 0) {\n const timeoutSeconds = parseFloat(retryAfter);\n if (!Number.isNaN(timeoutSeconds)) {\n ms = timeoutSeconds * 1e3;\n } else {\n ms = Date.parse(retryAfter) - Date.now();\n }\n }\n if (ms != null && !Number.isNaN(ms) && 0 <= ms && (ms < 60 * 1e3 || ms < exponentialBackoffDelay)) {\n return ms;\n }\n return exponentialBackoffDelay;\n}\nvar retryWithExponentialBackoffRespectingRetryHeaders = ({\n maxRetries = 2,\n initialDelayInMs = 2e3,\n backoffFactor = 2,\n abortSignal\n} = {}) => async (f) => _retryWithExponentialBackoff(f, {\n maxRetries,\n delayInMs: initialDelayInMs,\n backoffFactor,\n abortSignal\n});\nasync function _retryWithExponentialBackoff(f, {\n maxRetries,\n delayInMs,\n backoffFactor,\n abortSignal\n}, errors = []) {\n try {\n return await f();\n } catch (error) {\n if (isAbortError(error)) {\n throw error;\n }\n if (maxRetries === 0) {\n throw error;\n }\n const errorMessage = getErrorMessage4(error);\n const newErrors = [...errors, error];\n const tryNumber = newErrors.length;\n if (tryNumber > maxRetries) {\n throw new RetryError({\n message: `Failed after ${tryNumber} attempts. Last error: ${errorMessage}`,\n reason: \"maxRetriesExceeded\",\n errors: newErrors\n });\n }\n if (error instanceof Error && (APICallError2.isInstance(error) && error.isRetryable === true || GatewayError.isInstance(error) && error.isRetryable === true) && tryNumber <= maxRetries) {\n await delay(\n getRetryDelayInMs({\n error,\n exponentialBackoffDelay: delayInMs\n }),\n { abortSignal }\n );\n return _retryWithExponentialBackoff(\n f,\n {\n maxRetries,\n delayInMs: backoffFactor * delayInMs,\n backoffFactor,\n abortSignal\n },\n newErrors\n );\n }\n if (tryNumber === 1) {\n throw error;\n }\n throw new RetryError({\n message: `Failed after ${tryNumber} attempts with non-retryable error: '${errorMessage}'`,\n reason: \"errorNotRetryable\",\n errors: newErrors\n });\n }\n}\n\n// src/util/prepare-retries.ts\nfunction prepareRetries({\n maxRetries,\n abortSignal\n}) {\n if (maxRetries != null) {\n if (!Number.isInteger(maxRetries)) {\n throw new InvalidArgumentError({\n parameter: \"maxRetries\",\n value: maxRetries,\n message: \"maxRetries must be an integer\"\n });\n }\n if (maxRetries < 0) {\n throw new InvalidArgumentError({\n parameter: \"maxRetries\",\n value: maxRetries,\n message: \"maxRetries must be >= 0\"\n });\n }\n }\n const maxRetriesResult = maxRetries != null ? maxRetries : 2;\n return {\n maxRetries: maxRetriesResult,\n retry: retryWithExponentialBackoffRespectingRetryHeaders({\n maxRetries: maxRetriesResult,\n abortSignal\n })\n };\n}\n\n// src/generate-text/collect-tool-approvals.ts\nfunction collectToolApprovals({\n messages\n}) {\n const lastMessage = messages.at(-1);\n if ((lastMessage == null ? void 0 : lastMessage.role) != \"tool\") {\n return {\n approvedToolApprovals: [],\n deniedToolApprovals: []\n };\n }\n const toolCallsByToolCallId = {};\n for (const message of messages) {\n if (message.role === \"assistant\" && typeof message.content !== \"string\") {\n const content = message.content;\n for (const part of content) {\n if (part.type === \"tool-call\") {\n toolCallsByToolCallId[part.toolCallId] = part;\n }\n }\n }\n }\n const toolApprovalRequestsByApprovalId = {};\n for (const message of messages) {\n if (message.role === \"assistant\" && typeof message.content !== \"string\") {\n const content = message.content;\n for (const part of content) {\n if (part.type === \"tool-approval-request\") {\n toolApprovalRequestsByApprovalId[part.approvalId] = part;\n }\n }\n }\n }\n const toolResults = {};\n for (const part of lastMessage.content) {\n if (part.type === \"tool-result\") {\n toolResults[part.toolCallId] = part;\n }\n }\n const approvedToolApprovals = [];\n const deniedToolApprovals = [];\n const approvalResponses = lastMessage.content.filter(\n (part) => part.type === \"tool-approval-response\"\n );\n for (const approvalResponse of approvalResponses) {\n const approvalRequest = toolApprovalRequestsByApprovalId[approvalResponse.approvalId];\n if (approvalRequest == null) {\n throw new InvalidToolApprovalError({\n approvalId: approvalResponse.approvalId\n });\n }\n if (toolResults[approvalRequest.toolCallId] != null) {\n continue;\n }\n const toolCall = toolCallsByToolCallId[approvalRequest.toolCallId];\n if (toolCall == null) {\n throw new ToolCallNotFoundForApprovalError({\n toolCallId: approvalRequest.toolCallId,\n approvalId: approvalRequest.approvalId\n });\n }\n const approval = {\n approvalRequest,\n approvalResponse,\n toolCall\n };\n if (approvalResponse.approved) {\n approvedToolApprovals.push(approval);\n } else {\n deniedToolApprovals.push(approval);\n }\n }\n return { approvedToolApprovals, deniedToolApprovals };\n}\n\n// src/generate-text/execute-tool-call.ts\nimport { executeTool } from \"@ai-sdk/provider-utils\";\n\n// src/util/now.ts\nfunction now() {\n var _a21, _b;\n return (_b = (_a21 = globalThis == null ? void 0 : globalThis.performance) == null ? void 0 : _a21.now()) != null ? _b : Date.now();\n}\n\n// src/generate-text/execute-tool-call.ts\nasync function executeToolCall({\n toolCall,\n tools,\n tracer,\n telemetry,\n messages,\n abortSignal,\n experimental_context,\n stepNumber,\n model,\n onPreliminaryToolResult,\n onToolCallStart,\n onToolCallFinish\n}) {\n const { toolName, toolCallId, input } = toolCall;\n const tool2 = tools == null ? void 0 : tools[toolName];\n if ((tool2 == null ? void 0 : tool2.execute) == null) {\n return void 0;\n }\n const baseCallbackEvent = {\n stepNumber,\n model,\n toolCall,\n messages,\n abortSignal,\n functionId: telemetry == null ? void 0 : telemetry.functionId,\n metadata: telemetry == null ? void 0 : telemetry.metadata,\n experimental_context\n };\n return recordSpan({\n name: \"ai.toolCall\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.toolCall\",\n telemetry\n }),\n \"ai.toolCall.name\": toolName,\n \"ai.toolCall.id\": toolCallId,\n \"ai.toolCall.args\": {\n output: () => JSON.stringify(input)\n }\n }\n }),\n tracer,\n fn: async (span) => {\n let output;\n await notify({ event: baseCallbackEvent, callbacks: onToolCallStart });\n const startTime = now();\n try {\n const stream = executeTool({\n execute: tool2.execute.bind(tool2),\n input,\n options: {\n toolCallId,\n messages,\n abortSignal,\n experimental_context\n }\n });\n for await (const part of stream) {\n if (part.type === \"preliminary\") {\n onPreliminaryToolResult == null ? void 0 : onPreliminaryToolResult({\n ...toolCall,\n type: \"tool-result\",\n output: part.output,\n preliminary: true\n });\n } else {\n output = part.output;\n }\n }\n } catch (error) {\n const durationMs2 = now() - startTime;\n await notify({\n event: {\n ...baseCallbackEvent,\n success: false,\n error,\n durationMs: durationMs2\n },\n callbacks: onToolCallFinish\n });\n recordErrorOnSpan(span, error);\n return {\n type: \"tool-error\",\n toolCallId,\n toolName,\n input,\n error,\n dynamic: tool2.type === \"dynamic\",\n ...toolCall.providerMetadata != null ? { providerMetadata: toolCall.providerMetadata } : {},\n ...toolCall.toolMetadata != null ? { toolMetadata: toolCall.toolMetadata } : {}\n };\n }\n const durationMs = now() - startTime;\n await notify({\n event: {\n ...baseCallbackEvent,\n success: true,\n output,\n durationMs\n },\n callbacks: onToolCallFinish\n });\n try {\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.toolCall.result\": {\n output: () => JSON.stringify(output)\n }\n }\n })\n );\n } catch (ignored) {\n }\n return {\n type: \"tool-result\",\n toolCallId,\n toolName,\n input,\n output,\n dynamic: tool2.type === \"dynamic\",\n ...toolCall.providerMetadata != null ? { providerMetadata: toolCall.providerMetadata } : {},\n ...toolCall.toolMetadata != null ? { toolMetadata: toolCall.toolMetadata } : {}\n };\n }\n });\n}\n\n// src/generate-text/extract-reasoning-content.ts\nfunction extractReasoningContent(content) {\n const parts = content.filter(\n (content2) => content2.type === \"reasoning\"\n );\n return parts.length === 0 ? void 0 : parts.map((content2) => content2.text).join(\"\\n\");\n}\n\n// src/generate-text/extract-text-content.ts\nfunction extractTextContent(content) {\n const parts = content.filter(\n (content2) => content2.type === \"text\"\n );\n if (parts.length === 0) {\n return void 0;\n }\n return parts.map((content2) => content2.text).join(\"\");\n}\n\n// src/generate-text/generated-file.ts\nimport {\n convertBase64ToUint8Array as convertBase64ToUint8Array3,\n convertUint8ArrayToBase64 as convertUint8ArrayToBase642\n} from \"@ai-sdk/provider-utils\";\nvar DefaultGeneratedFile = class {\n constructor({\n data,\n mediaType\n }) {\n const isUint8Array = data instanceof Uint8Array;\n this.base64Data = isUint8Array ? void 0 : data;\n this.uint8ArrayData = isUint8Array ? data : void 0;\n this.mediaType = mediaType;\n }\n // lazy conversion with caching to avoid unnecessary conversion overhead:\n get base64() {\n if (this.base64Data == null) {\n this.base64Data = convertUint8ArrayToBase642(this.uint8ArrayData);\n }\n return this.base64Data;\n }\n // lazy conversion with caching to avoid unnecessary conversion overhead:\n get uint8Array() {\n if (this.uint8ArrayData == null) {\n this.uint8ArrayData = convertBase64ToUint8Array3(this.base64Data);\n }\n return this.uint8ArrayData;\n }\n};\nvar DefaultGeneratedFileWithType = class extends DefaultGeneratedFile {\n constructor(options) {\n super(options);\n this.type = \"file\";\n }\n};\n\n// src/generate-text/is-approval-needed.ts\nasync function isApprovalNeeded({\n tool: tool2,\n toolCall,\n messages,\n experimental_context\n}) {\n if (tool2.needsApproval == null) {\n return false;\n }\n if (typeof tool2.needsApproval === \"boolean\") {\n return tool2.needsApproval;\n }\n return await tool2.needsApproval(toolCall.input, {\n toolCallId: toolCall.toolCallId,\n messages,\n experimental_context\n });\n}\n\n// src/generate-text/output.ts\nvar output_exports = {};\n__export(output_exports, {\n array: () => array,\n choice: () => choice,\n json: () => json,\n object: () => object,\n text: () => text\n});\nimport {\n TypeValidationError as TypeValidationError2\n} from \"@ai-sdk/provider\";\nimport {\n asSchema as asSchema2,\n resolve,\n safeParseJSON as safeParseJSON2,\n safeValidateTypes as safeValidateTypes2\n} from \"@ai-sdk/provider-utils\";\n\n// src/util/parse-partial-json.ts\nimport { safeParseJSON } from \"@ai-sdk/provider-utils\";\n\n// src/util/fix-json.ts\nfunction fixJson(input) {\n const stack = [\"ROOT\"];\n let lastValidIndex = -1;\n let literalStart = null;\n function processValueStart(char, i, swapState) {\n {\n switch (char) {\n case '\"': {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_STRING\");\n break;\n }\n case \"f\":\n case \"t\":\n case \"n\": {\n lastValidIndex = i;\n literalStart = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_LITERAL\");\n break;\n }\n case \"-\": {\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_NUMBER\");\n break;\n }\n case \"0\":\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\": {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_NUMBER\");\n break;\n }\n case \"{\": {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_OBJECT_START\");\n break;\n }\n case \"[\": {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_ARRAY_START\");\n break;\n }\n }\n }\n }\n function processAfterObjectValue(char, i) {\n switch (char) {\n case \",\": {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_AFTER_COMMA\");\n break;\n }\n case \"}\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n }\n }\n function processAfterArrayValue(char, i) {\n switch (char) {\n case \",\": {\n stack.pop();\n stack.push(\"INSIDE_ARRAY_AFTER_COMMA\");\n break;\n }\n case \"]\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n }\n }\n for (let i = 0; i < input.length; i++) {\n const char = input[i];\n const currentState = stack[stack.length - 1];\n switch (currentState) {\n case \"ROOT\":\n processValueStart(char, i, \"FINISH\");\n break;\n case \"INSIDE_OBJECT_START\": {\n switch (char) {\n case '\"': {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_KEY\");\n break;\n }\n case \"}\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n }\n break;\n }\n case \"INSIDE_OBJECT_AFTER_COMMA\": {\n switch (char) {\n case '\"': {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_KEY\");\n break;\n }\n }\n break;\n }\n case \"INSIDE_OBJECT_KEY\": {\n switch (char) {\n case '\"': {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_AFTER_KEY\");\n break;\n }\n }\n break;\n }\n case \"INSIDE_OBJECT_AFTER_KEY\": {\n switch (char) {\n case \":\": {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_BEFORE_VALUE\");\n break;\n }\n }\n break;\n }\n case \"INSIDE_OBJECT_BEFORE_VALUE\": {\n processValueStart(char, i, \"INSIDE_OBJECT_AFTER_VALUE\");\n break;\n }\n case \"INSIDE_OBJECT_AFTER_VALUE\": {\n processAfterObjectValue(char, i);\n break;\n }\n case \"INSIDE_STRING\": {\n switch (char) {\n case '\"': {\n stack.pop();\n lastValidIndex = i;\n break;\n }\n case \"\\\\\": {\n stack.push(\"INSIDE_STRING_ESCAPE\");\n break;\n }\n default: {\n lastValidIndex = i;\n }\n }\n break;\n }\n case \"INSIDE_ARRAY_START\": {\n switch (char) {\n case \"]\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n default: {\n lastValidIndex = i;\n processValueStart(char, i, \"INSIDE_ARRAY_AFTER_VALUE\");\n break;\n }\n }\n break;\n }\n case \"INSIDE_ARRAY_AFTER_VALUE\": {\n switch (char) {\n case \",\": {\n stack.pop();\n stack.push(\"INSIDE_ARRAY_AFTER_COMMA\");\n break;\n }\n case \"]\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n default: {\n lastValidIndex = i;\n break;\n }\n }\n break;\n }\n case \"INSIDE_ARRAY_AFTER_COMMA\": {\n processValueStart(char, i, \"INSIDE_ARRAY_AFTER_VALUE\");\n break;\n }\n case \"INSIDE_STRING_ESCAPE\": {\n stack.pop();\n lastValidIndex = i;\n break;\n }\n case \"INSIDE_NUMBER\": {\n switch (char) {\n case \"0\":\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\": {\n lastValidIndex = i;\n break;\n }\n case \"e\":\n case \"E\":\n case \"-\":\n case \".\": {\n break;\n }\n case \",\": {\n stack.pop();\n if (stack[stack.length - 1] === \"INSIDE_ARRAY_AFTER_VALUE\") {\n processAfterArrayValue(char, i);\n }\n if (stack[stack.length - 1] === \"INSIDE_OBJECT_AFTER_VALUE\") {\n processAfterObjectValue(char, i);\n }\n break;\n }\n case \"}\": {\n stack.pop();\n if (stack[stack.length - 1] === \"INSIDE_OBJECT_AFTER_VALUE\") {\n processAfterObjectValue(char, i);\n }\n break;\n }\n case \"]\": {\n stack.pop();\n if (stack[stack.length - 1] === \"INSIDE_ARRAY_AFTER_VALUE\") {\n processAfterArrayValue(char, i);\n }\n break;\n }\n default: {\n stack.pop();\n break;\n }\n }\n break;\n }\n case \"INSIDE_LITERAL\": {\n const partialLiteral = input.substring(literalStart, i + 1);\n if (!\"false\".startsWith(partialLiteral) && !\"true\".startsWith(partialLiteral) && !\"null\".startsWith(partialLiteral)) {\n stack.pop();\n if (stack[stack.length - 1] === \"INSIDE_OBJECT_AFTER_VALUE\") {\n processAfterObjectValue(char, i);\n } else if (stack[stack.length - 1] === \"INSIDE_ARRAY_AFTER_VALUE\") {\n processAfterArrayValue(char, i);\n }\n } else {\n lastValidIndex = i;\n }\n break;\n }\n }\n }\n let result = input.slice(0, lastValidIndex + 1);\n for (let i = stack.length - 1; i >= 0; i--) {\n const state = stack[i];\n switch (state) {\n case \"INSIDE_STRING\": {\n result += '\"';\n break;\n }\n case \"INSIDE_OBJECT_KEY\":\n case \"INSIDE_OBJECT_AFTER_KEY\":\n case \"INSIDE_OBJECT_AFTER_COMMA\":\n case \"INSIDE_OBJECT_START\":\n case \"INSIDE_OBJECT_BEFORE_VALUE\":\n case \"INSIDE_OBJECT_AFTER_VALUE\": {\n result += \"}\";\n break;\n }\n case \"INSIDE_ARRAY_START\":\n case \"INSIDE_ARRAY_AFTER_COMMA\":\n case \"INSIDE_ARRAY_AFTER_VALUE\": {\n result += \"]\";\n break;\n }\n case \"INSIDE_LITERAL\": {\n const partialLiteral = input.substring(literalStart, input.length);\n if (\"true\".startsWith(partialLiteral)) {\n result += \"true\".slice(partialLiteral.length);\n } else if (\"false\".startsWith(partialLiteral)) {\n result += \"false\".slice(partialLiteral.length);\n } else if (\"null\".startsWith(partialLiteral)) {\n result += \"null\".slice(partialLiteral.length);\n }\n }\n }\n }\n return result;\n}\n\n// src/util/parse-partial-json.ts\nasync function parsePartialJson(jsonText) {\n if (jsonText === void 0) {\n return { value: void 0, state: \"undefined-input\" };\n }\n let result = await safeParseJSON({ text: jsonText });\n if (result.success) {\n return { value: result.value, state: \"successful-parse\" };\n }\n result = await safeParseJSON({ text: fixJson(jsonText) });\n if (result.success) {\n return { value: result.value, state: \"repaired-parse\" };\n }\n return { value: void 0, state: \"failed-parse\" };\n}\n\n// src/generate-text/output.ts\nvar text = () => ({\n name: \"text\",\n responseFormat: Promise.resolve({ type: \"text\" }),\n async parseCompleteOutput({ text: text2 }) {\n return text2;\n },\n async parsePartialOutput({ text: text2 }) {\n return { partial: text2 };\n },\n createElementStreamTransform() {\n return void 0;\n }\n});\nvar object = ({\n schema: inputSchema,\n name: name21,\n description\n}) => {\n const schema = asSchema2(inputSchema);\n return {\n name: \"object\",\n responseFormat: resolve(schema.jsonSchema).then((jsonSchema2) => ({\n type: \"json\",\n schema: jsonSchema2,\n ...name21 != null && { name: name21 },\n ...description != null && { description }\n })),\n async parseCompleteOutput({ text: text2 }, context2) {\n const parseResult = await safeParseJSON2({ text: text2 });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n const validationResult = await safeValidateTypes2({\n value: parseResult.value,\n schema\n });\n if (!validationResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: validationResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n return validationResult.value;\n },\n async parsePartialOutput({ text: text2 }) {\n const result = await parsePartialJson(text2);\n switch (result.state) {\n case \"failed-parse\":\n case \"undefined-input\": {\n return void 0;\n }\n case \"repaired-parse\":\n case \"successful-parse\": {\n return {\n // Note: currently no validation of partial results:\n partial: result.value\n };\n }\n }\n },\n createElementStreamTransform() {\n return void 0;\n }\n };\n};\nvar array = ({\n element: inputElementSchema,\n name: name21,\n description\n}) => {\n const elementSchema = asSchema2(inputElementSchema);\n return {\n name: \"array\",\n // JSON schema that describes an array of elements:\n responseFormat: resolve(elementSchema.jsonSchema).then((jsonSchema2) => {\n const { $schema, ...itemSchema } = jsonSchema2;\n return {\n type: \"json\",\n schema: {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n properties: {\n elements: { type: \"array\", items: itemSchema }\n },\n required: [\"elements\"],\n additionalProperties: false\n },\n ...name21 != null && { name: name21 },\n ...description != null && { description }\n };\n }),\n async parseCompleteOutput({ text: text2 }, context2) {\n const parseResult = await safeParseJSON2({ text: text2 });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n const outerValue = parseResult.value;\n if (outerValue == null || typeof outerValue !== \"object\" || !(\"elements\" in outerValue) || !Array.isArray(outerValue.elements)) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: new TypeValidationError2({\n value: outerValue,\n cause: \"response must be an object with an elements array\"\n }),\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n for (const element of outerValue.elements) {\n const validationResult = await safeValidateTypes2({\n value: element,\n schema: elementSchema\n });\n if (!validationResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: validationResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n }\n return outerValue.elements;\n },\n async parsePartialOutput({ text: text2 }) {\n const result = await parsePartialJson(text2);\n switch (result.state) {\n case \"failed-parse\":\n case \"undefined-input\": {\n return void 0;\n }\n case \"repaired-parse\":\n case \"successful-parse\": {\n const outerValue = result.value;\n if (outerValue == null || typeof outerValue !== \"object\" || !(\"elements\" in outerValue) || !Array.isArray(outerValue.elements)) {\n return void 0;\n }\n const rawElements = result.state === \"repaired-parse\" && outerValue.elements.length > 0 ? outerValue.elements.slice(0, -1) : outerValue.elements;\n const parsedElements = [];\n for (const rawElement of rawElements) {\n const validationResult = await safeValidateTypes2({\n value: rawElement,\n schema: elementSchema\n });\n if (validationResult.success) {\n parsedElements.push(validationResult.value);\n }\n }\n return { partial: parsedElements };\n }\n }\n },\n createElementStreamTransform() {\n let publishedElements = 0;\n return new TransformStream({\n transform({ partialOutput }, controller) {\n if (partialOutput != null) {\n for (; publishedElements < partialOutput.length; publishedElements++) {\n controller.enqueue(partialOutput[publishedElements]);\n }\n }\n }\n });\n }\n };\n};\nvar choice = ({\n options: choiceOptions,\n name: name21,\n description\n}) => {\n return {\n name: \"choice\",\n // JSON schema that describes an enumeration:\n responseFormat: Promise.resolve({\n type: \"json\",\n schema: {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n properties: {\n result: { type: \"string\", enum: choiceOptions }\n },\n required: [\"result\"],\n additionalProperties: false\n },\n ...name21 != null && { name: name21 },\n ...description != null && { description }\n }),\n async parseCompleteOutput({ text: text2 }, context2) {\n const parseResult = await safeParseJSON2({ text: text2 });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n const outerValue = parseResult.value;\n if (outerValue == null || typeof outerValue !== \"object\" || !(\"result\" in outerValue) || typeof outerValue.result !== \"string\" || !choiceOptions.includes(outerValue.result)) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: new TypeValidationError2({\n value: outerValue,\n cause: \"response must be an object that contains a choice value.\"\n }),\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n return outerValue.result;\n },\n async parsePartialOutput({ text: text2 }) {\n const result = await parsePartialJson(text2);\n switch (result.state) {\n case \"failed-parse\":\n case \"undefined-input\": {\n return void 0;\n }\n case \"repaired-parse\":\n case \"successful-parse\": {\n const outerValue = result.value;\n if (outerValue == null || typeof outerValue !== \"object\" || !(\"result\" in outerValue) || typeof outerValue.result !== \"string\") {\n return void 0;\n }\n const potentialMatches = choiceOptions.filter(\n (choiceOption) => choiceOption.startsWith(outerValue.result)\n );\n if (result.state === \"successful-parse\") {\n return potentialMatches.includes(outerValue.result) ? { partial: outerValue.result } : void 0;\n } else {\n return potentialMatches.length === 1 ? { partial: potentialMatches[0] } : void 0;\n }\n }\n }\n },\n createElementStreamTransform() {\n return void 0;\n }\n };\n};\nvar json = ({\n name: name21,\n description\n} = {}) => {\n return {\n name: \"json\",\n responseFormat: Promise.resolve({\n type: \"json\",\n ...name21 != null && { name: name21 },\n ...description != null && { description }\n }),\n async parseCompleteOutput({ text: text2 }, context2) {\n const parseResult = await safeParseJSON2({ text: text2 });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n return parseResult.value;\n },\n async parsePartialOutput({ text: text2 }) {\n const result = await parsePartialJson(text2);\n switch (result.state) {\n case \"failed-parse\":\n case \"undefined-input\": {\n return void 0;\n }\n case \"repaired-parse\":\n case \"successful-parse\": {\n return result.value === void 0 ? void 0 : { partial: result.value };\n }\n }\n },\n createElementStreamTransform() {\n return void 0;\n }\n };\n};\n\n// src/generate-text/parse-tool-call.ts\nimport {\n asSchema as asSchema3,\n safeParseJSON as safeParseJSON3,\n safeValidateTypes as safeValidateTypes3\n} from \"@ai-sdk/provider-utils\";\nasync function parseToolCall({\n toolCall,\n tools,\n repairToolCall,\n system,\n messages\n}) {\n try {\n if (tools == null) {\n if (toolCall.providerExecuted && toolCall.dynamic) {\n return await parseProviderExecutedDynamicToolCall(toolCall);\n }\n throw new NoSuchToolError({ toolName: toolCall.toolName });\n }\n try {\n return await doParseToolCall({ toolCall, tools });\n } catch (error) {\n if (repairToolCall == null || !(NoSuchToolError.isInstance(error) || InvalidToolInputError.isInstance(error))) {\n throw error;\n }\n let repairedToolCall = null;\n try {\n repairedToolCall = await repairToolCall({\n toolCall,\n tools,\n inputSchema: async ({ toolName }) => {\n const { inputSchema } = tools[toolName];\n return await asSchema3(inputSchema).jsonSchema;\n },\n system,\n messages,\n error\n });\n } catch (repairError) {\n throw new ToolCallRepairError({\n cause: repairError,\n originalError: error\n });\n }\n if (repairedToolCall == null) {\n throw error;\n }\n return await doParseToolCall({ toolCall: repairedToolCall, tools });\n }\n } catch (error) {\n const parsedInput = await safeParseJSON3({ text: toolCall.input });\n const input = parsedInput.success ? parsedInput.value : toolCall.input;\n const tool2 = tools == null ? void 0 : tools[toolCall.toolName];\n return {\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input,\n dynamic: true,\n invalid: true,\n error,\n title: tool2 == null ? void 0 : tool2.title,\n providerExecuted: toolCall.providerExecuted,\n providerMetadata: toolCall.providerMetadata,\n ...(tool2 == null ? void 0 : tool2.metadata) != null ? { toolMetadata: tool2.metadata } : {}\n };\n }\n}\nasync function parseProviderExecutedDynamicToolCall(toolCall) {\n const parseResult = toolCall.input.trim() === \"\" ? { success: true, value: {} } : await safeParseJSON3({ text: toolCall.input });\n if (parseResult.success === false) {\n throw new InvalidToolInputError({\n toolName: toolCall.toolName,\n toolInput: toolCall.input,\n cause: parseResult.error\n });\n }\n return {\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: parseResult.value,\n providerExecuted: true,\n dynamic: true,\n providerMetadata: toolCall.providerMetadata\n };\n}\nasync function doParseToolCall({\n toolCall,\n tools\n}) {\n const toolName = toolCall.toolName;\n const tool2 = tools[toolName];\n if (tool2 == null) {\n if (toolCall.providerExecuted && toolCall.dynamic) {\n return await parseProviderExecutedDynamicToolCall(toolCall);\n }\n throw new NoSuchToolError({\n toolName: toolCall.toolName,\n availableTools: Object.keys(tools)\n });\n }\n const schema = asSchema3(tool2.inputSchema);\n const parseResult = toolCall.input.trim() === \"\" ? await safeValidateTypes3({ value: {}, schema }) : await safeParseJSON3({ text: toolCall.input, schema });\n if (parseResult.success === false) {\n throw new InvalidToolInputError({\n toolName,\n toolInput: toolCall.input,\n cause: parseResult.error\n });\n }\n return tool2.type === \"dynamic\" ? {\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: parseResult.value,\n providerExecuted: toolCall.providerExecuted,\n providerMetadata: toolCall.providerMetadata,\n ...tool2.metadata != null ? { toolMetadata: tool2.metadata } : {},\n dynamic: true,\n title: tool2.title\n } : {\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName,\n input: parseResult.value,\n providerExecuted: toolCall.providerExecuted,\n providerMetadata: toolCall.providerMetadata,\n ...tool2.metadata != null ? { toolMetadata: tool2.metadata } : {},\n title: tool2.title\n };\n}\n\n// src/generate-text/step-result.ts\nvar DefaultStepResult = class {\n constructor({\n stepNumber,\n model,\n functionId,\n metadata,\n experimental_context,\n content,\n finishReason,\n rawFinishReason,\n usage,\n warnings,\n request,\n response,\n providerMetadata\n }) {\n this.stepNumber = stepNumber;\n this.model = model;\n this.functionId = functionId;\n this.metadata = metadata;\n this.experimental_context = experimental_context;\n this.content = content;\n this.finishReason = finishReason;\n this.rawFinishReason = rawFinishReason;\n this.usage = usage;\n this.warnings = warnings;\n this.request = request;\n this.response = response;\n this.providerMetadata = providerMetadata;\n }\n get text() {\n return this.content.filter((part) => part.type === \"text\").map((part) => part.text).join(\"\");\n }\n get reasoning() {\n return this.content.filter((part) => part.type === \"reasoning\");\n }\n get reasoningText() {\n return this.reasoning.length === 0 ? void 0 : this.reasoning.map((part) => part.text).join(\"\");\n }\n get files() {\n return this.content.filter((part) => part.type === \"file\").map((part) => part.file);\n }\n get sources() {\n return this.content.filter((part) => part.type === \"source\");\n }\n get toolCalls() {\n return this.content.filter((part) => part.type === \"tool-call\");\n }\n get staticToolCalls() {\n return this.toolCalls.filter(\n (toolCall) => toolCall.dynamic !== true\n );\n }\n get dynamicToolCalls() {\n return this.toolCalls.filter(\n (toolCall) => toolCall.dynamic === true\n );\n }\n get toolResults() {\n return this.content.filter((part) => part.type === \"tool-result\");\n }\n get staticToolResults() {\n return this.toolResults.filter(\n (toolResult) => toolResult.dynamic !== true\n );\n }\n get dynamicToolResults() {\n return this.toolResults.filter(\n (toolResult) => toolResult.dynamic === true\n );\n }\n};\n\n// src/generate-text/stop-condition.ts\nfunction stepCountIs(stepCount) {\n return ({ steps }) => steps.length === stepCount;\n}\nfunction isLoopFinished() {\n return () => false;\n}\nfunction hasToolCall(toolName) {\n return ({ steps }) => {\n var _a21, _b, _c;\n return (_c = (_b = (_a21 = steps[steps.length - 1]) == null ? void 0 : _a21.toolCalls) == null ? void 0 : _b.some(\n (toolCall) => toolCall.toolName === toolName\n )) != null ? _c : false;\n };\n}\nasync function isStopConditionMet({\n stopConditions,\n steps\n}) {\n return (await Promise.all(stopConditions.map((condition) => condition({ steps })))).some((result) => result);\n}\n\n// src/generate-text/to-response-messages.ts\nasync function toResponseMessages({\n content: inputContent,\n tools\n}) {\n const responseMessages = [];\n const content = [];\n for (const part of inputContent) {\n if (part.type === \"source\") {\n continue;\n }\n if ((part.type === \"tool-result\" || part.type === \"tool-error\") && !part.providerExecuted) {\n continue;\n }\n if (part.type === \"text\" && part.text.length === 0) {\n continue;\n }\n switch (part.type) {\n case \"text\":\n content.push({\n type: \"text\",\n text: part.text,\n providerOptions: part.providerMetadata\n });\n break;\n case \"reasoning\":\n content.push({\n type: \"reasoning\",\n text: part.text,\n providerOptions: part.providerMetadata\n });\n break;\n case \"file\":\n content.push({\n type: \"file\",\n data: part.file.base64,\n mediaType: part.file.mediaType,\n providerOptions: part.providerMetadata\n });\n break;\n case \"tool-call\":\n content.push({\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.invalid && typeof part.input !== \"object\" ? {} : part.input,\n providerExecuted: part.providerExecuted,\n providerOptions: part.providerMetadata\n });\n break;\n case \"tool-result\": {\n const output = await createToolModelOutput({\n toolCallId: part.toolCallId,\n input: part.input,\n tool: tools == null ? void 0 : tools[part.toolName],\n output: part.output,\n errorMode: \"none\"\n });\n content.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output,\n providerOptions: part.providerMetadata\n });\n break;\n }\n case \"tool-error\": {\n const output = await createToolModelOutput({\n toolCallId: part.toolCallId,\n input: part.input,\n tool: tools == null ? void 0 : tools[part.toolName],\n output: part.error,\n errorMode: \"json\"\n });\n content.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output,\n providerOptions: part.providerMetadata\n });\n break;\n }\n case \"tool-approval-request\":\n content.push({\n type: \"tool-approval-request\",\n approvalId: part.approvalId,\n toolCallId: part.toolCall.toolCallId\n });\n break;\n }\n }\n if (content.length > 0) {\n responseMessages.push({\n role: \"assistant\",\n content\n });\n }\n const toolResultContent = [];\n for (const part of inputContent) {\n if (!(part.type === \"tool-result\" || part.type === \"tool-error\") || part.providerExecuted) {\n continue;\n }\n const output = await createToolModelOutput({\n toolCallId: part.toolCallId,\n input: part.input,\n tool: tools == null ? void 0 : tools[part.toolName],\n output: part.type === \"tool-result\" ? part.output : part.error,\n errorMode: part.type === \"tool-error\" ? \"text\" : \"none\"\n });\n toolResultContent.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n });\n }\n if (toolResultContent.length > 0) {\n responseMessages.push({\n role: \"tool\",\n content: toolResultContent\n });\n }\n return responseMessages;\n}\n\n// src/util/merge-abort-signals.ts\nfunction mergeAbortSignals(...signals) {\n const validSignals = signals.filter(\n (signal) => signal != null\n );\n if (validSignals.length === 0) {\n return void 0;\n }\n if (validSignals.length === 1) {\n return validSignals[0];\n }\n const controller = new AbortController();\n for (const signal of validSignals) {\n if (signal.aborted) {\n controller.abort(signal.reason);\n return controller.signal;\n }\n signal.addEventListener(\n \"abort\",\n () => {\n controller.abort(signal.reason);\n },\n { once: true }\n );\n }\n return controller.signal;\n}\n\n// src/generate-text/generate-text.ts\nvar originalGenerateId = createIdGenerator({\n prefix: \"aitxt\",\n size: 24\n});\nasync function generateText({\n model: modelArg,\n tools,\n toolChoice,\n system,\n prompt,\n messages,\n allowSystemInMessages,\n maxRetries: maxRetriesArg,\n abortSignal,\n timeout,\n headers,\n stopWhen = stepCountIs(1),\n experimental_output,\n output = experimental_output,\n experimental_telemetry: telemetry,\n providerOptions,\n experimental_activeTools,\n activeTools = experimental_activeTools,\n experimental_prepareStep,\n prepareStep = experimental_prepareStep,\n experimental_repairToolCall: repairToolCall,\n experimental_download: download2,\n experimental_context,\n experimental_include: include,\n _internal: { generateId: generateId2 = originalGenerateId } = {},\n experimental_onStart: onStart,\n experimental_onStepStart: onStepStart,\n experimental_onToolCallStart: onToolCallStart,\n experimental_onToolCallFinish: onToolCallFinish,\n onStepFinish,\n onFinish,\n ...settings\n}) {\n const model = resolveLanguageModel(modelArg);\n const createGlobalTelemetry = getGlobalTelemetryIntegration();\n const stopConditions = asArray(stopWhen);\n const totalTimeoutMs = getTotalTimeoutMs(timeout);\n const stepTimeoutMs = getStepTimeoutMs(timeout);\n const stepAbortController = stepTimeoutMs != null ? new AbortController() : void 0;\n const mergedAbortSignal = mergeAbortSignals(\n abortSignal,\n totalTimeoutMs != null ? AbortSignal.timeout(totalTimeoutMs) : void 0,\n stepAbortController == null ? void 0 : stepAbortController.signal\n );\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal: mergedAbortSignal\n });\n const callSettings = prepareCallSettings(settings);\n const headersWithUserAgent = withUserAgentSuffix2(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers: headersWithUserAgent,\n settings: { ...callSettings, maxRetries }\n });\n const modelInfo = { provider: model.provider, modelId: model.modelId };\n const initialPrompt = await standardizePrompt({\n system,\n prompt,\n messages,\n allowSystemInMessages\n });\n const globalTelemetry = createGlobalTelemetry(telemetry == null ? void 0 : telemetry.integrations);\n await notify({\n event: {\n model: modelInfo,\n system,\n prompt,\n messages,\n tools,\n toolChoice,\n activeTools,\n maxOutputTokens: callSettings.maxOutputTokens,\n temperature: callSettings.temperature,\n topP: callSettings.topP,\n topK: callSettings.topK,\n presencePenalty: callSettings.presencePenalty,\n frequencyPenalty: callSettings.frequencyPenalty,\n stopSequences: callSettings.stopSequences,\n seed: callSettings.seed,\n maxRetries,\n timeout,\n headers,\n providerOptions,\n stopWhen,\n output,\n abortSignal,\n include,\n functionId: telemetry == null ? void 0 : telemetry.functionId,\n metadata: telemetry == null ? void 0 : telemetry.metadata,\n experimental_context\n },\n callbacks: [\n onStart,\n globalTelemetry.onStart\n ]\n });\n const tracer = getTracer(telemetry);\n try {\n return await recordSpan({\n name: \"ai.generateText\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.generateText\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // model:\n \"ai.model.provider\": model.provider,\n \"ai.model.id\": model.modelId,\n // specific settings that only make sense on the outer level:\n \"ai.prompt\": {\n input: () => JSON.stringify({ system, prompt, messages })\n }\n }\n }),\n tracer,\n fn: async (span) => {\n var _a21, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t;\n const initialMessages = initialPrompt.messages;\n const responseMessages = [];\n const { approvedToolApprovals, deniedToolApprovals } = collectToolApprovals({ messages: initialMessages });\n const localApprovedToolApprovals = approvedToolApprovals.filter(\n (toolApproval) => !toolApproval.toolCall.providerExecuted\n );\n if (deniedToolApprovals.length > 0 || localApprovedToolApprovals.length > 0) {\n const toolOutputs = await executeTools({\n toolCalls: localApprovedToolApprovals.map(\n (toolApproval) => toolApproval.toolCall\n ),\n tools,\n tracer,\n telemetry,\n messages: initialMessages,\n abortSignal: mergedAbortSignal,\n experimental_context,\n stepNumber: 0,\n model: modelInfo,\n onToolCallStart: [\n onToolCallStart,\n globalTelemetry.onToolCallStart\n ],\n onToolCallFinish: [\n onToolCallFinish,\n globalTelemetry.onToolCallFinish\n ]\n });\n const toolContent = [];\n for (const output2 of toolOutputs) {\n const modelOutput = await createToolModelOutput({\n toolCallId: output2.toolCallId,\n input: output2.input,\n tool: tools == null ? void 0 : tools[output2.toolName],\n output: output2.type === \"tool-result\" ? output2.output : output2.error,\n errorMode: output2.type === \"tool-error\" ? \"text\" : \"none\"\n });\n toolContent.push({\n type: \"tool-result\",\n toolCallId: output2.toolCallId,\n toolName: output2.toolName,\n output: modelOutput\n });\n }\n for (const toolApproval of deniedToolApprovals) {\n toolContent.push({\n type: \"tool-result\",\n toolCallId: toolApproval.toolCall.toolCallId,\n toolName: toolApproval.toolCall.toolName,\n output: {\n type: \"execution-denied\",\n reason: toolApproval.approvalResponse.reason,\n // For provider-executed tools, include approvalId so provider can correlate\n ...toolApproval.toolCall.providerExecuted && {\n providerOptions: {\n openai: {\n approvalId: toolApproval.approvalResponse.approvalId\n }\n }\n }\n }\n });\n }\n responseMessages.push({\n role: \"tool\",\n content: toolContent\n });\n }\n const callSettings2 = prepareCallSettings(settings);\n let currentModelResponse;\n let clientToolCalls = [];\n let clientToolOutputs = [];\n const steps = [];\n const pendingDeferredToolCalls = /* @__PURE__ */ new Map();\n do {\n const stepTimeoutId = stepTimeoutMs != null ? setTimeout(() => stepAbortController.abort(), stepTimeoutMs) : void 0;\n try {\n const stepInputMessages = [...initialMessages, ...responseMessages];\n const prepareStepResult = await (prepareStep == null ? void 0 : prepareStep({\n model,\n steps,\n stepNumber: steps.length,\n messages: stepInputMessages,\n experimental_context\n }));\n const stepModel = resolveLanguageModel(\n (_a21 = prepareStepResult == null ? void 0 : prepareStepResult.model) != null ? _a21 : model\n );\n const stepModelInfo = {\n provider: stepModel.provider,\n modelId: stepModel.modelId\n };\n const promptMessages = await convertToLanguageModelPrompt({\n prompt: {\n system: (_b = prepareStepResult == null ? void 0 : prepareStepResult.system) != null ? _b : initialPrompt.system,\n messages: (_c = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _c : stepInputMessages\n },\n supportedUrls: await stepModel.supportedUrls,\n download: download2\n });\n experimental_context = (_d = prepareStepResult == null ? void 0 : prepareStepResult.experimental_context) != null ? _d : experimental_context;\n const stepActiveTools = (_e = prepareStepResult == null ? void 0 : prepareStepResult.activeTools) != null ? _e : activeTools;\n const { toolChoice: stepToolChoice, tools: stepTools } = await prepareToolsAndToolChoice({\n tools,\n toolChoice: (_f = prepareStepResult == null ? void 0 : prepareStepResult.toolChoice) != null ? _f : toolChoice,\n activeTools: stepActiveTools\n });\n const stepMessages = (_g = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _g : stepInputMessages;\n const stepSystem = (_h = prepareStepResult == null ? void 0 : prepareStepResult.system) != null ? _h : initialPrompt.system;\n const stepProviderOptions = mergeObjects(\n providerOptions,\n prepareStepResult == null ? void 0 : prepareStepResult.providerOptions\n );\n await notify({\n event: {\n stepNumber: steps.length,\n model: stepModelInfo,\n system: stepSystem,\n messages: stepMessages,\n tools,\n toolChoice: stepToolChoice,\n activeTools: stepActiveTools,\n steps: [...steps],\n providerOptions: stepProviderOptions,\n timeout,\n headers,\n stopWhen,\n output,\n abortSignal,\n include,\n functionId: telemetry == null ? void 0 : telemetry.functionId,\n metadata: telemetry == null ? void 0 : telemetry.metadata,\n experimental_context\n },\n callbacks: [\n onStepStart,\n globalTelemetry.onStepStart\n ]\n });\n currentModelResponse = await retry(\n () => {\n var _a22;\n return recordSpan({\n name: \"ai.generateText.doGenerate\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.generateText.doGenerate\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // model:\n \"ai.model.provider\": stepModel.provider,\n \"ai.model.id\": stepModel.modelId,\n // prompt:\n \"ai.prompt.messages\": {\n input: () => stringifyForTelemetry(promptMessages)\n },\n \"ai.prompt.tools\": {\n // convert the language model level tools:\n input: () => stepTools == null ? void 0 : stepTools.map((tool2) => JSON.stringify(tool2))\n },\n \"ai.prompt.toolChoice\": {\n input: () => stepToolChoice != null ? JSON.stringify(stepToolChoice) : void 0\n },\n // standardized gen-ai llm span attributes:\n \"gen_ai.system\": stepModel.provider,\n \"gen_ai.request.model\": stepModel.modelId,\n \"gen_ai.request.frequency_penalty\": settings.frequencyPenalty,\n \"gen_ai.request.max_tokens\": settings.maxOutputTokens,\n \"gen_ai.request.presence_penalty\": settings.presencePenalty,\n \"gen_ai.request.stop_sequences\": settings.stopSequences,\n \"gen_ai.request.temperature\": (_a22 = settings.temperature) != null ? _a22 : void 0,\n \"gen_ai.request.top_k\": settings.topK,\n \"gen_ai.request.top_p\": settings.topP\n }\n }),\n tracer,\n fn: async (span2) => {\n var _a23, _b2, _c2, _d2, _e2, _f2, _g2, _h2;\n const result = await stepModel.doGenerate({\n ...callSettings2,\n tools: stepTools,\n toolChoice: stepToolChoice,\n responseFormat: await (output == null ? void 0 : output.responseFormat),\n prompt: promptMessages,\n providerOptions: stepProviderOptions,\n abortSignal: mergedAbortSignal,\n headers: headersWithUserAgent\n });\n const responseData = {\n id: (_b2 = (_a23 = result.response) == null ? void 0 : _a23.id) != null ? _b2 : generateId2(),\n timestamp: (_d2 = (_c2 = result.response) == null ? void 0 : _c2.timestamp) != null ? _d2 : /* @__PURE__ */ new Date(),\n modelId: (_f2 = (_e2 = result.response) == null ? void 0 : _e2.modelId) != null ? _f2 : stepModel.modelId,\n headers: (_g2 = result.response) == null ? void 0 : _g2.headers,\n body: (_h2 = result.response) == null ? void 0 : _h2.body\n };\n const usage = asLanguageModelUsage(result.usage);\n span2.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": result.finishReason.unified,\n \"ai.response.text\": {\n output: () => extractTextContent(result.content)\n },\n \"ai.response.reasoning\": {\n output: () => extractReasoningContent(result.content)\n },\n \"ai.response.toolCalls\": {\n output: () => {\n const toolCalls = asToolCalls(result.content);\n return toolCalls == null ? void 0 : JSON.stringify(toolCalls);\n }\n },\n \"ai.response.id\": responseData.id,\n \"ai.response.model\": responseData.modelId,\n \"ai.response.timestamp\": responseData.timestamp.toISOString(),\n \"ai.response.providerMetadata\": JSON.stringify(\n result.providerMetadata\n ),\n \"ai.usage.inputTokens\": result.usage.inputTokens.total,\n \"ai.usage.inputTokenDetails.noCacheTokens\": result.usage.inputTokens.noCache,\n \"ai.usage.inputTokenDetails.cacheReadTokens\": result.usage.inputTokens.cacheRead,\n \"ai.usage.inputTokenDetails.cacheWriteTokens\": result.usage.inputTokens.cacheWrite,\n \"ai.usage.outputTokens\": result.usage.outputTokens.total,\n \"ai.usage.outputTokenDetails.textTokens\": result.usage.outputTokens.text,\n \"ai.usage.outputTokenDetails.reasoningTokens\": result.usage.outputTokens.reasoning,\n \"ai.usage.totalTokens\": usage.totalTokens,\n \"ai.usage.reasoningTokens\": result.usage.outputTokens.reasoning,\n \"ai.usage.cachedInputTokens\": result.usage.inputTokens.cacheRead,\n // standardized gen-ai llm span attributes:\n \"gen_ai.response.finish_reasons\": [\n result.finishReason.unified\n ],\n \"gen_ai.response.id\": responseData.id,\n \"gen_ai.response.model\": responseData.modelId,\n \"gen_ai.usage.input_tokens\": result.usage.inputTokens.total,\n \"gen_ai.usage.output_tokens\": result.usage.outputTokens.total\n }\n })\n );\n return { ...result, response: responseData };\n }\n });\n }\n );\n const stepToolCalls = await Promise.all(\n currentModelResponse.content.filter(\n (part) => part.type === \"tool-call\"\n ).map(\n (toolCall) => parseToolCall({\n toolCall,\n tools,\n repairToolCall,\n system,\n messages: stepInputMessages\n })\n )\n );\n const toolApprovalRequests = {};\n for (const toolCall of stepToolCalls) {\n if (toolCall.invalid) {\n continue;\n }\n const tool2 = tools == null ? void 0 : tools[toolCall.toolName];\n if (tool2 == null) {\n continue;\n }\n if ((tool2 == null ? void 0 : tool2.onInputAvailable) != null) {\n await tool2.onInputAvailable({\n input: toolCall.input,\n toolCallId: toolCall.toolCallId,\n messages: stepInputMessages,\n abortSignal: mergedAbortSignal,\n experimental_context\n });\n }\n if (await isApprovalNeeded({\n tool: tool2,\n toolCall,\n messages: stepInputMessages,\n experimental_context\n })) {\n toolApprovalRequests[toolCall.toolCallId] = {\n type: \"tool-approval-request\",\n approvalId: generateId2(),\n toolCall\n };\n }\n }\n const invalidToolCalls = stepToolCalls.filter(\n (toolCall) => toolCall.invalid && toolCall.dynamic\n );\n clientToolOutputs = [];\n for (const toolCall of invalidToolCalls) {\n clientToolOutputs.push({\n type: \"tool-error\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n error: getErrorMessage5(toolCall.error),\n dynamic: true\n });\n }\n clientToolCalls = stepToolCalls.filter(\n (toolCall) => !toolCall.providerExecuted\n );\n if (tools != null) {\n clientToolOutputs.push(\n ...await executeTools({\n toolCalls: clientToolCalls.filter(\n (toolCall) => !toolCall.invalid && toolApprovalRequests[toolCall.toolCallId] == null\n ),\n tools,\n tracer,\n telemetry,\n messages: stepInputMessages,\n abortSignal: mergedAbortSignal,\n experimental_context,\n stepNumber: steps.length,\n model: stepModelInfo,\n onToolCallStart: [\n onToolCallStart,\n globalTelemetry.onToolCallStart\n ],\n onToolCallFinish: [\n onToolCallFinish,\n globalTelemetry.onToolCallFinish\n ]\n })\n );\n }\n for (const toolCall of stepToolCalls) {\n if (!toolCall.providerExecuted)\n continue;\n const tool2 = tools == null ? void 0 : tools[toolCall.toolName];\n if ((tool2 == null ? void 0 : tool2.type) === \"provider\" && tool2.supportsDeferredResults) {\n const hasResultInResponse = currentModelResponse.content.some(\n (part) => part.type === \"tool-result\" && part.toolCallId === toolCall.toolCallId\n );\n if (!hasResultInResponse) {\n pendingDeferredToolCalls.set(toolCall.toolCallId, {\n toolName: toolCall.toolName\n });\n }\n }\n }\n for (const part of currentModelResponse.content) {\n if (part.type === \"tool-result\") {\n pendingDeferredToolCalls.delete(part.toolCallId);\n }\n }\n const stepContent = asContent({\n content: currentModelResponse.content,\n toolCalls: stepToolCalls,\n toolOutputs: clientToolOutputs,\n toolApprovalRequests: Object.values(toolApprovalRequests),\n tools\n });\n responseMessages.push(\n ...await toResponseMessages({\n content: stepContent,\n tools\n })\n );\n const stepRequest = ((_i = include == null ? void 0 : include.requestBody) != null ? _i : true) ? (_j = currentModelResponse.request) != null ? _j : {} : { ...currentModelResponse.request, body: void 0 };\n const stepResponse = {\n ...currentModelResponse.response,\n // deep clone msgs to avoid mutating past messages in multi-step:\n messages: structuredClone(responseMessages),\n // Conditionally include response body:\n body: ((_k = include == null ? void 0 : include.responseBody) != null ? _k : true) ? (_l = currentModelResponse.response) == null ? void 0 : _l.body : void 0\n };\n const stepNumber = steps.length;\n const currentStepResult = new DefaultStepResult({\n stepNumber,\n model: stepModelInfo,\n functionId: telemetry == null ? void 0 : telemetry.functionId,\n metadata: telemetry == null ? void 0 : telemetry.metadata,\n experimental_context,\n content: stepContent,\n finishReason: currentModelResponse.finishReason.unified,\n rawFinishReason: currentModelResponse.finishReason.raw,\n usage: asLanguageModelUsage(currentModelResponse.usage),\n warnings: currentModelResponse.warnings,\n providerMetadata: currentModelResponse.providerMetadata,\n request: stepRequest,\n response: stepResponse\n });\n logWarnings({\n warnings: (_m = currentModelResponse.warnings) != null ? _m : [],\n provider: stepModelInfo.provider,\n model: stepModelInfo.modelId\n });\n steps.push(currentStepResult);\n await notify({\n event: currentStepResult,\n callbacks: [onStepFinish, globalTelemetry.onStepFinish]\n });\n } finally {\n if (stepTimeoutId != null) {\n clearTimeout(stepTimeoutId);\n }\n }\n } while (\n // Continue if:\n // 1. There are client tool calls that have all been executed, OR\n // 2. There are pending deferred results from provider-executed tools\n (clientToolCalls.length > 0 && clientToolOutputs.length === clientToolCalls.length || pendingDeferredToolCalls.size > 0) && // continue until a stop condition is met:\n !await isStopConditionMet({ stopConditions, steps })\n );\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": currentModelResponse.finishReason.unified,\n \"ai.response.text\": {\n output: () => extractTextContent(currentModelResponse.content)\n },\n \"ai.response.reasoning\": {\n output: () => extractReasoningContent(currentModelResponse.content)\n },\n \"ai.response.toolCalls\": {\n output: () => {\n const toolCalls = asToolCalls(currentModelResponse.content);\n return toolCalls == null ? void 0 : JSON.stringify(toolCalls);\n }\n },\n \"ai.response.providerMetadata\": JSON.stringify(\n currentModelResponse.providerMetadata\n )\n }\n })\n );\n const lastStep = steps[steps.length - 1];\n const totalUsage = steps.reduce(\n (totalUsage2, step) => {\n return addLanguageModelUsage(totalUsage2, step.usage);\n },\n {\n inputTokens: void 0,\n outputTokens: void 0,\n totalTokens: void 0,\n reasoningTokens: void 0,\n cachedInputTokens: void 0\n }\n );\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.usage.inputTokens\": totalUsage.inputTokens,\n \"ai.usage.inputTokenDetails.noCacheTokens\": (_n = totalUsage.inputTokenDetails) == null ? void 0 : _n.noCacheTokens,\n \"ai.usage.inputTokenDetails.cacheReadTokens\": (_o = totalUsage.inputTokenDetails) == null ? void 0 : _o.cacheReadTokens,\n \"ai.usage.inputTokenDetails.cacheWriteTokens\": (_p = totalUsage.inputTokenDetails) == null ? void 0 : _p.cacheWriteTokens,\n \"ai.usage.outputTokens\": totalUsage.outputTokens,\n \"ai.usage.outputTokenDetails.textTokens\": (_q = totalUsage.outputTokenDetails) == null ? void 0 : _q.textTokens,\n \"ai.usage.outputTokenDetails.reasoningTokens\": (_r = totalUsage.outputTokenDetails) == null ? void 0 : _r.reasoningTokens,\n \"ai.usage.totalTokens\": totalUsage.totalTokens,\n \"ai.usage.reasoningTokens\": (_s = totalUsage.outputTokenDetails) == null ? void 0 : _s.reasoningTokens,\n \"ai.usage.cachedInputTokens\": (_t = totalUsage.inputTokenDetails) == null ? void 0 : _t.cacheReadTokens\n }\n })\n );\n await notify({\n event: {\n stepNumber: lastStep.stepNumber,\n model: lastStep.model,\n functionId: lastStep.functionId,\n metadata: lastStep.metadata,\n experimental_context: lastStep.experimental_context,\n finishReason: lastStep.finishReason,\n rawFinishReason: lastStep.rawFinishReason,\n usage: lastStep.usage,\n content: lastStep.content,\n text: lastStep.text,\n reasoningText: lastStep.reasoningText,\n reasoning: lastStep.reasoning,\n files: lastStep.files,\n sources: lastStep.sources,\n toolCalls: lastStep.toolCalls,\n staticToolCalls: lastStep.staticToolCalls,\n dynamicToolCalls: lastStep.dynamicToolCalls,\n toolResults: lastStep.toolResults,\n staticToolResults: lastStep.staticToolResults,\n dynamicToolResults: lastStep.dynamicToolResults,\n request: lastStep.request,\n response: lastStep.response,\n warnings: lastStep.warnings,\n providerMetadata: lastStep.providerMetadata,\n steps,\n totalUsage\n },\n callbacks: [\n onFinish,\n globalTelemetry.onFinish\n ]\n });\n let resolvedOutput;\n if (lastStep.finishReason === \"stop\") {\n const outputSpecification = output != null ? output : text();\n resolvedOutput = await outputSpecification.parseCompleteOutput(\n { text: lastStep.text },\n {\n response: lastStep.response,\n usage: lastStep.usage,\n finishReason: lastStep.finishReason\n }\n );\n }\n return new DefaultGenerateTextResult({\n steps,\n totalUsage,\n output: resolvedOutput\n });\n }\n });\n } catch (error) {\n throw wrapGatewayError(error);\n }\n}\nasync function executeTools({\n toolCalls,\n tools,\n tracer,\n telemetry,\n messages,\n abortSignal,\n experimental_context,\n stepNumber,\n model,\n onToolCallStart,\n onToolCallFinish\n}) {\n const toolOutputs = await Promise.all(\n toolCalls.map(\n async (toolCall) => executeToolCall({\n toolCall,\n tools,\n tracer,\n telemetry,\n messages,\n abortSignal,\n experimental_context,\n stepNumber,\n model,\n onToolCallStart,\n onToolCallFinish\n })\n )\n );\n return toolOutputs.filter(\n (output) => output != null\n );\n}\nvar DefaultGenerateTextResult = class {\n constructor(options) {\n this.steps = options.steps;\n this._output = options.output;\n this.totalUsage = options.totalUsage;\n }\n get finalStep() {\n return this.steps[this.steps.length - 1];\n }\n get content() {\n return this.finalStep.content;\n }\n get text() {\n return this.finalStep.text;\n }\n get files() {\n return this.finalStep.files;\n }\n get reasoningText() {\n return this.finalStep.reasoningText;\n }\n get reasoning() {\n return this.finalStep.reasoning;\n }\n get toolCalls() {\n return this.finalStep.toolCalls;\n }\n get staticToolCalls() {\n return this.finalStep.staticToolCalls;\n }\n get dynamicToolCalls() {\n return this.finalStep.dynamicToolCalls;\n }\n get toolResults() {\n return this.finalStep.toolResults;\n }\n get staticToolResults() {\n return this.finalStep.staticToolResults;\n }\n get dynamicToolResults() {\n return this.finalStep.dynamicToolResults;\n }\n get sources() {\n return this.finalStep.sources;\n }\n get finishReason() {\n return this.finalStep.finishReason;\n }\n get rawFinishReason() {\n return this.finalStep.rawFinishReason;\n }\n get warnings() {\n return this.finalStep.warnings;\n }\n get providerMetadata() {\n return this.finalStep.providerMetadata;\n }\n get response() {\n return this.finalStep.response;\n }\n get request() {\n return this.finalStep.request;\n }\n get usage() {\n return this.finalStep.usage;\n }\n get experimental_output() {\n return this.output;\n }\n get output() {\n if (this._output == null) {\n throw new NoOutputGeneratedError();\n }\n return this._output;\n }\n};\nfunction asToolCalls(content) {\n const parts = content.filter(\n (part) => part.type === \"tool-call\"\n );\n if (parts.length === 0) {\n return void 0;\n }\n return parts.map((toolCall) => ({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input\n }));\n}\nfunction asContent({\n content,\n toolCalls,\n toolOutputs,\n toolApprovalRequests,\n tools\n}) {\n const contentParts = [];\n for (const part of content) {\n switch (part.type) {\n case \"text\":\n case \"reasoning\":\n case \"source\":\n contentParts.push(part);\n break;\n case \"file\": {\n contentParts.push({\n type: \"file\",\n file: new DefaultGeneratedFile(part),\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"tool-call\": {\n contentParts.push(\n toolCalls.find((toolCall) => toolCall.toolCallId === part.toolCallId)\n );\n break;\n }\n case \"tool-result\": {\n const toolCall = toolCalls.find(\n (toolCall2) => toolCall2.toolCallId === part.toolCallId\n );\n if (toolCall == null) {\n const tool2 = tools == null ? void 0 : tools[part.toolName];\n const supportsDeferredResults = (tool2 == null ? void 0 : tool2.type) === \"provider\" && tool2.supportsDeferredResults;\n if (!supportsDeferredResults) {\n throw new Error(`Tool call ${part.toolCallId} not found.`);\n }\n if (part.isError) {\n contentParts.push({\n type: \"tool-error\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: void 0,\n error: part.result,\n providerExecuted: true,\n dynamic: part.dynamic,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...(tool2 == null ? void 0 : tool2.metadata) != null ? { toolMetadata: tool2.metadata } : {}\n });\n } else {\n contentParts.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: void 0,\n output: part.result,\n providerExecuted: true,\n dynamic: part.dynamic,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...(tool2 == null ? void 0 : tool2.metadata) != null ? { toolMetadata: tool2.metadata } : {}\n });\n }\n break;\n }\n if (part.isError) {\n contentParts.push({\n type: \"tool-error\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: toolCall.input,\n error: part.result,\n providerExecuted: true,\n dynamic: toolCall.dynamic,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...toolCall.toolMetadata != null ? { toolMetadata: toolCall.toolMetadata } : {}\n });\n } else {\n contentParts.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: toolCall.input,\n output: part.result,\n providerExecuted: true,\n dynamic: toolCall.dynamic,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...toolCall.toolMetadata != null ? { toolMetadata: toolCall.toolMetadata } : {}\n });\n }\n break;\n }\n case \"tool-approval-request\": {\n const toolCall = toolCalls.find(\n (toolCall2) => toolCall2.toolCallId === part.toolCallId\n );\n if (toolCall == null) {\n throw new ToolCallNotFoundForApprovalError({\n toolCallId: part.toolCallId,\n approvalId: part.approvalId\n });\n }\n contentParts.push({\n type: \"tool-approval-request\",\n approvalId: part.approvalId,\n toolCall\n });\n break;\n }\n }\n }\n return [...contentParts, ...toolOutputs, ...toolApprovalRequests];\n}\n\n// src/generate-text/stream-text.ts\nimport {\n getErrorMessage as getErrorMessage7,\n UnsupportedFunctionalityError as UnsupportedFunctionalityError2\n} from \"@ai-sdk/provider\";\nimport {\n createIdGenerator as createIdGenerator2,\n DelayedPromise,\n isAbortError as isAbortError2\n} from \"@ai-sdk/provider-utils\";\n\n// src/util/prepare-headers.ts\nfunction prepareHeaders(headers, defaultHeaders) {\n const responseHeaders = new Headers(headers != null ? headers : {});\n for (const [key, value] of Object.entries(defaultHeaders)) {\n if (!responseHeaders.has(key)) {\n responseHeaders.set(key, value);\n }\n }\n return responseHeaders;\n}\n\n// src/text-stream/create-text-stream-response.ts\nfunction createTextStreamResponse({\n status,\n statusText,\n headers,\n textStream\n}) {\n return new Response(textStream.pipeThrough(new TextEncoderStream()), {\n status: status != null ? status : 200,\n statusText,\n headers: prepareHeaders(headers, {\n \"content-type\": \"text/plain; charset=utf-8\"\n })\n });\n}\n\n// src/util/write-to-server-response.ts\nfunction writeToServerResponse({\n response,\n status,\n statusText,\n headers,\n stream\n}) {\n const statusCode = status != null ? status : 200;\n if (statusText !== void 0) {\n response.writeHead(statusCode, statusText, headers);\n } else {\n response.writeHead(statusCode, headers);\n }\n const reader = stream.getReader();\n const read = async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done)\n break;\n const canContinue = response.write(value);\n if (!canContinue) {\n await new Promise((resolve3) => {\n response.once(\"drain\", resolve3);\n });\n }\n }\n } catch (error) {\n throw error;\n } finally {\n response.end();\n }\n };\n read();\n}\n\n// src/text-stream/pipe-text-stream-to-response.ts\nfunction pipeTextStreamToResponse({\n response,\n status,\n statusText,\n headers,\n textStream\n}) {\n writeToServerResponse({\n response,\n status,\n statusText,\n headers: Object.fromEntries(\n prepareHeaders(headers, {\n \"content-type\": \"text/plain; charset=utf-8\"\n }).entries()\n ),\n stream: textStream.pipeThrough(new TextEncoderStream())\n });\n}\n\n// src/ui-message-stream/json-to-sse-transform-stream.ts\nvar JsonToSseTransformStream = class extends TransformStream {\n constructor() {\n super({\n transform(part, controller) {\n controller.enqueue(`data: ${JSON.stringify(part)}\n\n`);\n },\n flush(controller) {\n controller.enqueue(\"data: [DONE]\\n\\n\");\n }\n });\n }\n};\n\n// src/ui-message-stream/ui-message-stream-headers.ts\nvar UI_MESSAGE_STREAM_HEADERS = {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n \"x-vercel-ai-ui-message-stream\": \"v1\",\n \"x-accel-buffering\": \"no\"\n // disable nginx buffering\n};\n\n// src/ui-message-stream/create-ui-message-stream-response.ts\nfunction createUIMessageStreamResponse({\n status,\n statusText,\n headers,\n stream,\n consumeSseStream\n}) {\n let sseStream = stream.pipeThrough(new JsonToSseTransformStream());\n if (consumeSseStream) {\n const [stream1, stream2] = sseStream.tee();\n sseStream = stream1;\n consumeSseStream({ stream: stream2 });\n }\n return new Response(sseStream.pipeThrough(new TextEncoderStream()), {\n status,\n statusText,\n headers: prepareHeaders(headers, UI_MESSAGE_STREAM_HEADERS)\n });\n}\n\n// src/ui-message-stream/get-response-ui-message-id.ts\nfunction getResponseUIMessageId({\n originalMessages,\n responseMessageId\n}) {\n if (originalMessages == null) {\n return void 0;\n }\n const lastMessage = originalMessages[originalMessages.length - 1];\n return (lastMessage == null ? void 0 : lastMessage.role) === \"assistant\" ? lastMessage.id : typeof responseMessageId === \"function\" ? responseMessageId() : responseMessageId;\n}\n\n// src/ui/process-ui-message-stream.ts\nimport { validateTypes } from \"@ai-sdk/provider-utils\";\n\n// src/ui-message-stream/ui-message-chunks.ts\nimport { z as z7 } from \"zod/v4\";\nimport { lazySchema, zodSchema } from \"@ai-sdk/provider-utils\";\nvar toolMetadataSchema = z7.record(\n z7.string(),\n jsonValueSchema.optional()\n);\nvar uiMessageChunkSchema = lazySchema(\n () => zodSchema(\n z7.union([\n z7.strictObject({\n type: z7.literal(\"text-start\"),\n id: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"text-delta\"),\n id: z7.string(),\n delta: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"text-end\"),\n id: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"error\"),\n errorText: z7.string()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-input-start\"),\n toolCallId: z7.string(),\n toolName: z7.string(),\n providerExecuted: z7.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n toolMetadata: toolMetadataSchema.optional(),\n dynamic: z7.boolean().optional(),\n title: z7.string().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-input-delta\"),\n toolCallId: z7.string(),\n inputTextDelta: z7.string()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-input-available\"),\n toolCallId: z7.string(),\n toolName: z7.string(),\n input: z7.unknown(),\n providerExecuted: z7.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n toolMetadata: toolMetadataSchema.optional(),\n dynamic: z7.boolean().optional(),\n title: z7.string().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-input-error\"),\n toolCallId: z7.string(),\n toolName: z7.string(),\n input: z7.unknown(),\n providerExecuted: z7.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n toolMetadata: toolMetadataSchema.optional(),\n dynamic: z7.boolean().optional(),\n errorText: z7.string(),\n title: z7.string().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-approval-request\"),\n approvalId: z7.string(),\n toolCallId: z7.string()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-output-available\"),\n toolCallId: z7.string(),\n output: z7.unknown(),\n providerExecuted: z7.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n toolMetadata: toolMetadataSchema.optional(),\n dynamic: z7.boolean().optional(),\n preliminary: z7.boolean().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-output-error\"),\n toolCallId: z7.string(),\n errorText: z7.string(),\n providerExecuted: z7.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n toolMetadata: toolMetadataSchema.optional(),\n dynamic: z7.boolean().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-output-denied\"),\n toolCallId: z7.string()\n }),\n z7.strictObject({\n type: z7.literal(\"reasoning-start\"),\n id: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"reasoning-delta\"),\n id: z7.string(),\n delta: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"reasoning-end\"),\n id: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"source-url\"),\n sourceId: z7.string(),\n url: z7.string(),\n title: z7.string().optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"source-document\"),\n sourceId: z7.string(),\n mediaType: z7.string(),\n title: z7.string(),\n filename: z7.string().optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"file\"),\n url: z7.string(),\n mediaType: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.custom(\n (value) => typeof value === \"string\" && value.startsWith(\"data-\"),\n { message: 'Type must start with \"data-\"' }\n ),\n id: z7.string().optional(),\n data: z7.unknown(),\n transient: z7.boolean().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"start-step\")\n }),\n z7.strictObject({\n type: z7.literal(\"finish-step\")\n }),\n z7.strictObject({\n type: z7.literal(\"start\"),\n messageId: z7.string().optional(),\n messageMetadata: z7.unknown().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"finish\"),\n finishReason: z7.enum([\n \"stop\",\n \"length\",\n \"content-filter\",\n \"tool-calls\",\n \"error\",\n \"other\"\n ]).optional(),\n messageMetadata: z7.unknown().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"abort\"),\n reason: z7.string().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"message-metadata\"),\n messageMetadata: z7.unknown()\n })\n ])\n )\n);\nfunction isDataUIMessageChunk(chunk) {\n return chunk.type.startsWith(\"data-\");\n}\n\n// src/ui/ui-messages.ts\nfunction isDataUIPart(part) {\n return part.type.startsWith(\"data-\");\n}\nfunction isTextUIPart(part) {\n return part.type === \"text\";\n}\nfunction isFileUIPart(part) {\n return part.type === \"file\";\n}\nfunction isReasoningUIPart(part) {\n return part.type === \"reasoning\";\n}\nfunction isStaticToolUIPart(part) {\n return part.type.startsWith(\"tool-\");\n}\nfunction isDynamicToolUIPart(part) {\n return part.type === \"dynamic-tool\";\n}\nfunction isToolUIPart(part) {\n return isStaticToolUIPart(part) || isDynamicToolUIPart(part);\n}\nvar isToolOrDynamicToolUIPart = isToolUIPart;\nfunction getStaticToolName(part) {\n return part.type.split(\"-\").slice(1).join(\"-\");\n}\nfunction getToolName(part) {\n return isDynamicToolUIPart(part) ? part.toolName : getStaticToolName(part);\n}\nvar getToolOrDynamicToolName = getToolName;\n\n// src/ui/process-ui-message-stream.ts\nfunction createStreamingUIMessageState({\n lastMessage,\n messageId\n}) {\n return {\n message: (lastMessage == null ? void 0 : lastMessage.role) === \"assistant\" ? lastMessage : {\n id: messageId,\n metadata: void 0,\n role: \"assistant\",\n parts: []\n },\n activeTextParts: {},\n activeReasoningParts: {},\n partialToolCalls: {}\n };\n}\nfunction processUIMessageStream({\n stream,\n messageMetadataSchema,\n dataPartSchemas,\n runUpdateMessageJob,\n onError,\n onToolCall,\n onData\n}) {\n return stream.pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n await runUpdateMessageJob(async ({ state, write }) => {\n var _a21, _b, _c, _d;\n function getToolInvocation(toolCallId) {\n const toolInvocations = state.message.parts.filter(isToolUIPart);\n const toolInvocation = toolInvocations.find(\n (invocation) => invocation.toolCallId === toolCallId\n );\n if (toolInvocation == null) {\n throw new UIMessageStreamError({\n chunkType: \"tool-invocation\",\n chunkId: toolCallId,\n message: `No tool invocation found for tool call ID \"${toolCallId}\".`\n });\n }\n return toolInvocation;\n }\n function updateToolPart(options) {\n var _a22;\n const part = state.message.parts.find(\n (part2) => isStaticToolUIPart(part2) && part2.toolCallId === options.toolCallId\n );\n const anyOptions = options;\n const anyPart = part;\n if (part != null) {\n part.state = options.state;\n anyPart.input = anyOptions.input;\n anyPart.output = anyOptions.output;\n anyPart.errorText = anyOptions.errorText;\n anyPart.rawInput = anyOptions.rawInput;\n anyPart.preliminary = anyOptions.preliminary;\n if (options.title !== void 0) {\n anyPart.title = options.title;\n }\n if (options.toolMetadata !== void 0) {\n anyPart.toolMetadata = options.toolMetadata;\n }\n anyPart.providerExecuted = (_a22 = anyOptions.providerExecuted) != null ? _a22 : part.providerExecuted;\n const providerMetadata = anyOptions.providerMetadata;\n if (providerMetadata != null) {\n if (options.state === \"output-available\" || options.state === \"output-error\") {\n const resultPart = part;\n resultPart.resultProviderMetadata = providerMetadata;\n } else {\n part.callProviderMetadata = providerMetadata;\n }\n }\n } else {\n state.message.parts.push({\n type: `tool-${options.toolName}`,\n toolCallId: options.toolCallId,\n state: options.state,\n title: options.title,\n ...options.toolMetadata !== void 0 ? { toolMetadata: options.toolMetadata } : {},\n input: anyOptions.input,\n output: anyOptions.output,\n rawInput: anyOptions.rawInput,\n errorText: anyOptions.errorText,\n providerExecuted: anyOptions.providerExecuted,\n preliminary: anyOptions.preliminary,\n ...anyOptions.providerMetadata != null && (options.state === \"output-available\" || options.state === \"output-error\") ? { resultProviderMetadata: anyOptions.providerMetadata } : {},\n ...anyOptions.providerMetadata != null && !(options.state === \"output-available\" || options.state === \"output-error\") ? { callProviderMetadata: anyOptions.providerMetadata } : {}\n });\n }\n }\n function updateDynamicToolPart(options) {\n var _a22, _b2;\n const part = state.message.parts.find(\n (part2) => part2.type === \"dynamic-tool\" && part2.toolCallId === options.toolCallId\n );\n const anyOptions = options;\n const anyPart = part;\n if (part != null) {\n part.state = options.state;\n anyPart.toolName = options.toolName;\n anyPart.input = anyOptions.input;\n anyPart.output = anyOptions.output;\n anyPart.errorText = anyOptions.errorText;\n anyPart.rawInput = (_a22 = anyOptions.rawInput) != null ? _a22 : anyPart.rawInput;\n anyPart.preliminary = anyOptions.preliminary;\n if (options.title !== void 0) {\n anyPart.title = options.title;\n }\n if (options.toolMetadata !== void 0) {\n anyPart.toolMetadata = options.toolMetadata;\n }\n anyPart.providerExecuted = (_b2 = anyOptions.providerExecuted) != null ? _b2 : part.providerExecuted;\n const providerMetadata = anyOptions.providerMetadata;\n if (providerMetadata != null) {\n if (options.state === \"output-available\" || options.state === \"output-error\") {\n const resultPart = part;\n resultPart.resultProviderMetadata = providerMetadata;\n } else {\n part.callProviderMetadata = providerMetadata;\n }\n }\n } else {\n state.message.parts.push({\n type: \"dynamic-tool\",\n toolName: options.toolName,\n toolCallId: options.toolCallId,\n state: options.state,\n input: anyOptions.input,\n output: anyOptions.output,\n errorText: anyOptions.errorText,\n preliminary: anyOptions.preliminary,\n providerExecuted: anyOptions.providerExecuted,\n title: options.title,\n ...options.toolMetadata !== void 0 ? { toolMetadata: options.toolMetadata } : {},\n ...anyOptions.providerMetadata != null && (options.state === \"output-available\" || options.state === \"output-error\") ? { resultProviderMetadata: anyOptions.providerMetadata } : {},\n ...anyOptions.providerMetadata != null && !(options.state === \"output-available\" || options.state === \"output-error\") ? { callProviderMetadata: anyOptions.providerMetadata } : {}\n });\n }\n }\n async function updateMessageMetadata(metadata) {\n if (metadata != null) {\n const mergedMetadata = state.message.metadata != null ? mergeObjects(state.message.metadata, metadata) : metadata;\n if (messageMetadataSchema != null) {\n await validateTypes({\n value: mergedMetadata,\n schema: messageMetadataSchema,\n context: {\n field: \"message.metadata\",\n entityId: state.message.id\n }\n });\n }\n state.message.metadata = mergedMetadata;\n }\n }\n switch (chunk.type) {\n case \"text-start\": {\n const textPart = {\n type: \"text\",\n text: \"\",\n providerMetadata: chunk.providerMetadata,\n state: \"streaming\"\n };\n state.activeTextParts[chunk.id] = textPart;\n state.message.parts.push(textPart);\n write();\n break;\n }\n case \"text-delta\": {\n const textPart = state.activeTextParts[chunk.id];\n if (textPart == null) {\n throw new UIMessageStreamError({\n chunkType: \"text-delta\",\n chunkId: chunk.id,\n message: `Received text-delta for missing text part with ID \"${chunk.id}\". Ensure a \"text-start\" chunk is sent before any \"text-delta\" chunks.`\n });\n }\n textPart.text += chunk.delta;\n textPart.providerMetadata = (_a21 = chunk.providerMetadata) != null ? _a21 : textPart.providerMetadata;\n write();\n break;\n }\n case \"text-end\": {\n const textPart = state.activeTextParts[chunk.id];\n if (textPart == null) {\n throw new UIMessageStreamError({\n chunkType: \"text-end\",\n chunkId: chunk.id,\n message: `Received text-end for missing text part with ID \"${chunk.id}\". Ensure a \"text-start\" chunk is sent before any \"text-end\" chunks.`\n });\n }\n textPart.state = \"done\";\n textPart.providerMetadata = (_b = chunk.providerMetadata) != null ? _b : textPart.providerMetadata;\n delete state.activeTextParts[chunk.id];\n write();\n break;\n }\n case \"reasoning-start\": {\n const reasoningPart = {\n type: \"reasoning\",\n text: \"\",\n providerMetadata: chunk.providerMetadata,\n state: \"streaming\"\n };\n state.activeReasoningParts[chunk.id] = reasoningPart;\n state.message.parts.push(reasoningPart);\n write();\n break;\n }\n case \"reasoning-delta\": {\n const reasoningPart = state.activeReasoningParts[chunk.id];\n if (reasoningPart == null) {\n throw new UIMessageStreamError({\n chunkType: \"reasoning-delta\",\n chunkId: chunk.id,\n message: `Received reasoning-delta for missing reasoning part with ID \"${chunk.id}\". Ensure a \"reasoning-start\" chunk is sent before any \"reasoning-delta\" chunks.`\n });\n }\n reasoningPart.text += chunk.delta;\n reasoningPart.providerMetadata = (_c = chunk.providerMetadata) != null ? _c : reasoningPart.providerMetadata;\n write();\n break;\n }\n case \"reasoning-end\": {\n const reasoningPart = state.activeReasoningParts[chunk.id];\n if (reasoningPart == null) {\n throw new UIMessageStreamError({\n chunkType: \"reasoning-end\",\n chunkId: chunk.id,\n message: `Received reasoning-end for missing reasoning part with ID \"${chunk.id}\". Ensure a \"reasoning-start\" chunk is sent before any \"reasoning-end\" chunks.`\n });\n }\n reasoningPart.providerMetadata = (_d = chunk.providerMetadata) != null ? _d : reasoningPart.providerMetadata;\n reasoningPart.state = \"done\";\n delete state.activeReasoningParts[chunk.id];\n write();\n break;\n }\n case \"file\": {\n state.message.parts.push({\n type: \"file\",\n mediaType: chunk.mediaType,\n url: chunk.url,\n ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {}\n });\n write();\n break;\n }\n case \"source-url\": {\n state.message.parts.push({\n type: \"source-url\",\n sourceId: chunk.sourceId,\n url: chunk.url,\n title: chunk.title,\n providerMetadata: chunk.providerMetadata\n });\n write();\n break;\n }\n case \"source-document\": {\n state.message.parts.push({\n type: \"source-document\",\n sourceId: chunk.sourceId,\n mediaType: chunk.mediaType,\n title: chunk.title,\n filename: chunk.filename,\n providerMetadata: chunk.providerMetadata\n });\n write();\n break;\n }\n case \"tool-input-start\": {\n const toolInvocations = state.message.parts.filter(isStaticToolUIPart);\n state.partialToolCalls[chunk.toolCallId] = {\n text: \"\",\n toolName: chunk.toolName,\n index: toolInvocations.length,\n dynamic: chunk.dynamic,\n title: chunk.title,\n toolMetadata: chunk.toolMetadata\n };\n if (chunk.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-streaming\",\n input: void 0,\n providerExecuted: chunk.providerExecuted,\n title: chunk.title,\n toolMetadata: chunk.toolMetadata,\n providerMetadata: chunk.providerMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-streaming\",\n input: void 0,\n providerExecuted: chunk.providerExecuted,\n title: chunk.title,\n toolMetadata: chunk.toolMetadata,\n providerMetadata: chunk.providerMetadata\n });\n }\n write();\n break;\n }\n case \"tool-input-delta\": {\n const partialToolCall = state.partialToolCalls[chunk.toolCallId];\n if (partialToolCall == null) {\n throw new UIMessageStreamError({\n chunkType: \"tool-input-delta\",\n chunkId: chunk.toolCallId,\n message: `Received tool-input-delta for missing tool call with ID \"${chunk.toolCallId}\". Ensure a \"tool-input-start\" chunk is sent before any \"tool-input-delta\" chunks.`\n });\n }\n partialToolCall.text += chunk.inputTextDelta;\n const { value: partialArgs } = await parsePartialJson(\n partialToolCall.text\n );\n if (partialToolCall.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: partialToolCall.toolName,\n state: \"input-streaming\",\n input: partialArgs,\n title: partialToolCall.title,\n toolMetadata: partialToolCall.toolMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: partialToolCall.toolName,\n state: \"input-streaming\",\n input: partialArgs,\n title: partialToolCall.title,\n toolMetadata: partialToolCall.toolMetadata\n });\n }\n write();\n break;\n }\n case \"tool-input-available\": {\n if (chunk.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-available\",\n input: chunk.input,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: chunk.title,\n toolMetadata: chunk.toolMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-available\",\n input: chunk.input,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: chunk.title,\n toolMetadata: chunk.toolMetadata\n });\n }\n write();\n if (onToolCall && !chunk.providerExecuted) {\n await onToolCall({\n toolCall: chunk\n });\n }\n break;\n }\n case \"tool-input-error\": {\n const existingPart = state.message.parts.filter(isToolUIPart).find((p) => p.toolCallId === chunk.toolCallId);\n const isDynamic = existingPart != null ? existingPart.type === \"dynamic-tool\" : !!chunk.dynamic;\n if (isDynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"output-error\",\n input: chunk.input,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"output-error\",\n input: void 0,\n rawInput: chunk.input,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata\n });\n }\n write();\n break;\n }\n case \"tool-approval-request\": {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n toolInvocation.state = \"approval-requested\";\n toolInvocation.approval = { id: chunk.approvalId };\n write();\n break;\n }\n case \"tool-output-denied\": {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n toolInvocation.state = \"output-denied\";\n write();\n break;\n }\n case \"tool-output-available\": {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n if (toolInvocation.type === \"dynamic-tool\") {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: toolInvocation.toolName,\n state: \"output-available\",\n input: toolInvocation.input,\n output: chunk.output,\n preliminary: chunk.preliminary,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: toolInvocation.title,\n toolMetadata: toolInvocation.toolMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: getStaticToolName(toolInvocation),\n state: \"output-available\",\n input: toolInvocation.input,\n output: chunk.output,\n providerExecuted: chunk.providerExecuted,\n preliminary: chunk.preliminary,\n providerMetadata: chunk.providerMetadata,\n title: toolInvocation.title,\n toolMetadata: toolInvocation.toolMetadata\n });\n }\n write();\n break;\n }\n case \"tool-output-error\": {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n if (toolInvocation.type === \"dynamic-tool\") {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: toolInvocation.toolName,\n state: \"output-error\",\n input: toolInvocation.input,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: toolInvocation.title,\n toolMetadata: toolInvocation.toolMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: getStaticToolName(toolInvocation),\n state: \"output-error\",\n input: toolInvocation.input,\n rawInput: toolInvocation.rawInput,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: toolInvocation.title,\n toolMetadata: toolInvocation.toolMetadata\n });\n }\n write();\n break;\n }\n case \"start-step\": {\n state.message.parts.push({ type: \"step-start\" });\n break;\n }\n case \"finish-step\": {\n state.activeTextParts = {};\n state.activeReasoningParts = {};\n break;\n }\n case \"start\": {\n if (chunk.messageId != null) {\n state.message.id = chunk.messageId;\n }\n await updateMessageMetadata(chunk.messageMetadata);\n if (chunk.messageId != null || chunk.messageMetadata != null) {\n write();\n }\n break;\n }\n case \"finish\": {\n if (chunk.finishReason != null) {\n state.finishReason = chunk.finishReason;\n }\n await updateMessageMetadata(chunk.messageMetadata);\n if (chunk.messageMetadata != null) {\n write();\n }\n break;\n }\n case \"message-metadata\": {\n await updateMessageMetadata(chunk.messageMetadata);\n if (chunk.messageMetadata != null) {\n write();\n }\n break;\n }\n case \"error\": {\n onError == null ? void 0 : onError(new Error(chunk.errorText));\n break;\n }\n default: {\n if (isDataUIMessageChunk(chunk)) {\n if ((dataPartSchemas == null ? void 0 : dataPartSchemas[chunk.type]) != null) {\n const partIdx = state.message.parts.findIndex(\n (p) => \"id\" in p && \"data\" in p && p.id === chunk.id && p.type === chunk.type\n );\n const actualPartIdx = partIdx >= 0 ? partIdx : state.message.parts.length;\n await validateTypes({\n value: chunk.data,\n schema: dataPartSchemas[chunk.type],\n context: {\n field: `message.parts[${actualPartIdx}].data`,\n entityName: chunk.type,\n entityId: chunk.id\n }\n });\n }\n const dataChunk = chunk;\n if (dataChunk.transient) {\n onData == null ? void 0 : onData(dataChunk);\n break;\n }\n const existingUIPart = dataChunk.id != null ? state.message.parts.find(\n (chunkArg) => dataChunk.type === chunkArg.type && dataChunk.id === chunkArg.id\n ) : void 0;\n if (existingUIPart != null) {\n existingUIPart.data = dataChunk.data;\n } else {\n state.message.parts.push(dataChunk);\n }\n onData == null ? void 0 : onData(dataChunk);\n write();\n }\n }\n }\n controller.enqueue(chunk);\n });\n }\n })\n );\n}\n\n// src/ui-message-stream/handle-ui-message-stream-finish.ts\nfunction handleUIMessageStreamFinish({\n messageId,\n originalMessages = [],\n onStepFinish,\n onFinish,\n onError,\n stream\n}) {\n let lastMessage = originalMessages == null ? void 0 : originalMessages[originalMessages.length - 1];\n if ((lastMessage == null ? void 0 : lastMessage.role) !== \"assistant\") {\n lastMessage = void 0;\n } else {\n messageId = lastMessage.id;\n }\n let isAborted = false;\n const idInjectedStream = stream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n if (chunk.type === \"start\") {\n const startChunk = chunk;\n if (startChunk.messageId == null && messageId != null) {\n startChunk.messageId = messageId;\n }\n }\n if (chunk.type === \"abort\") {\n isAborted = true;\n }\n controller.enqueue(chunk);\n }\n })\n );\n if (onFinish == null && onStepFinish == null) {\n return idInjectedStream;\n }\n const state = createStreamingUIMessageState({\n lastMessage: lastMessage ? structuredClone(lastMessage) : void 0,\n messageId: messageId != null ? messageId : \"\"\n // will be overridden by the stream\n });\n const runUpdateMessageJob = async (job) => {\n await job({ state, write: () => {\n } });\n };\n let finishCalled = false;\n const callOnFinish = async () => {\n if (finishCalled || !onFinish) {\n return;\n }\n finishCalled = true;\n const isContinuation = state.message.id === (lastMessage == null ? void 0 : lastMessage.id);\n await onFinish({\n isAborted,\n isContinuation,\n responseMessage: state.message,\n messages: [\n ...isContinuation ? originalMessages.slice(0, -1) : originalMessages,\n state.message\n ],\n finishReason: state.finishReason\n });\n };\n const callOnStepFinish = async () => {\n if (!onStepFinish) {\n return;\n }\n const isContinuation = state.message.id === (lastMessage == null ? void 0 : lastMessage.id);\n try {\n await onStepFinish({\n isContinuation,\n responseMessage: structuredClone(state.message),\n messages: [\n ...isContinuation ? originalMessages.slice(0, -1) : originalMessages,\n structuredClone(state.message)\n ]\n });\n } catch (error) {\n onError(error);\n }\n };\n return processUIMessageStream({\n stream: idInjectedStream,\n runUpdateMessageJob,\n onError\n }).pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n if (chunk.type === \"finish-step\") {\n await callOnStepFinish();\n }\n controller.enqueue(chunk);\n },\n // @ts-expect-error cancel is still new and missing from types https://developer.mozilla.org/en-US/docs/Web/API/TransformStream#browser_compatibility\n async cancel() {\n await callOnFinish();\n },\n async flush() {\n await callOnFinish();\n }\n })\n );\n}\n\n// src/ui-message-stream/pipe-ui-message-stream-to-response.ts\nfunction pipeUIMessageStreamToResponse({\n response,\n status,\n statusText,\n headers,\n stream,\n consumeSseStream\n}) {\n let sseStream = stream.pipeThrough(new JsonToSseTransformStream());\n if (consumeSseStream) {\n const [stream1, stream2] = sseStream.tee();\n sseStream = stream1;\n consumeSseStream({ stream: stream2 });\n }\n writeToServerResponse({\n response,\n status,\n statusText,\n headers: Object.fromEntries(\n prepareHeaders(headers, UI_MESSAGE_STREAM_HEADERS).entries()\n ),\n stream: sseStream.pipeThrough(new TextEncoderStream())\n });\n}\n\n// src/util/async-iterable-stream.ts\nfunction createAsyncIterableStream(source) {\n const stream = source.pipeThrough(new TransformStream());\n stream[Symbol.asyncIterator] = function() {\n const reader = this.getReader();\n let finished = false;\n async function cleanup(cancelStream) {\n var _a21;\n if (finished)\n return;\n finished = true;\n try {\n if (cancelStream) {\n await ((_a21 = reader.cancel) == null ? void 0 : _a21.call(reader));\n }\n } finally {\n try {\n reader.releaseLock();\n } catch (e) {\n }\n }\n }\n return {\n /**\n * Reads the next chunk from the stream.\n * @returns A promise resolving to the next IteratorResult.\n */\n async next() {\n if (finished) {\n return { done: true, value: void 0 };\n }\n const { done, value } = await reader.read();\n if (done) {\n await cleanup(true);\n return { done: true, value: void 0 };\n }\n return { done: false, value };\n },\n /**\n * May be called on early exit (e.g., break from for-await) or after completion.\n * Ensures the stream is cancelled and resources are released.\n * @returns A promise resolving to a completed IteratorResult.\n */\n async return() {\n await cleanup(true);\n return { done: true, value: void 0 };\n },\n /**\n * Called on early exit with error.\n * Ensures the stream is cancelled and resources are released, then rethrows the error.\n * @param err The error to throw.\n * @returns A promise that rejects with the provided error.\n */\n async throw(err) {\n await cleanup(true);\n throw err;\n }\n };\n };\n return stream;\n}\n\n// src/util/consume-stream.ts\nasync function consumeStream({\n stream,\n onError\n}) {\n const reader = stream.getReader();\n try {\n while (true) {\n const { done } = await reader.read();\n if (done)\n break;\n }\n } catch (error) {\n onError == null ? void 0 : onError(error);\n } finally {\n reader.releaseLock();\n }\n}\n\n// src/util/create-resolvable-promise.ts\nfunction createResolvablePromise() {\n let resolve3;\n let reject;\n const promise = new Promise((res, rej) => {\n resolve3 = res;\n reject = rej;\n });\n return {\n promise,\n resolve: resolve3,\n reject\n };\n}\n\n// src/util/create-stitchable-stream.ts\nfunction createStitchableStream() {\n let innerStreamReaders = [];\n let controller = null;\n let isClosed = false;\n let waitForNewStream = createResolvablePromise();\n const terminate = () => {\n isClosed = true;\n waitForNewStream.resolve();\n innerStreamReaders.forEach((reader) => reader.cancel());\n innerStreamReaders = [];\n controller == null ? void 0 : controller.close();\n };\n const processPull = async () => {\n if (isClosed && innerStreamReaders.length === 0) {\n controller == null ? void 0 : controller.close();\n return;\n }\n if (innerStreamReaders.length === 0) {\n waitForNewStream = createResolvablePromise();\n await waitForNewStream.promise;\n return processPull();\n }\n try {\n const { value, done } = await innerStreamReaders[0].read();\n if (done) {\n innerStreamReaders.shift();\n if (innerStreamReaders.length === 0 && isClosed) {\n controller == null ? void 0 : controller.close();\n } else {\n await processPull();\n }\n } else {\n controller == null ? void 0 : controller.enqueue(value);\n }\n } catch (error) {\n controller == null ? void 0 : controller.error(error);\n innerStreamReaders.shift();\n terminate();\n }\n };\n return {\n stream: new ReadableStream({\n start(controllerParam) {\n controller = controllerParam;\n },\n pull: processPull,\n async cancel() {\n for (const reader of innerStreamReaders) {\n await reader.cancel();\n }\n innerStreamReaders = [];\n isClosed = true;\n }\n }),\n addStream: (innerStream) => {\n if (isClosed) {\n throw new Error(\"Cannot add inner stream: outer stream is closed\");\n }\n innerStreamReaders.push(innerStream.getReader());\n waitForNewStream.resolve();\n },\n /**\n * Gracefully close the outer stream. This will let the inner streams\n * finish processing and then close the outer stream.\n */\n close: () => {\n isClosed = true;\n waitForNewStream.resolve();\n if (innerStreamReaders.length === 0) {\n controller == null ? void 0 : controller.close();\n }\n },\n /**\n * Immediately close the outer stream. This will cancel all inner streams\n * and close the outer stream.\n */\n terminate\n };\n}\n\n// src/generate-text/run-tools-transformation.ts\nimport {\n getErrorMessage as getErrorMessage6\n} from \"@ai-sdk/provider-utils\";\nfunction runToolsTransformation({\n tools,\n generatorStream,\n tracer,\n telemetry,\n system,\n messages,\n abortSignal,\n repairToolCall,\n experimental_context,\n generateId: generateId2,\n stepNumber,\n model,\n onToolCallStart,\n onToolCallFinish\n}) {\n let toolResultsStreamController = null;\n const toolResultsStream = new ReadableStream({\n start(controller) {\n toolResultsStreamController = controller;\n }\n });\n const outstandingToolResults = /* @__PURE__ */ new Set();\n const toolInputs = /* @__PURE__ */ new Map();\n const toolCallsByToolCallId = /* @__PURE__ */ new Map();\n let canClose = false;\n let finishChunk = void 0;\n function attemptClose() {\n if (canClose && outstandingToolResults.size === 0) {\n if (finishChunk != null) {\n toolResultsStreamController.enqueue(finishChunk);\n }\n toolResultsStreamController.close();\n }\n }\n const forwardStream = new TransformStream({\n async transform(chunk, controller) {\n const chunkType = chunk.type;\n switch (chunkType) {\n case \"stream-start\":\n case \"text-start\":\n case \"text-delta\":\n case \"text-end\":\n case \"reasoning-start\":\n case \"reasoning-delta\":\n case \"reasoning-end\":\n case \"tool-input-start\":\n case \"tool-input-delta\":\n case \"tool-input-end\":\n case \"source\":\n case \"response-metadata\":\n case \"error\":\n case \"raw\": {\n controller.enqueue(chunk);\n break;\n }\n case \"file\": {\n controller.enqueue({\n type: \"file\",\n file: new DefaultGeneratedFileWithType({\n data: chunk.data,\n mediaType: chunk.mediaType\n }),\n ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {}\n });\n break;\n }\n case \"finish\": {\n finishChunk = {\n type: \"finish\",\n finishReason: chunk.finishReason.unified,\n rawFinishReason: chunk.finishReason.raw,\n usage: asLanguageModelUsage(chunk.usage),\n providerMetadata: chunk.providerMetadata\n };\n break;\n }\n case \"tool-approval-request\": {\n const toolCall = toolCallsByToolCallId.get(chunk.toolCallId);\n if (toolCall == null) {\n toolResultsStreamController.enqueue({\n type: \"error\",\n error: new ToolCallNotFoundForApprovalError({\n toolCallId: chunk.toolCallId,\n approvalId: chunk.approvalId\n })\n });\n break;\n }\n controller.enqueue({\n type: \"tool-approval-request\",\n approvalId: chunk.approvalId,\n toolCall\n });\n break;\n }\n case \"tool-call\": {\n try {\n const toolCall = await parseToolCall({\n toolCall: chunk,\n tools,\n repairToolCall,\n system,\n messages\n });\n toolCallsByToolCallId.set(toolCall.toolCallId, toolCall);\n controller.enqueue(toolCall);\n if (toolCall.invalid) {\n toolResultsStreamController.enqueue({\n type: \"tool-error\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n error: getErrorMessage6(toolCall.error),\n dynamic: true,\n title: toolCall.title,\n ...toolCall.toolMetadata != null ? { toolMetadata: toolCall.toolMetadata } : {}\n });\n break;\n }\n const tool2 = tools == null ? void 0 : tools[toolCall.toolName];\n if (tool2 == null) {\n break;\n }\n if (tool2.onInputAvailable != null) {\n await tool2.onInputAvailable({\n input: toolCall.input,\n toolCallId: toolCall.toolCallId,\n messages,\n abortSignal,\n experimental_context\n });\n }\n if (await isApprovalNeeded({\n tool: tool2,\n toolCall,\n messages,\n experimental_context\n })) {\n toolResultsStreamController.enqueue({\n type: \"tool-approval-request\",\n approvalId: generateId2(),\n toolCall\n });\n break;\n }\n toolInputs.set(toolCall.toolCallId, toolCall.input);\n if (tool2.execute != null && toolCall.providerExecuted !== true) {\n const toolExecutionId = generateId2();\n outstandingToolResults.add(toolExecutionId);\n executeToolCall({\n toolCall,\n tools,\n tracer,\n telemetry,\n messages,\n abortSignal,\n experimental_context,\n stepNumber,\n model,\n onToolCallStart,\n onToolCallFinish,\n onPreliminaryToolResult: (result) => {\n toolResultsStreamController.enqueue(result);\n }\n }).then((result) => {\n toolResultsStreamController.enqueue(result);\n }).catch((error) => {\n toolResultsStreamController.enqueue({\n type: \"error\",\n error\n });\n }).finally(() => {\n outstandingToolResults.delete(toolExecutionId);\n attemptClose();\n });\n }\n } catch (error) {\n toolResultsStreamController.enqueue({ type: \"error\", error });\n }\n break;\n }\n case \"tool-result\": {\n const toolName = chunk.toolName;\n const toolCall = toolCallsByToolCallId.get(chunk.toolCallId);\n if (chunk.isError) {\n toolResultsStreamController.enqueue({\n type: \"tool-error\",\n toolCallId: chunk.toolCallId,\n toolName,\n input: toolInputs.get(chunk.toolCallId),\n providerExecuted: true,\n error: chunk.result,\n dynamic: chunk.dynamic,\n ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {},\n ...(toolCall == null ? void 0 : toolCall.toolMetadata) != null ? { toolMetadata: toolCall.toolMetadata } : {}\n });\n } else {\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: chunk.toolCallId,\n toolName,\n input: toolInputs.get(chunk.toolCallId),\n output: chunk.result,\n providerExecuted: true,\n dynamic: chunk.dynamic,\n ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {},\n ...(toolCall == null ? void 0 : toolCall.toolMetadata) != null ? { toolMetadata: toolCall.toolMetadata } : {}\n });\n }\n break;\n }\n default: {\n const _exhaustiveCheck = chunkType;\n throw new Error(`Unhandled chunk type: ${_exhaustiveCheck}`);\n }\n }\n },\n flush() {\n canClose = true;\n attemptClose();\n }\n });\n return new ReadableStream({\n async start(controller) {\n return Promise.all([\n generatorStream.pipeThrough(forwardStream).pipeTo(\n new WritableStream({\n write(chunk) {\n controller.enqueue(chunk);\n },\n close() {\n }\n })\n ),\n toolResultsStream.pipeTo(\n new WritableStream({\n write(chunk) {\n controller.enqueue(chunk);\n },\n close() {\n controller.close();\n }\n })\n )\n ]);\n }\n });\n}\n\n// src/generate-text/stream-text.ts\nvar originalGenerateId2 = createIdGenerator2({\n prefix: \"aitxt\",\n size: 24\n});\nfunction streamText({\n model,\n tools,\n toolChoice,\n system,\n prompt,\n messages,\n allowSystemInMessages,\n maxRetries,\n abortSignal,\n timeout,\n headers,\n stopWhen = stepCountIs(1),\n experimental_output,\n output = experimental_output,\n experimental_telemetry: telemetry,\n prepareStep,\n providerOptions,\n experimental_activeTools,\n activeTools = experimental_activeTools,\n experimental_repairToolCall: repairToolCall,\n experimental_transform: transform,\n experimental_download: download2,\n includeRawChunks = false,\n onChunk,\n onError = ({ error }) => {\n console.error(error);\n },\n onFinish,\n onAbort,\n onStepFinish,\n experimental_onStart: onStart,\n experimental_onStepStart: onStepStart,\n experimental_onToolCallStart: onToolCallStart,\n experimental_onToolCallFinish: onToolCallFinish,\n experimental_context,\n experimental_include: include,\n _internal: { now: now2 = now, generateId: generateId2 = originalGenerateId2 } = {},\n ...settings\n}) {\n const totalTimeoutMs = getTotalTimeoutMs(timeout);\n const stepTimeoutMs = getStepTimeoutMs(timeout);\n const chunkTimeoutMs = getChunkTimeoutMs(timeout);\n const stepAbortController = stepTimeoutMs != null ? new AbortController() : void 0;\n const chunkAbortController = chunkTimeoutMs != null ? new AbortController() : void 0;\n return new DefaultStreamTextResult({\n model: resolveLanguageModel(model),\n telemetry,\n headers,\n settings,\n maxRetries,\n abortSignal: mergeAbortSignals(\n abortSignal,\n totalTimeoutMs != null ? AbortSignal.timeout(totalTimeoutMs) : void 0,\n stepAbortController == null ? void 0 : stepAbortController.signal,\n chunkAbortController == null ? void 0 : chunkAbortController.signal\n ),\n stepTimeoutMs,\n stepAbortController,\n chunkTimeoutMs,\n chunkAbortController,\n system,\n prompt,\n messages,\n allowSystemInMessages,\n tools,\n toolChoice,\n transforms: asArray(transform),\n activeTools,\n repairToolCall,\n stopConditions: asArray(stopWhen),\n output,\n providerOptions,\n prepareStep,\n includeRawChunks,\n timeout,\n stopWhen,\n originalAbortSignal: abortSignal,\n onChunk,\n onError,\n onFinish,\n onAbort,\n onStepFinish,\n onStart,\n onStepStart,\n onToolCallStart,\n onToolCallFinish,\n now: now2,\n generateId: generateId2,\n experimental_context,\n download: download2,\n include\n });\n}\nfunction createOutputTransformStream(output) {\n let firstTextChunkId = void 0;\n let text2 = \"\";\n let textChunk = \"\";\n let textProviderMetadata = void 0;\n let lastPublishedValue = \"\";\n function publishTextChunk({\n controller,\n partialOutput = void 0\n }) {\n controller.enqueue({\n part: {\n type: \"text-delta\",\n id: firstTextChunkId,\n text: textChunk,\n providerMetadata: textProviderMetadata\n },\n partialOutput\n });\n textChunk = \"\";\n }\n return new TransformStream({\n async transform(chunk, controller) {\n var _a21;\n if (chunk.type === \"finish-step\" && textChunk.length > 0) {\n publishTextChunk({ controller });\n }\n if (chunk.type !== \"text-delta\" && chunk.type !== \"text-start\" && chunk.type !== \"text-end\") {\n controller.enqueue({ part: chunk, partialOutput: void 0 });\n return;\n }\n if (firstTextChunkId == null) {\n firstTextChunkId = chunk.id;\n } else if (chunk.id !== firstTextChunkId) {\n controller.enqueue({ part: chunk, partialOutput: void 0 });\n return;\n }\n if (chunk.type === \"text-start\") {\n controller.enqueue({ part: chunk, partialOutput: void 0 });\n return;\n }\n if (chunk.type === \"text-end\") {\n if (textChunk.length > 0) {\n publishTextChunk({ controller });\n }\n controller.enqueue({ part: chunk, partialOutput: void 0 });\n return;\n }\n text2 += chunk.text;\n textChunk += chunk.text;\n textProviderMetadata = (_a21 = chunk.providerMetadata) != null ? _a21 : textProviderMetadata;\n const result = await output.parsePartialOutput({ text: text2 });\n if (result !== void 0) {\n const currentValue = typeof result.partial === \"string\" ? result.partial : JSON.stringify(result.partial);\n if (currentValue !== lastPublishedValue) {\n publishTextChunk({ controller, partialOutput: result.partial });\n lastPublishedValue = currentValue;\n }\n }\n }\n });\n}\nvar DefaultStreamTextResult = class {\n constructor({\n model,\n telemetry,\n headers,\n settings,\n maxRetries: maxRetriesArg,\n abortSignal,\n stepTimeoutMs,\n stepAbortController,\n chunkTimeoutMs,\n chunkAbortController,\n system,\n prompt,\n messages,\n allowSystemInMessages,\n tools,\n toolChoice,\n transforms,\n activeTools,\n repairToolCall,\n stopConditions,\n output,\n providerOptions,\n prepareStep,\n includeRawChunks,\n now: now2,\n generateId: generateId2,\n timeout,\n stopWhen,\n originalAbortSignal,\n onChunk,\n onError,\n onFinish,\n onAbort,\n onStepFinish,\n onStart,\n onStepStart,\n onToolCallStart,\n onToolCallFinish,\n experimental_context,\n download: download2,\n include\n }) {\n this._totalUsage = new DelayedPromise();\n this._finishReason = new DelayedPromise();\n this._rawFinishReason = new DelayedPromise();\n this._steps = new DelayedPromise();\n this.outputSpecification = output;\n this.includeRawChunks = includeRawChunks;\n this.tools = tools;\n const createGlobalTelemetry = getGlobalTelemetryIntegration();\n const globalTelemetry = createGlobalTelemetry(telemetry == null ? void 0 : telemetry.integrations);\n let stepFinish;\n let recordedContent = [];\n const recordedResponseMessages = [];\n let recordedFinishReason = void 0;\n let recordedRawFinishReason = void 0;\n let recordedTotalUsage = void 0;\n let recordedRequest = {};\n let recordedWarnings = [];\n const recordedSteps = [];\n const pendingDeferredToolCalls = /* @__PURE__ */ new Map();\n let rootSpan;\n let activeTextContent = {};\n let activeReasoningContent = {};\n const eventProcessor = new TransformStream({\n async transform(chunk, controller) {\n var _a21, _b, _c, _d;\n controller.enqueue(chunk);\n const { part } = chunk;\n if (part.type === \"text-delta\" || part.type === \"reasoning-delta\" || part.type === \"source\" || part.type === \"tool-call\" || part.type === \"tool-result\" || part.type === \"tool-input-start\" || part.type === \"tool-input-delta\" || part.type === \"raw\") {\n await (onChunk == null ? void 0 : onChunk({ chunk: part }));\n }\n if (part.type === \"error\") {\n await onError({ error: wrapGatewayError(part.error) });\n }\n if (part.type === \"text-start\") {\n activeTextContent[part.id] = {\n type: \"text\",\n text: \"\",\n providerMetadata: part.providerMetadata\n };\n recordedContent.push(activeTextContent[part.id]);\n }\n if (part.type === \"text-delta\") {\n const activeText = activeTextContent[part.id];\n if (activeText == null) {\n controller.enqueue({\n part: {\n type: \"error\",\n error: `text part ${part.id} not found`\n },\n partialOutput: void 0\n });\n return;\n }\n activeText.text += part.text;\n activeText.providerMetadata = (_a21 = part.providerMetadata) != null ? _a21 : activeText.providerMetadata;\n }\n if (part.type === \"text-end\") {\n const activeText = activeTextContent[part.id];\n if (activeText == null) {\n controller.enqueue({\n part: {\n type: \"error\",\n error: `text part ${part.id} not found`\n },\n partialOutput: void 0\n });\n return;\n }\n activeText.providerMetadata = (_b = part.providerMetadata) != null ? _b : activeText.providerMetadata;\n delete activeTextContent[part.id];\n }\n if (part.type === \"reasoning-start\") {\n activeReasoningContent[part.id] = {\n type: \"reasoning\",\n text: \"\",\n providerMetadata: part.providerMetadata\n };\n recordedContent.push(activeReasoningContent[part.id]);\n }\n if (part.type === \"reasoning-delta\") {\n const activeReasoning = activeReasoningContent[part.id];\n if (activeReasoning == null) {\n controller.enqueue({\n part: {\n type: \"error\",\n error: `reasoning part ${part.id} not found`\n },\n partialOutput: void 0\n });\n return;\n }\n activeReasoning.text += part.text;\n activeReasoning.providerMetadata = (_c = part.providerMetadata) != null ? _c : activeReasoning.providerMetadata;\n }\n if (part.type === \"reasoning-end\") {\n const activeReasoning = activeReasoningContent[part.id];\n if (activeReasoning == null) {\n controller.enqueue({\n part: {\n type: \"error\",\n error: `reasoning part ${part.id} not found`\n },\n partialOutput: void 0\n });\n return;\n }\n activeReasoning.providerMetadata = (_d = part.providerMetadata) != null ? _d : activeReasoning.providerMetadata;\n delete activeReasoningContent[part.id];\n }\n if (part.type === \"file\") {\n recordedContent.push({\n type: \"file\",\n file: part.file,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n if (part.type === \"source\") {\n recordedContent.push(part);\n }\n if (part.type === \"tool-call\") {\n recordedContent.push(part);\n }\n if (part.type === \"tool-result\" && !part.preliminary) {\n recordedContent.push(part);\n }\n if (part.type === \"tool-approval-request\") {\n recordedContent.push(part);\n }\n if (part.type === \"tool-error\") {\n recordedContent.push(part);\n }\n if (part.type === \"start-step\") {\n recordedContent = [];\n activeReasoningContent = {};\n activeTextContent = {};\n recordedRequest = part.request;\n recordedWarnings = part.warnings;\n }\n if (part.type === \"finish-step\") {\n const stepMessages = await toResponseMessages({\n content: recordedContent,\n tools\n });\n const currentStepResult = new DefaultStepResult({\n stepNumber: recordedSteps.length,\n model: modelInfo,\n ...callbackTelemetryProps,\n experimental_context,\n content: recordedContent,\n finishReason: part.finishReason,\n rawFinishReason: part.rawFinishReason,\n usage: part.usage,\n warnings: recordedWarnings,\n request: recordedRequest,\n response: {\n ...part.response,\n messages: [...recordedResponseMessages, ...stepMessages]\n },\n providerMetadata: part.providerMetadata\n });\n await notify({\n event: currentStepResult,\n callbacks: [onStepFinish, globalTelemetry.onStepFinish]\n });\n logWarnings({\n warnings: recordedWarnings,\n provider: modelInfo.provider,\n model: modelInfo.modelId\n });\n recordedSteps.push(currentStepResult);\n recordedResponseMessages.push(...stepMessages);\n stepFinish.resolve();\n }\n if (part.type === \"finish\") {\n recordedTotalUsage = part.totalUsage;\n recordedFinishReason = part.finishReason;\n recordedRawFinishReason = part.rawFinishReason;\n }\n },\n async flush(controller) {\n var _a21, _b, _c, _d, _e, _f, _g;\n try {\n if (recordedSteps.length === 0) {\n const error = (abortSignal == null ? void 0 : abortSignal.aborted) ? abortSignal.reason : new NoOutputGeneratedError({\n message: \"No output generated. Check the stream for errors.\"\n });\n self._finishReason.reject(error);\n self._rawFinishReason.reject(error);\n self._totalUsage.reject(error);\n self._steps.reject(error);\n return;\n }\n const finishReason = recordedFinishReason != null ? recordedFinishReason : \"other\";\n const totalUsage = recordedTotalUsage != null ? recordedTotalUsage : createNullLanguageModelUsage();\n self._finishReason.resolve(finishReason);\n self._rawFinishReason.resolve(recordedRawFinishReason);\n self._totalUsage.resolve(totalUsage);\n self._steps.resolve(recordedSteps);\n const finalStep = recordedSteps[recordedSteps.length - 1];\n await notify({\n event: {\n stepNumber: finalStep.stepNumber,\n model: finalStep.model,\n functionId: finalStep.functionId,\n metadata: finalStep.metadata,\n experimental_context: finalStep.experimental_context,\n finishReason: finalStep.finishReason,\n rawFinishReason: finalStep.rawFinishReason,\n totalUsage,\n usage: finalStep.usage,\n content: finalStep.content,\n text: finalStep.text,\n reasoningText: finalStep.reasoningText,\n reasoning: finalStep.reasoning,\n files: finalStep.files,\n sources: finalStep.sources,\n toolCalls: finalStep.toolCalls,\n staticToolCalls: finalStep.staticToolCalls,\n dynamicToolCalls: finalStep.dynamicToolCalls,\n toolResults: finalStep.toolResults,\n staticToolResults: finalStep.staticToolResults,\n dynamicToolResults: finalStep.dynamicToolResults,\n request: finalStep.request,\n response: finalStep.response,\n warnings: finalStep.warnings,\n providerMetadata: finalStep.providerMetadata,\n steps: recordedSteps\n },\n callbacks: [\n onFinish,\n globalTelemetry.onFinish\n ]\n });\n rootSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": finishReason,\n \"ai.response.text\": { output: () => finalStep.text },\n \"ai.response.reasoning\": {\n output: () => finalStep.reasoningText\n },\n \"ai.response.toolCalls\": {\n output: () => {\n var _a22;\n return ((_a22 = finalStep.toolCalls) == null ? void 0 : _a22.length) ? JSON.stringify(finalStep.toolCalls) : void 0;\n }\n },\n \"ai.response.providerMetadata\": JSON.stringify(\n finalStep.providerMetadata\n ),\n \"ai.usage.inputTokens\": totalUsage.inputTokens,\n \"ai.usage.inputTokenDetails.noCacheTokens\": (_a21 = totalUsage.inputTokenDetails) == null ? void 0 : _a21.noCacheTokens,\n \"ai.usage.inputTokenDetails.cacheReadTokens\": (_b = totalUsage.inputTokenDetails) == null ? void 0 : _b.cacheReadTokens,\n \"ai.usage.inputTokenDetails.cacheWriteTokens\": (_c = totalUsage.inputTokenDetails) == null ? void 0 : _c.cacheWriteTokens,\n \"ai.usage.outputTokens\": totalUsage.outputTokens,\n \"ai.usage.outputTokenDetails.textTokens\": (_d = totalUsage.outputTokenDetails) == null ? void 0 : _d.textTokens,\n \"ai.usage.outputTokenDetails.reasoningTokens\": (_e = totalUsage.outputTokenDetails) == null ? void 0 : _e.reasoningTokens,\n \"ai.usage.totalTokens\": totalUsage.totalTokens,\n \"ai.usage.reasoningTokens\": (_f = totalUsage.outputTokenDetails) == null ? void 0 : _f.reasoningTokens,\n \"ai.usage.cachedInputTokens\": (_g = totalUsage.inputTokenDetails) == null ? void 0 : _g.cacheReadTokens\n }\n })\n );\n } catch (error) {\n controller.error(error);\n } finally {\n rootSpan.end();\n }\n }\n });\n const stitchableStream = createStitchableStream();\n this.addStream = stitchableStream.addStream;\n this.closeStream = stitchableStream.close;\n const reader = stitchableStream.stream.getReader();\n let stream = new ReadableStream({\n async start(controller) {\n controller.enqueue({ type: \"start\" });\n },\n async pull(controller) {\n function abort() {\n onAbort == null ? void 0 : onAbort({ steps: recordedSteps });\n controller.enqueue({\n type: \"abort\",\n // The `reason` is usually of type DOMException, but it can also be of any type,\n // so we use getErrorMessage for serialization because it is already designed to accept values of the unknown type.\n // See: https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/reason\n ...(abortSignal == null ? void 0 : abortSignal.reason) !== void 0 ? { reason: getErrorMessage7(abortSignal.reason) } : {}\n });\n controller.close();\n }\n try {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n return;\n }\n if (abortSignal == null ? void 0 : abortSignal.aborted) {\n abort();\n return;\n }\n controller.enqueue(value);\n } catch (error) {\n if (isAbortError2(error) && (abortSignal == null ? void 0 : abortSignal.aborted)) {\n abort();\n } else {\n controller.error(error);\n }\n }\n },\n cancel(reason) {\n return stitchableStream.stream.cancel(reason);\n }\n });\n for (const transform of transforms) {\n stream = stream.pipeThrough(\n transform({\n tools,\n stopStream() {\n stitchableStream.terminate();\n }\n })\n );\n }\n this.baseStream = stream.pipeThrough(createOutputTransformStream(output != null ? output : text())).pipeThrough(eventProcessor);\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const tracer = getTracer(telemetry);\n const callSettings = prepareCallSettings(settings);\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { ...callSettings, maxRetries }\n });\n const self = this;\n const modelInfo = { provider: model.provider, modelId: model.modelId };\n const callbackTelemetryProps = {\n functionId: telemetry == null ? void 0 : telemetry.functionId,\n metadata: telemetry == null ? void 0 : telemetry.metadata\n };\n recordSpan({\n name: \"ai.streamText\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: \"ai.streamText\", telemetry }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.prompt\": {\n input: () => JSON.stringify({ system, prompt, messages })\n }\n }\n }),\n tracer,\n endWhenDone: false,\n fn: async (rootSpanArg) => {\n rootSpan = rootSpanArg;\n const initialPrompt = await standardizePrompt({\n system,\n prompt,\n messages,\n allowSystemInMessages\n });\n await notify({\n event: {\n model: modelInfo,\n system,\n prompt,\n messages,\n tools,\n toolChoice,\n activeTools,\n maxOutputTokens: callSettings.maxOutputTokens,\n temperature: callSettings.temperature,\n topP: callSettings.topP,\n topK: callSettings.topK,\n presencePenalty: callSettings.presencePenalty,\n frequencyPenalty: callSettings.frequencyPenalty,\n stopSequences: callSettings.stopSequences,\n seed: callSettings.seed,\n maxRetries,\n timeout,\n headers,\n providerOptions,\n stopWhen,\n output,\n abortSignal: originalAbortSignal,\n include,\n ...callbackTelemetryProps,\n experimental_context\n },\n callbacks: [\n onStart,\n globalTelemetry.onStart\n ]\n });\n const initialMessages = initialPrompt.messages;\n const initialResponseMessages = [];\n const { approvedToolApprovals, deniedToolApprovals } = collectToolApprovals({ messages: initialMessages });\n if (deniedToolApprovals.length > 0 || approvedToolApprovals.length > 0) {\n const localApprovedToolApprovals = approvedToolApprovals.filter(\n (toolApproval) => !toolApproval.toolCall.providerExecuted\n );\n const localDeniedToolApprovals = deniedToolApprovals.filter(\n (toolApproval) => !toolApproval.toolCall.providerExecuted\n );\n const deniedProviderExecutedToolApprovals = deniedToolApprovals.filter(\n (toolApproval) => toolApproval.toolCall.providerExecuted\n );\n let toolExecutionStepStreamController;\n const toolExecutionStepStream = new ReadableStream({\n start(controller) {\n toolExecutionStepStreamController = controller;\n }\n });\n self.addStream(toolExecutionStepStream);\n try {\n for (const toolApproval of [\n ...localDeniedToolApprovals,\n ...deniedProviderExecutedToolApprovals\n ]) {\n toolExecutionStepStreamController == null ? void 0 : toolExecutionStepStreamController.enqueue({\n type: \"tool-output-denied\",\n toolCallId: toolApproval.toolCall.toolCallId,\n toolName: toolApproval.toolCall.toolName\n });\n }\n const toolOutputs = [];\n await Promise.all(\n localApprovedToolApprovals.map(async (toolApproval) => {\n const result = await executeToolCall({\n toolCall: toolApproval.toolCall,\n tools,\n tracer,\n telemetry,\n messages: initialMessages,\n abortSignal,\n experimental_context,\n stepNumber: recordedSteps.length,\n model: modelInfo,\n onToolCallStart: [\n onToolCallStart,\n globalTelemetry.onToolCallStart\n ],\n onToolCallFinish: [\n onToolCallFinish,\n globalTelemetry.onToolCallFinish\n ],\n onPreliminaryToolResult: (result2) => {\n toolExecutionStepStreamController == null ? void 0 : toolExecutionStepStreamController.enqueue(result2);\n }\n });\n if (result != null) {\n toolExecutionStepStreamController == null ? void 0 : toolExecutionStepStreamController.enqueue(result);\n toolOutputs.push(result);\n }\n })\n );\n if (toolOutputs.length > 0 || localDeniedToolApprovals.length > 0) {\n const localToolContent = [];\n for (const output2 of toolOutputs) {\n localToolContent.push({\n type: \"tool-result\",\n toolCallId: output2.toolCallId,\n toolName: output2.toolName,\n output: await createToolModelOutput({\n toolCallId: output2.toolCallId,\n input: output2.input,\n tool: tools == null ? void 0 : tools[output2.toolName],\n output: output2.type === \"tool-result\" ? output2.output : output2.error,\n errorMode: output2.type === \"tool-error\" ? \"text\" : \"none\"\n })\n });\n }\n for (const toolApproval of localDeniedToolApprovals) {\n localToolContent.push({\n type: \"tool-result\",\n toolCallId: toolApproval.toolCall.toolCallId,\n toolName: toolApproval.toolCall.toolName,\n output: {\n type: \"execution-denied\",\n reason: toolApproval.approvalResponse.reason\n }\n });\n }\n initialResponseMessages.push({\n role: \"tool\",\n content: localToolContent\n });\n }\n } finally {\n toolExecutionStepStreamController == null ? void 0 : toolExecutionStepStreamController.close();\n }\n }\n recordedResponseMessages.push(...initialResponseMessages);\n async function streamStep({\n currentStep,\n responseMessages,\n usage\n }) {\n var _a21, _b, _c, _d, _e, _f, _g, _h, _i;\n const includeRawChunks2 = self.includeRawChunks;\n const stepTimeoutId = stepTimeoutMs != null ? setTimeout(() => stepAbortController.abort(), stepTimeoutMs) : void 0;\n let chunkTimeoutId = void 0;\n function resetChunkTimeout() {\n if (chunkTimeoutMs != null) {\n if (chunkTimeoutId != null) {\n clearTimeout(chunkTimeoutId);\n }\n chunkTimeoutId = setTimeout(\n () => chunkAbortController.abort(),\n chunkTimeoutMs\n );\n }\n }\n function clearChunkTimeout() {\n if (chunkTimeoutId != null) {\n clearTimeout(chunkTimeoutId);\n chunkTimeoutId = void 0;\n }\n }\n function clearStepTimeout() {\n if (stepTimeoutId != null) {\n clearTimeout(stepTimeoutId);\n }\n }\n try {\n stepFinish = new DelayedPromise();\n const stepInputMessages = [...initialMessages, ...responseMessages];\n const prepareStepResult = await (prepareStep == null ? void 0 : prepareStep({\n model,\n steps: recordedSteps,\n stepNumber: recordedSteps.length,\n messages: stepInputMessages,\n experimental_context\n }));\n const stepModel = resolveLanguageModel(\n (_a21 = prepareStepResult == null ? void 0 : prepareStepResult.model) != null ? _a21 : model\n );\n const stepModelInfo = {\n provider: stepModel.provider,\n modelId: stepModel.modelId\n };\n const promptMessages = await convertToLanguageModelPrompt({\n prompt: {\n system: (_b = prepareStepResult == null ? void 0 : prepareStepResult.system) != null ? _b : initialPrompt.system,\n messages: (_c = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _c : stepInputMessages\n },\n supportedUrls: await stepModel.supportedUrls,\n download: download2\n });\n const stepActiveTools = (_d = prepareStepResult == null ? void 0 : prepareStepResult.activeTools) != null ? _d : activeTools;\n const { toolChoice: stepToolChoice, tools: stepTools } = await prepareToolsAndToolChoice({\n tools,\n toolChoice: (_e = prepareStepResult == null ? void 0 : prepareStepResult.toolChoice) != null ? _e : toolChoice,\n activeTools: stepActiveTools\n });\n experimental_context = (_f = prepareStepResult == null ? void 0 : prepareStepResult.experimental_context) != null ? _f : experimental_context;\n const stepMessages = (_g = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _g : stepInputMessages;\n const stepSystem = (_h = prepareStepResult == null ? void 0 : prepareStepResult.system) != null ? _h : initialPrompt.system;\n const stepProviderOptions = mergeObjects(\n providerOptions,\n prepareStepResult == null ? void 0 : prepareStepResult.providerOptions\n );\n await notify({\n event: {\n stepNumber: recordedSteps.length,\n model: stepModelInfo,\n system: stepSystem,\n messages: stepMessages,\n tools,\n toolChoice: stepToolChoice,\n activeTools: stepActiveTools,\n steps: [...recordedSteps],\n providerOptions: stepProviderOptions,\n timeout,\n headers,\n stopWhen,\n output,\n abortSignal: originalAbortSignal,\n include,\n ...callbackTelemetryProps,\n experimental_context\n },\n callbacks: [\n onStepStart,\n globalTelemetry.onStepStart\n ]\n });\n const {\n result: { stream: stream2, response, request },\n doStreamSpan,\n startTimestampMs\n } = await retry(\n () => recordSpan({\n name: \"ai.streamText.doStream\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.streamText.doStream\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // model:\n \"ai.model.provider\": stepModel.provider,\n \"ai.model.id\": stepModel.modelId,\n // prompt:\n \"ai.prompt.messages\": {\n input: () => stringifyForTelemetry(promptMessages)\n },\n \"ai.prompt.tools\": {\n // convert the language model level tools:\n input: () => stepTools == null ? void 0 : stepTools.map((tool2) => JSON.stringify(tool2))\n },\n \"ai.prompt.toolChoice\": {\n input: () => stepToolChoice != null ? JSON.stringify(stepToolChoice) : void 0\n },\n // standardized gen-ai llm span attributes:\n \"gen_ai.system\": stepModel.provider,\n \"gen_ai.request.model\": stepModel.modelId,\n \"gen_ai.request.frequency_penalty\": callSettings.frequencyPenalty,\n \"gen_ai.request.max_tokens\": callSettings.maxOutputTokens,\n \"gen_ai.request.presence_penalty\": callSettings.presencePenalty,\n \"gen_ai.request.stop_sequences\": callSettings.stopSequences,\n \"gen_ai.request.temperature\": callSettings.temperature,\n \"gen_ai.request.top_k\": callSettings.topK,\n \"gen_ai.request.top_p\": callSettings.topP\n }\n }),\n tracer,\n endWhenDone: false,\n fn: async (doStreamSpan2) => ({\n startTimestampMs: now2(),\n // get before the call\n doStreamSpan: doStreamSpan2,\n result: await stepModel.doStream({\n ...callSettings,\n tools: stepTools,\n toolChoice: stepToolChoice,\n responseFormat: await (output == null ? void 0 : output.responseFormat),\n prompt: promptMessages,\n providerOptions: stepProviderOptions,\n abortSignal,\n headers,\n includeRawChunks: includeRawChunks2\n })\n })\n })\n );\n const streamWithToolResults = runToolsTransformation({\n tools,\n generatorStream: stream2,\n tracer,\n telemetry,\n system,\n messages: stepInputMessages,\n repairToolCall,\n abortSignal,\n experimental_context,\n generateId: generateId2,\n stepNumber: recordedSteps.length,\n model: stepModelInfo,\n onToolCallStart: [\n onToolCallStart,\n globalTelemetry.onToolCallStart\n ],\n onToolCallFinish: [\n onToolCallFinish,\n globalTelemetry.onToolCallFinish\n ]\n });\n const stepRequest = ((_i = include == null ? void 0 : include.requestBody) != null ? _i : true) ? request != null ? request : {} : { ...request, body: void 0 };\n const stepToolCalls = [];\n const stepToolOutputs = [];\n let warnings;\n const activeToolCallToolNames = {};\n let stepFinishReason = \"other\";\n let stepRawFinishReason = void 0;\n let stepUsage = createNullLanguageModelUsage();\n let stepProviderMetadata;\n let stepFirstChunk = true;\n let stepResponse = {\n id: generateId2(),\n timestamp: /* @__PURE__ */ new Date(),\n modelId: modelInfo.modelId\n };\n let activeText = \"\";\n self.addStream(\n streamWithToolResults.pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n var _a22, _b2, _c2, _d2, _e2;\n resetChunkTimeout();\n if (chunk.type === \"stream-start\") {\n warnings = chunk.warnings;\n return;\n }\n if (stepFirstChunk) {\n const msToFirstChunk = now2() - startTimestampMs;\n stepFirstChunk = false;\n doStreamSpan.addEvent(\"ai.stream.firstChunk\", {\n \"ai.response.msToFirstChunk\": msToFirstChunk\n });\n doStreamSpan.setAttributes({\n \"ai.response.msToFirstChunk\": msToFirstChunk\n });\n controller.enqueue({\n type: \"start-step\",\n request: stepRequest,\n warnings: warnings != null ? warnings : []\n });\n }\n const chunkType = chunk.type;\n switch (chunkType) {\n case \"tool-approval-request\":\n case \"text-start\":\n case \"text-end\": {\n controller.enqueue(chunk);\n break;\n }\n case \"text-delta\": {\n if (chunk.delta.length > 0) {\n controller.enqueue({\n type: \"text-delta\",\n id: chunk.id,\n text: chunk.delta,\n providerMetadata: chunk.providerMetadata\n });\n activeText += chunk.delta;\n }\n break;\n }\n case \"reasoning-start\":\n case \"reasoning-end\": {\n controller.enqueue(chunk);\n break;\n }\n case \"reasoning-delta\": {\n controller.enqueue({\n type: \"reasoning-delta\",\n id: chunk.id,\n text: chunk.delta,\n providerMetadata: chunk.providerMetadata\n });\n break;\n }\n case \"tool-call\": {\n controller.enqueue(chunk);\n stepToolCalls.push(chunk);\n break;\n }\n case \"tool-result\": {\n controller.enqueue(chunk);\n if (!chunk.preliminary) {\n stepToolOutputs.push(chunk);\n }\n break;\n }\n case \"tool-error\": {\n controller.enqueue(chunk);\n stepToolOutputs.push(chunk);\n break;\n }\n case \"response-metadata\": {\n stepResponse = {\n id: (_a22 = chunk.id) != null ? _a22 : stepResponse.id,\n timestamp: (_b2 = chunk.timestamp) != null ? _b2 : stepResponse.timestamp,\n modelId: (_c2 = chunk.modelId) != null ? _c2 : stepResponse.modelId\n };\n break;\n }\n case \"finish\": {\n stepUsage = chunk.usage;\n stepFinishReason = chunk.finishReason;\n stepRawFinishReason = chunk.rawFinishReason;\n stepProviderMetadata = chunk.providerMetadata;\n const msToFinish = now2() - startTimestampMs;\n doStreamSpan.addEvent(\"ai.stream.finish\");\n doStreamSpan.setAttributes({\n \"ai.response.msToFinish\": msToFinish,\n \"ai.response.avgOutputTokensPerSecond\": 1e3 * ((_d2 = stepUsage.outputTokens) != null ? _d2 : 0) / msToFinish\n });\n break;\n }\n case \"file\": {\n controller.enqueue(chunk);\n break;\n }\n case \"source\": {\n controller.enqueue(chunk);\n break;\n }\n case \"tool-input-start\": {\n activeToolCallToolNames[chunk.id] = chunk.toolName;\n const tool2 = tools == null ? void 0 : tools[chunk.toolName];\n if ((tool2 == null ? void 0 : tool2.onInputStart) != null) {\n await tool2.onInputStart({\n toolCallId: chunk.id,\n messages: stepInputMessages,\n abortSignal,\n experimental_context\n });\n }\n controller.enqueue({\n ...chunk,\n dynamic: (_e2 = chunk.dynamic) != null ? _e2 : (tool2 == null ? void 0 : tool2.type) === \"dynamic\",\n title: tool2 == null ? void 0 : tool2.title\n });\n break;\n }\n case \"tool-input-end\": {\n delete activeToolCallToolNames[chunk.id];\n controller.enqueue(chunk);\n break;\n }\n case \"tool-input-delta\": {\n const toolName = activeToolCallToolNames[chunk.id];\n const tool2 = tools == null ? void 0 : tools[toolName];\n if ((tool2 == null ? void 0 : tool2.onInputDelta) != null) {\n await tool2.onInputDelta({\n inputTextDelta: chunk.delta,\n toolCallId: chunk.id,\n messages: stepInputMessages,\n abortSignal,\n experimental_context\n });\n }\n controller.enqueue(chunk);\n break;\n }\n case \"error\": {\n controller.enqueue(chunk);\n stepFinishReason = \"error\";\n break;\n }\n case \"raw\": {\n if (includeRawChunks2) {\n controller.enqueue(chunk);\n }\n break;\n }\n default: {\n const exhaustiveCheck = chunkType;\n throw new Error(\n `Unknown chunk type: ${exhaustiveCheck}`\n );\n }\n }\n },\n // invoke onFinish callback and resolve toolResults promise when the stream is about to close:\n async flush(controller) {\n var _a22, _b2, _c2, _d2, _e2, _f2, _g2;\n const stepToolCallsJson = stepToolCalls.length > 0 ? JSON.stringify(stepToolCalls) : void 0;\n try {\n doStreamSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": stepFinishReason,\n \"ai.response.toolCalls\": {\n output: () => stepToolCallsJson\n },\n \"ai.response.id\": stepResponse.id,\n \"ai.response.model\": stepResponse.modelId,\n \"ai.response.timestamp\": stepResponse.timestamp.toISOString(),\n \"ai.usage.inputTokens\": stepUsage.inputTokens,\n \"ai.usage.inputTokenDetails.noCacheTokens\": (_a22 = stepUsage.inputTokenDetails) == null ? void 0 : _a22.noCacheTokens,\n \"ai.usage.inputTokenDetails.cacheReadTokens\": (_b2 = stepUsage.inputTokenDetails) == null ? void 0 : _b2.cacheReadTokens,\n \"ai.usage.inputTokenDetails.cacheWriteTokens\": (_c2 = stepUsage.inputTokenDetails) == null ? void 0 : _c2.cacheWriteTokens,\n \"ai.usage.outputTokens\": stepUsage.outputTokens,\n \"ai.usage.outputTokenDetails.textTokens\": (_d2 = stepUsage.outputTokenDetails) == null ? void 0 : _d2.textTokens,\n \"ai.usage.outputTokenDetails.reasoningTokens\": (_e2 = stepUsage.outputTokenDetails) == null ? void 0 : _e2.reasoningTokens,\n \"ai.usage.totalTokens\": stepUsage.totalTokens,\n \"ai.usage.reasoningTokens\": (_f2 = stepUsage.outputTokenDetails) == null ? void 0 : _f2.reasoningTokens,\n \"ai.usage.cachedInputTokens\": (_g2 = stepUsage.inputTokenDetails) == null ? void 0 : _g2.cacheReadTokens,\n // standardized gen-ai llm span attributes:\n \"gen_ai.response.finish_reasons\": [\n stepFinishReason\n ],\n \"gen_ai.response.id\": stepResponse.id,\n \"gen_ai.response.model\": stepResponse.modelId,\n \"gen_ai.usage.input_tokens\": stepUsage.inputTokens,\n \"gen_ai.usage.output_tokens\": stepUsage.outputTokens\n }\n })\n );\n } catch (error) {\n }\n controller.enqueue({\n type: \"finish-step\",\n finishReason: stepFinishReason,\n rawFinishReason: stepRawFinishReason,\n usage: stepUsage,\n providerMetadata: stepProviderMetadata,\n response: {\n ...stepResponse,\n headers: response == null ? void 0 : response.headers\n }\n });\n const combinedUsage = addLanguageModelUsage(\n usage,\n stepUsage\n );\n await stepFinish.promise;\n const processedStep = recordedSteps[recordedSteps.length - 1];\n try {\n doStreamSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.text\": {\n output: () => processedStep.text\n },\n \"ai.response.reasoning\": {\n output: () => processedStep.reasoningText\n },\n \"ai.response.providerMetadata\": JSON.stringify(\n processedStep.providerMetadata\n )\n }\n })\n );\n } catch (error) {\n } finally {\n doStreamSpan.end();\n }\n const clientToolCalls = stepToolCalls.filter(\n (toolCall) => toolCall.providerExecuted !== true\n );\n const clientToolOutputs = stepToolOutputs.filter(\n (toolOutput) => toolOutput.providerExecuted !== true\n );\n for (const toolCall of stepToolCalls) {\n if (toolCall.providerExecuted !== true)\n continue;\n const tool2 = tools == null ? void 0 : tools[toolCall.toolName];\n if ((tool2 == null ? void 0 : tool2.type) === \"provider\" && tool2.supportsDeferredResults) {\n const hasResultInStep = stepToolOutputs.some(\n (output2) => (output2.type === \"tool-result\" || output2.type === \"tool-error\") && output2.toolCallId === toolCall.toolCallId\n );\n if (!hasResultInStep) {\n pendingDeferredToolCalls.set(toolCall.toolCallId, {\n toolName: toolCall.toolName\n });\n }\n }\n }\n for (const output2 of stepToolOutputs) {\n if (output2.type === \"tool-result\" || output2.type === \"tool-error\") {\n pendingDeferredToolCalls.delete(output2.toolCallId);\n }\n }\n clearStepTimeout();\n clearChunkTimeout();\n if (\n // Continue if:\n // 1. There are client tool calls that have all been executed, OR\n // 2. There are pending deferred results from provider-executed tools\n (clientToolCalls.length > 0 && clientToolOutputs.length === clientToolCalls.length || pendingDeferredToolCalls.size > 0) && // continue until a stop condition is met:\n !await isStopConditionMet({\n stopConditions,\n steps: recordedSteps\n })\n ) {\n responseMessages.push(\n ...await toResponseMessages({\n content: (\n // use transformed content to create the messages for the next step:\n recordedSteps[recordedSteps.length - 1].content\n ),\n tools\n })\n );\n try {\n await streamStep({\n currentStep: currentStep + 1,\n responseMessages,\n usage: combinedUsage\n });\n } catch (error) {\n controller.enqueue({\n type: \"error\",\n error\n });\n self.closeStream();\n }\n } else {\n controller.enqueue({\n type: \"finish\",\n finishReason: stepFinishReason,\n rawFinishReason: stepRawFinishReason,\n totalUsage: combinedUsage\n });\n self.closeStream();\n }\n }\n })\n )\n );\n } finally {\n clearStepTimeout();\n clearChunkTimeout();\n }\n }\n await streamStep({\n currentStep: 0,\n responseMessages: initialResponseMessages,\n usage: createNullLanguageModelUsage()\n });\n }\n }).catch((error) => {\n self.addStream(\n new ReadableStream({\n start(controller) {\n controller.enqueue({ type: \"error\", error });\n controller.close();\n }\n })\n );\n self.closeStream();\n });\n }\n get steps() {\n this.consumeStream();\n return this._steps.promise;\n }\n get finalStep() {\n return this.steps.then((steps) => steps[steps.length - 1]);\n }\n get content() {\n return this.finalStep.then((step) => step.content);\n }\n get warnings() {\n return this.finalStep.then((step) => step.warnings);\n }\n get providerMetadata() {\n return this.finalStep.then((step) => step.providerMetadata);\n }\n get text() {\n return this.finalStep.then((step) => step.text);\n }\n get reasoningText() {\n return this.finalStep.then((step) => step.reasoningText);\n }\n get reasoning() {\n return this.finalStep.then((step) => step.reasoning);\n }\n get sources() {\n return this.finalStep.then((step) => step.sources);\n }\n get files() {\n return this.finalStep.then((step) => step.files);\n }\n get toolCalls() {\n return this.finalStep.then((step) => step.toolCalls);\n }\n get staticToolCalls() {\n return this.finalStep.then((step) => step.staticToolCalls);\n }\n get dynamicToolCalls() {\n return this.finalStep.then((step) => step.dynamicToolCalls);\n }\n get toolResults() {\n return this.finalStep.then((step) => step.toolResults);\n }\n get staticToolResults() {\n return this.finalStep.then((step) => step.staticToolResults);\n }\n get dynamicToolResults() {\n return this.finalStep.then((step) => step.dynamicToolResults);\n }\n get usage() {\n return this.finalStep.then((step) => step.usage);\n }\n get request() {\n return this.finalStep.then((step) => step.request);\n }\n get response() {\n return this.finalStep.then((step) => step.response);\n }\n get totalUsage() {\n this.consumeStream();\n return this._totalUsage.promise;\n }\n get finishReason() {\n this.consumeStream();\n return this._finishReason.promise;\n }\n get rawFinishReason() {\n this.consumeStream();\n return this._rawFinishReason.promise;\n }\n /**\n * Split out a new stream from the original stream.\n * The original stream is replaced to allow for further splitting,\n * since we do not know how many times the stream will be split.\n *\n * Note: this leads to buffering the stream content on the server.\n * However, the LLM results are expected to be small enough to not cause issues.\n */\n teeStream() {\n const [stream1, stream2] = this.baseStream.tee();\n this.baseStream = stream2;\n return stream1;\n }\n get textStream() {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream({\n transform({ part }, controller) {\n if (part.type === \"text-delta\") {\n controller.enqueue(part.text);\n }\n }\n })\n )\n );\n }\n get fullStream() {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream({\n transform({ part }, controller) {\n controller.enqueue(part);\n }\n })\n )\n );\n }\n async consumeStream(options) {\n var _a21;\n try {\n await consumeStream({\n stream: this.fullStream,\n onError: options == null ? void 0 : options.onError\n });\n } catch (error) {\n (_a21 = options == null ? void 0 : options.onError) == null ? void 0 : _a21.call(options, error);\n }\n }\n get experimental_partialOutputStream() {\n return this.partialOutputStream;\n }\n get partialOutputStream() {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream({\n transform({ partialOutput }, controller) {\n if (partialOutput != null) {\n controller.enqueue(partialOutput);\n }\n }\n })\n )\n );\n }\n get elementStream() {\n var _a21, _b, _c;\n const transform = (_a21 = this.outputSpecification) == null ? void 0 : _a21.createElementStreamTransform();\n if (transform == null) {\n throw new UnsupportedFunctionalityError2({\n functionality: `element streams in ${(_c = (_b = this.outputSpecification) == null ? void 0 : _b.name) != null ? _c : \"text\"} mode`\n });\n }\n return createAsyncIterableStream(this.teeStream().pipeThrough(transform));\n }\n get output() {\n return this.finalStep.then((step) => {\n var _a21;\n const output = (_a21 = this.outputSpecification) != null ? _a21 : text();\n return output.parseCompleteOutput(\n { text: step.text },\n {\n response: step.response,\n usage: step.usage,\n finishReason: step.finishReason\n }\n );\n });\n }\n toUIMessageStream({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning = true,\n sendSources = false,\n sendStart = true,\n sendFinish = true,\n onError = getErrorMessage7\n } = {}) {\n const responseMessageId = generateMessageId != null ? getResponseUIMessageId({\n originalMessages,\n responseMessageId: generateMessageId\n }) : void 0;\n const isDynamic = (part) => {\n var _a21;\n const tool2 = (_a21 = this.tools) == null ? void 0 : _a21[part.toolName];\n if (tool2 == null) {\n return part.dynamic;\n }\n return (tool2 == null ? void 0 : tool2.type) === \"dynamic\" ? true : void 0;\n };\n const baseStream = this.fullStream.pipeThrough(\n new TransformStream({\n transform: async (part, controller) => {\n const messageMetadataValue = messageMetadata == null ? void 0 : messageMetadata({ part });\n const partType = part.type;\n switch (partType) {\n case \"text-start\": {\n controller.enqueue({\n type: \"text-start\",\n id: part.id,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"text-delta\": {\n controller.enqueue({\n type: \"text-delta\",\n id: part.id,\n delta: part.text,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"text-end\": {\n controller.enqueue({\n type: \"text-end\",\n id: part.id,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"reasoning-start\":\n case \"reasoning-end\": {\n if (sendReasoning) {\n controller.enqueue({\n type: partType,\n id: part.id,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n break;\n }\n case \"reasoning-delta\": {\n if (sendReasoning) {\n controller.enqueue({\n type: \"reasoning-delta\",\n id: part.id,\n delta: part.text,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n break;\n }\n case \"file\": {\n controller.enqueue({\n type: \"file\",\n mediaType: part.file.mediaType,\n url: `data:${part.file.mediaType};base64,${part.file.base64}`,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"source\": {\n if (sendSources && part.sourceType === \"url\") {\n controller.enqueue({\n type: \"source-url\",\n sourceId: part.id,\n url: part.url,\n title: part.title,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n if (sendSources && part.sourceType === \"document\") {\n controller.enqueue({\n type: \"source-document\",\n sourceId: part.id,\n mediaType: part.mediaType,\n title: part.title,\n filename: part.filename,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n break;\n }\n case \"tool-input-start\": {\n const dynamic = isDynamic(part);\n controller.enqueue({\n type: \"tool-input-start\",\n toolCallId: part.id,\n toolName: part.toolName,\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...part.toolMetadata != null ? { toolMetadata: part.toolMetadata } : {},\n ...dynamic != null ? { dynamic } : {},\n ...part.title != null ? { title: part.title } : {}\n });\n break;\n }\n case \"tool-input-delta\": {\n controller.enqueue({\n type: \"tool-input-delta\",\n toolCallId: part.id,\n inputTextDelta: part.delta\n });\n break;\n }\n case \"tool-call\": {\n const dynamic = isDynamic(part);\n if (part.invalid) {\n controller.enqueue({\n type: \"tool-input-error\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...part.toolMetadata != null ? { toolMetadata: part.toolMetadata } : {},\n ...dynamic != null ? { dynamic } : {},\n errorText: onError(part.error),\n ...part.title != null ? { title: part.title } : {}\n });\n } else {\n controller.enqueue({\n type: \"tool-input-available\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...part.toolMetadata != null ? { toolMetadata: part.toolMetadata } : {},\n ...dynamic != null ? { dynamic } : {},\n ...part.title != null ? { title: part.title } : {}\n });\n }\n break;\n }\n case \"tool-approval-request\": {\n controller.enqueue({\n type: \"tool-approval-request\",\n approvalId: part.approvalId,\n toolCallId: part.toolCall.toolCallId\n });\n break;\n }\n case \"tool-result\": {\n const dynamic = isDynamic(part);\n controller.enqueue({\n type: \"tool-output-available\",\n toolCallId: part.toolCallId,\n output: part.output,\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...part.toolMetadata != null ? { toolMetadata: part.toolMetadata } : {},\n ...part.preliminary != null ? { preliminary: part.preliminary } : {},\n ...dynamic != null ? { dynamic } : {}\n });\n break;\n }\n case \"tool-error\": {\n const dynamic = isDynamic(part);\n controller.enqueue({\n type: \"tool-output-error\",\n toolCallId: part.toolCallId,\n errorText: part.providerExecuted ? typeof part.error === \"string\" ? part.error : JSON.stringify(part.error) : onError(part.error),\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...part.toolMetadata != null ? { toolMetadata: part.toolMetadata } : {},\n ...dynamic != null ? { dynamic } : {}\n });\n break;\n }\n case \"tool-output-denied\": {\n controller.enqueue({\n type: \"tool-output-denied\",\n toolCallId: part.toolCallId\n });\n break;\n }\n case \"error\": {\n controller.enqueue({\n type: \"error\",\n errorText: onError(part.error)\n });\n break;\n }\n case \"start-step\": {\n controller.enqueue({ type: \"start-step\" });\n break;\n }\n case \"finish-step\": {\n controller.enqueue({ type: \"finish-step\" });\n break;\n }\n case \"start\": {\n if (sendStart) {\n controller.enqueue({\n type: \"start\",\n ...messageMetadataValue != null ? { messageMetadata: messageMetadataValue } : {},\n ...responseMessageId != null ? { messageId: responseMessageId } : {}\n });\n }\n break;\n }\n case \"finish\": {\n if (sendFinish) {\n controller.enqueue({\n type: \"finish\",\n finishReason: part.finishReason,\n ...messageMetadataValue != null ? { messageMetadata: messageMetadataValue } : {}\n });\n }\n break;\n }\n case \"abort\": {\n controller.enqueue(part);\n break;\n }\n case \"tool-input-end\": {\n break;\n }\n case \"raw\": {\n break;\n }\n default: {\n const exhaustiveCheck = partType;\n throw new Error(`Unknown chunk type: ${exhaustiveCheck}`);\n }\n }\n if (messageMetadataValue != null && partType !== \"start\" && partType !== \"finish\") {\n controller.enqueue({\n type: \"message-metadata\",\n messageMetadata: messageMetadataValue\n });\n }\n }\n })\n );\n return createAsyncIterableStream(\n handleUIMessageStreamFinish({\n stream: baseStream,\n messageId: responseMessageId != null ? responseMessageId : generateMessageId == null ? void 0 : generateMessageId(),\n originalMessages,\n onFinish,\n onError\n })\n );\n }\n pipeUIMessageStreamToResponse(response, {\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError,\n ...init\n } = {}) {\n pipeUIMessageStreamToResponse({\n response,\n stream: this.toUIMessageStream({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError\n }),\n ...init\n });\n }\n pipeTextStreamToResponse(response, init) {\n pipeTextStreamToResponse({\n response,\n textStream: this.textStream,\n ...init\n });\n }\n toUIMessageStreamResponse({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError,\n ...init\n } = {}) {\n return createUIMessageStreamResponse({\n stream: this.toUIMessageStream({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError\n }),\n ...init\n });\n }\n toTextStreamResponse(init) {\n return createTextStreamResponse({\n textStream: this.textStream,\n ...init\n });\n }\n};\n\n// src/agent/tool-loop-agent.ts\nvar ToolLoopAgent = class {\n constructor(settings) {\n this.version = \"agent-v1\";\n this.settings = settings;\n }\n /**\n * The id of the agent.\n */\n get id() {\n return this.settings.id;\n }\n /**\n * The tools that the agent can use.\n */\n get tools() {\n return this.settings.tools;\n }\n async prepareCall(options) {\n var _a21, _b, _c, _d;\n if (this.settings.callOptionsSchema != null && options.options !== void 0) {\n const validatedOptions = await validateTypes2({\n value: options.options,\n schema: this.settings.callOptionsSchema,\n context: { field: \"options\" }\n });\n options = { ...options, options: validatedOptions };\n }\n const { onStepFinish: _settingsOnStepFinish, ...settingsWithoutCallback } = this.settings;\n const baseCallArgs = {\n ...settingsWithoutCallback,\n stopWhen: (_a21 = this.settings.stopWhen) != null ? _a21 : stepCountIs(20),\n ...options\n };\n const preparedCallArgs = (_d = await ((_c = (_b = this.settings).prepareCall) == null ? void 0 : _c.call(\n _b,\n baseCallArgs\n ))) != null ? _d : baseCallArgs;\n const {\n instructions,\n allowSystemInMessages,\n messages,\n prompt,\n ...callArgs\n } = preparedCallArgs;\n return {\n ...callArgs,\n // restore prompt types\n ...{\n system: instructions,\n allowSystemInMessages,\n messages,\n prompt\n }\n };\n }\n mergeOnStepFinishCallbacks(methodCallback) {\n const constructorCallback = this.settings.onStepFinish;\n if (methodCallback && constructorCallback) {\n return async (stepResult) => {\n await constructorCallback(stepResult);\n await methodCallback(stepResult);\n };\n }\n return methodCallback != null ? methodCallback : constructorCallback;\n }\n /**\n * Generates an output from the agent (non-streaming).\n */\n async generate({\n abortSignal,\n timeout,\n onStepFinish,\n ...options\n }) {\n return generateText({\n ...await this.prepareCall(options),\n abortSignal,\n timeout,\n onStepFinish: this.mergeOnStepFinishCallbacks(onStepFinish)\n });\n }\n /**\n * Streams an output from the agent (streaming).\n */\n async stream({\n abortSignal,\n timeout,\n experimental_transform,\n onStepFinish,\n ...options\n }) {\n return streamText({\n ...await this.prepareCall(options),\n abortSignal,\n timeout,\n experimental_transform,\n onStepFinish: this.mergeOnStepFinishCallbacks(onStepFinish)\n });\n }\n};\n\n// src/ui-message-stream/create-ui-message-stream.ts\nimport {\n generateId as generateIdFunc,\n getErrorMessage as getErrorMessage8\n} from \"@ai-sdk/provider-utils\";\nfunction createUIMessageStream({\n execute,\n onError = getErrorMessage8,\n originalMessages,\n onStepFinish,\n onFinish,\n generateId: generateId2 = generateIdFunc\n}) {\n let controller;\n const ongoingStreamPromises = [];\n const stream = new ReadableStream({\n start(controllerArg) {\n controller = controllerArg;\n }\n });\n function safeEnqueue(data) {\n try {\n controller.enqueue(data);\n } catch (error) {\n }\n }\n try {\n const result = execute({\n writer: {\n write(part) {\n safeEnqueue(part);\n },\n merge(streamArg) {\n ongoingStreamPromises.push(\n (async () => {\n const reader = streamArg.getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done)\n break;\n safeEnqueue(value);\n }\n })().catch((error) => {\n safeEnqueue({\n type: \"error\",\n errorText: onError(error)\n });\n })\n );\n },\n onError\n }\n });\n if (result) {\n ongoingStreamPromises.push(\n result.catch((error) => {\n safeEnqueue({\n type: \"error\",\n errorText: onError(error)\n });\n })\n );\n }\n } catch (error) {\n safeEnqueue({\n type: \"error\",\n errorText: onError(error)\n });\n }\n const waitForStreams = new Promise(async (resolve3) => {\n while (ongoingStreamPromises.length > 0) {\n await ongoingStreamPromises.shift();\n }\n resolve3();\n });\n waitForStreams.finally(() => {\n try {\n controller.close();\n } catch (error) {\n }\n });\n return handleUIMessageStreamFinish({\n stream,\n messageId: generateId2(),\n originalMessages,\n onStepFinish,\n onFinish,\n onError\n });\n}\n\n// src/ui-message-stream/read-ui-message-stream.ts\nfunction readUIMessageStream({\n message,\n stream,\n onError,\n terminateOnError = false\n}) {\n var _a21;\n let controller;\n let hasErrored = false;\n const outputStream = new ReadableStream({\n start(controllerParam) {\n controller = controllerParam;\n }\n });\n const state = createStreamingUIMessageState({\n messageId: (_a21 = message == null ? void 0 : message.id) != null ? _a21 : \"\",\n lastMessage: message\n });\n const handleError = (error) => {\n onError == null ? void 0 : onError(error);\n if (!hasErrored && terminateOnError) {\n hasErrored = true;\n controller == null ? void 0 : controller.error(error);\n }\n };\n consumeStream({\n stream: processUIMessageStream({\n stream,\n runUpdateMessageJob(job) {\n return job({\n state,\n write: () => {\n controller == null ? void 0 : controller.enqueue(structuredClone(state.message));\n }\n });\n },\n onError: handleError\n }),\n onError: handleError\n }).finally(() => {\n if (!hasErrored) {\n controller == null ? void 0 : controller.close();\n }\n });\n return createAsyncIterableStream(outputStream);\n}\n\n// src/ui/convert-to-model-messages.ts\nimport {\n isNonNullable\n} from \"@ai-sdk/provider-utils\";\nasync function convertToModelMessages(messages, options) {\n const modelMessages = [];\n if (options == null ? void 0 : options.ignoreIncompleteToolCalls) {\n messages = messages.map((message) => ({\n ...message,\n parts: message.parts.filter(\n (part) => !isToolUIPart(part) || part.state !== \"input-streaming\" && part.state !== \"input-available\"\n )\n }));\n }\n for (const message of messages) {\n switch (message.role) {\n case \"system\": {\n const textParts = message.parts.filter(\n (part) => part.type === \"text\"\n );\n const providerMetadata = textParts.reduce((acc, part) => {\n if (part.providerMetadata != null) {\n return { ...acc, ...part.providerMetadata };\n }\n return acc;\n }, {});\n modelMessages.push({\n role: \"system\",\n content: textParts.map((part) => part.text).join(\"\"),\n ...Object.keys(providerMetadata).length > 0 ? { providerOptions: providerMetadata } : {}\n });\n break;\n }\n case \"user\": {\n modelMessages.push({\n role: \"user\",\n content: message.parts.map((part) => {\n var _a21;\n if (isTextUIPart(part)) {\n return {\n type: \"text\",\n text: part.text,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n };\n }\n if (isFileUIPart(part)) {\n return {\n type: \"file\",\n mediaType: part.mediaType,\n filename: part.filename,\n data: part.url,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n };\n }\n if (isDataUIPart(part)) {\n return (_a21 = options == null ? void 0 : options.convertDataPart) == null ? void 0 : _a21.call(\n options,\n part\n );\n }\n }).filter(isNonNullable)\n });\n break;\n }\n case \"assistant\": {\n if (message.parts != null) {\n let block = [];\n async function processBlock() {\n var _a21, _b, _c, _d, _e, _f, _g;\n if (block.length === 0) {\n return;\n }\n const content = [];\n for (const part of block) {\n if (isTextUIPart(part)) {\n content.push({\n type: \"text\",\n text: part.text,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n });\n } else if (isFileUIPart(part)) {\n content.push({\n type: \"file\",\n mediaType: part.mediaType,\n filename: part.filename,\n data: part.url,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n });\n } else if (isReasoningUIPart(part)) {\n content.push({\n type: \"reasoning\",\n text: part.text,\n providerOptions: part.providerMetadata\n });\n } else if (isToolUIPart(part)) {\n const toolName = getToolName(part);\n if (part.state !== \"input-streaming\") {\n content.push({\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName,\n input: part.state === \"output-error\" ? (_a21 = part.input) != null ? _a21 : \"rawInput\" in part ? part.rawInput : void 0 : part.input,\n providerExecuted: part.providerExecuted,\n ...part.callProviderMetadata != null ? { providerOptions: part.callProviderMetadata } : {}\n });\n if (part.approval != null) {\n content.push({\n type: \"tool-approval-request\",\n approvalId: part.approval.id,\n toolCallId: part.toolCallId\n });\n }\n if (part.providerExecuted === true && part.state !== \"approval-responded\" && (part.state === \"output-available\" || part.state === \"output-error\")) {\n const resultProviderMetadata = (_b = part.resultProviderMetadata) != null ? _b : part.callProviderMetadata;\n content.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName,\n output: await createToolModelOutput({\n toolCallId: part.toolCallId,\n input: part.input,\n output: part.state === \"output-error\" ? part.errorText : part.output,\n tool: (_c = options == null ? void 0 : options.tools) == null ? void 0 : _c[toolName],\n errorMode: part.state === \"output-error\" ? \"json\" : \"none\"\n }),\n ...resultProviderMetadata != null ? { providerOptions: resultProviderMetadata } : {}\n });\n }\n }\n } else if (isDataUIPart(part)) {\n const dataPart = (_d = options == null ? void 0 : options.convertDataPart) == null ? void 0 : _d.call(\n options,\n part\n );\n if (dataPart != null) {\n content.push(dataPart);\n }\n } else {\n const _exhaustiveCheck = part;\n throw new Error(`Unsupported part: ${_exhaustiveCheck}`);\n }\n }\n modelMessages.push({\n role: \"assistant\",\n content\n });\n const toolParts = block.filter(\n (part) => {\n var _a22;\n return isToolUIPart(part) && (part.providerExecuted !== true || ((_a22 = part.approval) == null ? void 0 : _a22.approved) != null);\n }\n );\n if (toolParts.length > 0) {\n {\n const content2 = [];\n for (const toolPart of toolParts) {\n if (((_e = toolPart.approval) == null ? void 0 : _e.approved) != null) {\n content2.push({\n type: \"tool-approval-response\",\n approvalId: toolPart.approval.id,\n approved: toolPart.approval.approved,\n reason: toolPart.approval.reason,\n providerExecuted: toolPart.providerExecuted\n });\n }\n if (toolPart.providerExecuted === true) {\n continue;\n }\n switch (toolPart.state) {\n case \"output-denied\": {\n content2.push({\n type: \"tool-result\",\n toolCallId: toolPart.toolCallId,\n toolName: getToolName(toolPart),\n output: {\n type: \"error-text\",\n value: (_f = toolPart.approval.reason) != null ? _f : \"Tool execution denied.\"\n },\n ...toolPart.callProviderMetadata != null ? { providerOptions: toolPart.callProviderMetadata } : {}\n });\n break;\n }\n case \"output-error\":\n case \"output-available\": {\n const toolName = getToolName(toolPart);\n content2.push({\n type: \"tool-result\",\n toolCallId: toolPart.toolCallId,\n toolName,\n output: await createToolModelOutput({\n toolCallId: toolPart.toolCallId,\n input: toolPart.input,\n output: toolPart.state === \"output-error\" ? toolPart.errorText : toolPart.output,\n tool: (_g = options == null ? void 0 : options.tools) == null ? void 0 : _g[toolName],\n errorMode: toolPart.state === \"output-error\" ? \"text\" : \"none\"\n }),\n ...toolPart.callProviderMetadata != null ? { providerOptions: toolPart.callProviderMetadata } : {}\n });\n break;\n }\n }\n }\n if (content2.length > 0) {\n modelMessages.push({\n role: \"tool\",\n content: content2\n });\n }\n }\n }\n block = [];\n }\n for (const part of message.parts) {\n if (isTextUIPart(part) || isReasoningUIPart(part) || isFileUIPart(part) || isToolUIPart(part) || isDataUIPart(part)) {\n block.push(part);\n } else if (part.type === \"step-start\") {\n await processBlock();\n }\n }\n await processBlock();\n break;\n }\n break;\n }\n default: {\n const _exhaustiveCheck = message.role;\n throw new MessageConversionError({\n originalMessage: message,\n message: `Unsupported role: ${_exhaustiveCheck}`\n });\n }\n }\n }\n return modelMessages;\n}\n\n// src/ui/validate-ui-messages.ts\nimport {\n TypeValidationError as TypeValidationError3\n} from \"@ai-sdk/provider\";\nimport {\n lazySchema as lazySchema2,\n validateTypes as validateTypes3,\n zodSchema as zodSchema2\n} from \"@ai-sdk/provider-utils\";\nimport { z as z8 } from \"zod/v4\";\nvar toolMetadataSchema2 = z8.record(\n z8.string(),\n jsonValueSchema.optional()\n);\nvar uiMessagesSchema = lazySchema2(\n () => zodSchema2(\n z8.array(\n z8.object({\n id: z8.string(),\n role: z8.enum([\"system\", \"user\", \"assistant\"]),\n metadata: z8.unknown().optional(),\n parts: z8.array(\n z8.union([\n z8.object({\n type: z8.literal(\"text\"),\n text: z8.string(),\n state: z8.enum([\"streaming\", \"done\"]).optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z8.object({\n type: z8.literal(\"reasoning\"),\n text: z8.string(),\n state: z8.enum([\"streaming\", \"done\"]).optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z8.object({\n type: z8.literal(\"source-url\"),\n sourceId: z8.string(),\n url: z8.string(),\n title: z8.string().optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z8.object({\n type: z8.literal(\"source-document\"),\n sourceId: z8.string(),\n mediaType: z8.string(),\n title: z8.string(),\n filename: z8.string().optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z8.object({\n type: z8.literal(\"file\"),\n mediaType: z8.string(),\n filename: z8.string().optional(),\n url: z8.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z8.object({\n type: z8.literal(\"step-start\")\n }),\n z8.object({\n type: z8.string().startsWith(\"data-\"),\n id: z8.string().optional(),\n data: z8.unknown()\n }),\n z8.object({\n type: z8.literal(\"dynamic-tool\"),\n toolName: z8.string(),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"input-streaming\"),\n input: z8.unknown().optional(),\n providerExecuted: z8.boolean().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n approval: z8.never().optional()\n }),\n z8.object({\n type: z8.literal(\"dynamic-tool\"),\n toolName: z8.string(),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"input-available\"),\n input: z8.unknown(),\n providerExecuted: z8.boolean().optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.never().optional()\n }),\n z8.object({\n type: z8.literal(\"dynamic-tool\"),\n toolName: z8.string(),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"approval-requested\"),\n input: z8.unknown(),\n providerExecuted: z8.boolean().optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.never().optional(),\n reason: z8.never().optional()\n })\n }),\n z8.object({\n type: z8.literal(\"dynamic-tool\"),\n toolName: z8.string(),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"approval-responded\"),\n input: z8.unknown(),\n providerExecuted: z8.boolean().optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.boolean(),\n reason: z8.string().optional()\n })\n }),\n z8.object({\n type: z8.literal(\"dynamic-tool\"),\n toolName: z8.string(),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"output-available\"),\n input: z8.unknown(),\n providerExecuted: z8.boolean().optional(),\n output: z8.unknown(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n resultProviderMetadata: providerMetadataSchema.optional(),\n preliminary: z8.boolean().optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.literal(true),\n reason: z8.string().optional()\n }).optional()\n }),\n z8.object({\n type: z8.literal(\"dynamic-tool\"),\n toolName: z8.string(),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"output-error\"),\n input: z8.unknown().optional(),\n rawInput: z8.unknown().optional(),\n providerExecuted: z8.boolean().optional(),\n output: z8.never().optional(),\n errorText: z8.string(),\n callProviderMetadata: providerMetadataSchema.optional(),\n resultProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.literal(true),\n reason: z8.string().optional()\n }).optional()\n }),\n z8.object({\n type: z8.literal(\"dynamic-tool\"),\n toolName: z8.string(),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"output-denied\"),\n input: z8.unknown(),\n providerExecuted: z8.boolean().optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.literal(false),\n reason: z8.string().optional()\n })\n }),\n z8.object({\n type: z8.string().startsWith(\"tool-\"),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"input-streaming\"),\n providerExecuted: z8.boolean().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n input: z8.unknown().optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n approval: z8.never().optional()\n }),\n z8.object({\n type: z8.string().startsWith(\"tool-\"),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"input-available\"),\n providerExecuted: z8.boolean().optional(),\n input: z8.unknown(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.never().optional()\n }),\n z8.object({\n type: z8.string().startsWith(\"tool-\"),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"approval-requested\"),\n input: z8.unknown(),\n providerExecuted: z8.boolean().optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.never().optional(),\n reason: z8.never().optional()\n })\n }),\n z8.object({\n type: z8.string().startsWith(\"tool-\"),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"approval-responded\"),\n input: z8.unknown(),\n providerExecuted: z8.boolean().optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.boolean(),\n reason: z8.string().optional()\n })\n }),\n z8.object({\n type: z8.string().startsWith(\"tool-\"),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"output-available\"),\n providerExecuted: z8.boolean().optional(),\n input: z8.unknown(),\n output: z8.unknown(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n resultProviderMetadata: providerMetadataSchema.optional(),\n preliminary: z8.boolean().optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.literal(true),\n reason: z8.string().optional()\n }).optional()\n }),\n z8.object({\n type: z8.string().startsWith(\"tool-\"),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"output-error\"),\n providerExecuted: z8.boolean().optional(),\n input: z8.unknown().optional(),\n rawInput: z8.unknown().optional(),\n output: z8.never().optional(),\n errorText: z8.string(),\n callProviderMetadata: providerMetadataSchema.optional(),\n resultProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.literal(true),\n reason: z8.string().optional()\n }).optional()\n }),\n z8.object({\n type: z8.string().startsWith(\"tool-\"),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"output-denied\"),\n providerExecuted: z8.boolean().optional(),\n input: z8.unknown(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.literal(false),\n reason: z8.string().optional()\n })\n })\n ])\n ).nonempty(\"Message must contain at least one part\")\n })\n ).nonempty(\"Messages array must not be empty\")\n )\n);\nasync function safeValidateUIMessages({\n messages,\n metadataSchema,\n dataSchemas,\n tools\n}) {\n try {\n if (messages == null) {\n return {\n success: false,\n error: new InvalidArgumentError({\n parameter: \"messages\",\n value: messages,\n message: \"messages parameter must be provided\"\n })\n };\n }\n const validatedMessages = await validateTypes3({\n value: messages,\n schema: uiMessagesSchema\n });\n if (metadataSchema) {\n for (const [msgIdx, message] of validatedMessages.entries()) {\n await validateTypes3({\n value: message.metadata,\n schema: metadataSchema,\n context: {\n field: `messages[${msgIdx}].metadata`,\n entityId: message.id\n }\n });\n }\n }\n if (dataSchemas || tools) {\n for (const [msgIdx, message] of validatedMessages.entries()) {\n for (const [partIdx, part] of message.parts.entries()) {\n if (dataSchemas && part.type.startsWith(\"data-\")) {\n const dataPart = part;\n const dataName = dataPart.type.slice(5);\n const dataSchema = dataSchemas[dataName];\n if (!dataSchema) {\n return {\n success: false,\n error: new TypeValidationError3({\n value: dataPart.data,\n cause: `No data schema found for data part ${dataName}`,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].data`,\n entityName: dataName,\n entityId: dataPart.id\n }\n })\n };\n }\n await validateTypes3({\n value: dataPart.data,\n schema: dataSchema,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].data`,\n entityName: dataName,\n entityId: dataPart.id\n }\n });\n }\n if (tools && part.type.startsWith(\"tool-\")) {\n const toolPart = part;\n const toolName = toolPart.type.slice(5);\n const tool2 = tools[toolName];\n if (!tool2 && (toolPart.state === \"output-available\" || toolPart.state === \"output-error\" || toolPart.state === \"output-denied\")) {\n continue;\n }\n if (!tool2) {\n return {\n success: false,\n error: new TypeValidationError3({\n value: toolPart.input,\n cause: `No tool schema found for tool part ${toolName}`,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].input`,\n entityName: toolName,\n entityId: toolPart.toolCallId\n }\n })\n };\n }\n if (toolPart.state === \"input-available\" || toolPart.state === \"output-available\") {\n await validateTypes3({\n value: toolPart.input,\n schema: tool2.inputSchema,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].input`,\n entityName: toolName,\n entityId: toolPart.toolCallId\n }\n });\n }\n if (toolPart.state === \"output-available\" && tool2.outputSchema) {\n await validateTypes3({\n value: toolPart.output,\n schema: tool2.outputSchema,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].output`,\n entityName: toolName,\n entityId: toolPart.toolCallId\n }\n });\n }\n }\n }\n }\n }\n return {\n success: true,\n data: validatedMessages\n };\n } catch (error) {\n const err = error;\n return {\n success: false,\n error: err\n };\n }\n}\nasync function validateUIMessages({\n messages,\n metadataSchema,\n dataSchemas,\n tools\n}) {\n const response = await safeValidateUIMessages({\n messages,\n metadataSchema,\n dataSchemas,\n tools\n });\n if (!response.success)\n throw response.error;\n return response.data;\n}\n\n// src/agent/create-agent-ui-stream.ts\nasync function createAgentUIStream({\n agent,\n uiMessages,\n options,\n abortSignal,\n timeout,\n experimental_transform,\n onStepFinish,\n ...uiMessageStreamOptions\n}) {\n var _a21;\n const validatedMessages = await validateUIMessages({\n messages: uiMessages,\n tools: agent.tools\n });\n const modelMessages = await convertToModelMessages(validatedMessages, {\n tools: agent.tools\n });\n const result = await agent.stream({\n prompt: modelMessages,\n options,\n abortSignal,\n timeout,\n experimental_transform,\n onStepFinish\n });\n return result.toUIMessageStream({\n ...uiMessageStreamOptions,\n // TODO reading `originalMessages` is here for bc, always use `validatedMessages` in v7\n originalMessages: (_a21 = uiMessageStreamOptions.originalMessages) != null ? _a21 : validatedMessages\n });\n}\n\n// src/agent/create-agent-ui-stream-response.ts\nasync function createAgentUIStreamResponse({\n headers,\n status,\n statusText,\n consumeSseStream,\n ...options\n}) {\n return createUIMessageStreamResponse({\n headers,\n status,\n statusText,\n consumeSseStream,\n stream: await createAgentUIStream(options)\n });\n}\n\n// src/agent/pipe-agent-ui-stream-to-response.ts\nasync function pipeAgentUIStreamToResponse({\n response,\n headers,\n status,\n statusText,\n consumeSseStream,\n ...options\n}) {\n pipeUIMessageStreamToResponse({\n response,\n headers,\n status,\n statusText,\n consumeSseStream,\n stream: await createAgentUIStream(options)\n });\n}\n\n// src/embed/embed.ts\nimport {\n withUserAgentSuffix as withUserAgentSuffix3\n} from \"@ai-sdk/provider-utils\";\nasync function embed({\n model: modelArg,\n value,\n providerOptions,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n experimental_telemetry: telemetry\n}) {\n const model = resolveEmbeddingModel(modelArg);\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const headersWithUserAgent = withUserAgentSuffix3(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers: headersWithUserAgent,\n settings: { maxRetries }\n });\n const tracer = getTracer(telemetry);\n return recordSpan({\n name: \"ai.embed\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: \"ai.embed\", telemetry }),\n ...baseTelemetryAttributes,\n \"ai.value\": { input: () => JSON.stringify(value) }\n }\n }),\n tracer,\n fn: async (span) => {\n const { embedding, usage, warnings, response, providerMetadata } = await retry(\n () => (\n // nested spans to align with the embedMany telemetry data:\n recordSpan({\n name: \"ai.embed.doEmbed\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.embed.doEmbed\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.values\": { input: () => [JSON.stringify(value)] }\n }\n }),\n tracer,\n fn: async (doEmbedSpan) => {\n var _a21, _b;\n const modelResponse = await model.doEmbed({\n values: [value],\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions\n });\n const embedding2 = modelResponse.embeddings[0];\n const usage2 = (_a21 = modelResponse.usage) != null ? _a21 : { tokens: NaN };\n doEmbedSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embeddings\": {\n output: () => modelResponse.embeddings.map(\n (embedding3) => JSON.stringify(embedding3)\n )\n },\n \"ai.usage.tokens\": usage2.tokens\n }\n })\n );\n return {\n embedding: embedding2,\n usage: usage2,\n warnings: (_b = modelResponse.warnings) != null ? _b : [],\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response\n };\n }\n })\n )\n );\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embedding\": { output: () => JSON.stringify(embedding) },\n \"ai.usage.tokens\": usage.tokens\n }\n })\n );\n logWarnings({ warnings, provider: model.provider, model: model.modelId });\n return new DefaultEmbedResult({\n value,\n embedding,\n usage,\n warnings,\n providerMetadata,\n response\n });\n }\n });\n}\nvar DefaultEmbedResult = class {\n constructor(options) {\n this.value = options.value;\n this.embedding = options.embedding;\n this.usage = options.usage;\n this.warnings = options.warnings;\n this.providerMetadata = options.providerMetadata;\n this.response = options.response;\n }\n};\n\n// src/embed/embed-many.ts\nimport {\n withUserAgentSuffix as withUserAgentSuffix4\n} from \"@ai-sdk/provider-utils\";\n\n// src/util/split-array.ts\nfunction splitArray(array2, chunkSize) {\n if (chunkSize <= 0) {\n throw new Error(\"chunkSize must be greater than 0\");\n }\n const result = [];\n for (let i = 0; i < array2.length; i += chunkSize) {\n result.push(array2.slice(i, i + chunkSize));\n }\n return result;\n}\n\n// src/embed/embed-many.ts\nasync function embedMany({\n model: modelArg,\n values,\n maxParallelCalls = Infinity,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n providerOptions,\n experimental_telemetry: telemetry\n}) {\n const model = resolveEmbeddingModel(modelArg);\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const headersWithUserAgent = withUserAgentSuffix4(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers: headersWithUserAgent,\n settings: { maxRetries }\n });\n const tracer = getTracer(telemetry);\n return recordSpan({\n name: \"ai.embedMany\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: \"ai.embedMany\", telemetry }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.values\": {\n input: () => values.map((value) => JSON.stringify(value))\n }\n }\n }),\n tracer,\n fn: async (span) => {\n var _a21;\n const [maxEmbeddingsPerCall, supportsParallelCalls] = await Promise.all([\n model.maxEmbeddingsPerCall,\n model.supportsParallelCalls\n ]);\n if (maxEmbeddingsPerCall == null || maxEmbeddingsPerCall === Infinity) {\n const { embeddings: embeddings2, usage, warnings: warnings2, response, providerMetadata: providerMetadata2 } = await retry(() => {\n return recordSpan({\n name: \"ai.embedMany.doEmbed\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.embedMany.doEmbed\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.values\": {\n input: () => values.map((value) => JSON.stringify(value))\n }\n }\n }),\n tracer,\n fn: async (doEmbedSpan) => {\n var _a22, _b;\n const modelResponse = await model.doEmbed({\n values,\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions\n });\n const embeddings3 = modelResponse.embeddings;\n const usage2 = (_a22 = modelResponse.usage) != null ? _a22 : { tokens: NaN };\n doEmbedSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embeddings\": {\n output: () => embeddings3.map(\n (embedding) => JSON.stringify(embedding)\n )\n },\n \"ai.usage.tokens\": usage2.tokens\n }\n })\n );\n return {\n embeddings: embeddings3,\n usage: usage2,\n warnings: (_b = modelResponse.warnings) != null ? _b : [],\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response\n };\n }\n });\n });\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embeddings\": {\n output: () => embeddings2.map((embedding) => JSON.stringify(embedding))\n },\n \"ai.usage.tokens\": usage.tokens\n }\n })\n );\n logWarnings({\n warnings: warnings2,\n provider: model.provider,\n model: model.modelId\n });\n return new DefaultEmbedManyResult({\n values,\n embeddings: embeddings2,\n usage,\n warnings: warnings2,\n providerMetadata: providerMetadata2,\n responses: [response]\n });\n }\n const valueChunks = splitArray(values, maxEmbeddingsPerCall);\n const embeddings = [];\n const warnings = [];\n const responses = [];\n let tokens = 0;\n let providerMetadata;\n const parallelChunks = splitArray(\n valueChunks,\n supportsParallelCalls ? maxParallelCalls : 1\n );\n for (const parallelChunk of parallelChunks) {\n const results = await Promise.all(\n parallelChunk.map((chunk) => {\n return retry(() => {\n return recordSpan({\n name: \"ai.embedMany.doEmbed\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.embedMany.doEmbed\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.values\": {\n input: () => chunk.map((value) => JSON.stringify(value))\n }\n }\n }),\n tracer,\n fn: async (doEmbedSpan) => {\n var _a22, _b;\n const modelResponse = await model.doEmbed({\n values: chunk,\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions\n });\n const embeddings2 = modelResponse.embeddings;\n const usage = (_a22 = modelResponse.usage) != null ? _a22 : { tokens: NaN };\n doEmbedSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embeddings\": {\n output: () => embeddings2.map(\n (embedding) => JSON.stringify(embedding)\n )\n },\n \"ai.usage.tokens\": usage.tokens\n }\n })\n );\n return {\n embeddings: embeddings2,\n usage,\n warnings: (_b = modelResponse.warnings) != null ? _b : [],\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response\n };\n }\n });\n });\n })\n );\n for (const result of results) {\n embeddings.push(...result.embeddings);\n warnings.push(...result.warnings);\n responses.push(result.response);\n tokens += result.usage.tokens;\n if (result.providerMetadata) {\n if (!providerMetadata) {\n providerMetadata = { ...result.providerMetadata };\n } else {\n for (const [providerName, metadata] of Object.entries(\n result.providerMetadata\n )) {\n providerMetadata[providerName] = {\n ...(_a21 = providerMetadata[providerName]) != null ? _a21 : {},\n ...metadata\n };\n }\n }\n }\n }\n }\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embeddings\": {\n output: () => embeddings.map((embedding) => JSON.stringify(embedding))\n },\n \"ai.usage.tokens\": tokens\n }\n })\n );\n logWarnings({\n warnings,\n provider: model.provider,\n model: model.modelId\n });\n return new DefaultEmbedManyResult({\n values,\n embeddings,\n usage: { tokens },\n warnings,\n providerMetadata,\n responses\n });\n }\n });\n}\nvar DefaultEmbedManyResult = class {\n constructor(options) {\n this.values = options.values;\n this.embeddings = options.embeddings;\n this.usage = options.usage;\n this.warnings = options.warnings;\n this.providerMetadata = options.providerMetadata;\n this.responses = options.responses;\n }\n};\n\n// src/generate-image/generate-image.ts\nimport {\n convertBase64ToUint8Array as convertBase64ToUint8Array4,\n withUserAgentSuffix as withUserAgentSuffix5\n} from \"@ai-sdk/provider-utils\";\nasync function generateImage({\n model: modelArg,\n prompt: promptArg,\n n = 1,\n maxImagesPerCall,\n size,\n aspectRatio,\n seed,\n providerOptions,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers\n}) {\n var _a21, _b;\n const model = resolveImageModel(modelArg);\n const headersWithUserAgent = withUserAgentSuffix5(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const maxImagesPerCallWithDefault = (_a21 = maxImagesPerCall != null ? maxImagesPerCall : await invokeModelMaxImagesPerCall(model)) != null ? _a21 : 1;\n const callCount = Math.ceil(n / maxImagesPerCallWithDefault);\n const callImageCounts = Array.from({ length: callCount }, (_, i) => {\n if (i < callCount - 1) {\n return maxImagesPerCallWithDefault;\n }\n const remainder = n % maxImagesPerCallWithDefault;\n return remainder === 0 ? maxImagesPerCallWithDefault : remainder;\n });\n const results = await Promise.all(\n callImageCounts.map(\n async (callImageCount) => retry(() => {\n const { prompt, files, mask } = normalizePrompt(promptArg);\n return model.doGenerate({\n prompt,\n files,\n mask,\n n: callImageCount,\n abortSignal,\n headers: headersWithUserAgent,\n size,\n aspectRatio,\n seed,\n providerOptions: providerOptions != null ? providerOptions : {}\n });\n })\n )\n );\n const images = [];\n const warnings = [];\n const responses = [];\n const providerMetadata = {};\n let totalUsage = {\n inputTokens: void 0,\n outputTokens: void 0,\n totalTokens: void 0\n };\n for (const result of results) {\n images.push(\n ...result.images.map(\n (image) => {\n var _a22;\n return new DefaultGeneratedFile({\n data: image,\n mediaType: (_a22 = detectMediaType({\n data: image,\n signatures: imageMediaTypeSignatures\n })) != null ? _a22 : \"image/png\"\n });\n }\n )\n );\n warnings.push(...result.warnings);\n if (result.usage != null) {\n totalUsage = addImageModelUsage(totalUsage, result.usage);\n }\n if (result.providerMetadata) {\n for (const [providerName, metadata] of Object.entries(result.providerMetadata)) {\n if (providerName === \"gateway\") {\n const currentEntry = providerMetadata[providerName];\n if (currentEntry != null && typeof currentEntry === \"object\") {\n providerMetadata[providerName] = {\n ...currentEntry,\n ...metadata\n };\n } else {\n providerMetadata[providerName] = metadata;\n }\n const imagesValue = providerMetadata[providerName].images;\n if (Array.isArray(imagesValue) && imagesValue.length === 0) {\n delete providerMetadata[providerName].images;\n }\n } else {\n (_b = providerMetadata[providerName]) != null ? _b : providerMetadata[providerName] = { images: [] };\n providerMetadata[providerName].images.push(\n ...result.providerMetadata[providerName].images\n );\n }\n }\n }\n responses.push(result.response);\n }\n logWarnings({ warnings, provider: model.provider, model: model.modelId });\n if (!images.length) {\n throw new NoImageGeneratedError({ responses });\n }\n return new DefaultGenerateImageResult({\n images,\n warnings,\n responses,\n providerMetadata,\n usage: totalUsage\n });\n}\nvar DefaultGenerateImageResult = class {\n constructor(options) {\n this.images = options.images;\n this.warnings = options.warnings;\n this.responses = options.responses;\n this.providerMetadata = options.providerMetadata;\n this.usage = options.usage;\n }\n get image() {\n return this.images[0];\n }\n};\nasync function invokeModelMaxImagesPerCall(model) {\n const isFunction = model.maxImagesPerCall instanceof Function;\n if (!isFunction) {\n return model.maxImagesPerCall;\n }\n return model.maxImagesPerCall({\n modelId: model.modelId\n });\n}\nfunction normalizePrompt(prompt) {\n if (typeof prompt === \"string\") {\n return { prompt, files: void 0, mask: void 0 };\n }\n return {\n prompt: prompt.text,\n files: prompt.images.map(toImageModelV3File),\n mask: prompt.mask ? toImageModelV3File(prompt.mask) : void 0\n };\n}\nfunction toImageModelV3File(dataContent) {\n if (typeof dataContent === \"string\" && dataContent.startsWith(\"http\")) {\n return {\n type: \"url\",\n url: dataContent\n };\n }\n if (typeof dataContent === \"string\" && dataContent.startsWith(\"data:\")) {\n const { mediaType: dataUrlMediaType, base64Content } = splitDataUrl(dataContent);\n if (base64Content != null) {\n const uint8Data2 = convertBase64ToUint8Array4(base64Content);\n return {\n type: \"file\",\n data: uint8Data2,\n mediaType: dataUrlMediaType || detectMediaType({\n data: uint8Data2,\n signatures: imageMediaTypeSignatures\n }) || \"image/png\"\n };\n }\n }\n const uint8Data = convertDataContentToUint8Array(dataContent);\n return {\n type: \"file\",\n data: uint8Data,\n mediaType: detectMediaType({\n data: uint8Data,\n signatures: imageMediaTypeSignatures\n }) || \"image/png\"\n };\n}\n\n// src/generate-image/index.ts\nvar experimental_generateImage = generateImage;\n\n// src/generate-object/generate-object.ts\nimport {\n createIdGenerator as createIdGenerator3,\n withUserAgentSuffix as withUserAgentSuffix6\n} from \"@ai-sdk/provider-utils\";\n\n// src/generate-object/output-strategy.ts\nimport {\n isJSONArray,\n isJSONObject,\n TypeValidationError as TypeValidationError4,\n UnsupportedFunctionalityError as UnsupportedFunctionalityError3\n} from \"@ai-sdk/provider\";\nimport {\n asSchema as asSchema4,\n safeValidateTypes as safeValidateTypes4\n} from \"@ai-sdk/provider-utils\";\nvar noSchemaOutputStrategy = {\n type: \"no-schema\",\n jsonSchema: async () => void 0,\n async validatePartialResult({ value, textDelta }) {\n return { success: true, value: { partial: value, textDelta } };\n },\n async validateFinalResult(value, context2) {\n return value === void 0 ? {\n success: false,\n error: new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n text: context2.text,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n })\n } : { success: true, value };\n },\n createElementStream() {\n throw new UnsupportedFunctionalityError3({\n functionality: \"element streams in no-schema mode\"\n });\n }\n};\nvar objectOutputStrategy = (schema) => ({\n type: \"object\",\n jsonSchema: async () => await schema.jsonSchema,\n async validatePartialResult({ value, textDelta }) {\n return {\n success: true,\n value: {\n // Note: currently no validation of partial results:\n partial: value,\n textDelta\n }\n };\n },\n async validateFinalResult(value) {\n return safeValidateTypes4({ value, schema });\n },\n createElementStream() {\n throw new UnsupportedFunctionalityError3({\n functionality: \"element streams in object mode\"\n });\n }\n});\nvar arrayOutputStrategy = (schema) => {\n return {\n type: \"array\",\n // wrap in object that contains array of elements, since most LLMs will not\n // be able to generate an array directly:\n // possible future optimization: use arrays directly when model supports grammar-guided generation\n jsonSchema: async () => {\n const { $schema, ...itemSchema } = await schema.jsonSchema;\n return {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n properties: {\n elements: { type: \"array\", items: itemSchema }\n },\n required: [\"elements\"],\n additionalProperties: false\n };\n },\n async validatePartialResult({\n value,\n latestObject,\n isFirstDelta,\n isFinalDelta\n }) {\n var _a21;\n if (!isJSONObject(value) || !isJSONArray(value.elements)) {\n return {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: \"value must be an object that contains an array of elements\"\n })\n };\n }\n const inputArray = value.elements;\n const resultArray = [];\n for (let i = 0; i < inputArray.length; i++) {\n const element = inputArray[i];\n const result = await safeValidateTypes4({ value: element, schema });\n if (i === inputArray.length - 1 && !isFinalDelta) {\n continue;\n }\n if (!result.success) {\n return result;\n }\n resultArray.push(result.value);\n }\n const publishedElementCount = (_a21 = latestObject == null ? void 0 : latestObject.length) != null ? _a21 : 0;\n let textDelta = \"\";\n if (isFirstDelta) {\n textDelta += \"[\";\n }\n if (publishedElementCount > 0) {\n textDelta += \",\";\n }\n textDelta += resultArray.slice(publishedElementCount).map((element) => JSON.stringify(element)).join(\",\");\n if (isFinalDelta) {\n textDelta += \"]\";\n }\n return {\n success: true,\n value: {\n partial: resultArray,\n textDelta\n }\n };\n },\n async validateFinalResult(value) {\n if (!isJSONObject(value) || !isJSONArray(value.elements)) {\n return {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: \"value must be an object that contains an array of elements\"\n })\n };\n }\n const inputArray = value.elements;\n for (const element of inputArray) {\n const result = await safeValidateTypes4({ value: element, schema });\n if (!result.success) {\n return result;\n }\n }\n return { success: true, value: inputArray };\n },\n createElementStream(originalStream) {\n let publishedElements = 0;\n return createAsyncIterableStream(\n originalStream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"object\": {\n const array2 = chunk.object;\n for (; publishedElements < array2.length; publishedElements++) {\n controller.enqueue(array2[publishedElements]);\n }\n break;\n }\n case \"text-delta\":\n case \"finish\":\n case \"error\":\n break;\n default: {\n const _exhaustiveCheck = chunk;\n throw new Error(\n `Unsupported chunk type: ${_exhaustiveCheck}`\n );\n }\n }\n }\n })\n )\n );\n }\n };\n};\nvar enumOutputStrategy = (enumValues) => {\n return {\n type: \"enum\",\n // wrap in object that contains result, since most LLMs will not\n // be able to generate an enum value directly:\n // possible future optimization: use enums directly when model supports top-level enums\n jsonSchema: async () => ({\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n properties: {\n result: { type: \"string\", enum: enumValues }\n },\n required: [\"result\"],\n additionalProperties: false\n }),\n async validateFinalResult(value) {\n if (!isJSONObject(value) || typeof value.result !== \"string\") {\n return {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: 'value must be an object that contains a string in the \"result\" property.'\n })\n };\n }\n const result = value.result;\n return enumValues.includes(result) ? { success: true, value: result } : {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: \"value must be a string in the enum\"\n })\n };\n },\n async validatePartialResult({ value, textDelta }) {\n if (!isJSONObject(value) || typeof value.result !== \"string\") {\n return {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: 'value must be an object that contains a string in the \"result\" property.'\n })\n };\n }\n const result = value.result;\n const possibleEnumValues = enumValues.filter(\n (enumValue) => enumValue.startsWith(result)\n );\n if (value.result.length === 0 || possibleEnumValues.length === 0) {\n return {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: \"value must be a string in the enum\"\n })\n };\n }\n return {\n success: true,\n value: {\n partial: possibleEnumValues.length > 1 ? result : possibleEnumValues[0],\n textDelta\n }\n };\n },\n createElementStream() {\n throw new UnsupportedFunctionalityError3({\n functionality: \"element streams in enum mode\"\n });\n }\n };\n};\nfunction getOutputStrategy({\n output,\n schema,\n enumValues\n}) {\n switch (output) {\n case \"object\":\n return objectOutputStrategy(asSchema4(schema));\n case \"array\":\n return arrayOutputStrategy(asSchema4(schema));\n case \"enum\":\n return enumOutputStrategy(enumValues);\n case \"no-schema\":\n return noSchemaOutputStrategy;\n default: {\n const _exhaustiveCheck = output;\n throw new Error(`Unsupported output: ${_exhaustiveCheck}`);\n }\n }\n}\n\n// src/generate-object/parse-and-validate-object-result.ts\nimport { JSONParseError as JSONParseError2, TypeValidationError as TypeValidationError5 } from \"@ai-sdk/provider\";\nimport { safeParseJSON as safeParseJSON4 } from \"@ai-sdk/provider-utils\";\nasync function parseAndValidateObjectResult(result, outputStrategy, context2) {\n const parseResult = await safeParseJSON4({ text: result });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: result,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n const validationResult = await outputStrategy.validateFinalResult(\n parseResult.value,\n {\n text: result,\n response: context2.response,\n usage: context2.usage\n }\n );\n if (!validationResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: validationResult.error,\n text: result,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n return validationResult.value;\n}\nasync function parseAndValidateObjectResultWithRepair(result, outputStrategy, repairText, context2) {\n try {\n return await parseAndValidateObjectResult(result, outputStrategy, context2);\n } catch (error) {\n if (repairText != null && NoObjectGeneratedError.isInstance(error) && (JSONParseError2.isInstance(error.cause) || TypeValidationError5.isInstance(error.cause))) {\n const repairedText = await repairText({\n text: result,\n error: error.cause\n });\n if (repairedText === null) {\n throw error;\n }\n return await parseAndValidateObjectResult(\n repairedText,\n outputStrategy,\n context2\n );\n }\n throw error;\n }\n}\n\n// src/generate-object/validate-object-generation-input.ts\nfunction validateObjectGenerationInput({\n output,\n schema,\n schemaName,\n schemaDescription,\n enumValues\n}) {\n if (output != null && output !== \"object\" && output !== \"array\" && output !== \"enum\" && output !== \"no-schema\") {\n throw new InvalidArgumentError({\n parameter: \"output\",\n value: output,\n message: \"Invalid output type.\"\n });\n }\n if (output === \"no-schema\") {\n if (schema != null) {\n throw new InvalidArgumentError({\n parameter: \"schema\",\n value: schema,\n message: \"Schema is not supported for no-schema output.\"\n });\n }\n if (schemaDescription != null) {\n throw new InvalidArgumentError({\n parameter: \"schemaDescription\",\n value: schemaDescription,\n message: \"Schema description is not supported for no-schema output.\"\n });\n }\n if (schemaName != null) {\n throw new InvalidArgumentError({\n parameter: \"schemaName\",\n value: schemaName,\n message: \"Schema name is not supported for no-schema output.\"\n });\n }\n if (enumValues != null) {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value: enumValues,\n message: \"Enum values are not supported for no-schema output.\"\n });\n }\n }\n if (output === \"object\") {\n if (schema == null) {\n throw new InvalidArgumentError({\n parameter: \"schema\",\n value: schema,\n message: \"Schema is required for object output.\"\n });\n }\n if (enumValues != null) {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value: enumValues,\n message: \"Enum values are not supported for object output.\"\n });\n }\n }\n if (output === \"array\") {\n if (schema == null) {\n throw new InvalidArgumentError({\n parameter: \"schema\",\n value: schema,\n message: \"Element schema is required for array output.\"\n });\n }\n if (enumValues != null) {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value: enumValues,\n message: \"Enum values are not supported for array output.\"\n });\n }\n }\n if (output === \"enum\") {\n if (schema != null) {\n throw new InvalidArgumentError({\n parameter: \"schema\",\n value: schema,\n message: \"Schema is not supported for enum output.\"\n });\n }\n if (schemaDescription != null) {\n throw new InvalidArgumentError({\n parameter: \"schemaDescription\",\n value: schemaDescription,\n message: \"Schema description is not supported for enum output.\"\n });\n }\n if (schemaName != null) {\n throw new InvalidArgumentError({\n parameter: \"schemaName\",\n value: schemaName,\n message: \"Schema name is not supported for enum output.\"\n });\n }\n if (enumValues == null) {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value: enumValues,\n message: \"Enum values are required for enum output.\"\n });\n }\n for (const value of enumValues) {\n if (typeof value !== \"string\") {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value,\n message: \"Enum values must be strings.\"\n });\n }\n }\n }\n}\n\n// src/generate-object/generate-object.ts\nvar originalGenerateId3 = createIdGenerator3({ prefix: \"aiobj\", size: 24 });\nasync function generateObject(options) {\n const {\n model: modelArg,\n output = \"object\",\n system,\n prompt,\n messages,\n allowSystemInMessages,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n experimental_repairText: repairText,\n experimental_telemetry: telemetry,\n experimental_download: download2,\n providerOptions,\n _internal: {\n generateId: generateId2 = originalGenerateId3,\n currentDate = () => /* @__PURE__ */ new Date()\n } = {},\n ...settings\n } = options;\n const model = resolveLanguageModel(modelArg);\n const enumValues = \"enum\" in options ? options.enum : void 0;\n const {\n schema: inputSchema,\n schemaDescription,\n schemaName\n } = \"schema\" in options ? options : {};\n validateObjectGenerationInput({\n output,\n schema: inputSchema,\n schemaName,\n schemaDescription,\n enumValues\n });\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const outputStrategy = getOutputStrategy({\n output,\n schema: inputSchema,\n enumValues\n });\n const callSettings = prepareCallSettings(settings);\n const headersWithUserAgent = withUserAgentSuffix6(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers: headersWithUserAgent,\n settings: { ...callSettings, maxRetries }\n });\n const tracer = getTracer(telemetry);\n const jsonSchema2 = await outputStrategy.jsonSchema();\n try {\n return await recordSpan({\n name: \"ai.generateObject\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.generateObject\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.prompt\": {\n input: () => JSON.stringify({ system, prompt, messages })\n },\n \"ai.schema\": jsonSchema2 != null ? { input: () => JSON.stringify(jsonSchema2) } : void 0,\n \"ai.schema.name\": schemaName,\n \"ai.schema.description\": schemaDescription,\n \"ai.settings.output\": outputStrategy.type\n }\n }),\n tracer,\n fn: async (span) => {\n var _a21;\n let result;\n let finishReason;\n let usage;\n let warnings;\n let response;\n let request;\n let resultProviderMetadata;\n let reasoning;\n const standardizedPrompt = await standardizePrompt({\n system,\n prompt,\n messages,\n allowSystemInMessages\n });\n const promptMessages = await convertToLanguageModelPrompt({\n prompt: standardizedPrompt,\n supportedUrls: await model.supportedUrls,\n download: download2\n });\n const generateResult = await retry(\n () => recordSpan({\n name: \"ai.generateObject.doGenerate\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.generateObject.doGenerate\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n \"ai.prompt.messages\": {\n input: () => stringifyForTelemetry(promptMessages)\n },\n // standardized gen-ai llm span attributes:\n \"gen_ai.system\": model.provider,\n \"gen_ai.request.model\": model.modelId,\n \"gen_ai.request.frequency_penalty\": callSettings.frequencyPenalty,\n \"gen_ai.request.max_tokens\": callSettings.maxOutputTokens,\n \"gen_ai.request.presence_penalty\": callSettings.presencePenalty,\n \"gen_ai.request.temperature\": callSettings.temperature,\n \"gen_ai.request.top_k\": callSettings.topK,\n \"gen_ai.request.top_p\": callSettings.topP\n }\n }),\n tracer,\n fn: async (span2) => {\n var _a22, _b, _c, _d, _e, _f, _g, _h;\n const result2 = await model.doGenerate({\n responseFormat: {\n type: \"json\",\n schema: jsonSchema2,\n name: schemaName,\n description: schemaDescription\n },\n ...prepareCallSettings(settings),\n prompt: promptMessages,\n providerOptions,\n abortSignal,\n headers: headersWithUserAgent\n });\n const responseData = {\n id: (_b = (_a22 = result2.response) == null ? void 0 : _a22.id) != null ? _b : generateId2(),\n timestamp: (_d = (_c = result2.response) == null ? void 0 : _c.timestamp) != null ? _d : currentDate(),\n modelId: (_f = (_e = result2.response) == null ? void 0 : _e.modelId) != null ? _f : model.modelId,\n headers: (_g = result2.response) == null ? void 0 : _g.headers,\n body: (_h = result2.response) == null ? void 0 : _h.body\n };\n const text2 = extractTextContent(result2.content);\n const reasoning2 = extractReasoningContent(result2.content);\n if (text2 === void 0) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: the model did not return a response.\",\n response: responseData,\n usage: asLanguageModelUsage(result2.usage),\n finishReason: result2.finishReason.unified\n });\n }\n span2.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": result2.finishReason.unified,\n \"ai.response.object\": { output: () => text2 },\n \"ai.response.id\": responseData.id,\n \"ai.response.model\": responseData.modelId,\n \"ai.response.timestamp\": responseData.timestamp.toISOString(),\n \"ai.response.providerMetadata\": JSON.stringify(\n result2.providerMetadata\n ),\n // TODO rename telemetry attributes to inputTokens and outputTokens\n \"ai.usage.promptTokens\": result2.usage.inputTokens.total,\n \"ai.usage.completionTokens\": result2.usage.outputTokens.total,\n // standardized gen-ai llm span attributes:\n \"gen_ai.response.finish_reasons\": [\n result2.finishReason.unified\n ],\n \"gen_ai.response.id\": responseData.id,\n \"gen_ai.response.model\": responseData.modelId,\n \"gen_ai.usage.input_tokens\": result2.usage.inputTokens.total,\n \"gen_ai.usage.output_tokens\": result2.usage.outputTokens.total\n }\n })\n );\n return {\n ...result2,\n objectText: text2,\n reasoning: reasoning2,\n responseData\n };\n }\n })\n );\n result = generateResult.objectText;\n finishReason = generateResult.finishReason.unified;\n usage = asLanguageModelUsage(generateResult.usage);\n warnings = generateResult.warnings;\n resultProviderMetadata = generateResult.providerMetadata;\n request = (_a21 = generateResult.request) != null ? _a21 : {};\n response = generateResult.responseData;\n reasoning = generateResult.reasoning;\n logWarnings({\n warnings,\n provider: model.provider,\n model: model.modelId\n });\n const object2 = await parseAndValidateObjectResultWithRepair(\n result,\n outputStrategy,\n repairText,\n {\n response,\n usage,\n finishReason\n }\n );\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": finishReason,\n \"ai.response.object\": {\n output: () => JSON.stringify(object2)\n },\n \"ai.response.providerMetadata\": JSON.stringify(\n resultProviderMetadata\n ),\n // TODO rename telemetry attributes to inputTokens and outputTokens\n \"ai.usage.promptTokens\": usage.inputTokens,\n \"ai.usage.completionTokens\": usage.outputTokens\n }\n })\n );\n return new DefaultGenerateObjectResult({\n object: object2,\n reasoning,\n finishReason,\n usage,\n warnings,\n request,\n response,\n providerMetadata: resultProviderMetadata\n });\n }\n });\n } catch (error) {\n throw wrapGatewayError(error);\n }\n}\nvar DefaultGenerateObjectResult = class {\n constructor(options) {\n this.object = options.object;\n this.finishReason = options.finishReason;\n this.usage = options.usage;\n this.warnings = options.warnings;\n this.providerMetadata = options.providerMetadata;\n this.response = options.response;\n this.request = options.request;\n this.reasoning = options.reasoning;\n }\n toJsonResponse(init) {\n var _a21;\n return new Response(JSON.stringify(this.object), {\n status: (_a21 = init == null ? void 0 : init.status) != null ? _a21 : 200,\n headers: prepareHeaders(init == null ? void 0 : init.headers, {\n \"content-type\": \"application/json; charset=utf-8\"\n })\n });\n }\n};\n\n// src/generate-object/stream-object.ts\nimport {\n createIdGenerator as createIdGenerator4,\n DelayedPromise as DelayedPromise2\n} from \"@ai-sdk/provider-utils\";\n\n// src/util/cosine-similarity.ts\nfunction cosineSimilarity(vector1, vector2) {\n if (vector1.length !== vector2.length) {\n throw new InvalidArgumentError({\n parameter: \"vector1,vector2\",\n value: { vector1Length: vector1.length, vector2Length: vector2.length },\n message: `Vectors must have the same length`\n });\n }\n const n = vector1.length;\n if (n === 0) {\n return 0;\n }\n let magnitudeSquared1 = 0;\n let magnitudeSquared2 = 0;\n let dotProduct = 0;\n for (let i = 0; i < n; i++) {\n const value1 = vector1[i];\n const value2 = vector2[i];\n magnitudeSquared1 += value1 * value1;\n magnitudeSquared2 += value2 * value2;\n dotProduct += value1 * value2;\n }\n return magnitudeSquared1 === 0 || magnitudeSquared2 === 0 ? 0 : dotProduct / (Math.sqrt(magnitudeSquared1) * Math.sqrt(magnitudeSquared2));\n}\n\n// src/util/download/create-download.ts\nfunction createDownload(options) {\n return ({ url, abortSignal }) => download({ url, maxBytes: options == null ? void 0 : options.maxBytes, abortSignal });\n}\n\n// src/util/data-url.ts\nfunction getTextFromDataUrl(dataUrl) {\n const [header, base64Content] = dataUrl.split(\",\");\n const mediaType = header.split(\";\")[0].split(\":\")[1];\n if (mediaType == null || base64Content == null) {\n throw new Error(\"Invalid data URL format\");\n }\n try {\n return window.atob(base64Content);\n } catch (error) {\n throw new Error(`Error decoding data URL`);\n }\n}\n\n// src/util/is-deep-equal-data.ts\nfunction isDeepEqualData(obj1, obj2) {\n if (obj1 === obj2)\n return true;\n if (obj1 == null || obj2 == null)\n return false;\n if (typeof obj1 !== \"object\" && typeof obj2 !== \"object\")\n return obj1 === obj2;\n if (obj1.constructor !== obj2.constructor)\n return false;\n if (obj1 instanceof Date && obj2 instanceof Date) {\n return obj1.getTime() === obj2.getTime();\n }\n if (Array.isArray(obj1)) {\n if (obj1.length !== obj2.length)\n return false;\n for (let i = 0; i < obj1.length; i++) {\n if (!isDeepEqualData(obj1[i], obj2[i]))\n return false;\n }\n return true;\n }\n const keys1 = Object.keys(obj1);\n const keys2 = Object.keys(obj2);\n if (keys1.length !== keys2.length)\n return false;\n for (const key of keys1) {\n if (!keys2.includes(key))\n return false;\n if (!isDeepEqualData(obj1[key], obj2[key]))\n return false;\n }\n return true;\n}\n\n// src/util/serial-job-executor.ts\nvar SerialJobExecutor = class {\n constructor() {\n this.queue = [];\n this.isProcessing = false;\n }\n async processQueue() {\n if (this.isProcessing) {\n return;\n }\n this.isProcessing = true;\n while (this.queue.length > 0) {\n await this.queue[0]();\n this.queue.shift();\n }\n this.isProcessing = false;\n }\n async run(job) {\n return new Promise((resolve3, reject) => {\n this.queue.push(async () => {\n try {\n await job();\n resolve3();\n } catch (error) {\n reject(error);\n }\n });\n void this.processQueue();\n });\n }\n};\n\n// src/util/simulate-readable-stream.ts\nimport { delay as delayFunction } from \"@ai-sdk/provider-utils\";\nfunction simulateReadableStream({\n chunks,\n initialDelayInMs = 0,\n chunkDelayInMs = 0,\n _internal\n}) {\n var _a21;\n const delay2 = (_a21 = _internal == null ? void 0 : _internal.delay) != null ? _a21 : delayFunction;\n let index = 0;\n return new ReadableStream({\n async pull(controller) {\n if (index < chunks.length) {\n await delay2(index === 0 ? initialDelayInMs : chunkDelayInMs);\n controller.enqueue(chunks[index++]);\n } else {\n controller.close();\n }\n }\n });\n}\n\n// src/generate-object/stream-object.ts\nvar originalGenerateId4 = createIdGenerator4({ prefix: \"aiobj\", size: 24 });\nfunction streamObject(options) {\n const {\n model,\n output = \"object\",\n system,\n prompt,\n messages,\n allowSystemInMessages,\n maxRetries,\n abortSignal,\n headers,\n experimental_repairText: repairText,\n experimental_telemetry: telemetry,\n experimental_download: download2,\n providerOptions,\n onError = ({ error }) => {\n console.error(error);\n },\n onFinish,\n _internal: {\n generateId: generateId2 = originalGenerateId4,\n currentDate = () => /* @__PURE__ */ new Date(),\n now: now2 = now\n } = {},\n ...settings\n } = options;\n const enumValues = \"enum\" in options && options.enum ? options.enum : void 0;\n const {\n schema: inputSchema,\n schemaDescription,\n schemaName\n } = \"schema\" in options ? options : {};\n validateObjectGenerationInput({\n output,\n schema: inputSchema,\n schemaName,\n schemaDescription,\n enumValues\n });\n const outputStrategy = getOutputStrategy({\n output,\n schema: inputSchema,\n enumValues\n });\n return new DefaultStreamObjectResult({\n model,\n telemetry,\n headers,\n settings,\n maxRetries,\n abortSignal,\n outputStrategy,\n system,\n prompt,\n messages,\n allowSystemInMessages,\n schemaName,\n schemaDescription,\n providerOptions,\n repairText,\n onError,\n onFinish,\n download: download2,\n generateId: generateId2,\n currentDate,\n now: now2\n });\n}\nvar DefaultStreamObjectResult = class {\n constructor({\n model: modelArg,\n headers,\n telemetry,\n settings,\n maxRetries: maxRetriesArg,\n abortSignal,\n outputStrategy,\n system,\n prompt,\n messages,\n allowSystemInMessages,\n schemaName,\n schemaDescription,\n providerOptions,\n repairText,\n onError,\n onFinish,\n download: download2,\n generateId: generateId2,\n currentDate,\n now: now2\n }) {\n this._object = new DelayedPromise2();\n this._usage = new DelayedPromise2();\n this._providerMetadata = new DelayedPromise2();\n this._warnings = new DelayedPromise2();\n this._request = new DelayedPromise2();\n this._response = new DelayedPromise2();\n this._finishReason = new DelayedPromise2();\n const model = resolveLanguageModel(modelArg);\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const callSettings = prepareCallSettings(settings);\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { ...callSettings, maxRetries }\n });\n const tracer = getTracer(telemetry);\n const self = this;\n const stitchableStream = createStitchableStream();\n const eventProcessor = new TransformStream({\n transform(chunk, controller) {\n controller.enqueue(chunk);\n if (chunk.type === \"error\") {\n onError({ error: wrapGatewayError(chunk.error) });\n }\n }\n });\n this.baseStream = stitchableStream.stream.pipeThrough(eventProcessor);\n recordSpan({\n name: \"ai.streamObject\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.streamObject\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.prompt\": {\n input: () => JSON.stringify({ system, prompt, messages })\n },\n \"ai.schema\": {\n input: async () => JSON.stringify(await outputStrategy.jsonSchema())\n },\n \"ai.schema.name\": schemaName,\n \"ai.schema.description\": schemaDescription,\n \"ai.settings.output\": outputStrategy.type\n }\n }),\n tracer,\n endWhenDone: false,\n fn: async (rootSpan) => {\n const standardizedPrompt = await standardizePrompt({\n system,\n prompt,\n messages,\n allowSystemInMessages\n });\n const callOptions = {\n responseFormat: {\n type: \"json\",\n schema: await outputStrategy.jsonSchema(),\n name: schemaName,\n description: schemaDescription\n },\n ...prepareCallSettings(settings),\n prompt: await convertToLanguageModelPrompt({\n prompt: standardizedPrompt,\n supportedUrls: await model.supportedUrls,\n download: download2\n }),\n providerOptions,\n abortSignal,\n headers,\n includeRawChunks: false\n };\n const transformer = {\n transform: (chunk, controller) => {\n switch (chunk.type) {\n case \"text-delta\":\n controller.enqueue(chunk.delta);\n break;\n case \"response-metadata\":\n case \"finish\":\n case \"error\":\n case \"stream-start\":\n controller.enqueue(chunk);\n break;\n }\n }\n };\n const {\n result: { stream, response, request },\n doStreamSpan,\n startTimestampMs\n } = await retry(\n () => recordSpan({\n name: \"ai.streamObject.doStream\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.streamObject.doStream\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n \"ai.prompt.messages\": {\n input: () => stringifyForTelemetry(callOptions.prompt)\n },\n // standardized gen-ai llm span attributes:\n \"gen_ai.system\": model.provider,\n \"gen_ai.request.model\": model.modelId,\n \"gen_ai.request.frequency_penalty\": callSettings.frequencyPenalty,\n \"gen_ai.request.max_tokens\": callSettings.maxOutputTokens,\n \"gen_ai.request.presence_penalty\": callSettings.presencePenalty,\n \"gen_ai.request.temperature\": callSettings.temperature,\n \"gen_ai.request.top_k\": callSettings.topK,\n \"gen_ai.request.top_p\": callSettings.topP\n }\n }),\n tracer,\n endWhenDone: false,\n fn: async (doStreamSpan2) => ({\n startTimestampMs: now2(),\n doStreamSpan: doStreamSpan2,\n result: await model.doStream(callOptions)\n })\n })\n );\n self._request.resolve(request != null ? request : {});\n let warnings;\n let usage = createNullLanguageModelUsage();\n let finishReason;\n let providerMetadata;\n let object2;\n let error;\n let accumulatedText = \"\";\n let textDelta = \"\";\n let fullResponse = {\n id: generateId2(),\n timestamp: currentDate(),\n modelId: model.modelId\n };\n let latestObjectJson = void 0;\n let latestObject = void 0;\n let isFirstChunk = true;\n let isFirstDelta = true;\n const transformedStream = stream.pipeThrough(new TransformStream(transformer)).pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n var _a21, _b, _c;\n if (typeof chunk === \"object\" && chunk.type === \"stream-start\") {\n warnings = chunk.warnings;\n return;\n }\n if (isFirstChunk) {\n const msToFirstChunk = now2() - startTimestampMs;\n isFirstChunk = false;\n doStreamSpan.addEvent(\"ai.stream.firstChunk\", {\n \"ai.stream.msToFirstChunk\": msToFirstChunk\n });\n doStreamSpan.setAttributes({\n \"ai.stream.msToFirstChunk\": msToFirstChunk\n });\n }\n if (typeof chunk === \"string\") {\n accumulatedText += chunk;\n textDelta += chunk;\n const { value: currentObjectJson, state: parseState } = await parsePartialJson(accumulatedText);\n if (currentObjectJson !== void 0 && !isDeepEqualData(latestObjectJson, currentObjectJson)) {\n const validationResult = await outputStrategy.validatePartialResult({\n value: currentObjectJson,\n textDelta,\n latestObject,\n isFirstDelta,\n isFinalDelta: parseState === \"successful-parse\"\n });\n if (validationResult.success && !isDeepEqualData(\n latestObject,\n validationResult.value.partial\n )) {\n latestObjectJson = currentObjectJson;\n latestObject = validationResult.value.partial;\n controller.enqueue({\n type: \"object\",\n object: latestObject\n });\n controller.enqueue({\n type: \"text-delta\",\n textDelta: validationResult.value.textDelta\n });\n textDelta = \"\";\n isFirstDelta = false;\n }\n }\n return;\n }\n switch (chunk.type) {\n case \"response-metadata\": {\n fullResponse = {\n id: (_a21 = chunk.id) != null ? _a21 : fullResponse.id,\n timestamp: (_b = chunk.timestamp) != null ? _b : fullResponse.timestamp,\n modelId: (_c = chunk.modelId) != null ? _c : fullResponse.modelId\n };\n break;\n }\n case \"finish\": {\n if (textDelta !== \"\") {\n controller.enqueue({ type: \"text-delta\", textDelta });\n }\n finishReason = chunk.finishReason.unified;\n usage = asLanguageModelUsage(chunk.usage);\n providerMetadata = chunk.providerMetadata;\n controller.enqueue({\n ...chunk,\n finishReason: chunk.finishReason.unified,\n usage,\n response: fullResponse\n });\n logWarnings({\n warnings: warnings != null ? warnings : [],\n provider: model.provider,\n model: model.modelId\n });\n self._usage.resolve(usage);\n self._providerMetadata.resolve(providerMetadata);\n self._warnings.resolve(warnings);\n self._response.resolve({\n ...fullResponse,\n headers: response == null ? void 0 : response.headers\n });\n self._finishReason.resolve(finishReason != null ? finishReason : \"other\");\n try {\n object2 = await parseAndValidateObjectResultWithRepair(\n accumulatedText,\n outputStrategy,\n repairText,\n {\n response: fullResponse,\n usage,\n finishReason\n }\n );\n self._object.resolve(object2);\n } catch (e) {\n error = e;\n self._object.reject(e);\n }\n break;\n }\n default: {\n controller.enqueue(chunk);\n break;\n }\n }\n },\n // invoke onFinish callback and resolve toolResults promise when the stream is about to close:\n async flush(controller) {\n try {\n const finalUsage = usage != null ? usage : {\n promptTokens: NaN,\n completionTokens: NaN,\n totalTokens: NaN\n };\n doStreamSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": finishReason,\n \"ai.response.object\": {\n output: () => JSON.stringify(object2)\n },\n \"ai.response.id\": fullResponse.id,\n \"ai.response.model\": fullResponse.modelId,\n \"ai.response.timestamp\": fullResponse.timestamp.toISOString(),\n \"ai.response.providerMetadata\": JSON.stringify(providerMetadata),\n \"ai.usage.inputTokens\": finalUsage.inputTokens,\n \"ai.usage.outputTokens\": finalUsage.outputTokens,\n \"ai.usage.totalTokens\": finalUsage.totalTokens,\n \"ai.usage.reasoningTokens\": finalUsage.reasoningTokens,\n \"ai.usage.cachedInputTokens\": finalUsage.cachedInputTokens,\n // standardized gen-ai llm span attributes:\n \"gen_ai.response.finish_reasons\": [finishReason],\n \"gen_ai.response.id\": fullResponse.id,\n \"gen_ai.response.model\": fullResponse.modelId,\n \"gen_ai.usage.input_tokens\": finalUsage.inputTokens,\n \"gen_ai.usage.output_tokens\": finalUsage.outputTokens\n }\n })\n );\n doStreamSpan.end();\n rootSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.usage.inputTokens\": finalUsage.inputTokens,\n \"ai.usage.outputTokens\": finalUsage.outputTokens,\n \"ai.usage.totalTokens\": finalUsage.totalTokens,\n \"ai.usage.reasoningTokens\": finalUsage.reasoningTokens,\n \"ai.usage.cachedInputTokens\": finalUsage.cachedInputTokens,\n \"ai.response.object\": {\n output: () => JSON.stringify(object2)\n },\n \"ai.response.providerMetadata\": JSON.stringify(providerMetadata)\n }\n })\n );\n await (onFinish == null ? void 0 : onFinish({\n usage: finalUsage,\n object: object2,\n error,\n response: {\n ...fullResponse,\n headers: response == null ? void 0 : response.headers\n },\n warnings,\n providerMetadata\n }));\n } catch (error2) {\n controller.enqueue({ type: \"error\", error: error2 });\n } finally {\n rootSpan.end();\n }\n }\n })\n );\n stitchableStream.addStream(transformedStream);\n }\n }).catch((error) => {\n stitchableStream.addStream(\n new ReadableStream({\n start(controller) {\n controller.enqueue({ type: \"error\", error });\n controller.close();\n }\n })\n );\n }).finally(() => {\n stitchableStream.close();\n });\n this.outputStrategy = outputStrategy;\n }\n get object() {\n return this._object.promise;\n }\n get usage() {\n return this._usage.promise;\n }\n get providerMetadata() {\n return this._providerMetadata.promise;\n }\n get warnings() {\n return this._warnings.promise;\n }\n get request() {\n return this._request.promise;\n }\n get response() {\n return this._response.promise;\n }\n get finishReason() {\n return this._finishReason.promise;\n }\n get partialObjectStream() {\n return createAsyncIterableStream(\n this.baseStream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"object\":\n controller.enqueue(chunk.object);\n break;\n case \"text-delta\":\n case \"finish\":\n case \"error\":\n break;\n default: {\n const _exhaustiveCheck = chunk;\n throw new Error(`Unsupported chunk type: ${_exhaustiveCheck}`);\n }\n }\n }\n })\n )\n );\n }\n get elementStream() {\n return this.outputStrategy.createElementStream(this.baseStream);\n }\n get textStream() {\n return createAsyncIterableStream(\n this.baseStream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"text-delta\":\n controller.enqueue(chunk.textDelta);\n break;\n case \"object\":\n case \"finish\":\n case \"error\":\n break;\n default: {\n const _exhaustiveCheck = chunk;\n throw new Error(`Unsupported chunk type: ${_exhaustiveCheck}`);\n }\n }\n }\n })\n )\n );\n }\n get fullStream() {\n return createAsyncIterableStream(this.baseStream);\n }\n pipeTextStreamToResponse(response, init) {\n pipeTextStreamToResponse({\n response,\n textStream: this.textStream,\n ...init\n });\n }\n toTextStreamResponse(init) {\n return createTextStreamResponse({\n textStream: this.textStream,\n ...init\n });\n }\n};\n\n// src/generate-speech/generate-speech.ts\nimport {\n withUserAgentSuffix as withUserAgentSuffix7\n} from \"@ai-sdk/provider-utils\";\n\n// src/generate-speech/generated-audio-file.ts\nvar DefaultGeneratedAudioFile = class extends DefaultGeneratedFile {\n constructor({\n data,\n mediaType\n }) {\n super({ data, mediaType });\n let format = \"mp3\";\n if (mediaType) {\n const mediaTypeParts = mediaType.split(\"/\");\n if (mediaTypeParts.length === 2) {\n if (mediaType !== \"audio/mpeg\") {\n format = mediaTypeParts[1];\n }\n }\n }\n if (!format) {\n throw new Error(\n \"Audio format must be provided or determinable from media type\"\n );\n }\n this.format = format;\n }\n};\n\n// src/generate-speech/generate-speech.ts\nasync function generateSpeech({\n model,\n text: text2,\n voice,\n outputFormat,\n instructions,\n speed,\n language,\n providerOptions = {},\n maxRetries: maxRetriesArg,\n abortSignal,\n headers\n}) {\n var _a21;\n const resolvedModel = resolveSpeechModel(model);\n if (!resolvedModel) {\n throw new Error(\"Model could not be resolved\");\n }\n const headersWithUserAgent = withUserAgentSuffix7(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const result = await retry(\n () => resolvedModel.doGenerate({\n text: text2,\n voice,\n outputFormat,\n instructions,\n speed,\n language,\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions\n })\n );\n if (!result.audio || result.audio.length === 0) {\n throw new NoSpeechGeneratedError({ responses: [result.response] });\n }\n logWarnings({\n warnings: result.warnings,\n provider: resolvedModel.provider,\n model: resolvedModel.modelId\n });\n return new DefaultSpeechResult({\n audio: new DefaultGeneratedAudioFile({\n data: result.audio,\n mediaType: (_a21 = detectMediaType({\n data: result.audio,\n signatures: audioMediaTypeSignatures\n })) != null ? _a21 : \"audio/mp3\"\n }),\n warnings: result.warnings,\n responses: [result.response],\n providerMetadata: result.providerMetadata\n });\n}\nvar DefaultSpeechResult = class {\n constructor(options) {\n var _a21;\n this.audio = options.audio;\n this.warnings = options.warnings;\n this.responses = options.responses;\n this.providerMetadata = (_a21 = options.providerMetadata) != null ? _a21 : {};\n }\n};\n\n// src/generate-text/prune-messages.ts\nfunction pruneMessages({\n messages,\n reasoning = \"none\",\n toolCalls = [],\n emptyMessages = \"remove\"\n}) {\n if (reasoning === \"all\" || reasoning === \"before-last-message\") {\n messages = messages.map((message, messageIndex) => {\n if (message.role !== \"assistant\" || typeof message.content === \"string\" || reasoning === \"before-last-message\" && messageIndex === messages.length - 1) {\n return message;\n }\n return {\n ...message,\n content: message.content.filter((part) => part.type !== \"reasoning\")\n };\n });\n }\n if (toolCalls === \"none\") {\n toolCalls = [];\n } else if (toolCalls === \"all\") {\n toolCalls = [{ type: \"all\" }];\n } else if (toolCalls === \"before-last-message\") {\n toolCalls = [{ type: \"before-last-message\" }];\n } else if (typeof toolCalls === \"string\") {\n toolCalls = [{ type: toolCalls }];\n }\n for (const toolCall of toolCalls) {\n const keepLastMessagesCount = toolCall.type === \"all\" ? void 0 : toolCall.type === \"before-last-message\" ? 1 : Number(\n toolCall.type.slice(\"before-last-\".length).slice(0, -\"-messages\".length)\n );\n const keptToolCallIds = /* @__PURE__ */ new Set();\n const keptApprovalIds = /* @__PURE__ */ new Set();\n if (keepLastMessagesCount != null) {\n for (const message of messages.slice(-keepLastMessagesCount)) {\n if ((message.role === \"assistant\" || message.role === \"tool\") && typeof message.content !== \"string\") {\n for (const part of message.content) {\n if (part.type === \"tool-call\" || part.type === \"tool-result\") {\n keptToolCallIds.add(part.toolCallId);\n } else if (part.type === \"tool-approval-request\" || part.type === \"tool-approval-response\") {\n keptApprovalIds.add(part.approvalId);\n }\n }\n }\n }\n }\n messages = messages.map((message, messageIndex) => {\n if (message.role !== \"assistant\" && message.role !== \"tool\" || typeof message.content === \"string\" || keepLastMessagesCount && messageIndex >= messages.length - keepLastMessagesCount) {\n return message;\n }\n const toolCallIdToToolName = {};\n const approvalIdToToolName = {};\n return {\n ...message,\n content: message.content.filter((part) => {\n if (part.type !== \"tool-call\" && part.type !== \"tool-result\" && part.type !== \"tool-approval-request\" && part.type !== \"tool-approval-response\") {\n return true;\n }\n if (part.type === \"tool-call\") {\n toolCallIdToToolName[part.toolCallId] = part.toolName;\n } else if (part.type === \"tool-approval-request\") {\n approvalIdToToolName[part.approvalId] = toolCallIdToToolName[part.toolCallId];\n }\n if ((part.type === \"tool-call\" || part.type === \"tool-result\") && keptToolCallIds.has(part.toolCallId) || (part.type === \"tool-approval-request\" || part.type === \"tool-approval-response\") && keptApprovalIds.has(part.approvalId)) {\n return true;\n }\n return toolCall.tools != null && !toolCall.tools.includes(\n part.type === \"tool-call\" || part.type === \"tool-result\" ? part.toolName : approvalIdToToolName[part.approvalId]\n );\n })\n };\n });\n }\n if (emptyMessages === \"remove\") {\n messages = messages.filter((message) => message.content.length > 0);\n }\n return messages;\n}\n\n// src/generate-text/smooth-stream.ts\nimport { delay as originalDelay } from \"@ai-sdk/provider-utils\";\nimport {\n InvalidArgumentError as InvalidArgumentError2\n} from \"@ai-sdk/provider\";\nvar CHUNKING_REGEXPS = {\n word: /\\S+\\s+/m,\n line: /\\n+/m\n};\nfunction smoothStream({\n delayInMs = 10,\n chunking = \"word\",\n _internal: { delay: delay2 = originalDelay } = {}\n} = {}) {\n let detectChunk;\n if (chunking != null && typeof chunking === \"object\" && \"segment\" in chunking && typeof chunking.segment === \"function\") {\n const segmenter = chunking;\n detectChunk = (buffer) => {\n if (buffer.length === 0)\n return null;\n const iterator = segmenter.segment(buffer)[Symbol.iterator]();\n const first = iterator.next().value;\n return (first == null ? void 0 : first.segment) || null;\n };\n } else if (typeof chunking === \"function\") {\n detectChunk = (buffer) => {\n const match = chunking(buffer);\n if (match == null) {\n return null;\n }\n if (!match.length) {\n throw new Error(`Chunking function must return a non-empty string.`);\n }\n if (!buffer.startsWith(match)) {\n throw new Error(\n `Chunking function must return a match that is a prefix of the buffer. Received: \"${match}\" expected to start with \"${buffer}\"`\n );\n }\n return match;\n };\n } else {\n const chunkingRegex = typeof chunking === \"string\" ? CHUNKING_REGEXPS[chunking] : chunking instanceof RegExp ? chunking : void 0;\n if (chunkingRegex == null) {\n throw new InvalidArgumentError2({\n argument: \"chunking\",\n message: `Chunking must be \"word\", \"line\", a RegExp, an Intl.Segmenter, or a ChunkDetector function. Received: ${chunking}`\n });\n }\n detectChunk = (buffer) => {\n const match = chunkingRegex.exec(buffer);\n if (!match) {\n return null;\n }\n return buffer.slice(0, match.index) + (match == null ? void 0 : match[0]);\n };\n }\n return () => {\n let buffer = \"\";\n let id = \"\";\n let type = void 0;\n let providerMetadata = void 0;\n function flushBuffer(controller) {\n if (buffer.length > 0 && type !== void 0) {\n controller.enqueue({\n type,\n text: buffer,\n id,\n ...providerMetadata != null ? { providerMetadata } : {}\n });\n buffer = \"\";\n providerMetadata = void 0;\n }\n }\n return new TransformStream({\n async transform(chunk, controller) {\n if (chunk.type !== \"text-delta\" && chunk.type !== \"reasoning-delta\") {\n flushBuffer(controller);\n controller.enqueue(chunk);\n return;\n }\n if ((chunk.type !== type || chunk.id !== id) && buffer.length > 0) {\n flushBuffer(controller);\n }\n buffer += chunk.text;\n id = chunk.id;\n type = chunk.type;\n if (chunk.providerMetadata != null) {\n providerMetadata = chunk.providerMetadata;\n }\n let match;\n while ((match = detectChunk(buffer)) != null) {\n controller.enqueue({ type, text: match, id });\n buffer = buffer.slice(match.length);\n await delay2(delayInMs);\n }\n }\n });\n };\n}\n\n// src/generate-video/generate-video.ts\nimport {\n convertBase64ToUint8Array as convertBase64ToUint8Array5,\n withUserAgentSuffix as withUserAgentSuffix8\n} from \"@ai-sdk/provider-utils\";\nvar defaultDownload = createDownload();\nasync function experimental_generateVideo({\n model: modelArg,\n prompt: promptArg,\n n = 1,\n maxVideosPerCall,\n aspectRatio,\n resolution,\n duration,\n fps,\n seed,\n providerOptions,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n download: downloadFn = defaultDownload\n}) {\n var _a21;\n const model = resolveVideoModel(modelArg);\n const headersWithUserAgent = withUserAgentSuffix8(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const { prompt, image } = normalizePrompt2(promptArg);\n const maxVideosPerCallWithDefault = (_a21 = maxVideosPerCall != null ? maxVideosPerCall : await invokeModelMaxVideosPerCall(model)) != null ? _a21 : 1;\n const callCount = Math.ceil(n / maxVideosPerCallWithDefault);\n const callVideoCounts = Array.from({ length: callCount }, (_, index) => {\n const remaining = n - index * maxVideosPerCallWithDefault;\n return Math.min(remaining, maxVideosPerCallWithDefault);\n });\n const results = await Promise.all(\n callVideoCounts.map(\n async (callVideoCount) => retry(\n () => model.doGenerate({\n prompt,\n n: callVideoCount,\n aspectRatio,\n resolution,\n duration,\n fps,\n seed,\n image,\n providerOptions: providerOptions != null ? providerOptions : {},\n headers: headersWithUserAgent,\n abortSignal\n })\n )\n )\n );\n const videos = [];\n const warnings = [];\n const responses = [];\n const providerMetadata = {};\n for (const result of results) {\n for (const videoData of result.videos) {\n switch (videoData.type) {\n case \"url\": {\n const { data, mediaType: downloadedMediaType } = await downloadFn({\n url: new URL(videoData.url),\n abortSignal\n });\n const isUsableMediaType = (type) => !!type && type !== \"application/octet-stream\";\n const mediaType = isUsableMediaType(videoData.mediaType) && videoData.mediaType || isUsableMediaType(downloadedMediaType) && downloadedMediaType || detectMediaType({\n data,\n signatures: videoMediaTypeSignatures\n }) || \"video/mp4\";\n videos.push(\n new DefaultGeneratedFile({\n data,\n mediaType\n })\n );\n break;\n }\n case \"base64\": {\n videos.push(\n new DefaultGeneratedFile({\n data: videoData.data,\n mediaType: videoData.mediaType || \"video/mp4\"\n })\n );\n break;\n }\n case \"binary\": {\n const mediaType = videoData.mediaType || detectMediaType({\n data: videoData.data,\n signatures: videoMediaTypeSignatures\n }) || \"video/mp4\";\n videos.push(\n new DefaultGeneratedFile({\n data: videoData.data,\n mediaType\n })\n );\n break;\n }\n }\n }\n warnings.push(...result.warnings);\n responses.push({\n timestamp: result.response.timestamp,\n modelId: result.response.modelId,\n headers: result.response.headers,\n providerMetadata: result.providerMetadata\n });\n if (result.providerMetadata != null) {\n for (const [providerName, metadata] of Object.entries(\n result.providerMetadata\n )) {\n const existingMetadata = providerMetadata[providerName];\n if (existingMetadata != null && typeof existingMetadata === \"object\") {\n providerMetadata[providerName] = {\n ...existingMetadata,\n ...metadata\n };\n if (\"videos\" in existingMetadata && Array.isArray(existingMetadata.videos) && \"videos\" in metadata && Array.isArray(metadata.videos)) {\n providerMetadata[providerName].videos = [\n ...existingMetadata.videos,\n ...metadata.videos\n ];\n }\n } else {\n providerMetadata[providerName] = metadata;\n }\n }\n }\n }\n if (videos.length === 0) {\n throw new NoVideoGeneratedError({ responses });\n }\n if (warnings.length > 0) {\n logWarnings({\n warnings,\n provider: model.provider,\n model: model.modelId\n });\n }\n return {\n video: videos[0],\n videos,\n warnings,\n responses,\n providerMetadata\n };\n}\nfunction normalizePrompt2(promptArg) {\n var _a21, _b;\n if (typeof promptArg === \"string\") {\n return {\n prompt: promptArg,\n image: void 0\n };\n }\n let image;\n if (promptArg.image != null) {\n const dataContent = promptArg.image;\n if (typeof dataContent === \"string\") {\n if (dataContent.startsWith(\"http://\") || dataContent.startsWith(\"https://\")) {\n image = {\n type: \"url\",\n url: dataContent\n };\n } else if (dataContent.startsWith(\"data:\")) {\n const { mediaType, base64Content } = splitDataUrl(dataContent);\n image = {\n type: \"file\",\n mediaType: mediaType != null ? mediaType : \"image/png\",\n data: convertBase64ToUint8Array5(base64Content != null ? base64Content : \"\")\n };\n } else {\n const bytes = convertBase64ToUint8Array5(dataContent);\n const mediaType = (_a21 = detectMediaType({\n data: bytes,\n signatures: imageMediaTypeSignatures\n })) != null ? _a21 : \"image/png\";\n image = {\n type: \"file\",\n mediaType,\n data: bytes\n };\n }\n } else if (dataContent instanceof Uint8Array) {\n const mediaType = (_b = detectMediaType({\n data: dataContent,\n signatures: imageMediaTypeSignatures\n })) != null ? _b : \"image/png\";\n image = {\n type: \"file\",\n mediaType,\n data: dataContent\n };\n }\n }\n return {\n prompt: promptArg.text,\n image\n };\n}\nasync function invokeModelMaxVideosPerCall(model) {\n if (typeof model.maxVideosPerCall === \"function\") {\n return await model.maxVideosPerCall({ modelId: model.modelId });\n }\n return model.maxVideosPerCall;\n}\n\n// src/middleware/default-embedding-settings-middleware.ts\nfunction defaultEmbeddingSettingsMiddleware({\n settings\n}) {\n return {\n specificationVersion: \"v3\",\n transformParams: async ({ params }) => {\n return mergeObjects(settings, params);\n }\n };\n}\n\n// src/middleware/default-settings-middleware.ts\nfunction defaultSettingsMiddleware({\n settings\n}) {\n return {\n specificationVersion: \"v3\",\n transformParams: async ({ params }) => {\n return mergeObjects(settings, params);\n }\n };\n}\n\n// src/middleware/extract-json-middleware.ts\nfunction defaultTransform(text2) {\n return text2.replace(/^```(?:json)?\\s*\\n?/, \"\").replace(/\\n?```\\s*$/, \"\").trim();\n}\nfunction extractJsonMiddleware(options) {\n var _a21;\n const transform = (_a21 = options == null ? void 0 : options.transform) != null ? _a21 : defaultTransform;\n const hasCustomTransform = (options == null ? void 0 : options.transform) !== void 0;\n return {\n specificationVersion: \"v3\",\n wrapGenerate: async ({ doGenerate }) => {\n const { content, ...rest } = await doGenerate();\n const transformedContent = [];\n for (const part of content) {\n if (part.type !== \"text\") {\n transformedContent.push(part);\n continue;\n }\n transformedContent.push({\n ...part,\n text: transform(part.text)\n });\n }\n return { content: transformedContent, ...rest };\n },\n wrapStream: async ({ doStream }) => {\n const { stream, ...rest } = await doStream();\n const textBlocks = {};\n const SUFFIX_BUFFER_SIZE = 12;\n return {\n stream: stream.pipeThrough(\n new TransformStream({\n transform: (chunk, controller) => {\n if (chunk.type === \"text-start\") {\n textBlocks[chunk.id] = {\n startEvent: chunk,\n // Custom transforms need to buffer all content\n phase: hasCustomTransform ? \"buffering\" : \"prefix\",\n buffer: \"\",\n prefixStripped: false\n };\n return;\n }\n if (chunk.type === \"text-delta\") {\n const block = textBlocks[chunk.id];\n if (!block) {\n controller.enqueue(chunk);\n return;\n }\n block.buffer += chunk.delta;\n if (block.phase === \"buffering\") {\n return;\n }\n if (block.phase === \"prefix\") {\n if (block.buffer.length > 0 && !block.buffer.startsWith(\"`\")) {\n block.phase = \"streaming\";\n controller.enqueue(block.startEvent);\n } else if (block.buffer.startsWith(\"```\")) {\n if (block.buffer.includes(\"\\n\")) {\n const prefixMatch = block.buffer.match(/^```(?:json)?\\s*\\n/);\n if (prefixMatch) {\n block.buffer = block.buffer.slice(\n prefixMatch[0].length\n );\n block.prefixStripped = true;\n block.phase = \"streaming\";\n controller.enqueue(block.startEvent);\n } else {\n block.phase = \"streaming\";\n controller.enqueue(block.startEvent);\n }\n }\n } else if (block.buffer.length >= 3 && !block.buffer.startsWith(\"```\")) {\n block.phase = \"streaming\";\n controller.enqueue(block.startEvent);\n }\n }\n if (block.phase === \"streaming\" && block.buffer.length > SUFFIX_BUFFER_SIZE) {\n const toStream = block.buffer.slice(0, -SUFFIX_BUFFER_SIZE);\n block.buffer = block.buffer.slice(-SUFFIX_BUFFER_SIZE);\n controller.enqueue({\n type: \"text-delta\",\n id: chunk.id,\n delta: toStream\n });\n }\n return;\n }\n if (chunk.type === \"text-end\") {\n const block = textBlocks[chunk.id];\n if (block) {\n if (block.phase === \"prefix\" || block.phase === \"buffering\") {\n controller.enqueue(block.startEvent);\n }\n let remaining = block.buffer;\n if (block.phase === \"buffering\") {\n remaining = transform(remaining);\n } else if (block.prefixStripped) {\n remaining = remaining.replace(/\\n?```\\s*$/, \"\").trimEnd();\n } else {\n remaining = transform(remaining);\n }\n if (remaining.length > 0) {\n controller.enqueue({\n type: \"text-delta\",\n id: chunk.id,\n delta: remaining\n });\n }\n controller.enqueue(chunk);\n delete textBlocks[chunk.id];\n return;\n }\n }\n controller.enqueue(chunk);\n }\n })\n ),\n ...rest\n };\n }\n };\n}\n\n// src/util/get-potential-start-index.ts\nfunction getPotentialStartIndex(text2, searchedText) {\n if (searchedText.length === 0) {\n return null;\n }\n const directIndex = text2.indexOf(searchedText);\n if (directIndex !== -1) {\n return directIndex;\n }\n for (let i = text2.length - 1; i >= 0; i--) {\n const suffix = text2.substring(i);\n if (searchedText.startsWith(suffix)) {\n return i;\n }\n }\n return null;\n}\n\n// src/middleware/extract-reasoning-middleware.ts\nfunction extractReasoningMiddleware({\n tagName,\n separator = \"\\n\",\n startWithReasoning = false\n}) {\n const openingTag = `<${tagName}>`;\n const closingTag = `</${tagName}>`;\n return {\n specificationVersion: \"v3\",\n wrapGenerate: async ({ doGenerate }) => {\n const { content, ...rest } = await doGenerate();\n const transformedContent = [];\n for (const part of content) {\n if (part.type !== \"text\") {\n transformedContent.push(part);\n continue;\n }\n const text2 = startWithReasoning ? openingTag + part.text : part.text;\n const regexp = new RegExp(`${openingTag}(.*?)${closingTag}`, \"gs\");\n const matches = Array.from(text2.matchAll(regexp));\n if (!matches.length) {\n transformedContent.push(part);\n continue;\n }\n const reasoningText = matches.map((match) => match[1]).join(separator);\n let textWithoutReasoning = text2;\n for (let i = matches.length - 1; i >= 0; i--) {\n const match = matches[i];\n const beforeMatch = textWithoutReasoning.slice(0, match.index);\n const afterMatch = textWithoutReasoning.slice(\n match.index + match[0].length\n );\n textWithoutReasoning = beforeMatch + (beforeMatch.length > 0 && afterMatch.length > 0 ? separator : \"\") + afterMatch;\n }\n transformedContent.push({\n type: \"reasoning\",\n text: reasoningText\n });\n transformedContent.push({\n type: \"text\",\n text: textWithoutReasoning\n });\n }\n return { content: transformedContent, ...rest };\n },\n wrapStream: async ({ doStream }) => {\n const { stream, ...rest } = await doStream();\n const reasoningExtractions = {};\n let delayedTextStart;\n return {\n stream: stream.pipeThrough(\n new TransformStream({\n transform: (chunk, controller) => {\n if (chunk.type === \"text-start\") {\n delayedTextStart = chunk;\n return;\n }\n if (chunk.type === \"text-end\" && delayedTextStart) {\n controller.enqueue(delayedTextStart);\n delayedTextStart = void 0;\n }\n if (chunk.type !== \"text-delta\") {\n controller.enqueue(chunk);\n return;\n }\n if (reasoningExtractions[chunk.id] == null) {\n reasoningExtractions[chunk.id] = {\n isFirstReasoning: true,\n isFirstText: true,\n afterSwitch: false,\n isReasoning: startWithReasoning,\n buffer: \"\",\n idCounter: 0,\n textId: chunk.id\n };\n }\n const activeExtraction = reasoningExtractions[chunk.id];\n activeExtraction.buffer += chunk.delta;\n function publish(text2) {\n if (text2.length > 0) {\n const prefix = activeExtraction.afterSwitch && (activeExtraction.isReasoning ? !activeExtraction.isFirstReasoning : !activeExtraction.isFirstText) ? separator : \"\";\n if (activeExtraction.isReasoning && (activeExtraction.afterSwitch || activeExtraction.isFirstReasoning)) {\n controller.enqueue({\n type: \"reasoning-start\",\n id: `reasoning-${activeExtraction.idCounter}`\n });\n }\n if (activeExtraction.isReasoning) {\n controller.enqueue({\n type: \"reasoning-delta\",\n delta: prefix + text2,\n id: `reasoning-${activeExtraction.idCounter}`\n });\n } else {\n if (delayedTextStart) {\n controller.enqueue(delayedTextStart);\n delayedTextStart = void 0;\n }\n controller.enqueue({\n type: \"text-delta\",\n delta: prefix + text2,\n id: activeExtraction.textId\n });\n }\n activeExtraction.afterSwitch = false;\n if (activeExtraction.isReasoning) {\n activeExtraction.isFirstReasoning = false;\n } else {\n activeExtraction.isFirstText = false;\n }\n }\n }\n do {\n const nextTag = activeExtraction.isReasoning ? closingTag : openingTag;\n const startIndex = getPotentialStartIndex(\n activeExtraction.buffer,\n nextTag\n );\n if (startIndex == null) {\n publish(activeExtraction.buffer);\n activeExtraction.buffer = \"\";\n break;\n }\n publish(activeExtraction.buffer.slice(0, startIndex));\n const foundFullMatch = startIndex + nextTag.length <= activeExtraction.buffer.length;\n if (foundFullMatch) {\n activeExtraction.buffer = activeExtraction.buffer.slice(\n startIndex + nextTag.length\n );\n if (activeExtraction.isReasoning) {\n if (activeExtraction.isFirstReasoning) {\n controller.enqueue({\n type: \"reasoning-start\",\n id: `reasoning-${activeExtraction.idCounter}`\n });\n }\n controller.enqueue({\n type: \"reasoning-end\",\n id: `reasoning-${activeExtraction.idCounter++}`\n });\n }\n activeExtraction.isReasoning = !activeExtraction.isReasoning;\n activeExtraction.afterSwitch = true;\n } else {\n activeExtraction.buffer = activeExtraction.buffer.slice(startIndex);\n break;\n }\n } while (true);\n }\n })\n ),\n ...rest\n };\n }\n };\n}\n\n// src/middleware/simulate-streaming-middleware.ts\nfunction simulateStreamingMiddleware() {\n return {\n specificationVersion: \"v3\",\n wrapStream: async ({ doGenerate }) => {\n const result = await doGenerate();\n let id = 0;\n const simulatedStream = new ReadableStream({\n start(controller) {\n controller.enqueue({\n type: \"stream-start\",\n warnings: result.warnings\n });\n controller.enqueue({ type: \"response-metadata\", ...result.response });\n for (const part of result.content) {\n switch (part.type) {\n case \"text\": {\n if (part.text.length > 0) {\n controller.enqueue({ type: \"text-start\", id: String(id) });\n controller.enqueue({\n type: \"text-delta\",\n id: String(id),\n delta: part.text\n });\n controller.enqueue({ type: \"text-end\", id: String(id) });\n id++;\n }\n break;\n }\n case \"reasoning\": {\n controller.enqueue({\n type: \"reasoning-start\",\n id: String(id),\n providerMetadata: part.providerMetadata\n });\n controller.enqueue({\n type: \"reasoning-delta\",\n id: String(id),\n delta: part.text\n });\n controller.enqueue({ type: \"reasoning-end\", id: String(id) });\n id++;\n break;\n }\n default: {\n controller.enqueue(part);\n break;\n }\n }\n }\n controller.enqueue({\n type: \"finish\",\n finishReason: result.finishReason,\n usage: result.usage,\n providerMetadata: result.providerMetadata\n });\n controller.close();\n }\n });\n return {\n stream: simulatedStream,\n request: result.request,\n response: result.response\n };\n }\n };\n}\n\n// src/middleware/add-tool-input-examples-middleware.ts\nfunction defaultFormatExample(example) {\n return JSON.stringify(example.input);\n}\nfunction addToolInputExamplesMiddleware({\n prefix = \"Input Examples:\",\n format = defaultFormatExample,\n remove = true\n} = {}) {\n return {\n specificationVersion: \"v3\",\n transformParams: async ({ params }) => {\n var _a21;\n if (!((_a21 = params.tools) == null ? void 0 : _a21.length)) {\n return params;\n }\n const transformedTools = params.tools.map((tool2) => {\n var _a22;\n if (tool2.type !== \"function\" || !((_a22 = tool2.inputExamples) == null ? void 0 : _a22.length)) {\n return tool2;\n }\n const formattedExamples = tool2.inputExamples.map((example, index) => format(example, index)).join(\"\\n\");\n const examplesSection = `${prefix}\n${formattedExamples}`;\n const toolDescription = tool2.description ? `${tool2.description}\n\n${examplesSection}` : examplesSection;\n return {\n ...tool2,\n description: toolDescription,\n inputExamples: remove ? void 0 : tool2.inputExamples\n };\n });\n return {\n ...params,\n tools: transformedTools\n };\n }\n };\n}\n\n// src/middleware/wrap-language-model.ts\nvar wrapLanguageModel = ({\n model,\n middleware: middlewareArg,\n modelId,\n providerId\n}) => {\n return [...asArray(middlewareArg)].reverse().reduce((wrappedModel, middleware) => {\n return doWrap({ model: wrappedModel, middleware, modelId, providerId });\n }, model);\n};\nvar doWrap = ({\n model,\n middleware: {\n transformParams,\n wrapGenerate,\n wrapStream,\n overrideProvider,\n overrideModelId,\n overrideSupportedUrls\n },\n modelId,\n providerId\n}) => {\n var _a21, _b, _c;\n async function doTransform({\n params,\n type\n }) {\n return transformParams ? await transformParams({ params, type, model }) : params;\n }\n return {\n specificationVersion: \"v3\",\n provider: (_a21 = providerId != null ? providerId : overrideProvider == null ? void 0 : overrideProvider({ model })) != null ? _a21 : model.provider,\n modelId: (_b = modelId != null ? modelId : overrideModelId == null ? void 0 : overrideModelId({ model })) != null ? _b : model.modelId,\n supportedUrls: (_c = overrideSupportedUrls == null ? void 0 : overrideSupportedUrls({ model })) != null ? _c : model.supportedUrls,\n async doGenerate(params) {\n const transformedParams = await doTransform({ params, type: \"generate\" });\n const doGenerate = async () => model.doGenerate(transformedParams);\n const doStream = async () => model.doStream(transformedParams);\n return wrapGenerate ? wrapGenerate({\n doGenerate,\n doStream,\n params: transformedParams,\n model\n }) : doGenerate();\n },\n async doStream(params) {\n const transformedParams = await doTransform({ params, type: \"stream\" });\n const doGenerate = async () => model.doGenerate(transformedParams);\n const doStream = async () => model.doStream(transformedParams);\n return wrapStream ? wrapStream({ doGenerate, doStream, params: transformedParams, model }) : doStream();\n }\n };\n};\n\n// src/middleware/wrap-embedding-model.ts\nvar wrapEmbeddingModel = ({\n model,\n middleware: middlewareArg,\n modelId,\n providerId\n}) => {\n return [...asArray(middlewareArg)].reverse().reduce((wrappedModel, middleware) => {\n return doWrap2({ model: wrappedModel, middleware, modelId, providerId });\n }, model);\n};\nvar doWrap2 = ({\n model,\n middleware: {\n transformParams,\n wrapEmbed,\n overrideProvider,\n overrideModelId,\n overrideMaxEmbeddingsPerCall,\n overrideSupportsParallelCalls\n },\n modelId,\n providerId\n}) => {\n var _a21, _b, _c, _d;\n async function doTransform({\n params\n }) {\n return transformParams ? await transformParams({ params, model }) : params;\n }\n return {\n specificationVersion: \"v3\",\n provider: (_a21 = providerId != null ? providerId : overrideProvider == null ? void 0 : overrideProvider({ model })) != null ? _a21 : model.provider,\n modelId: (_b = modelId != null ? modelId : overrideModelId == null ? void 0 : overrideModelId({ model })) != null ? _b : model.modelId,\n maxEmbeddingsPerCall: (_c = overrideMaxEmbeddingsPerCall == null ? void 0 : overrideMaxEmbeddingsPerCall({ model })) != null ? _c : model.maxEmbeddingsPerCall,\n supportsParallelCalls: (_d = overrideSupportsParallelCalls == null ? void 0 : overrideSupportsParallelCalls({ model })) != null ? _d : model.supportsParallelCalls,\n async doEmbed(params) {\n const transformedParams = await doTransform({ params });\n const doEmbed = async () => model.doEmbed(transformedParams);\n return wrapEmbed ? wrapEmbed({\n doEmbed,\n params: transformedParams,\n model\n }) : doEmbed();\n }\n };\n};\n\n// src/middleware/wrap-image-model.ts\nvar wrapImageModel = ({\n model,\n middleware: middlewareArg,\n modelId,\n providerId\n}) => {\n return [...asArray(middlewareArg)].reverse().reduce((wrappedModel, middleware) => {\n return doWrap3({ model: wrappedModel, middleware, modelId, providerId });\n }, model);\n};\nvar doWrap3 = ({\n model,\n middleware: {\n transformParams,\n wrapGenerate,\n overrideProvider,\n overrideModelId,\n overrideMaxImagesPerCall\n },\n modelId,\n providerId\n}) => {\n var _a21, _b, _c;\n async function doTransform({ params }) {\n return transformParams ? await transformParams({ params, model }) : params;\n }\n const maxImagesPerCallRaw = (_a21 = overrideMaxImagesPerCall == null ? void 0 : overrideMaxImagesPerCall({ model })) != null ? _a21 : model.maxImagesPerCall;\n const maxImagesPerCall = maxImagesPerCallRaw instanceof Function ? maxImagesPerCallRaw.bind(model) : maxImagesPerCallRaw;\n return {\n specificationVersion: \"v3\",\n provider: (_b = providerId != null ? providerId : overrideProvider == null ? void 0 : overrideProvider({ model })) != null ? _b : model.provider,\n modelId: (_c = modelId != null ? modelId : overrideModelId == null ? void 0 : overrideModelId({ model })) != null ? _c : model.modelId,\n maxImagesPerCall,\n async doGenerate(params) {\n const transformedParams = await doTransform({ params });\n const doGenerate = async () => model.doGenerate(transformedParams);\n return wrapGenerate ? wrapGenerate({\n doGenerate,\n params: transformedParams,\n model\n }) : doGenerate();\n }\n };\n};\n\n// src/model/as-provider-v3.ts\nfunction asProviderV3(provider) {\n if (\"specificationVersion\" in provider && provider.specificationVersion === \"v3\") {\n return provider;\n }\n const v2Provider = provider;\n return {\n specificationVersion: \"v3\",\n languageModel: (modelId) => asLanguageModelV3(v2Provider.languageModel(modelId)),\n embeddingModel: (modelId) => asEmbeddingModelV3(v2Provider.textEmbeddingModel(modelId)),\n imageModel: (modelId) => asImageModelV3(v2Provider.imageModel(modelId)),\n transcriptionModel: v2Provider.transcriptionModel ? (modelId) => asTranscriptionModelV3(v2Provider.transcriptionModel(modelId)) : void 0,\n speechModel: v2Provider.speechModel ? (modelId) => asSpeechModelV3(v2Provider.speechModel(modelId)) : void 0,\n rerankingModel: void 0\n // v2 providers don't have reranking models\n };\n}\n\n// src/middleware/wrap-provider.ts\nfunction wrapProvider({\n provider,\n languageModelMiddleware,\n imageModelMiddleware\n}) {\n const providerV3 = asProviderV3(provider);\n return {\n specificationVersion: \"v3\",\n languageModel: (modelId) => wrapLanguageModel({\n model: providerV3.languageModel(modelId),\n middleware: languageModelMiddleware\n }),\n embeddingModel: providerV3.embeddingModel,\n imageModel: (modelId) => {\n let model = providerV3.imageModel(modelId);\n if (imageModelMiddleware != null) {\n model = wrapImageModel({ model, middleware: imageModelMiddleware });\n }\n return model;\n },\n transcriptionModel: providerV3.transcriptionModel,\n speechModel: providerV3.speechModel,\n rerankingModel: providerV3.rerankingModel\n };\n}\n\n// src/registry/custom-provider.ts\nimport {\n NoSuchModelError as NoSuchModelError2\n} from \"@ai-sdk/provider\";\nfunction customProvider({\n languageModels,\n embeddingModels,\n imageModels,\n transcriptionModels,\n speechModels,\n rerankingModels,\n videoModels,\n fallbackProvider: fallbackProviderArg\n}) {\n const fallbackProvider = fallbackProviderArg ? asProviderV3(fallbackProviderArg) : void 0;\n return {\n specificationVersion: \"v3\",\n languageModel(modelId) {\n if (languageModels != null && modelId in languageModels) {\n return languageModels[modelId];\n }\n if (fallbackProvider) {\n return fallbackProvider.languageModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"languageModel\" });\n },\n embeddingModel(modelId) {\n if (embeddingModels != null && modelId in embeddingModels) {\n return embeddingModels[modelId];\n }\n if (fallbackProvider) {\n return fallbackProvider.embeddingModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"embeddingModel\" });\n },\n imageModel(modelId) {\n if (imageModels != null && modelId in imageModels) {\n return imageModels[modelId];\n }\n if (fallbackProvider == null ? void 0 : fallbackProvider.imageModel) {\n return fallbackProvider.imageModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"imageModel\" });\n },\n transcriptionModel(modelId) {\n if (transcriptionModels != null && modelId in transcriptionModels) {\n return transcriptionModels[modelId];\n }\n if (fallbackProvider == null ? void 0 : fallbackProvider.transcriptionModel) {\n return fallbackProvider.transcriptionModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"transcriptionModel\" });\n },\n speechModel(modelId) {\n if (speechModels != null && modelId in speechModels) {\n return speechModels[modelId];\n }\n if (fallbackProvider == null ? void 0 : fallbackProvider.speechModel) {\n return fallbackProvider.speechModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"speechModel\" });\n },\n rerankingModel(modelId) {\n if (rerankingModels != null && modelId in rerankingModels) {\n return rerankingModels[modelId];\n }\n if (fallbackProvider == null ? void 0 : fallbackProvider.rerankingModel) {\n return fallbackProvider.rerankingModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"rerankingModel\" });\n },\n videoModel(modelId) {\n if (videoModels != null && modelId in videoModels) {\n return videoModels[modelId];\n }\n const videoModel = fallbackProvider == null ? void 0 : fallbackProvider.videoModel;\n if (videoModel) {\n return videoModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"videoModel\" });\n }\n };\n}\nvar experimental_customProvider = customProvider;\n\n// src/registry/no-such-provider-error.ts\nimport { AISDKError as AISDKError24, NoSuchModelError as NoSuchModelError3 } from \"@ai-sdk/provider\";\nvar name20 = \"AI_NoSuchProviderError\";\nvar marker20 = `vercel.ai.error.${name20}`;\nvar symbol20 = Symbol.for(marker20);\nvar _a20;\nvar NoSuchProviderError = class extends NoSuchModelError3 {\n constructor({\n modelId,\n modelType,\n providerId,\n availableProviders,\n message = `No such provider: ${providerId} (available providers: ${availableProviders.join()})`\n }) {\n super({ errorName: name20, modelId, modelType, message });\n this[_a20] = true;\n this.providerId = providerId;\n this.availableProviders = availableProviders;\n }\n static isInstance(error) {\n return AISDKError24.hasMarker(error, marker20);\n }\n};\n_a20 = symbol20;\n\n// src/registry/provider-registry.ts\nimport {\n NoSuchModelError as NoSuchModelError4\n} from \"@ai-sdk/provider\";\nfunction createProviderRegistry(providers, {\n separator = \":\",\n languageModelMiddleware,\n imageModelMiddleware\n} = {}) {\n const registry = new DefaultProviderRegistry({\n separator,\n languageModelMiddleware,\n imageModelMiddleware\n });\n for (const [id, provider] of Object.entries(providers)) {\n registry.registerProvider({ id, provider });\n }\n return registry;\n}\nvar experimental_createProviderRegistry = createProviderRegistry;\nvar DefaultProviderRegistry = class {\n constructor({\n separator,\n languageModelMiddleware,\n imageModelMiddleware\n }) {\n this.providers = {};\n this.separator = separator;\n this.languageModelMiddleware = languageModelMiddleware;\n this.imageModelMiddleware = imageModelMiddleware;\n }\n registerProvider({\n id,\n provider\n }) {\n this.providers[id] = provider;\n }\n getProvider(id, modelType) {\n const provider = this.providers[id];\n if (provider == null) {\n throw new NoSuchProviderError({\n modelId: id,\n modelType,\n providerId: id,\n availableProviders: Object.keys(this.providers)\n });\n }\n return provider;\n }\n splitId(id, modelType) {\n const index = id.indexOf(this.separator);\n if (index === -1) {\n throw new NoSuchModelError4({\n modelId: id,\n modelType,\n message: `Invalid ${modelType} id for registry: ${id} (must be in the format \"providerId${this.separator}modelId\")`\n });\n }\n return [id.slice(0, index), id.slice(index + this.separator.length)];\n }\n languageModel(id) {\n var _a21, _b;\n const [providerId, modelId] = this.splitId(id, \"languageModel\");\n let model = (_b = (_a21 = this.getProvider(providerId, \"languageModel\")).languageModel) == null ? void 0 : _b.call(\n _a21,\n modelId\n );\n if (model == null) {\n throw new NoSuchModelError4({ modelId: id, modelType: \"languageModel\" });\n }\n if (this.languageModelMiddleware != null) {\n model = wrapLanguageModel({\n model,\n middleware: this.languageModelMiddleware\n });\n }\n return model;\n }\n embeddingModel(id) {\n var _a21;\n const [providerId, modelId] = this.splitId(id, \"embeddingModel\");\n const provider = this.getProvider(providerId, \"embeddingModel\");\n const model = (_a21 = provider.embeddingModel) == null ? void 0 : _a21.call(provider, modelId);\n if (model == null) {\n throw new NoSuchModelError4({\n modelId: id,\n modelType: \"embeddingModel\"\n });\n }\n return model;\n }\n imageModel(id) {\n var _a21;\n const [providerId, modelId] = this.splitId(id, \"imageModel\");\n const provider = this.getProvider(providerId, \"imageModel\");\n let model = (_a21 = provider.imageModel) == null ? void 0 : _a21.call(provider, modelId);\n if (model == null) {\n throw new NoSuchModelError4({ modelId: id, modelType: \"imageModel\" });\n }\n if (this.imageModelMiddleware != null) {\n model = wrapImageModel({\n model,\n middleware: this.imageModelMiddleware\n });\n }\n return model;\n }\n transcriptionModel(id) {\n var _a21;\n const [providerId, modelId] = this.splitId(id, \"transcriptionModel\");\n const provider = this.getProvider(providerId, \"transcriptionModel\");\n const model = (_a21 = provider.transcriptionModel) == null ? void 0 : _a21.call(provider, modelId);\n if (model == null) {\n throw new NoSuchModelError4({\n modelId: id,\n modelType: \"transcriptionModel\"\n });\n }\n return model;\n }\n speechModel(id) {\n var _a21;\n const [providerId, modelId] = this.splitId(id, \"speechModel\");\n const provider = this.getProvider(providerId, \"speechModel\");\n const model = (_a21 = provider.speechModel) == null ? void 0 : _a21.call(provider, modelId);\n if (model == null) {\n throw new NoSuchModelError4({ modelId: id, modelType: \"speechModel\" });\n }\n return model;\n }\n rerankingModel(id) {\n var _a21;\n const [providerId, modelId] = this.splitId(id, \"rerankingModel\");\n const provider = this.getProvider(providerId, \"rerankingModel\");\n const model = (_a21 = provider.rerankingModel) == null ? void 0 : _a21.call(provider, modelId);\n if (model == null) {\n throw new NoSuchModelError4({ modelId: id, modelType: \"rerankingModel\" });\n }\n return model;\n }\n};\n\n// src/rerank/rerank.ts\nasync function rerank({\n model: modelArg,\n documents,\n query,\n topN,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n providerOptions,\n experimental_telemetry: telemetry\n}) {\n const model = resolveRerankingModel(modelArg);\n if (documents.length === 0) {\n return new DefaultRerankResult({\n originalDocuments: [],\n ranking: [],\n providerMetadata: void 0,\n response: {\n timestamp: /* @__PURE__ */ new Date(),\n modelId: model.modelId\n }\n });\n }\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const documentsToSend = typeof documents[0] === \"string\" ? { type: \"text\", values: documents } : { type: \"object\", values: documents };\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { maxRetries }\n });\n const tracer = getTracer(telemetry);\n return recordSpan({\n name: \"ai.rerank\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: \"ai.rerank\", telemetry }),\n ...baseTelemetryAttributes,\n \"ai.documents\": {\n input: () => documents.map((document) => JSON.stringify(document))\n }\n }\n }),\n tracer,\n fn: async () => {\n var _a21, _b;\n const { ranking, response, providerMetadata, warnings } = await retry(\n () => recordSpan({\n name: \"ai.rerank.doRerank\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.rerank.doRerank\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.documents\": {\n input: () => documents.map((document) => JSON.stringify(document))\n }\n }\n }),\n tracer,\n fn: async (doRerankSpan) => {\n const modelResponse = await model.doRerank({\n documents: documentsToSend,\n query,\n topN,\n providerOptions,\n abortSignal,\n headers\n });\n const ranking2 = modelResponse.ranking;\n doRerankSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.ranking.type\": documentsToSend.type,\n \"ai.ranking\": {\n output: () => ranking2.map((ranking3) => JSON.stringify(ranking3))\n }\n }\n })\n );\n return {\n ranking: ranking2,\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response,\n warnings: modelResponse.warnings\n };\n }\n })\n );\n logWarnings({\n warnings: warnings != null ? warnings : [],\n provider: model.provider,\n model: model.modelId\n });\n return new DefaultRerankResult({\n originalDocuments: documents,\n ranking: ranking.map((ranking2) => ({\n originalIndex: ranking2.index,\n score: ranking2.relevanceScore,\n document: documents[ranking2.index]\n })),\n providerMetadata,\n response: {\n id: response == null ? void 0 : response.id,\n timestamp: (_a21 = response == null ? void 0 : response.timestamp) != null ? _a21 : /* @__PURE__ */ new Date(),\n modelId: (_b = response == null ? void 0 : response.modelId) != null ? _b : model.modelId,\n headers: response == null ? void 0 : response.headers,\n body: response == null ? void 0 : response.body\n }\n });\n }\n });\n}\nvar DefaultRerankResult = class {\n constructor(options) {\n this.originalDocuments = options.originalDocuments;\n this.ranking = options.ranking;\n this.response = options.response;\n this.providerMetadata = options.providerMetadata;\n }\n get rerankedDocuments() {\n return this.ranking.map((ranking) => ranking.document);\n }\n};\n\n// src/transcribe/transcribe.ts\nimport {\n withUserAgentSuffix as withUserAgentSuffix9\n} from \"@ai-sdk/provider-utils\";\nvar defaultDownload2 = createDownload();\nasync function transcribe({\n model,\n audio,\n providerOptions = {},\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n download: downloadFn = defaultDownload2\n}) {\n const resolvedModel = resolveTranscriptionModel(model);\n if (!resolvedModel) {\n throw new Error(\"Model could not be resolved\");\n }\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const headersWithUserAgent = withUserAgentSuffix9(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const audioData = audio instanceof URL ? (await downloadFn({ url: audio, abortSignal })).data : convertDataContentToUint8Array(audio);\n const result = await retry(\n () => {\n var _a21;\n return resolvedModel.doGenerate({\n audio: audioData,\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions,\n mediaType: (_a21 = detectMediaType({\n data: audioData,\n signatures: audioMediaTypeSignatures\n })) != null ? _a21 : \"audio/wav\"\n });\n }\n );\n logWarnings({\n warnings: result.warnings,\n provider: resolvedModel.provider,\n model: resolvedModel.modelId\n });\n if (!result.text) {\n throw new NoTranscriptGeneratedError({ responses: [result.response] });\n }\n return new DefaultTranscriptionResult({\n text: result.text,\n segments: result.segments,\n language: result.language,\n durationInSeconds: result.durationInSeconds,\n warnings: result.warnings,\n responses: [result.response],\n providerMetadata: result.providerMetadata\n });\n}\nvar DefaultTranscriptionResult = class {\n constructor(options) {\n var _a21;\n this.text = options.text;\n this.segments = options.segments;\n this.language = options.language;\n this.durationInSeconds = options.durationInSeconds;\n this.warnings = options.warnings;\n this.responses = options.responses;\n this.providerMetadata = (_a21 = options.providerMetadata) != null ? _a21 : {};\n }\n};\n\n// src/ui/call-completion-api.ts\nimport {\n parseJsonEventStream,\n withUserAgentSuffix as withUserAgentSuffix10,\n getRuntimeEnvironmentUserAgent as getRuntimeEnvironmentUserAgent2\n} from \"@ai-sdk/provider-utils\";\n\n// src/ui/process-text-stream.ts\nasync function processTextStream({\n stream,\n onTextPart\n}) {\n const reader = stream.pipeThrough(new TextDecoderStream()).getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n await onTextPart(value);\n }\n}\n\n// src/ui/call-completion-api.ts\nvar getOriginalFetch = () => fetch;\nasync function callCompletionApi({\n api,\n prompt,\n credentials,\n headers,\n body,\n streamProtocol = \"data\",\n setCompletion,\n setLoading,\n setError,\n setAbortController,\n onFinish,\n onError,\n fetch: fetch2 = getOriginalFetch()\n}) {\n var _a21;\n try {\n setLoading(true);\n setError(void 0);\n const abortController = new AbortController();\n setAbortController(abortController);\n setCompletion(\"\");\n const response = await fetch2(api, {\n method: \"POST\",\n body: JSON.stringify({\n prompt,\n ...body\n }),\n credentials,\n headers: withUserAgentSuffix10(\n {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n `ai-sdk/${VERSION}`,\n getRuntimeEnvironmentUserAgent2()\n ),\n signal: abortController.signal\n }).catch((err) => {\n throw err;\n });\n if (!response.ok) {\n throw new Error(\n (_a21 = await response.text()) != null ? _a21 : \"Failed to fetch the chat response.\"\n );\n }\n if (!response.body) {\n throw new Error(\"The response body is empty.\");\n }\n let result = \"\";\n switch (streamProtocol) {\n case \"text\": {\n await processTextStream({\n stream: response.body,\n onTextPart: (chunk) => {\n result += chunk;\n setCompletion(result);\n }\n });\n break;\n }\n case \"data\": {\n await consumeStream({\n stream: parseJsonEventStream({\n stream: response.body,\n schema: uiMessageChunkSchema\n }).pipeThrough(\n new TransformStream({\n async transform(part) {\n if (!part.success) {\n throw part.error;\n }\n const streamPart = part.value;\n if (streamPart.type === \"text-delta\") {\n result += streamPart.delta;\n setCompletion(result);\n } else if (streamPart.type === \"error\") {\n throw new Error(streamPart.errorText);\n }\n }\n })\n ),\n onError: (error) => {\n throw error;\n }\n });\n break;\n }\n default: {\n const exhaustiveCheck = streamProtocol;\n throw new Error(`Unknown stream protocol: ${exhaustiveCheck}`);\n }\n }\n if (onFinish) {\n onFinish(prompt, result);\n }\n setAbortController(null);\n return result;\n } catch (err) {\n if (err.name === \"AbortError\") {\n setAbortController(null);\n return null;\n }\n if (err instanceof Error) {\n if (onError) {\n onError(err);\n }\n }\n setError(err);\n } finally {\n setLoading(false);\n }\n}\n\n// src/ui/chat.ts\nimport {\n generateId as generateIdFunc2\n} from \"@ai-sdk/provider-utils\";\n\n// src/ui/convert-file-list-to-file-ui-parts.ts\nasync function convertFileListToFileUIParts(files) {\n if (files == null) {\n return [];\n }\n if (!globalThis.FileList || !(files instanceof globalThis.FileList)) {\n throw new Error(\"FileList is not supported in the current environment\");\n }\n return Promise.all(\n Array.from(files).map(async (file) => {\n const { name: name21, type } = file;\n const dataUrl = await new Promise((resolve3, reject) => {\n const reader = new FileReader();\n reader.onload = (readerEvent) => {\n var _a21;\n resolve3((_a21 = readerEvent.target) == null ? void 0 : _a21.result);\n };\n reader.onerror = (error) => reject(error);\n reader.readAsDataURL(file);\n });\n return {\n type: \"file\",\n mediaType: type,\n filename: name21,\n url: dataUrl\n };\n })\n );\n}\n\n// src/ui/default-chat-transport.ts\nimport { parseJsonEventStream as parseJsonEventStream2 } from \"@ai-sdk/provider-utils\";\n\n// src/ui/http-chat-transport.ts\nimport {\n normalizeHeaders,\n resolve as resolve2\n} from \"@ai-sdk/provider-utils\";\nvar HttpChatTransport = class {\n constructor({\n api = \"/api/chat\",\n credentials,\n headers,\n body,\n fetch: fetch2,\n prepareSendMessagesRequest,\n prepareReconnectToStreamRequest\n }) {\n this.api = api;\n this.credentials = credentials;\n this.headers = headers;\n this.body = body;\n this.fetch = fetch2;\n this.prepareSendMessagesRequest = prepareSendMessagesRequest;\n this.prepareReconnectToStreamRequest = prepareReconnectToStreamRequest;\n }\n async sendMessages({\n abortSignal,\n ...options\n }) {\n var _a21, _b, _c, _d, _e;\n const resolvedBody = await resolve2(this.body);\n const resolvedHeaders = await resolve2(this.headers);\n const resolvedCredentials = await resolve2(this.credentials);\n const baseHeaders = {\n ...normalizeHeaders(resolvedHeaders),\n ...normalizeHeaders(options.headers)\n };\n const preparedRequest = await ((_a21 = this.prepareSendMessagesRequest) == null ? void 0 : _a21.call(this, {\n api: this.api,\n id: options.chatId,\n messages: options.messages,\n body: { ...resolvedBody, ...options.body },\n headers: baseHeaders,\n credentials: resolvedCredentials,\n requestMetadata: options.metadata,\n trigger: options.trigger,\n messageId: options.messageId\n }));\n const api = (_b = preparedRequest == null ? void 0 : preparedRequest.api) != null ? _b : this.api;\n const headers = (preparedRequest == null ? void 0 : preparedRequest.headers) !== void 0 ? normalizeHeaders(preparedRequest.headers) : baseHeaders;\n const body = (preparedRequest == null ? void 0 : preparedRequest.body) !== void 0 ? preparedRequest.body : {\n ...resolvedBody,\n ...options.body,\n id: options.chatId,\n messages: options.messages,\n trigger: options.trigger,\n messageId: options.messageId\n };\n const credentials = (_c = preparedRequest == null ? void 0 : preparedRequest.credentials) != null ? _c : resolvedCredentials;\n const fetch2 = (_d = this.fetch) != null ? _d : globalThis.fetch;\n const response = await fetch2(api, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n body: JSON.stringify(body),\n credentials,\n signal: abortSignal\n });\n if (!response.ok) {\n throw new Error(\n (_e = await response.text()) != null ? _e : \"Failed to fetch the chat response.\"\n );\n }\n if (!response.body) {\n throw new Error(\"The response body is empty.\");\n }\n return this.processResponseStream(response.body);\n }\n async reconnectToStream(options) {\n var _a21, _b, _c, _d, _e;\n const resolvedBody = await resolve2(this.body);\n const resolvedHeaders = await resolve2(this.headers);\n const resolvedCredentials = await resolve2(this.credentials);\n const baseHeaders = {\n ...normalizeHeaders(resolvedHeaders),\n ...normalizeHeaders(options.headers)\n };\n const preparedRequest = await ((_a21 = this.prepareReconnectToStreamRequest) == null ? void 0 : _a21.call(this, {\n api: this.api,\n id: options.chatId,\n body: { ...resolvedBody, ...options.body },\n headers: baseHeaders,\n credentials: resolvedCredentials,\n requestMetadata: options.metadata\n }));\n const api = (_b = preparedRequest == null ? void 0 : preparedRequest.api) != null ? _b : `${this.api}/${options.chatId}/stream`;\n const headers = (preparedRequest == null ? void 0 : preparedRequest.headers) !== void 0 ? normalizeHeaders(preparedRequest.headers) : baseHeaders;\n const credentials = (_c = preparedRequest == null ? void 0 : preparedRequest.credentials) != null ? _c : resolvedCredentials;\n const fetch2 = (_d = this.fetch) != null ? _d : globalThis.fetch;\n const response = await fetch2(api, {\n method: \"GET\",\n headers,\n credentials\n });\n if (response.status === 204) {\n return null;\n }\n if (!response.ok) {\n throw new Error(\n (_e = await response.text()) != null ? _e : \"Failed to fetch the chat response.\"\n );\n }\n if (!response.body) {\n throw new Error(\"The response body is empty.\");\n }\n return this.processResponseStream(response.body);\n }\n};\n\n// src/ui/default-chat-transport.ts\nvar DefaultChatTransport = class extends HttpChatTransport {\n constructor(options = {}) {\n super(options);\n }\n processResponseStream(stream) {\n return parseJsonEventStream2({\n stream,\n schema: uiMessageChunkSchema\n }).pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n if (!chunk.success) {\n throw chunk.error;\n }\n controller.enqueue(chunk.value);\n }\n })\n );\n }\n};\n\n// src/ui/chat.ts\nvar AbstractChat = class {\n constructor({\n generateId: generateId2 = generateIdFunc2,\n id = generateId2(),\n transport = new DefaultChatTransport(),\n messageMetadataSchema,\n dataPartSchemas,\n state,\n onError,\n onToolCall,\n onFinish,\n onData,\n sendAutomaticallyWhen\n }) {\n this.activeResponse = void 0;\n this.jobExecutor = new SerialJobExecutor();\n /**\n * Appends or replaces a user message to the chat list. This triggers the API call to fetch\n * the assistant's response.\n *\n * If a messageId is provided, the message will be replaced.\n */\n this.sendMessage = async (message, options) => {\n var _a21, _b, _c, _d;\n if (message == null) {\n await this.makeRequest({\n trigger: \"submit-message\",\n messageId: (_a21 = this.lastMessage) == null ? void 0 : _a21.id,\n ...options\n });\n return;\n }\n let uiMessage;\n if (\"text\" in message || \"files\" in message) {\n const fileParts = Array.isArray(message.files) ? message.files : await convertFileListToFileUIParts(message.files);\n uiMessage = {\n parts: [\n ...fileParts,\n ...\"text\" in message && message.text != null ? [{ type: \"text\", text: message.text }] : []\n ]\n };\n } else {\n uiMessage = message;\n }\n if (message.messageId != null) {\n const messageIndex = this.state.messages.findIndex(\n (m) => m.id === message.messageId\n );\n if (messageIndex === -1) {\n throw new Error(`message with id ${message.messageId} not found`);\n }\n if (this.state.messages[messageIndex].role !== \"user\") {\n throw new Error(\n `message with id ${message.messageId} is not a user message`\n );\n }\n this.state.messages = this.state.messages.slice(0, messageIndex + 1);\n this.state.replaceMessage(messageIndex, {\n ...uiMessage,\n id: message.messageId,\n role: (_b = uiMessage.role) != null ? _b : \"user\",\n metadata: message.metadata\n });\n } else {\n this.state.pushMessage({\n ...uiMessage,\n id: (_c = uiMessage.id) != null ? _c : this.generateId(),\n role: (_d = uiMessage.role) != null ? _d : \"user\",\n metadata: message.metadata\n });\n }\n await this.makeRequest({\n trigger: \"submit-message\",\n messageId: message.messageId,\n ...options\n });\n };\n /**\n * Regenerate the assistant message with the provided message id.\n * If no message id is provided, the last assistant message will be regenerated.\n */\n this.regenerate = async ({\n messageId,\n ...options\n } = {}) => {\n const messageIndex = messageId == null ? this.state.messages.length - 1 : this.state.messages.findIndex((message) => message.id === messageId);\n if (messageIndex === -1) {\n throw new Error(`message ${messageId} not found`);\n }\n this.state.messages = this.state.messages.slice(\n 0,\n // if the message is a user message, we need to include it in the request:\n this.messages[messageIndex].role === \"assistant\" ? messageIndex : messageIndex + 1\n );\n await this.makeRequest({\n trigger: \"regenerate-message\",\n messageId,\n ...options\n });\n };\n /**\n * Attempt to resume an ongoing streaming response.\n */\n this.resumeStream = async (options = {}) => {\n await this.makeRequest({ trigger: \"resume-stream\", ...options });\n };\n /**\n * Clear the error state and set the status to ready if the chat is in an error state.\n */\n this.clearError = () => {\n if (this.status === \"error\") {\n this.state.error = void 0;\n this.setStatus({ status: \"ready\" });\n }\n };\n this.addToolApprovalResponse = async ({\n id,\n approved,\n reason,\n options\n }) => this.jobExecutor.run(async () => {\n const messages = this.state.messages;\n const lastMessage = messages[messages.length - 1];\n const updatePart = (part) => isToolUIPart(part) && part.state === \"approval-requested\" && part.approval.id === id ? {\n ...part,\n state: \"approval-responded\",\n approval: { id, approved, reason }\n } : part;\n this.state.replaceMessage(messages.length - 1, {\n ...lastMessage,\n parts: lastMessage.parts.map(updatePart)\n });\n if (this.activeResponse) {\n this.activeResponse.state.message.parts = this.activeResponse.state.message.parts.map(updatePart);\n }\n if (this.status !== \"streaming\" && this.status !== \"submitted\" && this.sendAutomaticallyWhen) {\n this.shouldSendAutomatically().then((shouldSend) => {\n var _a21;\n if (shouldSend) {\n this.makeRequest({\n trigger: \"submit-message\",\n messageId: (_a21 = this.lastMessage) == null ? void 0 : _a21.id,\n ...options\n });\n }\n });\n }\n });\n this.addToolOutput = async ({\n state = \"output-available\",\n toolCallId,\n output,\n errorText,\n options\n }) => this.jobExecutor.run(async () => {\n const messages = this.state.messages;\n const lastMessage = messages[messages.length - 1];\n const updatePart = (part) => isToolUIPart(part) && part.toolCallId === toolCallId ? { ...part, state, output, errorText } : part;\n this.state.replaceMessage(messages.length - 1, {\n ...lastMessage,\n parts: lastMessage.parts.map(updatePart)\n });\n if (this.activeResponse) {\n this.activeResponse.state.message.parts = this.activeResponse.state.message.parts.map(updatePart);\n }\n if (this.status !== \"streaming\" && this.status !== \"submitted\" && this.sendAutomaticallyWhen) {\n this.shouldSendAutomatically().then((shouldSend) => {\n var _a21;\n if (shouldSend) {\n this.makeRequest({\n trigger: \"submit-message\",\n messageId: (_a21 = this.lastMessage) == null ? void 0 : _a21.id,\n ...options\n });\n }\n });\n }\n });\n /** @deprecated Use addToolOutput */\n this.addToolResult = this.addToolOutput;\n /**\n * Abort the current request immediately, keep the generated tokens if any.\n */\n this.stop = async () => {\n var _a21;\n if (this.status !== \"streaming\" && this.status !== \"submitted\")\n return;\n if ((_a21 = this.activeResponse) == null ? void 0 : _a21.abortController) {\n this.activeResponse.abortController.abort();\n }\n };\n this.id = id;\n this.transport = transport;\n this.generateId = generateId2;\n this.messageMetadataSchema = messageMetadataSchema;\n this.dataPartSchemas = dataPartSchemas;\n this.state = state;\n this.onError = onError;\n this.onToolCall = onToolCall;\n this.onFinish = onFinish;\n this.onData = onData;\n this.sendAutomaticallyWhen = sendAutomaticallyWhen;\n }\n /**\n * Hook status:\n *\n * - `submitted`: The message has been sent to the API and we're awaiting the start of the response stream.\n * - `streaming`: The response is actively streaming in from the API, receiving chunks of data.\n * - `ready`: The full response has been received and processed; a new user message can be submitted.\n * - `error`: An error occurred during the API request, preventing successful completion.\n */\n get status() {\n return this.state.status;\n }\n setStatus({\n status,\n error\n }) {\n if (this.status === status)\n return;\n this.state.status = status;\n this.state.error = error;\n }\n get error() {\n return this.state.error;\n }\n get messages() {\n return this.state.messages;\n }\n get lastMessage() {\n return this.state.messages[this.state.messages.length - 1];\n }\n set messages(messages) {\n this.state.messages = messages;\n }\n async shouldSendAutomatically() {\n if (!this.sendAutomaticallyWhen)\n return false;\n const result = this.sendAutomaticallyWhen({\n messages: this.state.messages\n });\n if (result && typeof result === \"object\" && \"then\" in result) {\n return await result;\n }\n return result;\n }\n async makeRequest({\n trigger,\n metadata,\n headers,\n body,\n messageId\n }) {\n var _a21, _b, _c;\n let resumeStream;\n if (trigger === \"resume-stream\") {\n try {\n const reconnect = await this.transport.reconnectToStream({\n chatId: this.id,\n metadata,\n headers,\n body\n });\n if (reconnect == null) {\n return;\n }\n resumeStream = reconnect;\n } catch (err) {\n if (this.onError && err instanceof Error) {\n this.onError(err);\n }\n this.setStatus({ status: \"error\", error: err });\n return;\n }\n }\n this.setStatus({ status: \"submitted\", error: void 0 });\n const lastMessage = this.lastMessage;\n let isAbort = false;\n let isDisconnect = false;\n let isError = false;\n try {\n const activeResponse = {\n state: createStreamingUIMessageState({\n lastMessage: this.state.snapshot(lastMessage),\n messageId: this.generateId()\n }),\n abortController: new AbortController()\n };\n activeResponse.abortController.signal.addEventListener(\"abort\", () => {\n isAbort = true;\n });\n this.activeResponse = activeResponse;\n let stream;\n if (trigger === \"resume-stream\") {\n stream = resumeStream;\n } else {\n stream = await this.transport.sendMessages({\n chatId: this.id,\n messages: this.state.messages,\n abortSignal: activeResponse.abortController.signal,\n metadata,\n headers,\n body,\n trigger,\n messageId\n });\n }\n const runUpdateMessageJob = (job) => (\n // serialize the job execution to avoid race conditions:\n this.jobExecutor.run(\n () => job({\n state: activeResponse.state,\n write: () => {\n var _a22;\n this.setStatus({ status: \"streaming\" });\n const replaceLastMessage = activeResponse.state.message.id === ((_a22 = this.lastMessage) == null ? void 0 : _a22.id);\n if (replaceLastMessage) {\n this.state.replaceMessage(\n this.state.messages.length - 1,\n activeResponse.state.message\n );\n } else {\n this.state.pushMessage(activeResponse.state.message);\n }\n }\n })\n )\n );\n await consumeStream({\n stream: processUIMessageStream({\n stream,\n onToolCall: this.onToolCall,\n onData: this.onData,\n messageMetadataSchema: this.messageMetadataSchema,\n dataPartSchemas: this.dataPartSchemas,\n runUpdateMessageJob,\n onError: (error) => {\n throw error;\n }\n }),\n onError: (error) => {\n throw error;\n }\n });\n this.setStatus({ status: \"ready\" });\n } catch (err) {\n if (isAbort || err.name === \"AbortError\") {\n isAbort = true;\n this.setStatus({ status: \"ready\" });\n return null;\n }\n isError = true;\n if (err instanceof TypeError && (err.message.toLowerCase().includes(\"fetch\") || err.message.toLowerCase().includes(\"network\"))) {\n isDisconnect = true;\n }\n if (this.onError && err instanceof Error) {\n this.onError(err);\n }\n this.setStatus({ status: \"error\", error: err });\n } finally {\n try {\n (_b = this.onFinish) == null ? void 0 : _b.call(this, {\n message: this.activeResponse.state.message,\n messages: this.state.messages,\n isAbort,\n isDisconnect,\n isError,\n finishReason: (_a21 = this.activeResponse) == null ? void 0 : _a21.state.finishReason\n });\n } catch (err) {\n console.error(err);\n }\n this.activeResponse = void 0;\n }\n if (!isError && await this.shouldSendAutomatically()) {\n await this.makeRequest({\n trigger: \"submit-message\",\n messageId: (_c = this.lastMessage) == null ? void 0 : _c.id,\n metadata,\n headers,\n body\n });\n }\n }\n};\n\n// src/ui/direct-chat-transport.ts\nvar DirectChatTransport = class {\n constructor({\n agent,\n options,\n ...uiMessageStreamOptions\n }) {\n this.agent = agent;\n this.agentOptions = options;\n this.uiMessageStreamOptions = uiMessageStreamOptions;\n }\n async sendMessages({\n messages,\n abortSignal\n }) {\n const validatedMessages = await validateUIMessages({\n messages,\n tools: this.agent.tools\n });\n const modelMessages = await convertToModelMessages(validatedMessages, {\n tools: this.agent.tools\n });\n const result = await this.agent.stream({\n prompt: modelMessages,\n abortSignal,\n ...this.agentOptions !== void 0 ? { options: this.agentOptions } : {}\n });\n return result.toUIMessageStream(this.uiMessageStreamOptions);\n }\n /**\n * Direct transport does not support reconnection since there is no\n * persistent server-side stream to reconnect to.\n *\n * @returns Always returns `null`\n */\n async reconnectToStream(_options) {\n return null;\n }\n};\n\n// src/ui/last-assistant-message-is-complete-with-approval-responses.ts\nfunction lastAssistantMessageIsCompleteWithApprovalResponses({\n messages\n}) {\n const message = messages[messages.length - 1];\n if (!message) {\n return false;\n }\n if (message.role !== \"assistant\") {\n return false;\n }\n const lastStepStartIndex = message.parts.reduce((lastIndex, part, index) => {\n return part.type === \"step-start\" ? index : lastIndex;\n }, -1);\n const lastStepToolInvocations = message.parts.slice(lastStepStartIndex + 1).filter(isToolUIPart);\n return (\n // has at least one tool approval response\n lastStepToolInvocations.filter((part) => part.state === \"approval-responded\").length > 0 && // all tool approvals must have a response\n lastStepToolInvocations.every(\n (part) => part.state === \"output-available\" || part.state === \"output-error\" || part.state === \"approval-responded\"\n )\n );\n}\n\n// src/ui/last-assistant-message-is-complete-with-tool-calls.ts\nfunction lastAssistantMessageIsCompleteWithToolCalls({\n messages\n}) {\n const message = messages[messages.length - 1];\n if (!message) {\n return false;\n }\n if (message.role !== \"assistant\") {\n return false;\n }\n const lastStepStartIndex = message.parts.reduce((lastIndex, part, index) => {\n return part.type === \"step-start\" ? index : lastIndex;\n }, -1);\n const lastStepToolInvocations = message.parts.slice(lastStepStartIndex + 1).filter(isToolUIPart).filter((part) => !part.providerExecuted);\n return lastStepToolInvocations.length > 0 && lastStepToolInvocations.every(\n (part) => part.state === \"output-available\" || part.state === \"output-error\"\n );\n}\n\n// src/ui/transform-text-to-ui-message-stream.ts\nfunction transformTextToUiMessageStream({\n stream\n}) {\n return stream.pipeThrough(\n new TransformStream({\n start(controller) {\n controller.enqueue({ type: \"start\" });\n controller.enqueue({ type: \"start-step\" });\n controller.enqueue({ type: \"text-start\", id: \"text-1\" });\n },\n async transform(part, controller) {\n controller.enqueue({ type: \"text-delta\", id: \"text-1\", delta: part });\n },\n async flush(controller) {\n controller.enqueue({ type: \"text-end\", id: \"text-1\" });\n controller.enqueue({ type: \"finish-step\" });\n controller.enqueue({ type: \"finish\" });\n }\n })\n );\n}\n\n// src/ui/text-stream-chat-transport.ts\nvar TextStreamChatTransport = class extends HttpChatTransport {\n constructor(options = {}) {\n super(options);\n }\n processResponseStream(stream) {\n return transformTextToUiMessageStream({\n stream: stream.pipeThrough(new TextDecoderStream())\n });\n }\n};\nexport {\n AISDKError21 as AISDKError,\n APICallError,\n AbstractChat,\n DefaultChatTransport,\n DefaultGeneratedFile,\n DirectChatTransport,\n DownloadError,\n EmptyResponseBodyError,\n ToolLoopAgent as Experimental_Agent,\n HttpChatTransport,\n InvalidArgumentError,\n InvalidDataContentError,\n InvalidMessageRoleError,\n InvalidPromptError,\n InvalidResponseDataError,\n InvalidStreamPartError,\n InvalidToolApprovalError,\n InvalidToolInputError,\n JSONParseError,\n JsonToSseTransformStream,\n LoadAPIKeyError,\n LoadSettingError,\n MessageConversionError,\n MissingToolResultsError,\n NoContentGeneratedError,\n NoImageGeneratedError,\n NoObjectGeneratedError,\n NoOutputGeneratedError,\n NoSpeechGeneratedError,\n NoSuchModelError,\n NoSuchProviderError,\n NoSuchToolError,\n NoTranscriptGeneratedError,\n NoVideoGeneratedError,\n output_exports as Output,\n RetryError,\n SerialJobExecutor,\n TextStreamChatTransport,\n TooManyEmbeddingValuesForCallError,\n ToolCallNotFoundForApprovalError,\n ToolCallRepairError,\n ToolLoopAgent,\n TypeValidationError,\n UIMessageStreamError,\n UI_MESSAGE_STREAM_HEADERS,\n UnsupportedFunctionalityError,\n UnsupportedModelVersionError,\n addToolInputExamplesMiddleware,\n asSchema5 as asSchema,\n assistantModelMessageSchema,\n bindTelemetryIntegration,\n callCompletionApi,\n consumeStream,\n convertFileListToFileUIParts,\n convertToModelMessages,\n cosineSimilarity,\n createAgentUIStream,\n createAgentUIStreamResponse,\n createDownload,\n createGateway,\n createIdGenerator5 as createIdGenerator,\n createProviderRegistry,\n createTextStreamResponse,\n createUIMessageStream,\n createUIMessageStreamResponse,\n customProvider,\n defaultEmbeddingSettingsMiddleware,\n defaultSettingsMiddleware,\n dynamicTool,\n embed,\n embedMany,\n experimental_createProviderRegistry,\n experimental_customProvider,\n experimental_generateImage,\n generateSpeech as experimental_generateSpeech,\n experimental_generateVideo,\n transcribe as experimental_transcribe,\n extractJsonMiddleware,\n extractReasoningMiddleware,\n gateway2 as gateway,\n generateId,\n generateImage,\n generateObject,\n generateText,\n getStaticToolName,\n getTextFromDataUrl,\n getToolName,\n getToolOrDynamicToolName,\n hasToolCall,\n isDataUIPart,\n isDeepEqualData,\n isFileUIPart,\n isLoopFinished,\n isReasoningUIPart,\n isStaticToolUIPart,\n isTextUIPart,\n isToolOrDynamicToolUIPart,\n isToolUIPart,\n jsonSchema,\n lastAssistantMessageIsCompleteWithApprovalResponses,\n lastAssistantMessageIsCompleteWithToolCalls,\n modelMessageSchema,\n parseJsonEventStream3 as parseJsonEventStream,\n parsePartialJson,\n pipeAgentUIStreamToResponse,\n pipeTextStreamToResponse,\n pipeUIMessageStreamToResponse,\n pruneMessages,\n readUIMessageStream,\n registerTelemetryIntegration,\n rerank,\n safeValidateUIMessages,\n simulateReadableStream,\n simulateStreamingMiddleware,\n smoothStream,\n stepCountIs,\n streamObject,\n streamText,\n systemModelMessageSchema,\n tool,\n toolModelMessageSchema,\n uiMessageChunkSchema,\n userModelMessageSchema,\n validateUIMessages,\n wrapEmbeddingModel,\n wrapImageModel,\n wrapLanguageModel,\n wrapProvider,\n zodSchema3 as zodSchema\n};\n//# sourceMappingURL=index.mjs.map","import { joinPath } from '@/lib/string/paths/joinPath';\nimport { DefaultChatTransport } from 'ai';\n\nexport function getChatTransport(orgId: string) {\n\treturn new DefaultChatTransport({\n\t\tapi: joinPath(import.meta.env.VITE_CENTRAL_MANAGER_API_URL || '/', 'Chat/Messages/'),\n\t\tcredentials: 'include',\n\t\tbody: { orgId },\n\t});\n}\n","function throttle(function_, wait) {\n\tif (typeof function_ !== 'function') {\n\t\tthrow new TypeError(`Expected the first argument to be a \\`function\\`, got \\`${typeof function_}\\`.`);\n\t}\n\n\t// TODO: Add `wait` validation too in the next major version.\n\n\tlet timeoutId;\n\tlet lastCallTime = 0;\n\n\treturn function throttled(...arguments_) { // eslint-disable-line func-names\n\t\tclearTimeout(timeoutId);\n\n\t\tconst now = Date.now();\n\t\tconst timeSinceLastCall = now - lastCallTime;\n\t\tconst delayForNextCall = wait - timeSinceLastCall;\n\n\t\tif (delayForNextCall <= 0) {\n\t\t\tlastCallTime = now;\n\t\t\tfunction_.apply(this, arguments_);\n\t\t} else {\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tlastCallTime = Date.now();\n\t\t\t\tfunction_.apply(this, arguments_);\n\t\t\t}, delayForNextCall);\n\t\t}\n\t};\n}\n\nmodule.exports = throttle;\n","var __accessCheck = (obj, member, msg) => {\n if (!member.has(obj))\n throw TypeError(\"Cannot \" + msg);\n};\nvar __privateGet = (obj, member, getter) => {\n __accessCheck(obj, member, \"read from private field\");\n return getter ? getter.call(obj) : member.get(obj);\n};\nvar __privateAdd = (obj, member, value) => {\n if (member.has(obj))\n throw TypeError(\"Cannot add the same private member more than once\");\n member instanceof WeakSet ? member.add(obj) : member.set(obj, value);\n};\nvar __privateSet = (obj, member, value, setter) => {\n __accessCheck(obj, member, \"write to private field\");\n setter ? setter.call(obj, value) : member.set(obj, value);\n return value;\n};\n\n// src/use-chat.ts\nimport { useCallback, useEffect, useRef, useSyncExternalStore } from \"react\";\n\n// src/chat.react.ts\nimport {\n AbstractChat\n} from \"ai\";\n\n// src/throttle.ts\nimport throttleFunction from \"throttleit\";\nfunction throttle(fn, waitMs) {\n return waitMs != null ? throttleFunction(fn, waitMs) : fn;\n}\n\n// src/chat.react.ts\nvar _messages, _status, _error, _messagesCallbacks, _statusCallbacks, _errorCallbacks, _callMessagesCallbacks, _callStatusCallbacks, _callErrorCallbacks;\nvar ReactChatState = class {\n constructor(initialMessages = []) {\n __privateAdd(this, _messages, void 0);\n __privateAdd(this, _status, \"ready\");\n __privateAdd(this, _error, void 0);\n __privateAdd(this, _messagesCallbacks, /* @__PURE__ */ new Set());\n __privateAdd(this, _statusCallbacks, /* @__PURE__ */ new Set());\n __privateAdd(this, _errorCallbacks, /* @__PURE__ */ new Set());\n this.pushMessage = (message) => {\n __privateSet(this, _messages, __privateGet(this, _messages).concat(message));\n __privateGet(this, _callMessagesCallbacks).call(this);\n };\n this.popMessage = () => {\n __privateSet(this, _messages, __privateGet(this, _messages).slice(0, -1));\n __privateGet(this, _callMessagesCallbacks).call(this);\n };\n this.replaceMessage = (index, message) => {\n __privateSet(this, _messages, [\n ...__privateGet(this, _messages).slice(0, index),\n // We deep clone the message here to ensure the new React Compiler (currently in RC) detects deeply nested parts/metadata changes:\n this.snapshot(message),\n ...__privateGet(this, _messages).slice(index + 1)\n ]);\n __privateGet(this, _callMessagesCallbacks).call(this);\n };\n this.snapshot = (value) => structuredClone(value);\n this[\"~registerMessagesCallback\"] = (onChange, throttleWaitMs) => {\n const callback = throttleWaitMs ? throttle(onChange, throttleWaitMs) : onChange;\n __privateGet(this, _messagesCallbacks).add(callback);\n return () => {\n __privateGet(this, _messagesCallbacks).delete(callback);\n };\n };\n this[\"~registerStatusCallback\"] = (onChange) => {\n __privateGet(this, _statusCallbacks).add(onChange);\n return () => {\n __privateGet(this, _statusCallbacks).delete(onChange);\n };\n };\n this[\"~registerErrorCallback\"] = (onChange) => {\n __privateGet(this, _errorCallbacks).add(onChange);\n return () => {\n __privateGet(this, _errorCallbacks).delete(onChange);\n };\n };\n __privateAdd(this, _callMessagesCallbacks, () => {\n __privateGet(this, _messagesCallbacks).forEach((callback) => callback());\n });\n __privateAdd(this, _callStatusCallbacks, () => {\n __privateGet(this, _statusCallbacks).forEach((callback) => callback());\n });\n __privateAdd(this, _callErrorCallbacks, () => {\n __privateGet(this, _errorCallbacks).forEach((callback) => callback());\n });\n __privateSet(this, _messages, initialMessages);\n }\n get status() {\n return __privateGet(this, _status);\n }\n set status(newStatus) {\n __privateSet(this, _status, newStatus);\n __privateGet(this, _callStatusCallbacks).call(this);\n }\n get error() {\n return __privateGet(this, _error);\n }\n set error(newError) {\n __privateSet(this, _error, newError);\n __privateGet(this, _callErrorCallbacks).call(this);\n }\n get messages() {\n return __privateGet(this, _messages);\n }\n set messages(newMessages) {\n __privateSet(this, _messages, [...newMessages]);\n __privateGet(this, _callMessagesCallbacks).call(this);\n }\n};\n_messages = new WeakMap();\n_status = new WeakMap();\n_error = new WeakMap();\n_messagesCallbacks = new WeakMap();\n_statusCallbacks = new WeakMap();\n_errorCallbacks = new WeakMap();\n_callMessagesCallbacks = new WeakMap();\n_callStatusCallbacks = new WeakMap();\n_callErrorCallbacks = new WeakMap();\nvar _state;\nvar Chat = class extends AbstractChat {\n constructor({ messages, ...init }) {\n const state = new ReactChatState(messages);\n super({ ...init, state });\n __privateAdd(this, _state, void 0);\n this[\"~registerMessagesCallback\"] = (onChange, throttleWaitMs) => __privateGet(this, _state)[\"~registerMessagesCallback\"](onChange, throttleWaitMs);\n this[\"~registerStatusCallback\"] = (onChange) => __privateGet(this, _state)[\"~registerStatusCallback\"](onChange);\n this[\"~registerErrorCallback\"] = (onChange) => __privateGet(this, _state)[\"~registerErrorCallback\"](onChange);\n __privateSet(this, _state, state);\n }\n};\n_state = new WeakMap();\n\n// src/use-chat.ts\nfunction useChat({\n experimental_throttle: throttleWaitMs,\n resume = false,\n ...options\n} = {}) {\n const callbacksRef = useRef(\n !(\"chat\" in options) ? {\n onToolCall: options.onToolCall,\n onData: options.onData,\n onFinish: options.onFinish,\n onError: options.onError,\n sendAutomaticallyWhen: options.sendAutomaticallyWhen\n } : {}\n );\n if (!(\"chat\" in options)) {\n callbacksRef.current = {\n onToolCall: options.onToolCall,\n onData: options.onData,\n onFinish: options.onFinish,\n onError: options.onError,\n sendAutomaticallyWhen: options.sendAutomaticallyWhen\n };\n }\n const optionsWithCallbacks = {\n ...options,\n onToolCall: (arg) => {\n var _a, _b;\n return (_b = (_a = callbacksRef.current).onToolCall) == null ? void 0 : _b.call(_a, arg);\n },\n onData: (arg) => {\n var _a, _b;\n return (_b = (_a = callbacksRef.current).onData) == null ? void 0 : _b.call(_a, arg);\n },\n onFinish: (arg) => {\n var _a, _b;\n return (_b = (_a = callbacksRef.current).onFinish) == null ? void 0 : _b.call(_a, arg);\n },\n onError: (arg) => {\n var _a, _b;\n return (_b = (_a = callbacksRef.current).onError) == null ? void 0 : _b.call(_a, arg);\n },\n sendAutomaticallyWhen: (arg) => {\n var _a, _b, _c;\n return (_c = (_b = (_a = callbacksRef.current).sendAutomaticallyWhen) == null ? void 0 : _b.call(_a, arg)) != null ? _c : false;\n }\n };\n const chatRef = useRef(\n \"chat\" in options ? options.chat : new Chat(optionsWithCallbacks)\n );\n const shouldRecreateChat = \"chat\" in options && options.chat !== chatRef.current || \"id\" in options && chatRef.current.id !== options.id;\n if (shouldRecreateChat) {\n chatRef.current = \"chat\" in options ? options.chat : new Chat(optionsWithCallbacks);\n }\n const subscribeToMessages = useCallback(\n (update) => chatRef.current[\"~registerMessagesCallback\"](update, throttleWaitMs),\n // `chatRef.current.id` is required to trigger re-subscription when the chat ID changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [throttleWaitMs, chatRef.current.id]\n );\n const messages = useSyncExternalStore(\n subscribeToMessages,\n () => chatRef.current.messages,\n () => chatRef.current.messages\n );\n const status = useSyncExternalStore(\n chatRef.current[\"~registerStatusCallback\"],\n () => chatRef.current.status,\n () => chatRef.current.status\n );\n const error = useSyncExternalStore(\n chatRef.current[\"~registerErrorCallback\"],\n () => chatRef.current.error,\n () => chatRef.current.error\n );\n const setMessages = useCallback(\n (messagesParam) => {\n if (typeof messagesParam === \"function\") {\n messagesParam = messagesParam(chatRef.current.messages);\n }\n chatRef.current.messages = messagesParam;\n },\n [chatRef]\n );\n useEffect(() => {\n if (resume) {\n chatRef.current.resumeStream();\n }\n }, [resume, chatRef]);\n return {\n id: chatRef.current.id,\n messages,\n setMessages,\n sendMessage: chatRef.current.sendMessage,\n regenerate: chatRef.current.regenerate,\n clearError: chatRef.current.clearError,\n stop: chatRef.current.stop,\n error,\n resumeStream: chatRef.current.resumeStream,\n status,\n /**\n * @deprecated Use `addToolOutput` instead.\n */\n addToolResult: chatRef.current.addToolOutput,\n addToolOutput: chatRef.current.addToolOutput,\n addToolApprovalResponse: chatRef.current.addToolApprovalResponse\n };\n}\n\n// src/use-completion.ts\nimport {\n callCompletionApi\n} from \"ai\";\nimport { useCallback as useCallback2, useEffect as useEffect2, useId, useRef as useRef2, useState } from \"react\";\nimport useSWR from \"swr\";\nfunction useCompletion({\n api = \"/api/completion\",\n id,\n initialCompletion = \"\",\n initialInput = \"\",\n credentials,\n headers,\n body,\n streamProtocol = \"data\",\n fetch: fetch2,\n onFinish,\n onError,\n experimental_throttle: throttleWaitMs\n} = {}) {\n const hookId = useId();\n const completionId = id || hookId;\n const { data, mutate } = useSWR([api, completionId], null, {\n fallbackData: initialCompletion\n });\n const { data: isLoading = false, mutate: mutateLoading } = useSWR(\n [completionId, \"loading\"],\n null\n );\n const [error, setError] = useState(void 0);\n const completion = data;\n const [abortController, setAbortController] = useState(null);\n const extraMetadataRef = useRef2({\n credentials,\n headers,\n body\n });\n useEffect2(() => {\n extraMetadataRef.current = {\n credentials,\n headers,\n body\n };\n }, [credentials, headers, body]);\n const triggerRequest = useCallback2(\n async (prompt, options) => callCompletionApi({\n api,\n prompt,\n credentials: extraMetadataRef.current.credentials,\n headers: { ...extraMetadataRef.current.headers, ...options == null ? void 0 : options.headers },\n body: {\n ...extraMetadataRef.current.body,\n ...options == null ? void 0 : options.body\n },\n streamProtocol,\n fetch: fetch2,\n // throttle streamed ui updates:\n setCompletion: throttle(\n (completion2) => mutate(completion2, false),\n throttleWaitMs\n ),\n setLoading: mutateLoading,\n setError,\n setAbortController,\n onFinish,\n onError\n }),\n [\n mutate,\n mutateLoading,\n api,\n extraMetadataRef,\n setAbortController,\n onFinish,\n onError,\n setError,\n streamProtocol,\n fetch2,\n throttleWaitMs\n ]\n );\n const stop = useCallback2(() => {\n if (abortController) {\n abortController.abort();\n setAbortController(null);\n }\n }, [abortController]);\n const setCompletion = useCallback2(\n (completion2) => {\n mutate(completion2, false);\n },\n [mutate]\n );\n const complete = useCallback2(\n async (prompt, options) => {\n return triggerRequest(prompt, options);\n },\n [triggerRequest]\n );\n const [input, setInput] = useState(initialInput);\n const handleSubmit = useCallback2(\n (event) => {\n var _a;\n (_a = event == null ? void 0 : event.preventDefault) == null ? void 0 : _a.call(event);\n return input ? complete(input) : void 0;\n },\n [input, complete]\n );\n const handleInputChange = useCallback2(\n (e) => {\n setInput(e.target.value);\n },\n [setInput]\n );\n return {\n completion,\n complete,\n error,\n setCompletion,\n stop,\n input,\n setInput,\n handleInputChange,\n handleSubmit,\n isLoading\n };\n}\n\n// src/use-object.ts\nimport {\n isAbortError,\n resolve,\n normalizeHeaders,\n safeValidateTypes\n} from \"@ai-sdk/provider-utils\";\nimport {\n asSchema,\n isDeepEqualData,\n parsePartialJson\n} from \"ai\";\nimport { useCallback as useCallback3, useId as useId2, useRef as useRef3, useState as useState2 } from \"react\";\nimport useSWR2 from \"swr\";\nvar getOriginalFetch = () => fetch;\nfunction useObject({\n api,\n id,\n schema,\n // required, in the future we will use it for validation\n initialValue,\n fetch: fetch2,\n onError,\n onFinish,\n headers,\n credentials\n}) {\n const hookId = useId2();\n const completionId = id != null ? id : hookId;\n const { data, mutate } = useSWR2(\n [api, completionId],\n null,\n { fallbackData: initialValue }\n );\n const [error, setError] = useState2(void 0);\n const [isLoading, setIsLoading] = useState2(false);\n const abortControllerRef = useRef3(null);\n const stop = useCallback3(() => {\n var _a;\n try {\n (_a = abortControllerRef.current) == null ? void 0 : _a.abort();\n } catch (ignored) {\n } finally {\n setIsLoading(false);\n abortControllerRef.current = null;\n }\n }, []);\n const submit = async (input) => {\n var _a;\n try {\n clearObject();\n setIsLoading(true);\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n const resolvedHeaders = await resolve(headers);\n const actualFetch = fetch2 != null ? fetch2 : getOriginalFetch();\n const response = await actualFetch(api, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...normalizeHeaders(resolvedHeaders)\n },\n credentials,\n signal: abortController.signal,\n body: JSON.stringify(input)\n });\n if (!response.ok) {\n throw new Error(\n (_a = await response.text()) != null ? _a : \"Failed to fetch the response.\"\n );\n }\n if (response.body == null) {\n throw new Error(\"The response body is empty.\");\n }\n let accumulatedText = \"\";\n let latestObject = void 0;\n await response.body.pipeThrough(new TextDecoderStream()).pipeTo(\n new WritableStream({\n async write(chunk) {\n accumulatedText += chunk;\n const { value } = await parsePartialJson(accumulatedText);\n const currentObject = value;\n if (!isDeepEqualData(latestObject, currentObject)) {\n latestObject = currentObject;\n mutate(currentObject);\n }\n },\n async close() {\n setIsLoading(false);\n abortControllerRef.current = null;\n if (onFinish != null) {\n const validationResult = await safeValidateTypes({\n value: latestObject,\n schema: asSchema(schema)\n });\n onFinish(\n validationResult.success ? { object: validationResult.value, error: void 0 } : { object: void 0, error: validationResult.error }\n );\n }\n }\n })\n );\n } catch (error2) {\n if (isAbortError(error2)) {\n return;\n }\n if (onError && error2 instanceof Error) {\n onError(error2);\n }\n setIsLoading(false);\n setError(error2 instanceof Error ? error2 : new Error(String(error2)));\n }\n };\n const clear = () => {\n stop();\n clearObject();\n };\n const clearObject = () => {\n setError(void 0);\n setIsLoading(false);\n mutate(void 0);\n };\n return {\n submit,\n object: data,\n error,\n isLoading,\n stop,\n clear\n };\n}\nvar experimental_useObject = useObject;\nexport {\n Chat,\n experimental_useObject,\n useChat,\n useCompletion\n};\n//# sourceMappingURL=index.mjs.map","import { Send } from 'lucide-react';\nimport { useEffect, useRef } from 'react';\nimport { SubmitEvent } from 'react';\n\ninterface ChatInputProps {\n\tinput: string;\n\tsetInput: (value: string) => void;\n\tonSubmit: (e: SubmitEvent) => void;\n\tdisabled: boolean;\n\tautoFocus?: boolean;\n}\n\nexport function ChatInput({ input, setInput, onSubmit, disabled, autoFocus }: ChatInputProps) {\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\n\tuseEffect(() => {\n\t\tif (autoFocus && !disabled) {\n\t\t\tinputRef.current?.focus();\n\t\t}\n\t}, [autoFocus, disabled]);\n\n\treturn (\n\t\t<form onSubmit={onSubmit} className=\"input-area\">\n\t\t\t<input\n\t\t\t\tref={inputRef}\n\t\t\t\tvalue={input}\n\t\t\t\tonChange={(e) => setInput(e.target.value)}\n\t\t\t\tplaceholder=\"Type a message...\"\n\t\t\t\tdisabled={disabled}\n\t\t\t/>\n\t\t\t<button type=\"submit\" disabled={disabled || !input.trim()}>\n\t\t\t\t<Send size={18} />\n\t\t\t</button>\n\t\t</form>\n\t);\n}\n","import { RefreshCw } from 'lucide-react';\n\nexport function LoadingState() {\n\treturn (\n\t\t<div className=\"loading-state\">\n\t\t\t<RefreshCw className=\"animate-spin\" size={24} />\n\t\t\t<p>Loading conversation...</p>\n\t\t</div>\n\t);\n}\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n feedbackSummary: z\n .string()\n .describe('A brief summary of the feedback, used as the discussion title.'),\n feedbackDetails: z.string().describe('Detailed feedback from the user or agent observation.'),\n recap: z\n .string()\n .describe('A sanitized recap of what the agent and user did together and if it was successful. No sensitive information.'),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'collectFeedback',\n description: 'Collects feedback from the user by fetching a link to a pre-populated GitHub Discussion. Use this if' +\n ' the user lets us know we did something well, or if the user seems frustrated, or wants to report a bug.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { inputSchema } from '@harperfast/agent-tools/tools/collectFeedback/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { feedbackSummary, feedbackDetails, recap } }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\tconst title = feedbackSummary;\n\tconst body = `${feedbackDetails}\\n\\n${recap}`;\n\tconst encodedTitle = encodeURIComponent(title);\n\tconst encodedBody = encodeURIComponent(body);\n\tconst url =\n\t\t`https://github.com/HarperFast/harper-agent/discussions/new?category=usage-feedback&title=${encodedTitle}&body=${encodedBody}`;\n\n\treturn {\n\t\tsuccess: true,\n\t\turl,\n\t\tmessage: 'Feedback URL created! Ask the user to open it in their browser, and they will be brought to a form to'\n\t\t\t+ ' approve the details of the feedback.',\n\t};\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/collectFeedback/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/collectFeedback/serverSchema';\nimport { MessageSquareHeartIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const collectFeedback: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: MessageSquareHeartIcon,\n\texecute,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n name: z.string().trim(),\n // TODO: Bind this up to the `templates` array somehow\n type: z.enum(['vanilla-js', 'vanilla-ts']),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'createApp',\n description: 'Create a new Harper app with the specified name and template type.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { templates } from '@/features/instance/applications/components/NewApplication/templates';\nimport { addComponent } from '@/integrations/api/instance/applications/addComponent';\nimport { restartInstance } from '@/integrations/api/instance/status/restartInstance';\nimport { findBy } from '@/lib/arrays/findBy';\nimport { emitToListeners } from '@/lib/events/listener';\nimport { toKebabCase } from '@/lib/string/to-kebab-case';\nimport { inputSchema } from '@harperfast/agent-tools/tools/createApp/inputSchema';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { name: rawName, type }, instanceClientParams, baseURL }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\tconst name = toKebabCase(rawName);\n\tconst template = findBy(templates, 'id', type);\n\tif (!template) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: Invalid template type, ${type}, please choose from: ${templates.map(t => t.id).join(', ')}`,\n\t\t};\n\t}\n\n\t// TODO: Make sure it doesn't exist already.\n\t// TODO: HITL approval right here? During the tool? IDK.\n\n\tconst toastId = toast.loading(`Creating from template...`, {\n\t\tdescription: 'This may take a bit.',\n\t\tduration: 300_000,\n\t});\n\n\ttry {\n\t\tawait addComponent({\n\t\t\t...instanceClientParams,\n\t\t\tproject: name,\n\t\t\ttemplate: template.npm || template.githubUrl,\n\t\t});\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n\n\temitToListeners('ReloadApplicationRootEntries', true);\n\n\ttoast.loading(`Created successfully!`, {\n\t\tdescription: `${name} created! Restarting the HTTP service...`,\n\t\tid: toastId,\n\t\tduration: 300_000,\n\t});\n\n\ttry {\n\t\tawait restartInstance({\n\t\t\t...instanceClientParams,\n\t\t\toperation: 'restart_service',\n\t\t\treplicated: instanceClientParams.entityType === 'cluster',\n\t\t});\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n\n\ttoast.success(`Created successfully!`, {\n\t\tdescription: `${name} created!`,\n\t\tid: toastId,\n\t\tduration: 5_000,\n\t});\n\n\treturn {\n\t\tsuccess: true,\n\t\tmessage: `App \"${name}\" created successfully.`,\n\t\twebURL: baseURL,\n\t};\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/createApp/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/createApp/serverSchema';\nimport { PlusIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const createApp: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: PlusIcon,\n\texecute,\n\trequiresApproval: true,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n database: z.string().trim(),\n table: z.string().trim(),\n primaryKeys: z.array(z.string()),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'deleteTableRecords',\n description: 'Deletes records in a particular table in a particular database on the server ' +\n 'by their primary keys.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { deleteTableRecords } from '@/integrations/api/instance/database/deleteTableRecords';\nimport { queryClient } from '@/react-query/queryClient';\nimport { inputSchema } from '@harperfast/agent-tools/tools/deleteTableRecords/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { database, table, primaryKeys }, instanceClientParams, params }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst data = await deleteTableRecords({\n\t\t\t...instanceClientParams,\n\t\t\tdatabaseName: database,\n\t\t\ttableName: table,\n\t\t\thashValues: primaryKeys,\n\t\t});\n\t\tconst { databaseName, tableName } = params;\n\t\tawait queryClient.invalidateQueries({ queryKey: [instanceClientParams.entityId, databaseName, tableName] });\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/deleteTableRecords/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/deleteTableRecords/serverSchema';\nimport { BetweenHorizonalStartIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const deleteTableRecords: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: BetweenHorizonalStartIcon,\n\texecute,\n\trequiresApproval: true,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n path: z.string().trim(),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'dropComponentFile',\n description: 'Drops a component file by its full path (which was returned by getComponents)',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { dropComponent } from '@/integrations/api/instance/applications/dropComponent';\nimport { inputSchema } from '@harperfast/agent-tools/tools/dropComponentFile/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { path }, instanceClientParams }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst parts = path.split('/');\n\t\tconst project = parts.shift()!;\n\t\tconst file = parts.join('/');\n\t\tconst data = await dropComponent({ ...instanceClientParams, file, project });\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/dropComponentFile/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/dropComponentFile/serverSchema';\nimport { TrashIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const dropComponentFile: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: TrashIcon,\n\texecute,\n\trequiresApproval: true,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n metricName: z.string().describe('The name of the metric to retrieve.'),\n startTime: z\n .number()\n .describe('The start of the time range for the metric, in milliseconds since the Unix epoch.'),\n endTime: z\n .number()\n .describe('The end of the time range for the metric, in milliseconds since the Unix epoch.'),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'getAnalytics',\n description: 'Retrieves analytics metrics for the server, such as CPU usage or database operations (reads, writes,' +\n ' messages).',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { getRawAnalytics } from '@/integrations/api/instance/status/getAnalytics';\nimport { inputSchema } from '@harperfast/agent-tools/tools/getAnalytics/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input, instanceClientParams }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst { metricName, startTime, endTime } = input;\n\n\t\tconst data = await getRawAnalytics({\n\t\t\tmetric: metricName,\n\t\t\tstartTime,\n\t\t\tendTime,\n\t\t\tinstanceParams: instanceClientParams,\n\t\t});\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error retrieving analytics: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/getAnalytics/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/getAnalytics/serverSchema';\nimport { ChartAreaIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const getAnalytics: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: ChartAreaIcon,\n\texecute,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n path: z.string().trim(),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'getComponentFile',\n description: 'Returns the contents of a component file by its full path (which was returned by getComponents)',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { getComponentFile } from '@/integrations/api/instance/applications/getComponentFile';\nimport { inputSchema } from '@harperfast/agent-tools/tools/getComponentFile/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { path }, instanceClientParams }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst parts = path.split('/');\n\t\tconst project = parts.shift();\n\t\tconst file = parts.join('/');\n\t\tconst data = await getComponentFile({ ...instanceClientParams, file, project });\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/getComponentFile/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/getComponentFile/serverSchema';\nimport { FileIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const getComponentFile: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: FileIcon,\n\texecute,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'getComponents',\n description: 'Retrieves a tree of all the component (files and folders) names and sizes stored on the server.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { buildItems } from '@/features/instance/applications/components/ApplicationsSidebar/buildItems';\nimport {\n\tcalculateRootEntries,\n} from '@/features/instance/applications/components/ApplicationsSidebar/calculateRootEntries';\nimport { getComponents } from '@/integrations/api/instance/applications/getComponents';\nimport { inputSchema } from '@harperfast/agent-tools/tools/getComponents/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ instanceClientParams }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst data = await getComponents(instanceClientParams);\n\t\tconst { rootEntries } = calculateRootEntries(data.entries);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\titems: buildItems(rootEntries).items,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/getComponents/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/getComponents/serverSchema';\nimport { FolderIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const getComponents: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: FolderIcon,\n\texecute,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'getDescribeAll',\n description: 'Retrieves a map of the names of databases and their tables stored on the server.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { getDescribeAll } from '@/integrations/api/instance/database/getDescribeAll';\nimport { inputSchema } from '@harperfast/agent-tools/tools/getDescribeAll/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ instanceClientParams }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst data = await getDescribeAll(instanceClientParams);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tmap: data,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/getDescribeAll/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/getDescribeAll/serverSchema';\nimport { DatabaseIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const getDescribeAll: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: DatabaseIcon,\n\texecute,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n database: z.string().trim(),\n table: z.string().trim(),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'getDescribeTable',\n description: 'Returns the schema metadata describing a particular table in a particular database on the server.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { getDescribeTable } from '@/integrations/api/instance/database/getDescribeTable';\nimport { inputSchema } from '@harperfast/agent-tools/tools/getDescribeTable/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { database, table }, instanceClientParams }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst data = await getDescribeTable({ ...instanceClientParams, databaseName: database, tableName: table });\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/getDescribeTable/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/getDescribeTable/serverSchema';\nimport { TableIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const getDescribeTable: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: TableIcon,\n\texecute,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'getUserContext',\n description: 'Retrieves the context of what the user is looking at on their screen, such as the current page, ' +\n 'the file they are viewing, the database and table visible to them, that sort of thing.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { getSessionStorage } from '@/lib/storage/getSessionStorage';\nimport { currentUrlAfterHash } from '@/lib/urls/currentUrlAfterHash';\nimport { inputSchema } from '@harperfast/agent-tools/tools/getUserContext/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ instanceClientParams, params }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\tconst url = currentUrlAfterHash();\n\n\tif (url.includes('/databases')) {\n\t\tconst { databaseName, tableName } = params;\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdescription: 'viewing the database',\n\t\t\tdata: {\n\t\t\t\tdatabaseName,\n\t\t\t\ttableName,\n\t\t\t},\n\t\t};\n\t}\n\n\tif (url.endsWith('/apis')) {\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdescription: 'viewing the APIs',\n\t\t};\n\t}\n\n\tif (url.endsWith('/status')) {\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdescription: 'viewing the status graphs',\n\t\t};\n\t}\n\n\tif (url.endsWith('/logs')) {\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdescription: 'viewing the logs',\n\t\t};\n\t}\n\n\tif (url.includes('/config/')) {\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdescription: 'viewing the configuration pages',\n\t\t};\n\t}\n\n\tconst focusedItem = getSessionStorage(\n\t\t`FileFocused/${instanceClientParams.entityId}` as 'FileFocused/{entityId}',\n\t\tundefined,\n\t);\n\tconst expandedItems = getSessionStorage(\n\t\t`FolderOpened/${instanceClientParams.entityId}` as 'FolderOpened/{entityId}',\n\t\t[],\n\t);\n\tconst selectedItems = getSessionStorage(\n\t\t`FileSelected/${instanceClientParams.entityId}` as 'FileSelected/{entityId}',\n\t\t[],\n\t);\n\n\tif (focusedItem) {\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdescription: 'editing application files',\n\t\t\tdata: {\n\t\t\t\topenedPath: focusedItem,\n\t\t\t\texpandedItems,\n\t\t\t\tselectedItems,\n\t\t\t},\n\t\t};\n\t}\n\n\treturn {\n\t\tsuccess: true,\n\t\tdescription: url,\n\t};\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/getUserContext/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/getUserContext/serverSchema';\nimport { UserIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const getUserContext: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: UserIcon,\n\texecute,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n database: z.string().trim(),\n table: z.string().trim(),\n records: z.array(z.any()),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'insertTableRecords',\n description: 'Inserts one or more records into a particular table in a particular database on the server.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { insertTableRecords } from '@/integrations/api/instance/database/insertTableRecords';\nimport { queryClient } from '@/react-query/queryClient';\nimport { inputSchema } from '@harperfast/agent-tools/tools/insertTableRecords/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { database, table, records }, instanceClientParams, params }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst data = await insertTableRecords({\n\t\t\t...instanceClientParams,\n\t\t\tdatabaseName: database,\n\t\t\ttableName: table,\n\t\t\trecords,\n\t\t});\n\t\tconst { databaseName, tableName } = params;\n\t\tawait queryClient.invalidateQueries({ queryKey: [instanceClientParams.entityId, databaseName, tableName] });\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/insertTableRecords/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/insertTableRecords/serverSchema';\nimport { BetweenHorizonalStartIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const insertTableRecords: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: BetweenHorizonalStartIcon,\n\texecute,\n\trequiresApproval: true,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n metricTypes: z.enum(['builtin', 'custom']),\n customWindowMS: z\n .number()\n .optional()\n .describe('Default to one week time window for finding custom metrics.'),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'listAnalyticsMetrics',\n description: 'Lists the available analytics metric names available for calling getAnalytics upon.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","export async function listAnalyticsMetrics({\n\tmetricTypes,\n\tcustomWindowMS,\n\tinstanceParams,\n}: any) {\n\tconst { data } = await instanceParams.instanceClient.post('/', {\n\t\toperation: 'list_analytics_metrics',\n\t\tmetricTypes,\n\t\tcustomWindowMS,\n\t});\n\treturn data;\n}\n","import { listAnalyticsMetrics } from '@/integrations/api/instance/status/listAnalyticsMetrics';\nimport { inputSchema } from '@harperfast/agent-tools/tools/listAnalyticsMetrics/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input, instanceClientParams }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst { metricTypes, customWindowMS } = input;\n\n\t\tconst data = await listAnalyticsMetrics({\n\t\t\tmetricTypes,\n\t\t\tcustomWindowMS,\n\t\t\tinstanceParams: instanceClientParams,\n\t\t});\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tmetricNames: data,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error retrieving analytics: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/listAnalyticsMetrics/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/listAnalyticsMetrics/serverSchema';\nimport { ChartAreaIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const listAnalyticsMetrics: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: ChartAreaIcon,\n\texecute,\n};\n","/**\n * An array of all available rule names.\n */\nexport const ruleNames = [\n\t\"adding-tables-with-schemas\",\n\t\"automatic-apis\",\n\t\"caching\",\n\t\"checking-authentication\",\n\t\"creating-a-fabric-account-and-cluster\",\n\t\"creating-harper-apps\",\n\t\"custom-resources\",\n\t\"defining-relationships\",\n\t\"deploying-to-harper-fabric\",\n\t\"extending-tables\",\n\t\"handling-binary-data\",\n\t\"load-env\",\n\t\"logging\",\n\t\"programmatic-table-requests\",\n\t\"querying-rest-apis\",\n\t\"real-time-apps\",\n\t\"schema-design-tooling\",\n\t\"serving-web-content\",\n\t\"typescript-type-stripping\",\n\t\"using-blob-datatype\",\n\t\"vector-indexing\"\n];\n\n/**\n * A map from rule names to their markdown content.\n */\nexport const rules = {\n\t\"adding-tables-with-schemas\": \"---\\nname: adding-tables-with-schemas\\ndescription: Guidelines for adding tables to a Harper database using GraphQL schemas.\\nmetadata:\\n mode: synthesized\\n---\\n\\n# Adding Tables with Schemas\\n\\nInstructions for the agent to follow when adding tables to a Harper database.\\n\\n## When to Use\\n\\nUse this skill when you need to define new data structures or modify existing ones in a Harper database.\\n\\n## How It Works\\n\\n1. **Create Dedicated Schema Files**: Prefer having a dedicated schema `.graphql` file for each table. Check the `config.yaml` file under `graphqlSchema.files` to see how it's configured. It typically accepts wildcards (e.g., `schemas/*.graphql`), but may be configured to point at a single file.\\n2. **Use Directives**: All available directives for defining your schema are defined in `node_modules/harper/schema.graphql`. Common directives include `@table`, `@export`, `@primaryKey`, `@indexed`, and `@relationship`.\\n3. **Define Relationships**: Link tables together using the `@relationship` directive. For more details, see the [Defining Relationships](defining-relationships.md) skill.\\n4. **Enable Automatic APIs**: If you add `@table @export` to a schema type, Harper automatically sets up REST and WebSocket APIs for basic CRUD operations against that table. **Important**: REST endpoints also require `rest: true` in `config.yaml` — without it, `@export`ed tables will not respond to HTTP requests. For a detailed list of available endpoints and how to use them, see the [Automatic REST APIs](automatic-apis.md) skill.\\n - `GET /{TableName}`: Describes the schema itself.\\n - `GET /{TableName}/`: Lists all records (supports filtering, sorting, and pagination via query parameters). See the [Querying REST APIs](querying-rest-apis.md) skill for details.\\n - `GET /{TableName}/{id}`: Retrieves a single record by its ID.\\n - `POST /{TableName}/`: Creates a new record.\\n - `PUT /{TableName}/{id}`: Updates an existing record.\\n - `PATCH /{TableName}/{id}`: Performs a partial update on a record.\\n - `DELETE /{TableName}/`: Deletes all records or filtered records.\\n - `DELETE /{TableName}/{id}`: Deletes a single record by its ID.\\n5. **Consider Table Extensions**: If you are going to [extend the table](./extending-tables.md) in your resources, then do not `@export` the table from the schema.\\n\\n## Examples\\n\\nIn a hypothetical `schemas/ExamplePerson.graphql`:\\n\\n```graphql\\ntype ExamplePerson @table @export {\\n\\tid: ID @primaryKey\\n\\tname: String\\n\\ttag: String @indexed\\n}\\n```\\n\",\n\t\"automatic-apis\": \"---\\nname: automatic-apis\\ndescription: How to use Harper's automatically generated REST and WebSocket APIs.\\nmetadata:\\n mode: generate\\n sources:\\n - reference/v5/rest/overview.md\\n - reference/v5/rest/websockets.md\\n sourceCommit: b7fbddadd42eb4487190b650a9abc4bcfeef5819\\n inputHash: 8fcf0cfe190e013e\\n---\\n\\n# Automatic APIs\\n\\nInstructions for the agent to follow when enabling and using Harper's automatically generated REST and WebSocket APIs.\\n\\n## When to Use\\n\\nApply this rule when adding REST or WebSocket API access to Harper tables or custom resources. Use it when configuring `config.yaml` to expose endpoints, mapping HTTP methods to resource operations, or implementing real-time WebSocket connections on a resource class.\\n\\n## How It Works\\n\\n1. **Enable the REST plugin**: Add `rest: true` to your application's `config.yaml`. This activates the HTTP REST interface and enables WebSocket support by default.\\n\\n ```yaml\\n rest: true\\n ```\\n\\n To configure optional behavior:\\n\\n ```yaml\\n rest:\\n lastModified: true # enables Last-Modified response header support\\n webSocket: false # disables automatic WebSocket support (enabled by default)\\n ```\\n\\n2. **Export your resource in the schema**: Tables are not exposed by default. Use the `@export` directive in your schema definition to make a table available as a REST endpoint. The exported name defines the base URL path, served on the application HTTP server port (default `9926`).\\n\\n3. **Use the correct URL structure**: The REST interface follows a consistent path convention.\\n\\n | Path | Description |\\n | -------------------------------------------- | ---------------------------------------------------------------------------------- |\\n | `/my-resource` | Returns a description of the resource (e.g., table metadata) |\\n | `/my-resource/` | Trailing slash — represents the full collection; append query parameters to search |\\n | `/my-resource/record-id` | A specific record identified by its primary key |\\n | `/my-resource/record-id/` | Trailing slash — collection of records with the given id prefix |\\n | `/my-resource/record-id/with/multiple/parts` | Record id with multiple path segments |\\n\\n4. **Map HTTP methods to operations**: Each HTTP method maps to a resource method and operation.\\n - **GET** — Retrieve a record or search. Calls `get()`.\\n\\n ```\\n GET /MyTable/123\\n GET /MyTable/?name=Harper\\n GET /MyTable/123.propertyName\\n ```\\n\\n Responses include an `ETag` header. Clients may send `If-None-Match` to receive `304 Not Modified` when the record is unchanged.\\n\\n - **PUT** — Create or replace a record (upsert). Calls `put(record)`. Properties not in the body are removed.\\n\\n ```\\n PUT /MyTable/123\\n Content-Type: application/json\\n\\n { \\\"name\\\": \\\"some data\\\" }\\n ```\\n\\n - **POST** — Create a new record without specifying a primary key. Calls `post(data)`. The assigned key is returned in the `Location` response header.\\n\\n ```\\n POST /MyTable/\\n Content-Type: application/json\\n\\n { \\\"name\\\": \\\"some data\\\" }\\n ```\\n\\n - **PATCH** — Partially update a record, merging only provided properties. Unspecified properties are preserved.\\n\\n ```\\n PATCH /MyTable/123\\n Content-Type: application/json\\n\\n { \\\"status\\\": \\\"active\\\" }\\n ```\\n\\n - **DELETE** — Delete a record or all records matching a query.\\n ```\\n DELETE /MyTable/123\\n DELETE /MyTable/?status=archived\\n ```\\n\\n5. **Access the auto-generated OpenAPI spec**: Harper generates an OpenAPI specification for all exported resources. Retrieve it at:\\n\\n ```\\n GET /openapi\\n ```\\n\\n6. **Connect via WebSocket**: When `rest` is enabled, WebSocket support is on by default. Connect to a resource URL to subscribe to change events for that resource.\\n\\n ```javascript\\n let ws = new WebSocket('wss://server/my-resource/341');\\n ws.onmessage = (event) => {\\n \\tlet data = JSON.parse(event.data);\\n };\\n ```\\n\\n Connecting to `wss://server/my-resource/341` accesses the `my-resource` resource with record id `341` and subscribes to it. When the record changes or a message is published to it, the WebSocket connection receives the update.\\n\\n7. **Implement a custom `connect()` handler**: Override `connect(incomingMessages)` on a resource class to control WebSocket behavior. The method must return an async iterable or generator that produces messages to send to the client.\\n\\n## Examples\\n\\n**Simple echo server using an async generator**:\\n\\n```javascript\\nexport class Echo extends Resource {\\n\\tasync *connect(incomingMessages) {\\n\\t\\tfor await (let message of incomingMessages) {\\n\\t\\t\\tyield message; // echo each message back\\n\\t\\t}\\n\\t}\\n}\\n```\\n\\n**Using the default `connect()` with event-style access and a timer**:\\n\\n```javascript\\nexport class Example extends Resource {\\n\\tconnect(incomingMessages) {\\n\\t\\tlet outgoingMessages = super.connect();\\n\\n\\t\\tlet timer = setInterval(() => {\\n\\t\\t\\toutgoingMessages.send({ greeting: 'hi again!' });\\n\\t\\t}, 1000);\\n\\n\\t\\tincomingMessages.on('data', (message) => {\\n\\t\\t\\toutgoingMessages.send(message); // echo incoming messages\\n\\t\\t});\\n\\n\\t\\toutgoingMessages.on('close', () => {\\n\\t\\t\\tclearInterval(timer);\\n\\t\\t});\\n\\n\\t\\treturn outgoingMessages;\\n\\t}\\n}\\n```\\n\\n**Minimal `config.yaml` enabling REST with WebSocket disabled**:\\n\\n```yaml\\nrest:\\n webSocket: false\\n```\\n\\n## Notes\\n\\n- Tables must be explicitly exported using `@export` in the schema — they are not exposed by default.\\n- `rest: true` is the minimal configuration to enable both REST and WebSocket support. See [real-time-apps.md](real-time-apps.md) for patterns around real-time WebSocket usage.\\n- For full query syntax on `GET` and `DELETE` with query parameters, see [querying-rest-apis.md](querying-rest-apis.md).\\n- The default `connect()` returns an iterable with a `send(message)` method and a `close` event for cleanup on disconnect.\\n- For MQTT over WebSockets, set the sub-protocol header `Sec-WebSocket-Protocol: mqtt`.\\n- In distributed environments, non-retained messages are delivered in the order received per node; retained messages (PUT/updated records) keep only the latest-timestamp version as the winning record across the cluster.\\n- Use the `Content-Type` request header to specify body format and the `Accept` header to request a specific response format.\\n\",\n\t\"caching\": \"---\\nname: caching\\ndescription: How to implement integrated data caching in Harper from external sources.\\nmetadata:\\n mode: generate\\n sources:\\n - learn/developers/caching-with-harper.md\\n sourceCommit: b7fbddadd42eb4487190b650a9abc4bcfeef5819\\n inputHash: 8212a7d7dbbd2b18\\n---\\n\\n# Caching External Data Sources in Harper\\n\\nInstructions for the agent to implement integrated data caching in Harper by wrapping external sources with a cache table and `sourcedFrom`.\\n\\n## When to Use\\n\\nApply this rule when a Harper application needs to cache responses from an external API, microservice, or database to avoid repeated slow or expensive upstream calls. Use it whenever you need to define TTL-based cache expiration, observe ETag-based conditional responses, or manually invalidate cached entries.\\n\\n## How It Works\\n\\n1. **Define a cache table with `expiration`**: In `schema.graphql`, add the `expiration` argument to `@table`. The value is in seconds. Any record older than this threshold is considered stale and will be re-fetched on next access.\\n\\n ```graphql\\n type JokeCache @table(expiration: 60) @export {\\n \\tid: ID @primaryKey\\n \\tsetup: String\\n \\tpunchline: String\\n }\\n ```\\n\\n2. **Wrap the external source in `resources.js`**: Create an object with a `get(id)` method that fetches from the upstream source. Then call `sourcedFrom` on the table to register it.\\n\\n ```javascript\\n const jokeAPI = {\\n \\tasync get(id) {\\n \\t\\tconst response = await fetch(`https://official-joke-api.appspot.com/jokes/${id}`);\\n \\t\\treturn response.json();\\n \\t},\\n };\\n\\n tables.JokeCache.sourcedFrom(jokeAPI);\\n ```\\n\\n Harper's caching behavior after `sourcedFrom` is registered:\\n - A request arrives for `/JokeCache/1`.\\n - Harper checks if the record with id `1` exists in `JokeCache` and is not stale.\\n - If fresh, Harper returns it immediately.\\n - If missing or stale, Harper calls `jokeAPI.get()`, stores the result in `JokeCache`, and returns it.\\n - Multiple simultaneous requests for the same missing or stale record wait on a single upstream call — Harper prevents cache stampedes automatically.\\n\\n3. **Configure plugins in `config.yaml`**: Enable the schema, REST API, and JS resource plugins.\\n\\n ```yaml\\n graphqlSchema:\\n files: 'schema.graphql'\\n rest: true\\n jsResource:\\n files: 'resources.js'\\n ```\\n\\n4. **Observe caching via ETags**: Harper automatically computes an ETag from the record's last-modified timestamp. On the first request you receive a `200` with an `etag` header. Pass that value back in `If-None-Match` on subsequent requests; Harper returns `304 Not Modified` with an empty body if the record is unchanged.\\n\\n ```bash\\n curl -i 'http://localhost:9926/JokeCache/1' \\\\\\n -H 'If-None-Match: \\\"abCDefGHij\\\"'\\n ```\\n\\n5. **Force a cache bypass**: Send `Cache-Control: no-cache` to make Harper skip the local cache and always call the upstream source, regardless of TTL.\\n\\n ```bash\\n curl -i 'http://localhost:9926/JokeCache/1' \\\\\\n -H 'Cache-Control: no-cache'\\n ```\\n\\n6. **Invalidate a cache entry on demand**: Remove `@export` from the schema type, then export a class of the same name in `resources.js` that extends the table and implements a `post` handler calling `this.invalidate(target)`.\\n\\n ```graphql\\n type JokeCache @table(expiration: 60) {\\n \\tid: ID @primaryKey\\n \\tsetup: String\\n \\tpunchline: String\\n }\\n ```\\n\\n ```javascript\\n export class JokeCache extends tables.JokeCache {\\n \\tstatic async post(target, data) {\\n \\t\\tconst body = await data;\\n \\t\\tif (body?.action === 'invalidate') {\\n \\t\\t\\tthis.invalidate(target);\\n \\t\\t\\treturn { status: 200, data: { message: 'invalidated' } };\\n \\t\\t}\\n \\t}\\n }\\n ```\\n\\n Trigger invalidation with a `POST`:\\n\\n ```bash\\n curl -X POST 'http://localhost:9926/JokeCache/1' \\\\\\n -H 'Content-Type: application/json' \\\\\\n -d '{\\\"action\\\": \\\"invalidate\\\"}'\\n ```\\n\\n The next `GET /JokeCache/1` will fetch fresh data from the upstream source regardless of TTL.\\n\\n## Examples\\n\\nComplete `schema.graphql` and `resources.js` for a cached external API with on-demand invalidation:\\n\\n```graphql\\ntype JokeCache @table(expiration: 60) {\\n\\tid: ID @primaryKey\\n\\tsetup: String\\n\\tpunchline: String\\n}\\n```\\n\\n```javascript\\n// resources.js\\n\\nconst jokeAPI = {\\n\\tasync get() {\\n\\t\\tconst id = this.getId();\\n\\t\\tconst response = await fetch(`https://official-joke-api.appspot.com/jokes/${id}`);\\n\\t\\treturn response.json();\\n\\t},\\n};\\n\\ntables.JokeCache.sourcedFrom(jokeAPI);\\n\\nexport class JokeCache extends tables.JokeCache {\\n\\tstatic async post(target, data) {\\n\\t\\tconst body = await data;\\n\\t\\tif (body?.action === 'invalidate') {\\n\\t\\t\\tthis.invalidate(target);\\n\\t\\t\\treturn { status: 200, data: { message: 'invalidated' } };\\n\\t\\t}\\n\\t}\\n}\\n```\\n\\nFirst request — cache miss, upstream is called, `200` returned:\\n\\n```bash\\ncurl -i 'http://localhost:9926/JokeCache/1'\\n```\\n\\nSecond request with ETag — cache hit, `304 Not Modified`:\\n\\n```bash\\ncurl -i 'http://localhost:9926/JokeCache/1' \\\\\\n -H 'If-None-Match: \\\"abCDefGHij\\\"'\\n```\\n\\n## Notes\\n\\n- `expiration` is measured in seconds. Harper also supports separate `eviction` and `scanInterval` arguments on `@table` for fine-grained control over physical record removal.\\n- The `@export` directive on the schema type is not required when you export a Resource class of the same name from `resources.js` — the class export serves as the endpoint registration. See [custom-resources.md](custom-resources.md) for details on building Resource classes.\\n- Harper's REST layer automatically exposes `@export`-ed tables and Resource classes as HTTP endpoints. See [automatic-apis.md](automatic-apis.md) for how endpoints are structured and named.\\n- ETag values include their double quotes as part of the value — include them verbatim when passing the value in `If-None-Match`.\\n- `sourcedFrom` must be called after the table reference (`tables.JokeCache`) is available, which is guaranteed when the call is at the top level of `resources.js`.\\n\",\n\t\"checking-authentication\": \"---\\nname: checking-authentication\\ndescription: How to handle user authentication and sessions in Harper Resources.\\nmetadata:\\n mode: generate\\n sources:\\n - >-\\n reference/v5/resources/resource-api.md#`getCurrentUser(): User |\\n undefined`\\n - reference/v5/resources/resource-api.md#Session and Login from a Resource\\n - reference/v5/security/jwt-authentication.md\\n sourceCommit: b7fbddadd42eb4487190b650a9abc4bcfeef5819\\n inputHash: fdd9ec3b11011490\\n---\\n\\n# Checking Authentication\\n\\nInstructions for the agent to follow when handling user authentication and session management inside Harper Resources.\\n\\n## When to Use\\n\\nApply this rule when implementing authentication checks, login/logout flows, or token issuance inside a custom Resource. Use it any time a Resource needs to identify the current user, establish a session, or issue JWTs to clients. See [custom-resources.md](custom-resources.md) for the general Resource authoring pattern.\\n\\n## How It Works\\n\\n1. **Check the current user** with `getCurrentUser()`. Call it inside any Resource method to retrieve the authenticated user or `undefined` if no user is authenticated. Guard protected endpoints by returning a `401` when the result is `undefined`.\\n\\n ```javascript\\n async get(target) {\\n const user = this.getCurrentUser();\\n if (!user) return new Response(null, { status: 401 });\\n return { username: user.username, role: user.role };\\n }\\n ```\\n\\n The returned object exposes `username`, `role`, and `role.permission` flags.\\n\\n2. **Enable sessions** before using session-based login. Set `authentication.enableSessions: true` in `harperdb-config.yaml`:\\n\\n ```yaml\\n authentication:\\n enableSessions: true\\n ```\\n\\n3. **Access login and session helpers** via `getContext()`. The context object exposes `context.login` and `context.session` for sign-in/out flows.\\n - Call `context.login(username, password)` to verify credentials and establish a session cookie on success.\\n - To end a session, delete it via `context.session.delete(context.session.id)`.\\n\\n4. **Implement sign-in and sign-out Resources** using the context helpers:\\n\\n ```javascript\\n export class SignIn extends Resource {\\n \\tasync post(_target, data) {\\n \\t\\tconst context = this.getContext();\\n \\t\\ttry {\\n \\t\\t\\tawait context.login(data.username, data.password);\\n \\t\\t} catch {\\n \\t\\t\\treturn new Response('Invalid credentials', { status: 403 });\\n \\t\\t}\\n \\t\\treturn new Response('Logged in', { status: 200 });\\n \\t}\\n }\\n\\n export class SignOut extends Resource {\\n \\tasync post() {\\n \\t\\tconst context = this.getContext();\\n \\t\\tif (!context.session) return new Response(null, { status: 401 });\\n \\t\\tawait context.session.delete(context.session.id);\\n \\t\\treturn new Response('Logged out', { status: 200 });\\n \\t}\\n }\\n ```\\n\\n5. **Issue JWTs for non-browser clients** (CLI tools, mobile apps, service-to-service). Cookie-based sessions are intended for browser clients. For other clients, mint tokens programmatically using `server.operation()`:\\n\\n ```javascript\\n import { Resource, server } from 'harper';\\n\\n export class IssueTokens extends Resource {\\n \\tstatic async get(_target, context) {\\n \\t\\tconst { operation_token, refresh_token } = await server.operation(\\n \\t\\t\\t{ operation: 'create_authentication_tokens' },\\n \\t\\t\\tcontext,\\n \\t\\t\\ttrue,\\n \\t\\t);\\n \\t\\treturn { operation_token, refresh_token };\\n \\t}\\n\\n \\tstatic async post(_target, data) {\\n \\t\\tconst { username, password } = await data;\\n \\t\\tif (!username || !password) {\\n \\t\\t\\treturn new Response('username and password required', { status: 400 });\\n \\t\\t}\\n \\t\\tconst { operation_token, refresh_token } = await server.operation({\\n \\t\\t\\toperation: 'create_authentication_tokens',\\n \\t\\t\\tusername,\\n \\t\\t\\tpassword,\\n \\t\\t});\\n \\t\\treturn { operation_token, refresh_token };\\n \\t}\\n }\\n\\n export class RefreshJWT extends Resource {\\n \\tstatic async post(_target, data) {\\n \\t\\tconst { refresh_token } = await data;\\n \\t\\tif (!refresh_token) {\\n \\t\\t\\treturn new Response('refresh_token required', { status: 400 });\\n \\t\\t}\\n \\t\\tconst { operation_token } = await server.operation({\\n \\t\\t\\toperation: 'refresh_operation_token',\\n \\t\\t\\trefresh_token,\\n \\t\\t});\\n \\t\\treturn { operation_token };\\n \\t}\\n }\\n ```\\n\\n Pass `true` as the third argument to `server.operation()` when the operation should run as the current authenticated user. Omit it or pass `false` when the operation supplies its own credentials.\\n\\n6. **Configure JWT token expiry** in `harperdb-config.yaml` under the `authentication` section:\\n\\n ```yaml\\n authentication:\\n operationTokenTimeout: 1d\\n refreshTokenTimeout: 30d\\n ```\\n\\n Duration strings follow the `jsonwebtoken` package format (e.g., `1d`, `12h`, `60m`).\\n\\n## Examples\\n\\n**Protecting a resource endpoint and returning user info:**\\n\\n```javascript\\nasync get(target) {\\n const user = this.getCurrentUser();\\n if (!user) return new Response(null, { status: 401 });\\n return { username: user.username, role: user.role };\\n}\\n```\\n\\n**Full session-based sign-in/sign-out flow:**\\n\\n```javascript\\nexport class SignIn extends Resource {\\n\\tasync post(_target, data) {\\n\\t\\tconst context = this.getContext();\\n\\t\\ttry {\\n\\t\\t\\tawait context.login(data.username, data.password);\\n\\t\\t} catch {\\n\\t\\t\\treturn new Response('Invalid credentials', { status: 403 });\\n\\t\\t}\\n\\t\\treturn new Response('Logged in', { status: 200 });\\n\\t}\\n}\\n\\nexport class SignOut extends Resource {\\n\\tasync post() {\\n\\t\\tconst context = this.getContext();\\n\\t\\tif (!context.session) return new Response(null, { status: 401 });\\n\\t\\tawait context.session.delete(context.session.id);\\n\\t\\treturn new Response('Logged out', { status: 200 });\\n\\t}\\n}\\n```\\n\\n**JWT token refresh endpoint:**\\n\\n```javascript\\nexport class RefreshJWT extends Resource {\\n\\tstatic async post(_target, data) {\\n\\t\\tconst { refresh_token } = await data;\\n\\t\\tif (!refresh_token) {\\n\\t\\t\\treturn new Response('refresh_token required', { status: 400 });\\n\\t\\t}\\n\\t\\tconst { operation_token } = await server.operation({\\n\\t\\t\\toperation: 'refresh_operation_token',\\n\\t\\t\\trefresh_token,\\n\\t\\t});\\n\\t\\treturn { operation_token };\\n\\t}\\n}\\n```\\n\\n## Notes\\n\\n- `getCurrentUser()` and `getContext()` are instance methods; call them with `this` inside non-static Resource methods.\\n- `enableSessions` must be `true` in config before `context.login` or `context.session` will function.\\n- Cookie-based sessions target browser clients. Use JWT issuance via `server.operation()` for all other client types.\\n- When both `operation_token` and `refresh_token` have expired, the client must call `create_authentication_tokens` again with credentials.\\n\",\n\t\"creating-a-fabric-account-and-cluster\": \"---\\nname: creating-a-fabric-account-and-cluster\\ndescription: How to create a Harper Fabric account, organization, and cluster.\\nmetadata:\\n mode: synthesized\\n---\\n\\n# Creating a Harper Fabric Account and Cluster\\n\\nFollow these steps to set up your Harper Fabric environment for deployment.\\n\\n## How It Works\\n\\n1. **Sign Up/In**: Go to [https://fabric.harper.fast/](https://fabric.harper.fast/) and sign up or sign in.\\n2. **Create an Organization**: Create an organization (org) to manage your projects.\\n3. **Create a Cluster**: Create a new cluster. This can be on the free tier, no credit card required.\\n4. **Set Credentials**: During setup, set the cluster username and password to finish configuring it.\\n5. **Get Application URL**: Navigate to the **Config** tab and copy the **Application URL**.\\n6. **Configure Environment**: Update your `.env` file or GitHub Actions secrets with cluster-specific credentials.\\n7. **Next Steps**: See the [deploying-to-harper-fabric](deploying-to-harper-fabric.md) rule for detailed instructions on deploying your application successfully.\\n\\n## Examples\\n\\n### Environment Configuration\\n\\n```bash\\nCLI_TARGET_USERNAME='YOUR_CLUSTER_USERNAME'\\nCLI_TARGET_PASSWORD='YOUR_CLUSTER_PASSWORD'\\nCLI_TARGET='YOUR_CLUSTER_URL'\\n```\\n\",\n\t\"creating-harper-apps\": \"---\\nname: creating-harper-apps\\ndescription: How to initialize a new Harper application using the CLI.\\nmetadata:\\n mode: synthesized\\n---\\n\\n# Creating Harper Applications\\n\\nThe fastest way to start a new Harper project is using the `create-harper` CLI tool. This command\\ninitializes a project with a standard folder structure, essential configuration files, and basic\\nschema definitions.\\n\\n## When to Use\\n\\nUse this command when starting a new Harper application or adding a new Harper microservice to an\\nexisting architecture.\\n\\n## Commands\\n\\nInitialize a project using your preferred package manager:\\n\\n### NPM\\n\\n```bash\\nnpm create harper@latest\\n```\\n\\n### PNPM\\n\\n```bash\\npnpm create harper@latest\\n```\\n\\n### Bun\\n\\n```bash\\nbun create harper@latest\\n```\\n\\n## Options\\n\\nYou can specify the project name and template directly:\\n\\n```bash\\nnpm create harper@latest my-app --template default\\n```\\n\\n## Next Steps\\n\\n1. **Configure Environment**: Set up your `.env` file with local or cloud credentials.\\n2. **Define Schema**: Modify `schema.graphql` to fit your application's data model.\\n3. **Start Development**: Run `npm run dev` to start the local Harper instance.\\n4. **Deploy**: Use `npm run deploy` to push your application to Harper Fabric.\\n\",\n\t\"custom-resources\": \"---\\nname: custom-resources\\ndescription: How to define custom REST endpoints with JavaScript or TypeScript in Harper.\\nmetadata:\\n mode: synthesized\\n---\\n\\n# Custom Resources\\n\\nInstructions for the agent to follow when creating custom resources in Harper.\\n\\n## When to Use\\n\\nUse this skill when the automatic CRUD operations provided by `@table @export` are insufficient, and you need custom logic, third-party API integration, or specialized data handling for your REST endpoints.\\n\\n## How It Works\\n\\n1. **Check if a Custom Resource is Necessary**: Verify if [Automatic APIs](./automatic-apis.md) or [Extending Tables](./extending-tables.md) can satisfy the requirement first.\\n2. **Create the Resource File**: Create a `.ts` or `.js` file in the directory specified by `jsResource` in `config.yaml` (typically `resources/`).\\n3. **Define the Resource Class**: Export a class extending `Resource` from `harper`:\\n\\n ```typescript\\n import { type RequestTargetOrId, Resource } from 'harper';\\n\\n export class MyResource extends Resource {\\n \\tasync get(target?: RequestTargetOrId) {\\n \\t\\treturn { message: 'Hello from custom GET!' };\\n \\t}\\n }\\n ```\\n\\n4. **Implement HTTP Methods**: Add methods like `get`, `post`, `put`, `patch`, or `delete` to handle corresponding requests.\\n5. **Route Nesting and Naming**: You can control the URL structure by how you export your resources:\\n - **Direct Class Export**: `export class Foo extends Resource` creates endpoints at `/Foo/`. Class names are case-sensitive in the URL.\\n - **Nested Objects**: `export const Bar = { Foo };` creates endpoints at `/Bar/Foo/`.\\n - **Lowercase and Hyphens**: Use object keys to define custom paths: `export const bar = { 'foo-baz': Foo };` exposes endpoints at `/bar/foo-baz/`.\\n6. **Access Tables (Optional)**: Import and use the `tables` object to interact with your data:\\n ```typescript\\n import { tables } from 'harper';\\n // ... inside a method\\n const results = await tables.MyTable.list();\\n ```\\n7. **Configure Loading**: Ensure `config.yaml` points to your resource files (e.g., `jsResource: { files: 'resources/*.ts' }`).\\n\",\n\t\"defining-relationships\": \"---\\nname: defining-relationships\\ndescription: How to define and use relationships between tables in Harper using GraphQL.\\nmetadata:\\n mode: synthesized\\n---\\n\\n# Defining Relationships\\n\\nInstructions for the agent to follow when defining relationships between Harper tables.\\n\\n## When to Use\\n\\nUse this skill when you need to link data across different tables, enabling automatic joins and efficient related-data fetching via REST APIs.\\n\\n## How It Works\\n\\n1. **Identify the Relationship Type**: Determine if it's one-to-one, many-to-one, or one-to-many.\\n2. **Use the `@relationship` Directive**: Apply it to a field in your GraphQL schema.\\n - **Many-to-One (Current table holds FK)**: Use `from`.\\n ```graphql\\n type Book @table @export {\\n \\tauthorId: ID\\n \\tauthor: Author @relationship(from: \\\"authorId\\\")\\n }\\n ```\\n - **One-to-Many (Related table holds FK)**: Use `to` and an array type.\\n ```graphql\\n type Author @table @export {\\n \\tbooks: [Book] @relationship(to: \\\"authorId\\\")\\n }\\n ```\\n3. **Query with Relationships**: Use dot syntax in REST API calls for filtering or the `select()` operator for including related data.\\n - Example Filter: `GET /Book/?author.name=Harper`\\n - Example Select: `GET /Author/?select(name,books(title))`\\n\",\n\t\"deploying-to-harper-fabric\": \"---\\nname: deploying-to-harper-fabric\\ndescription: How to deploy a Harper application to the Harper Fabric cloud.\\nmetadata:\\n mode: generate\\n sources:\\n - reference/v5/components/applications.md#Remote Management\\n - >-\\n fabric/cluster-creation-management.md#Connecting the Harper CLI to a\\n Cluster\\n sourceCommit: b7fbddadd42eb4487190b650a9abc4bcfeef5819\\n inputHash: ccdefbbf8f3b8657\\n---\\n\\n# Deploying to Harper Fabric\\n\\nInstructions for the agent to follow when deploying a Harper application to the Harper Fabric cloud using the Harper CLI.\\n\\n## When to Use\\n\\nApply this rule when deploying a Harper application to a remote Harper instance or Harper Fabric cluster. This covers interactive deployments, CI/CD pipelines, and any scenario where the agent must push a local or remote package to a target environment.\\n\\n## How It Works\\n\\n1. **Authenticate with the remote target**: Run `harper login` once to store an authentication token. The CLI writes `HARPER_CLI_TARGET` to a local `.env` so subsequent commands do not need credentials repeated. Find the **Application URL** on the cluster's **Config → Overview** page (see [creating-a-fabric-account-and-cluster.md](creating-a-fabric-account-and-cluster.md)).\\n\\n ```bash\\n harper login <Application URL>\\n # Provide cluster username and password when prompted\\n ```\\n\\n2. **Deploy the application**: Run `harper deploy` with the required parameters. After logging in, no credentials are needed inline.\\n\\n ```bash\\n harper deploy \\\\\\n project=<name> \\\\\\n package=<package> \\\\\\n target=<remote> \\\\\\n restart=true \\\\\\n replicated=true\\n ```\\n\\n3. **Choose a package source**: Set the `package` parameter to any valid npm dependency value, or omit it to package and deploy the current local directory.\\n\\n | Value | Effect |\\n | ---------------------------------------------------- | ------------------------------------------------ |\\n | _(omitted)_ | Packages and deploys the current local directory |\\n | `\\\"@harperdb/status-check\\\"` | npm package |\\n | `\\\"HarperDB/status-check\\\"` | GitHub repo (short form) |\\n | `\\\"https://github.com/HarperDB/status-check\\\"` | GitHub repo (full URL) |\\n | `\\\"git+ssh://git@github.com:HarperDB/secret-app.git\\\"` | Private repo via SSH |\\n | `\\\"https://example.com/application.tar.gz\\\"` | Remote tarball |\\n\\n For git tags, use the `semver` directive for reliable versioning:\\n\\n ```\\n HarperDB/application-template#semver:v1.0.0\\n ```\\n\\n4. **Authenticate for CI/CD pipelines**: Use environment variables instead of interactive login. Set credentials before running `harper deploy`.\\n\\n ```bash\\n export HARPER_CLI_USERNAME=<username>\\n export HARPER_CLI_PASSWORD=<password>\\n harper deploy \\\\\\n project=<name> \\\\\\n package=<package> \\\\\\n target=<remote> \\\\\\n restart=true \\\\\\n replicated=true\\n ```\\n\\n5. **Register SSH keys for private repos**: Before deploying from an SSH-based private repository, use the Add SSH Key operation to register the key with the remote instance.\\n\\n## Examples\\n\\n**Interactive login then deploy (recommended):**\\n\\n```bash\\n# Log in once\\nharper login <remote>\\n# Provide your username and password when prompted\\n\\n# Subsequently deploy without credentials\\nharper deploy \\\\\\n project=<name> \\\\\\n package=<package> \\\\\\n target=<remote> \\\\\\n restart=true \\\\\\n replicated=true\\n```\\n\\n**Deploy with inline credentials (not recommended for production):**\\n\\n```bash\\nharper deploy \\\\\\n project=<name> \\\\\\n package=<package> \\\\\\n username=<username> \\\\\\n password=<password> \\\\\\n target=<remote> \\\\\\n restart=true \\\\\\n replicated=true\\n```\\n\\n**Deploy a specific GitHub release by semver tag:**\\n\\n```bash\\nharper deploy \\\\\\n project=my-app \\\\\\n package=\\\"HarperDB/application-template#semver:v1.0.0\\\" \\\\\\n target=<remote> \\\\\\n restart=true \\\\\\n replicated=true\\n```\\n\\n## Notes\\n\\n- Always prefer `harper login` for interactive use and environment variables (`HARPER_CLI_USERNAME`, `HARPER_CLI_PASSWORD`) for CI/CD. Avoid inline `username`/`password` parameters in production.\\n- Omitting `package` causes the CLI to package the current local directory. Specifying a local file path creates a symlink, so changes are picked up between restarts without redeploying.\\n- Harper generates a `package.json` from component configurations and resolves dependencies using a form of `npm install`.\\n- For SSH-based private repos, register keys with the Add SSH Key operation before deploying.\\n\",\n\t\"extending-tables\": \"---\\nname: extending-tables\\ndescription: How to add custom logic to automatically generated table resources in Harper.\\nmetadata:\\n mode: synthesized\\n---\\n\\n# Extending Tables\\n\\nInstructions for the agent to follow when extending table resources in Harper.\\n\\n## When to Use\\n\\nUse this skill when you need to add custom validation, side effects (like webhooks), data transformation, or custom access control to the standard CRUD operations of a Harper table.\\n\\n## How It Works\\n\\n1. **Define the Table in GraphQL**: In your `.graphql` schema, define the table using the `@table` directive. **Do not** use `@export` if you plan to extend it.\\n ```graphql\\n type MyTable @table {\\n \\tid: ID @primaryKey\\n \\tname: String\\n }\\n ```\\n2. **Create the Extension File**: Create a `.ts` file in your `resources/` directory.\\n3. **Extend the Table Resource**: Export a class that extends `tables.YourTableName`:\\n\\n ```typescript\\n import { type RequestTargetOrId, tables } from 'harper';\\n\\n export class MyTable extends tables.MyTable {\\n \\tasync post(target: RequestTargetOrId, record: any) {\\n \\t\\t// Custom logic here\\n \\t\\tif (!record.name) {\\n \\t\\t\\tthrow new Error('Name required');\\n \\t\\t}\\n \\t\\treturn super.post(target, record);\\n \\t}\\n }\\n ```\\n\\n4. **Override Methods**: Override `get`, `post`, `put`, `patch`, or `delete` as needed. Always call `super[method]` to maintain default Harper functionality unless you intend to replace it entirely.\\n5. **Implement Logic**: Use overrides for validation, side effects, or transforming data before/after database operations.\\n\",\n\t\"handling-binary-data\": \"---\\nname: handling-binary-data\\ndescription: How to store and serve binary data like images or audio in Harper.\\nmetadata:\\n mode: synthesized\\n---\\n\\n# Handling Binary Data\\n\\nInstructions for the agent to follow when handling binary data in Harper.\\n\\n## When to Use\\n\\nUse this skill when you need to store binary files (images, audio, etc.) in the database or serve them back to clients via REST endpoints.\\n\\n## How It Works\\n\\n1. **Store Binary Data**: In your resource's `post` or `put` method, convert incoming data to Buffers and then to Blobs using `createBlob` from Harper's globals. Include the MIME type if available:\\n\\n ```typescript\\n async post(target, record) {\\n if (record.data) {\\n record.data = createBlob(Buffer.from(record.data, record.encoding || 'base64'), {\\n type: record.contentType || 'application/octet-stream',\\n });\\n }\\n return super.post(target, record);\\n }\\n ```\\n\\n2. **Serve Binary Data**: In your resource's `get` method, return a response object with the appropriate `Content-Type` and the binary data in the `body`:\\n ```typescript\\n async get(target) {\\n const record = await super.get(target);\\n if (record?.data) {\\n return {\\n status: 200,\\n headers: { 'Content-Type': record.data.type || 'application/octet-stream' },\\n body: record.data,\\n };\\n }\\n return record;\\n }\\n ```\\n3. **Use the Blob Type**: Ensure your GraphQL schema uses the `Blob` scalar for binary fields.\\n\",\n\t\"load-env\": \"---\\nname: load-env\\ndescription: >-\\n How to load environment variables from .env files into a Harper application\\n using the loadEnv plugin.\\nmetadata:\\n mode: generate\\n sources:\\n - reference/v5/environment-variables/overview.md\\n sourceCommit: 42231db17c025a4a455e3d91875fad4084a01cb5\\n inputHash: fe610fc245226357\\n---\\n\\n# Load Environment Variables with loadEnv\\n\\nInstructions for the agent to follow when loading environment variables from `.env` files into a Harper application using the `loadEnv` plugin.\\n\\n## When to Use\\n\\nApply this rule when a Harper application needs to load secrets or configuration values from `.env` files into `process.env` at startup. Use it whenever hardcoding values must be avoided and environment-specific configuration must be supplied to Harper components.\\n\\n## How It Works\\n\\n1. **Declare `loadEnv` in `config.yaml`**: Add `loadEnv` as a top-level key. It is built into Harper and requires no installation.\\n\\n ```yaml\\n loadEnv:\\n files: '.env'\\n ```\\n\\n2. **Place `loadEnv` first**: Always list `loadEnv` before any other components in `config.yaml` so that environment variables are available on `process.env` before dependent components start.\\n\\n ```yaml\\n # config.yaml — loadEnv must come first\\n loadEnv:\\n files: '.env'\\n\\n rest: true\\n\\n myApp:\\n files: './src/*.js'\\n ```\\n\\n3. **Configure the `files` option**: Provide one or more paths or glob patterns pointing to the env files to load. This option is required.\\n\\n4. **Set `override` if needed**: By default, existing environment variables take precedence over values in `.env` files. Set `override: true` to reverse this and have loaded values win.\\n\\n ```yaml\\n loadEnv:\\n files: '.env'\\n override: true\\n ```\\n\\n5. **Load multiple files when required**: Supply a list of files or a glob pattern. Files are loaded in the order specified.\\n ```yaml\\n loadEnv:\\n files:\\n - '.env'\\n - '.env.local'\\n ```\\n or\\n ```yaml\\n loadEnv:\\n files: 'env-vars/*'\\n ```\\n\\n### Configuration Options\\n\\n| Option | Type | Required | Description |\\n| ---------- | -------------------- | -------- | -------------------------------------------------------------------------------------- |\\n| `files` | `string \\\\| string[]` | **Yes** | Path(s) or glob pattern(s) to the env file(s) to load. |\\n| `override` | `boolean` | No | If `true`, loaded values override existing environment variables. Defaults to `false`. |\\n\\n## Examples\\n\\n**Minimal setup — single `.env` file:**\\n\\n```yaml\\nloadEnv:\\n files: '.env'\\n```\\n\\n**Full `config.yaml` with load order, multiple files, and override:**\\n\\n```yaml\\n# config.yaml — loadEnv must come first\\nloadEnv:\\n files:\\n - '.env'\\n - '.env.local'\\n override: true\\n\\nrest: true\\n\\nmyApp:\\n files: './src/*.js'\\n```\\n\\n**Glob pattern:**\\n\\n```yaml\\nloadEnv:\\n files: 'env-vars/*'\\n```\\n\\n## Notes\\n\\n- `loadEnv` is built into Harper — do not install it separately; only declare it in `config.yaml`.\\n- Because Harper is a single-process application, variables loaded onto `process.env` are shared across all components.\\n- Without `override: true`, variables already set in the shell or container environment will not be overwritten by values in `.env` files.\\n- `files` is the only required option; omitting it will produce an invalid configuration.\\n\",\n\t\"logging\": \"---\\nname: logging\\ndescription: >-\\n Best practices for logging in Harper, including console capture, the granular\\n logger interface, and programmatic log retrieval.\\nmetadata:\\n mode: generate\\n sources:\\n - reference/v5/logging/overview.md\\n - reference/v5/logging/api.md\\n sourceCommit: b7fbddadd42eb4487190b650a9abc4bcfeef5819\\n inputHash: 46cd384598304e3b\\n---\\n\\n# Harper Logging\\n\\nInstructions for the agent to follow when implementing logging in Harper applications, including direct logger usage, tagged loggers, and console capture behavior.\\n\\n## When to Use\\n\\nApply this rule when writing any JavaScript component, plugin, or resource that needs to emit structured log entries, filter logs by component, or capture existing `console.log` output into Harper's log system. Use it whenever you need to understand log levels, log entry format, or the `logger` global API.\\n\\n## How It Works\\n\\n1. **Use the `logger` global directly** — `logger` is available in all JavaScript components without any imports. Call the method matching the desired severity level:\\n\\n ```javascript\\n logger.trace('detailed trace message');\\n logger.debug('debug info', { someContext: 'value' });\\n logger.info('informational message');\\n logger.warn('potential issue');\\n logger.error('error occurred', error);\\n logger.fatal('fatal error');\\n logger.notify('server is ready');\\n ```\\n\\n Only entries at or above the configured `logging.level` (or `logging.external.level`) are written to `hdb.log`.\\n\\n2. **Create a tagged logger with `withTag(`** — Call `logger.withTag(tag)` once per module or class to get a `TaggedLogger` scoped to that tag. This prefixes every log entry with the tag, making log output filterable by component.\\n\\n ```javascript\\n const log = logger.withTag('my-resource');\\n ```\\n\\n Because `TaggedLogger` methods for disabled levels are `null`, always use optional chaining (`?.`) when calling them:\\n\\n ```javascript\\n log.debug?.('Fetching record', { id });\\n log.warn?.('Record not found', { id });\\n log.error?.('Failed to update record', err);\\n ```\\n\\n `TaggedLogger` does not have a `withTag()` method.\\n\\n3. **Understand the interface contracts** — `MainLogger` always has all methods defined:\\n\\n ```typescript\\n interface MainLogger {\\n \\ttrace(...messages: any[]): void;\\n \\tdebug(...messages: any[]): void;\\n \\tinfo(...messages: any[]): void;\\n \\twarn(...messages: any[]): void;\\n \\terror(...messages: any[]): void;\\n \\tfatal(...messages: any[]): void;\\n \\tnotify(...messages: any[]): void;\\n \\twithTag(tag: string): TaggedLogger;\\n }\\n ```\\n\\n `TaggedLogger` methods may be `null`:\\n\\n ```typescript\\n interface TaggedLogger {\\n \\ttrace: ((...messages: any[]) => void) | null;\\n \\tdebug: ((...messages: any[]) => void) | null;\\n \\tinfo: ((...messages: any[]) => void) | null;\\n \\twarn: ((...messages: any[]) => void) | null;\\n \\terror: ((...messages: any[]) => void) | null;\\n \\tfatal: ((...messages: any[]) => void) | null;\\n \\tnotify: ((...messages: any[]) => void) | null;\\n }\\n ```\\n\\n4. **Know the log levels** — From least to most severe:\\n\\n | Level | Description |\\n | -------- | -------------------------------------------------------------------- |\\n | `trace` | Highly detailed internal execution tracing. |\\n | `debug` | Diagnostic information useful during development. |\\n | `info` | General operational events. |\\n | `warn` | Potential issues that don't prevent normal operation. |\\n | `error` | Errors that affect specific operations. |\\n | `fatal` | Critical errors causing process termination. |\\n | `notify` | Important operational milestones. Always logged regardless of level. |\\n\\n The default log level is `warn`. Setting a level includes that level and all more-severe levels.\\n\\n5. **Enable console capture when porting existing code** — When `logging.console: true` is set, writes via `console.log`, `console.warn`, `console.error`, etc. are appended verbatim to `hdb.log`. Captured lines do **not** pass through `logger`'s level filter. Prefer `logger` directly in production code so that level filtering and tagging apply. Console capture is intended as a convenience for porting existing code and for debugging.\\n\\n6. **Know where logs are written** — All standard log output goes to `<ROOTPATH>/log/hdb.log` (default: `~/hdb/log/hdb.log`). To also log to `stdout`/`stderr`, set `logging.stdStreams: true`.\\n\\n## Examples\\n\\n### Basic logging in a resource\\n\\n```javascript\\nexport class MyResource extends Resource {\\n\\tasync get(id) {\\n\\t\\tlogger.debug('Fetching record', { id });\\n\\t\\tconst record = await super.get(id);\\n\\t\\tif (!record) {\\n\\t\\t\\tlogger.warn('Record not found', { id });\\n\\t\\t}\\n\\t\\treturn record;\\n\\t}\\n\\n\\tasync put(record) {\\n\\t\\tlogger.info('Updating record', { id: record.id });\\n\\t\\ttry {\\n\\t\\t\\treturn await super.put(record);\\n\\t\\t} catch (err) {\\n\\t\\t\\tlogger.error('Failed to update record', err);\\n\\t\\t\\tthrow err;\\n\\t\\t}\\n\\t}\\n}\\n```\\n\\n### Tagged logging with `withTag()`\\n\\n```javascript\\nconst log = logger.withTag('my-resource');\\n\\nexport class MyResource extends Resource {\\n\\tasync get(id) {\\n\\t\\tlog.debug?.('Fetching record', { id });\\n\\t\\tconst record = await super.get(id);\\n\\t\\tif (!record) {\\n\\t\\t\\tlog.warn?.('Record not found', { id });\\n\\t\\t}\\n\\t\\treturn record;\\n\\t}\\n\\n\\tasync put(record) {\\n\\t\\tlog.info?.('Updating record', { id: record.id });\\n\\t\\ttry {\\n\\t\\t\\treturn await super.put(record);\\n\\t\\t} catch (err) {\\n\\t\\t\\tlog.error?.('Failed to update record', err);\\n\\t\\t\\tthrow err;\\n\\t\\t}\\n\\t}\\n}\\n```\\n\\nTagged entries appear in `hdb.log` with the tag in the header:\\n\\n```\\n2023-03-09T14:25:05.269Z [info] [my-resource]: Updating record\\n```\\n\\n## Notes\\n\\n- All log output is written to `<ROOTPATH>/log/hdb.log`. The `logger` global writes to this file at the configured `logging.external` level.\\n- Log entry format for `logger`: `<timestamp> [<level>] [<thread>/<id>]: <message>`\\n- Log entry format for `TaggedLogger`: `<timestamp> [<level>] [<tag>]: <message>`\\n- `console.log` output is only forwarded to `hdb.log` when `logging.console: true` is explicitly set; it is not forwarded by default.\\n- When logging to standard streams, run Harper in the foreground (`harper`, not `harper start`).\\n- `TaggedLogger` is bound to the configured log level at creation time — always use `?.` on its methods.\\n\",\n\t\"programmatic-table-requests\": \"---\\nname: programmatic-table-requests\\ndescription: How to interact with Harper tables programmatically using the `tables` object.\\nmetadata:\\n mode: synthesized\\n---\\n\\n# Programmatic Table Requests\\n\\nInstructions for the agent to follow when interacting with Harper tables via code.\\n\\n## When to Use\\n\\nUse this skill when you need to perform database operations (CRUD, search, subscribe) from within Harper Resources or scripts.\\n\\n## How It Works\\n\\n1. **Access the Table**: Use the global `tables` object followed by your table name (e.g., `tables.MyTable`).\\n2. **Perform CRUD Operations**:\\n - **Get**: `await tables.MyTable.get(id)` for a single record or `await tables.MyTable.get({ conditions: [...] })` for multiple.\\n - **Create**: `await tables.MyTable.post(record)` (auto-generates ID) or `await tables.MyTable.put(id, record)`.\\n - **Update**: `await tables.MyTable.patch(id, partialRecord)` for partial updates.\\n - **Delete**: `await tables.MyTable.delete(id)`.\\n3. **Use Updatable Records for Atomic Ops**: Call `update(id)` to get a reference, then use `addTo` or `subtractFrom` for atomic increments/decrements:\\n ```typescript\\n const stats = await tables.Stats.update('daily');\\n stats.addTo('viewCount', 1);\\n ```\\n4. **Search and Stream**: Use `search(query)` for efficient streaming of large result sets:\\n ```typescript\\n for await (const record of tables.MyTable.search({ conditions: [...] })) {\\n // process record\\n }\\n ```\\n See the [Query Conditions](#query-conditions) section below for the full query object reference.\\n5. **Real-time Subscriptions**: Use `subscribe(query)` to listen for changes:\\n ```typescript\\n for await (const event of tables.MyTable.subscribe(query)) {\\n \\t// handle event\\n }\\n ```\\n6. **Publish Events**: Use `publish(id, message)` to trigger subscriptions without necessarily persisting data.\\n\\n## Query Conditions\\n\\nWhen passing a query to `search()`, `get()`, or `subscribe()`, use a query object with a `conditions` array.\\n\\n### Condition Object Shape\\n\\n| Property | Description |\\n| ------------ | ------------------------------------------------------------------------------------------ |\\n| `attribute` | Field name, or array of field names to traverse a relationship (e.g., `['brand', 'name']`) |\\n| `value` | The value to compare against |\\n| `comparator` | One of the comparator strings below (default: `equals`) |\\n| `operator` | `and` (default) or `or` — applies to a nested `conditions` block |\\n| `conditions` | Nested array of condition objects for complex AND/OR logic |\\n\\n### Comparator Values\\n\\nUse these exact strings — incorrect comparator names will silently fail or error:\\n\\n| Comparator | Meaning |\\n| -------------------- | ---------------------------------------------------------- |\\n| `equals` | Exact match (default) |\\n| `not_equal` | Not equal |\\n| `greater_than` | `>` |\\n| `greater_than_equal` | `>=` |\\n| `less_than` | `<` |\\n| `less_than_equal` | `<=` |\\n| `starts_with` | String starts with value |\\n| `contains` | String contains value |\\n| `ends_with` | String ends with value |\\n| `between` | Value is between two bounds (pass `value` as `[min, max]`) |\\n\\n### Query Object Parameters\\n\\n| Property | Description |\\n| ------------ | ------------------------------------------------------------------------------------ |\\n| `conditions` | Array of condition objects |\\n| `limit` | Maximum number of records to return |\\n| `offset` | Number of records to skip (for pagination) |\\n| `select` | Array of attribute names to return; supports `$id` and `$updatedtime` |\\n| `sort` | Object with `attribute`, `descending` (bool), and optional `next` for secondary sort |\\n\\n### Examples\\n\\n**Simple filter:**\\n\\n```javascript\\nfor await (const record of tables.Product.search({\\n conditions: [{ attribute: 'price', comparator: 'less_than', value: 100 }],\\n limit: 20,\\n})) { ... }\\n```\\n\\n**AND + nested OR:**\\n\\n```javascript\\nfor await (const record of tables.Product.search({\\n conditions: [\\n { attribute: 'price', comparator: 'less_than', value: 100 },\\n {\\n operator: 'or',\\n conditions: [\\n { attribute: 'rating', comparator: 'greater_than', value: 4 },\\n { attribute: 'featured', value: true },\\n ],\\n },\\n ],\\n})) { ... }\\n```\\n\\n**Relationship traversal:**\\n\\n```javascript\\nfor await (const record of tables.Book.search({\\n conditions: [{ attribute: ['brand', 'name'], comparator: 'equals', value: 'Harper' }],\\n})) { ... }\\n```\\n\\n**Sort and paginate:**\\n\\n```javascript\\nfor await (const record of tables.Product.search({\\n conditions: [{ attribute: 'inStock', value: true }],\\n sort: { attribute: 'price', descending: false },\\n limit: 10,\\n offset: 20,\\n})) { ... }\\n```\\n\\n## Cautions\\n\\nBe very careful when performing updates and deletions! You may be dealing with live production data. The wrong request to delete, without approval from a human, could be devastating to a business. Always use the proper approval process.\\n\",\n\t\"querying-rest-apis\": \"---\\nname: querying-rest-apis\\ndescription: 'How to use query parameters to filter, sort, and paginate Harper REST APIs.'\\nmetadata:\\n mode: generate\\n sources:\\n - reference/v5/rest/querying.md\\n sourceCommit: b7fbddadd42eb4487190b650a9abc4bcfeef5819\\n inputHash: 9f8c981a629ef606\\n---\\n\\n# Querying REST APIs\\n\\nInstructions for the agent to filter, sort, select, and paginate Harper REST API collections using URL query parameters.\\n\\n## When to Use\\n\\nApply this rule when building or modifying code that queries Harper REST endpoints with filtering, sorting, field selection, or pagination. Use it whenever constructing URLs against collection paths exposed by Harper's automatic REST interface (see [automatic-apis.md](automatic-apis.md)).\\n\\n## How It Works\\n\\n1. **Filter by attribute**: Add query parameters matching attribute names and values. The queried attribute must be indexed.\\n\\n ```\\n GET /Product/?category=software\\n GET /Product/?category=software&inStock=true\\n ```\\n\\n2. **Apply comparison operators (FIQL syntax)**: Use FIQL operators directly in query parameter values.\\n\\n | Operator | Meaning |\\n | ------------ | -------------------------------------- |\\n | `==` | Equal |\\n | `=lt=` | Less than |\\n | `=le=` | Less than or equal |\\n | `=gt=` | Greater than |\\n | `=ge=` | Greater than or equal |\\n | `=ne=`, `!=` | Not equal |\\n | `=ct=` | Contains (strings) |\\n | `=sw=` | Starts with (strings) |\\n | `=ew=` | Ends with (strings) |\\n | `=`, `===` | Strict equality (no type conversion) |\\n | `!==` | Strict inequality (no type conversion) |\\n\\n ```\\n GET /Product/?price=gt=100\\n GET /Product/?price=le=20\\n GET /Product/?name==Keyboard*\\n GET /Product/?category=software&price=gt=100&price=lt=200\\n ```\\n\\n For date fields, URL-encode colons as `%3A`:\\n\\n ```\\n GET /Product/?listDate=gt=2017-03-08T09%3A30%3A00.000Z\\n ```\\n\\n3. **Chain conditions for range queries**: Omit the attribute name on the second condition to apply it to the same attribute. Only `gt`/`ge` combined with `lt`/`le` is supported.\\n\\n ```\\n GET /Product/?price=gt=100<=200\\n ```\\n\\n4. **Combine conditions with OR logic**: Use `|` instead of `&`.\\n\\n ```\\n GET /Product/?rating=5|featured=true\\n ```\\n\\n5. **Group conditions**: Use parentheses or square brackets to control order of operations. Prefer square brackets when constructing queries from user input, since standard URI encoding safely encodes `[` and `]`.\\n\\n ```\\n GET /Product/?rating=5|(price=gt=100&price=lt=200)\\n GET /Product/?rating=5&[tag=fast|tag=scalable|tag=efficient]\\n ```\\n\\n Construct grouped queries from JavaScript:\\n\\n ```javascript\\n let url = `/Product/?rating=5&[${tags.map(encodeURIComponent).join('|')}]`;\\n ```\\n\\n6. **Select specific properties with `select(`**: Use `select()` to control which fields are returned.\\n\\n | Syntax | Returns |\\n | -------------------------------------- | ------------------------------------------- |\\n | `?select(property)` | Values of a single property directly |\\n | `?select(property1,property2)` | Objects with only the specified properties |\\n | `?select([property1,property2])` | Arrays of property values |\\n | `?select(property1,)` | Objects with a single specified property |\\n | `?select(property{subProp1,subProp2})` | Nested objects with specific sub-properties |\\n\\n ```\\n GET /Product/?category=software&select(name)\\n GET /Product/?brand.name=Microsoft&select(name,brand{name})\\n ```\\n\\n7. **Limit results with `limit(`**: Use `limit(end)` or `limit(start,end)` to paginate.\\n\\n ```\\n GET /Product/?rating=gt=3&inStock=true&select(rating,name)&limit(20)\\n GET /Product/?rating=gt=3&limit(10,30)\\n ```\\n\\n8. **Sort results with `sort(`**: Use `sort(property)` or `sort(+property,-property,...)`. Prefix `+` or no prefix = ascending; `-` = descending.\\n\\n ```\\n GET /Product/?rating=gt=3&sort(+name)\\n GET /Product/?sort(+rating,-price)\\n ```\\n\\n9. **Query across relationships**: Use dot-syntax to filter by related table attributes. Relationships must be defined in the schema using `@relation`.\\n\\n ```\\n GET /Product/?brand.name=Microsoft\\n GET /Brand/?products.name=Keyboard\\n ```\\n\\n Use `select()` to include relationship attributes in the response (they are not included by default):\\n\\n ```\\n GET /Product/?brand.name=Microsoft&select(name,brand{name})\\n ```\\n\\n10. **Access a specific property by URL**: Append the property name with dot syntax to the record ID. Only works for properties declared in the schema.\\n ```\\n GET /MyTable/123.propertyName\\n ```\\n\\n## Examples\\n\\n**Range filter with select and limit:**\\n\\n```\\nGET /Product/?category=software&price=gt=100&price=lt=200&select(name,price)&limit(20)\\n```\\n\\n**Sort descending with multiple fields:**\\n\\n```\\nGET /Product/?sort(+rating,-price)\\n```\\n\\n**OR logic with grouping:**\\n\\n```\\nGET /Product/?price=lt=100|[rating=5&[tag=fast|tag=scalable|tag=efficient]&inStock=true]\\n```\\n\\n**Relationship join with nested select:**\\n\\n```\\nGET /Product/?brand.name=Microsoft&select(name,brand{name,id})\\n```\\n\\n**Schema defining a relationship for join queries:**\\n\\n```graphql\\ntype Product @table @export {\\n\\tid: Long @primaryKey\\n\\tname: String\\n\\tbrandId: Long @indexed\\n\\tbrand: Brand @relation(from: \\\"brandId\\\")\\n}\\ntype Brand @table @export {\\n\\tid: Long @primaryKey\\n\\tname: String\\n\\tproducts: [Product] @relation(to: \\\"brandId\\\")\\n}\\n```\\n\\n**Many-to-many relationship query:**\\n\\n```graphql\\ntype Product @table @export {\\n\\tid: Long @primaryKey\\n\\tname: String\\n\\tresellerIds: [Long] @indexed\\n\\tresellers: [Reseller] @relation(from: \\\"resellerId\\\")\\n}\\n```\\n\\n```\\nGET /Product/?resellers.name=Cool Shop&select(id,name,resellers{name,id})\\n```\\n\\n**Type conversion with explicit prefix:**\\n\\n```\\nGET /Product/?price==number:123\\nGET /Product/?active==boolean:true\\nGET /Product/?listDate==date:2024-01-05T20%3A07%3A27.955Z\\n```\\n\\n## Notes\\n\\n- Only indexed attributes can be used as the primary filter; additional unindexed attributes can be combined with `&` once at least one indexed attribute is present.\\n- For null value queries, use `?attribute=null`. Indexes must have been created with null indexing support; existing indexes must be removed and re-added to support null queries.\\n- FIQL comparators (`==`, `!=`, `=gt=`, etc.) apply automatic type conversion based on value syntax or schema-declared type. Strict operators (`=`, `===`, `!==`) skip automatic type conversion.\\n- Filtering by a related attribute produces INNER JOIN behavior (only records with a matching related record are returned). Using `select()` on a relationship without a filter produces LEFT JOIN behavior.\\n- The array order of foreign key values in many-to-many relationships is preserved when resolving the relationship.\\n- See [automatic-apis.md](automatic-apis.md) for how Harper tables are automatically exposed as REST endpoints.\\n\",\n\t\"real-time-apps\": \"---\\nname: real-time-apps\\ndescription: How to build real-time features in Harper using WebSockets and Pub/Sub.\\nmetadata:\\n mode: generate\\n sources:\\n - reference/v5/rest/websockets.md\\n sourceCommit: b7fbddadd42eb4487190b650a9abc4bcfeef5819\\n inputHash: a8afd4d3a52f77ba\\n---\\n\\n# Real-Time Apps with WebSockets and Pub/Sub\\n\\nInstructions for the agent to follow when building real-time features in Harper using WebSockets and Pub/Sub.\\n\\n## When to Use\\n\\nApply this rule when implementing any feature that requires real-time bidirectional communication, live data streaming, or push-based updates in a Harper application. This includes chat, live dashboards, sensor feeds, and any scenario where clients must receive resource changes as they happen.\\n\\n## How It Works\\n\\n1. **Enable WebSocket support**: WebSocket support is enabled automatically when the `rest` plugin is enabled. To explicitly disable it, set the following in your config:\\n\\n ```yaml\\n rest:\\n webSocket: false\\n ```\\n\\n2. **Connect a client to a resource**: A WebSocket connection to a resource URL automatically subscribes to that resource. When the record changes or a message is published to it, the connection receives the update.\\n\\n ```javascript\\n let ws = new WebSocket('wss://server/my-resource/341');\\n ws.onmessage = (event) => {\\n \\tlet data = JSON.parse(event.data);\\n };\\n ```\\n\\n `new WebSocket('wss://server/my-resource/341')` accesses the resource defined for `my-resource` with record id `341` and subscribes to it.\\n\\n3. **Implement a custom `connect()` handler**: Override the `connect(incomingMessages)` method on a resource class to control WebSocket behavior. The method must return an async iterable (or generator) that produces messages to send to the client. See [automatic-apis.md](automatic-apis.md) for more on defining resource classes.\\n\\n4. **Use the default `connect()` for event-style access**: Call `super.connect()` to get a streaming iterable that provides:\\n - A `send(message)` method for pushing outgoing messages\\n - A `close` event for cleanup on disconnect\\n\\n5. **Handle message ordering in distributed environments**: Harper delivers messages to local subscribers immediately without inter-node coordination delay.\\n\\n | Message Type | Behavior |\\n | -------------------------------------------------------- | ----------------------------------------------------------------------- |\\n | Non-retained (no `retain` flag) | Every message delivered in order received; suitable for chat |\\n | Retained (published with `retain`, or PUT/updated in DB) | Only the latest-timestamp message is kept; suitable for sensor readings |\\n\\n6. **Use MQTT over WebSockets** when needed by setting the sub-protocol header:\\n ```\\n Sec-WebSocket-Protocol: mqtt\\n ```\\n\\n## Examples\\n\\n**Simple echo server** — override `connect(incomingMessages)` to yield each incoming message back to the client:\\n\\n```javascript\\nexport class Echo extends Resource {\\n\\tasync *connect(incomingMessages) {\\n\\t\\tfor await (let message of incomingMessages) {\\n\\t\\t\\tyield message; // echo each message back\\n\\t\\t}\\n\\t}\\n}\\n```\\n\\n**Custom connect with timer and event-style access** — use `super.connect()` to get the outgoing stream, push periodic messages, echo incoming messages, and clean up on disconnect:\\n\\n```javascript\\nexport class Example extends Resource {\\n\\tconnect(incomingMessages) {\\n\\t\\tlet outgoingMessages = super.connect();\\n\\n\\t\\tlet timer = setInterval(() => {\\n\\t\\t\\toutgoingMessages.send({ greeting: 'hi again!' });\\n\\t\\t}, 1000);\\n\\n\\t\\tincomingMessages.on('data', (message) => {\\n\\t\\t\\toutgoingMessages.send(message); // echo incoming messages\\n\\t\\t});\\n\\n\\t\\toutgoingMessages.on('close', () => {\\n\\t\\t\\tclearInterval(timer);\\n\\t\\t});\\n\\n\\t\\treturn outgoingMessages;\\n\\t}\\n}\\n```\\n\\n## Notes\\n\\n- WebSocket connections target a resource URL path. By default, connecting to a resource subscribes to changes for that resource.\\n- The `connect(incomingMessages)` method **must** return an async iterable or generator; returning a plain value will not work.\\n- `super.connect()` returns a streaming iterable with `send(message)` and a `close` event — use this when you need to push messages outside of the incoming message loop.\\n- For one-way real-time streaming without bidirectional communication, consider Server-Sent Events instead.\\n- For full pub/sub capabilities, Harper also supports MQTT; set `Sec-WebSocket-Protocol: mqtt` to use MQTT over WebSockets.\\n\",\n\t\"schema-design-tooling\": \"---\\nname: schema-design-tooling\\ndescription: >-\\n Best practices for Harper schema design, including core directives and GraphQL\\n tooling configuration.\\nmetadata:\\n mode: generate\\n sources:\\n - reference/v5/database/schema.md#Overview\\n - reference/v5/database/schema.md#Type Directives\\n - reference/v5/database/schema.md#Field Directives\\n sourceCommit: b7fbddadd42eb4487190b650a9abc4bcfeef5819\\n inputHash: 4faa3baed7cfa854\\n---\\n\\n# Schema Design and Tooling\\n\\nInstructions for the agent to follow when designing Harper schemas, applying core directives, and configuring GraphQL tooling.\\n\\n## When to Use\\n\\nApply this rule when creating or modifying Harper schema files, configuring `graphqlSchema` in `config.yaml`, or deciding which directives to apply to tables and fields. Use it any time a component needs tables, indexes, primary keys, or exported endpoints defined.\\n\\n## How It Works\\n\\n1. **Create a GraphQL schema file** with Harper-specific directives. Name it (e.g., `schema.graphql`) and place it in your component directory.\\n\\n ```graphql\\n type Dog @table {\\n \\tid: Long @primaryKey\\n \\tname: String\\n \\tbreed: String\\n \\tage: Int\\n }\\n\\n type Breed @table {\\n \\tid: Long @primaryKey\\n \\tname: String @indexed\\n }\\n ```\\n\\n2. **Register the schema in `config.yaml`** using the `graphqlSchema` plugin key:\\n\\n ```yaml\\n graphqlSchema:\\n files: 'schema.graphql'\\n ```\\n\\n Both plugins and applications can specify schemas this way.\\n\\n3. **Mark every table type with `@table`**. The type name becomes the table name by default. Use optional arguments to override behavior:\\n\\n | Argument | Type | Default | Description |\\n | -------------- | --------- | ----------------------------- | ------------------------------------------------------------- |\\n | `table` | `String` | type name | Override the table name |\\n | `database` | `String` | `\\\"data\\\"` | Database to place the table in |\\n | `expiration` | `Int` | — | Seconds until a record goes stale |\\n | `eviction` | `Int` | `0` | Additional seconds after `expiration` before physical removal |\\n | `scanInterval` | `Int` | `(expiration + eviction) / 4` | Seconds between eviction scans |\\n | `replicate` | `Boolean` | `true` | Enable replication of this table |\\n\\n4. **Designate a primary key on every table** using `@primaryKey`. Primary keys must be unique; duplicate-key inserts are rejected. If no key is provided on insert, Harper auto-generates one:\\n - `String` or `ID` → UUID string\\n - `Int`, `Long`, or `Any` → auto-incrementing integer\\n\\n Prefer `Long` or `Any` for auto-generated numeric keys; `Int` is 32-bit and may be insufficient for large tables.\\n\\n5. **Index fields that need fast querying** with `@indexed`. This is required for filtering by that attribute in REST queries, SQL, or NoSQL operations. If the field value is an array, each element is individually indexed.\\n\\n ```graphql\\n type Product @table {\\n \\tid: Long @primaryKey\\n \\tcategory: String @indexed\\n \\tprice: Float @indexed\\n }\\n ```\\n\\n6. **Expose a table as an external resource endpoint** with `@export`. This makes the table accessible via REST, MQTT, and other interfaces. The optional `name` parameter sets the URL path segment; without it, the type name is used.\\n\\n ```graphql\\n type MyTable @table @export(name: \\\"my-table\\\") {\\n \\tid: Long @primaryKey\\n }\\n ```\\n\\n7. **Restrict extra properties** with `@sealed` when records must not include attributes beyond those declared. By default, Harper allows additional properties.\\n\\n ```graphql\\n type StrictRecord @table @sealed {\\n \\tid: Long @primaryKey\\n \\tname: String\\n }\\n ```\\n\\n8. **Configure expiration, eviction, and scan behavior** together when building caching tables. These three arguments control the full record lifecycle:\\n - `expiration` — record becomes stale; next request triggers a source fetch\\n - `eviction` — additional time after `expiration` before physical removal\\n - `scanInterval` — how often Harper scans for records to evict; clock-aligned, not startup-aligned\\n\\n## Examples\\n\\n**Caching table with tuned expiration:**\\n\\n```graphql\\n# Expire after 5 minutes, evict after 1 hour, scan every 10 minutes\\ntype WeatherCache @table(expiration: 300, eviction: 3300, scanInterval: 600) {\\n\\tid: ID @primaryKey\\n\\ttemperature: Float\\n}\\n```\\n\\n**Table in a named database with expiration and an indexed field:**\\n\\n```graphql\\ntype Event @table(database: \\\"analytics\\\", expiration: 86400) {\\n\\tid: Long @primaryKey\\n\\tname: String @indexed\\n}\\n```\\n\\n**Session cache with auto-expiry:**\\n\\n```graphql\\ntype Session @table(expiration: 3600) {\\n\\tid: Long @primaryKey\\n\\tuserId: String\\n}\\n```\\n\\n**Table with audit timestamps:**\\n\\n```graphql\\ntype Order @table @export(name: \\\"orders\\\") {\\n\\tid: Long @primaryKey\\n\\tcreatedAt: Long @createdTime\\n\\tupdatedAt: Long @updatedTime\\n\\tstatus: String @indexed\\n}\\n```\\n\\n**Overriding the table name and disabling replication:**\\n\\n```graphql\\ntype Product @table(table: \\\"products\\\") {\\n\\tid: Long @primaryKey\\n\\tname: String\\n}\\n\\ntype LocalRecord @table(replicate: false) {\\n\\tid: Long @primaryKey\\n\\tvalue: String\\n}\\n```\\n\\n## Notes\\n\\n- Use unique `database` names in plugins and applications to avoid table naming collisions, since all tables default to the `\\\"data\\\"` database.\\n- Eviction removes non-indexed record data but does **not** remove a record from its secondary indexes. Indexes remain functional for evicted records; Harper fetches the full record from the source on demand when a query matches an evicted record.\\n- `scanInterval` is clock-aligned to the server's local timezone. The server's startup time does not affect when eviction runs.\\n- If replication is disabled on a table and later re-enabled, it will not catch up on writes made while replication was disabled.\\n- Null values are indexed by `@indexed` fields, enabling queries such as `GET /Product/?category=null`.\\n\",\n\t\"serving-web-content\": \"---\\nname: serving-web-content\\ndescription: How to serve static files and integrated Vite/React applications in Harper.\\nmetadata:\\n mode: synthesized\\n---\\n\\n# Serving Web Content\\n\\nInstructions for the agent to follow when serving web content from Harper.\\n\\n## When to Use\\n\\nUse this skill when you need to serve a frontend (HTML, CSS, JS, or a React app) directly from your Harper instance.\\n\\n## How It Works\\n\\n1. **Choose a Method**: Decide between the simple Static Plugin or the integrated Vite Plugin.\\n2. **Option A: Static Plugin (Simple)**:\\n - Add to `config.yaml`:\\n ```yaml\\n static:\\n files: 'web/*'\\n ```\\n - Place files in a `web/` folder in the project root.\\n - Files are served at the root URL (e.g., `http://localhost:9926/index.html`).\\n3. **Option B: Vite Plugin (Advanced/Development)**:\\n - Add to `config.yaml`:\\n ```yaml\\n '@harperfast/vite-plugin':\\n package: '@harperfast/vite-plugin'\\n ```\\n - Ensure `vite.config.ts` and `index.html` are in the project root.\\n\\n ```javascript\\n import vue from '@vitejs/plugin-vue';\\n import path from 'node:path';\\n import { defineConfig } from 'vite';\\n\\n // https://vite.dev/config/\\n export default defineConfig({\\n \\tplugins: [vue()],\\n \\tresolve: {\\n \\t\\talias: {\\n \\t\\t\\t'@': path.resolve(import.meta.dirname, './src'),\\n \\t\\t},\\n \\t},\\n \\tbuild: {\\n \\t\\toutDir: 'web',\\n \\t\\temptyOutDir: true,\\n \\t\\trolldownOptions: {\\n \\t\\t\\texternal: ['**/*.test.*', '**/*.spec.*'],\\n \\t\\t},\\n \\t},\\n });\\n ```\\n\\n - Install dependencies: `npm install --save-dev vite @harperfast/vite-plugin`.\\n - Then `harper run .` will start up Harper and Vite with HMR. Vite does _not_ need to be executed separately.\\n\\n4. **Deploy for Production**: For Vite apps, use a build script to generate static files into a `web/` folder and deploy them using the static handler pattern. For example, these scripts in a package.json can perform the necessary steps:\\n ```json\\n \\\"build\\\": \\\"vite build\\\",\\n \\\"deploy\\\": \\\"rm -Rf deploy && npm run build && mkdir deploy && mv web deploy/ && cp -R deploy-template/* deploy/ && cp -R schemas resources deploy/ && (cd deploy && harper deploy_component . project=web restart=rolling replicated=true) && rm -Rf deploy\\\",\\n ```\\n Then in production, the \\\"Static Plugin\\\" option will performantly and securely serve your assets. `npm create harper@latest` scaffolds all of this for you.\\n\",\n\t\"typescript-type-stripping\": \"---\\nname: typescript-type-stripping\\ndescription: How to run TypeScript files directly in Harper without a build step.\\nmetadata:\\n mode: generate\\n sources:\\n - reference/v5/components/javascript-environment.md#TypeScript Support\\n sourceCommit: b7fbddadd42eb4487190b650a9abc4bcfeef5819\\n inputHash: 4e6bd8b610edd595\\n---\\n\\n# TypeScript Type Stripping in Harper\\n\\nInstructions for the agent to run `.ts` files directly in Harper without a build step using Node.js's built-in type stripping.\\n\\n## When to Use\\n\\nApply this rule when writing Harper resource files in TypeScript. Use it any time you need to reference `.ts` source files from `config.yaml` or import between local TypeScript modules in a Harper project.\\n\\n## How It Works\\n\\n1. **Ensure Node.js version**: Require Node.js 22.6 or later. Type stripping is unavailable on earlier versions.\\n\\n2. **Point `jsResource` at `.ts` files**: The `jsResource` plugin loads both `.js` and `.ts` files. Set its `files` glob in `config.yaml` to target your `.ts` source files:\\n\\n ```yaml\\n jsResource:\\n files: 'resources/*.ts'\\n ```\\n\\n3. **Use explicit `.ts` extensions in local imports**: Node's loader does not resolve `'./helper'` to `'./helper.ts'`, so always include the full extension:\\n\\n ```typescript\\n import { helper } from './helper.ts';\\n ```\\n\\n4. **Stay within type-stripping limits**: Only type annotations and declarations are removed. Do not use enums with runtime values, namespaces with runtime semantics, or any other features that require code transformation beyond type stripping.\\n\\n## Examples\\n\\nA complete Harper resource written in TypeScript, using imports from the `harper` package:\\n\\n```typescript\\nimport { type RequestTargetOrId, Resource, tables } from 'harper';\\n\\nexport class MyResource extends Resource {\\n\\tasync get(target?: RequestTargetOrId): Promise<{ message: string }> {\\n\\t\\treturn { message: 'Hello from TS' };\\n\\t}\\n}\\n```\\n\\nPaired `config.yaml` entry loading the file via `jsResource`:\\n\\n```yaml\\njsResource:\\n files: 'resources/*.ts'\\n```\\n\\n## Notes\\n\\n- No build step or transpiler is required — Harper runs `.ts` files directly.\\n- Type imports (e.g., `import { type RequestTargetOrId }`) from the `harper` package work as usual.\\n- Unsupported TypeScript features include: enums with runtime values, namespaces with runtime semantics, and anything requiring code transformation beyond simple type stripping.\\n\",\n\t\"using-blob-datatype\": \"---\\nname: using-blob-datatype\\ndescription: How to use the Blob data type for efficient binary storage in Harper.\\nmetadata:\\n mode: synthesized\\n---\\n\\n# Using Blob Datatype\\n\\nInstructions for the agent to follow when working with the Blob data type in Harper.\\n\\n## When to Use\\n\\nUse this skill when you need to store unstructured or large binary data (media, documents) that is too large for standard JSON fields. Blobs provide efficient storage and integrated streaming support.\\n\\n## How It Works\\n\\n1. **Define Blob Fields**: In your GraphQL schema, use the `Blob` type:\\n ```graphql\\n type MyTable @table {\\n \\tid: ID @primaryKey\\n \\tdata: Blob\\n }\\n ```\\n2. **Create and Store Blobs**: Use `createBlob()` from Harper's globals to wrap Buffers or Streams:\\n ```javascript\\n import { tables } from 'harper';\\n const blob = createBlob(largeBuffer);\\n await tables.MyTable.put('my-id', { data: blob });\\n ```\\n3. **Use Streaming (Optional)**: For very large files, pass a stream to `createBlob()` to avoid loading the entire file into memory.\\n4. **Read Blob Data**: Retrieve the record and use `.bytes()` or streaming interfaces on the blob field:\\n ```javascript\\n const record = await tables.MyTable.get('my-id');\\n const buffer = await record.data.bytes();\\n ```\\n5. **Ensure Write Completion**: Use `saveBeforeCommit: true` in `createBlob` options if you need the blob fully written before the record is committed.\\n6. **Handle Errors**: Attach error listeners to the blob object to handle streaming failures.\\n\",\n\t\"vector-indexing\": \"---\\nname: vector-indexing\\ndescription: How to enable and query vector indexes for similarity search in Harper.\\nmetadata:\\n mode: generate\\n sources:\\n - reference/v5/database/schema.md#Vector Indexing\\n sourceCommit: b7fbddadd42eb4487190b650a9abc4bcfeef5819\\n inputHash: 3732961c671aac00\\n---\\n\\n# Vector Indexing\\n\\nInstructions for the agent to follow when enabling and querying vector indexes for similarity search in Harper using the HNSW algorithm.\\n\\n## When to Use\\n\\nApply this rule when adding a vector index to a Harper table schema or writing similarity search queries against high-dimensional vector fields. Use it whenever you need approximate nearest-neighbor search, distance-threshold filtering, or distance-scored results.\\n\\n## How It Works\\n\\n1. **Declare the vector index on a `[Float]` field**: Add `@indexed(type: \\\"HNSW\\\")` to any `[Float]` attribute in a `@table` type. See [adding-tables-with-schemas.md](adding-tables-with-schemas.md) for general schema setup.\\n\\n ```graphql\\n type Document @table {\\n \\tid: Long @primaryKey\\n \\ttextEmbeddings: [Float] @indexed(type: \\\"HNSW\\\")\\n }\\n ```\\n\\n2. **Query by nearest neighbors using `sort`**: Call `Document.search()` with a `sort` object containing `attribute` (the indexed field name) and `target` (the query vector). Include `limit` to cap results.\\n\\n ```javascript\\n let results = Document.search({\\n \\tsort: { attribute: 'textEmbeddings', target: searchVector },\\n \\tlimit: 5,\\n });\\n ```\\n\\n3. **Combine with filter conditions**: Add a `conditions` array alongside `sort` to pre-filter records before ranking by similarity.\\n\\n ```javascript\\n let results = Document.search({\\n \\tconditions: [{ attribute: 'price', comparator: 'lt', value: 50 }],\\n \\tsort: { attribute: 'textEmbeddings', target: searchVector },\\n \\tlimit: 5,\\n });\\n ```\\n\\n4. **Filter by distance threshold**: To return only records within a similarity cutoff (without ranking), place `target` directly on the condition alongside `comparator` and `value`. Omit `sort`.\\n\\n ```javascript\\n let results = Document.search({\\n \\tconditions: {\\n \\t\\tattribute: 'textEmbeddings',\\n \\t\\tcomparator: 'lt',\\n \\t\\tvalue: 0.1,\\n \\t\\ttarget: searchVector,\\n \\t},\\n });\\n ```\\n\\n5. **Include computed distance in results**: Use the special `$distance` field in `select` to return the distance from the target vector. Works with both `sort`-based and `conditions`-based queries.\\n\\n ```javascript\\n let results = Document.search({\\n \\tselect: ['name', '$distance'],\\n \\tsort: { attribute: 'textEmbeddings', target: searchVector },\\n \\tlimit: 5,\\n });\\n ```\\n\\n6. **Tune HNSW parameters**: Pass additional parameters to `@indexed(type: \\\"HNSW\\\", ...)` to control index quality and performance.\\n\\n | Parameter | Default | Description |\\n | ---------------------- | ----------------- | --------------------------------------------------------------------------------------------------- |\\n | `distance` | `\\\"cosine\\\"` | Distance function: `\\\"euclidean\\\"` or `\\\"cosine\\\"` (negative cosine similarity) |\\n | `efConstruction` | `100` | Max nodes explored during index construction. Higher = better recall, lower = better performance |\\n | `M` | `16` | Preferred connections per graph layer. Higher = more space, better recall for high-dimensional data |\\n | `optimizeRouting` | `0.5` | Heuristic aggressiveness for omitting redundant connections (0 = off, 1 = most aggressive) |\\n | `mL` | computed from `M` | Normalization factor for level generation |\\n | `efSearchConstruction` | `50` | Max nodes explored during search |\\n\\n## Examples\\n\\n**Schema with custom HNSW parameters:**\\n\\n```graphql\\ntype Document @table {\\n\\tid: Long @primaryKey\\n\\ttextEmbeddings: [Float]\\n\\t\\t@indexed(type: \\\"HNSW\\\", distance: \\\"euclidean\\\", optimizeRouting: 0, efSearchConstruction: 100)\\n}\\n```\\n\\n**Nearest-neighbor search with distance score:**\\n\\n```javascript\\nlet results = Document.search({\\n\\tselect: ['name', '$distance'],\\n\\tsort: { attribute: 'textEmbeddings', target: searchVector },\\n\\tlimit: 5,\\n});\\n```\\n\\n**Distance-threshold filter (no ranking):**\\n\\n```javascript\\nlet results = Document.search({\\n\\tconditions: {\\n\\t\\tattribute: 'textEmbeddings',\\n\\t\\tcomparator: 'lt',\\n\\t\\tvalue: 0.1,\\n\\t\\ttarget: searchVector,\\n\\t},\\n});\\n```\\n\\n## Notes\\n\\n- The default `distance` function is `cosine`. Pass `distance: \\\"euclidean\\\"` to switch.\\n- `efConstruction` controls index build quality; raising it improves recall at the cost of build time.\\n- `$distance` is available in both `sort`-based ranking and `conditions`-based threshold queries.\\n- Use the threshold (`conditions` + `target`) form when you want to bound result quality by a similarity cutoff rather than ranking by similarity.\\n\"\n};\n\n/**\n * The content of the Harper Best Practices SKILL.md.\n */\nexport const skillSummary = \"---\\nname: harper-best-practices\\ndescription: Best practices for building Harper applications, covering schema definition,\\n automatic APIs, authentication, custom resources, and data handling.\\n Triggers on tasks involving Harper database design, API implementation,\\n and deployment.\\nlicense: Apache-2.0\\nmetadata:\\n author: harper\\n version: '1.0.0'\\n---\\n\\n# Harper Best Practices\\n\\nGuidelines for building scalable, secure, and performant applications on Harper. These practices cover everything from initial schema design to advanced deployment strategies.\\n\\n## When to Use\\n\\nReference these guidelines when:\\n\\n- Defining or modifying database schemas\\n- Implementing or extending REST/WebSocket APIs\\n- Handling authentication and session management\\n- Working with custom resources and extensions\\n- Optimizing data storage and retrieval (Blobs, Vector Indexing)\\n- Deploying applications to Harper Fabric\\n\\n## How It Works\\n\\n1. Review the requirements for the task (schema design, API needs, or infrastructure setup).\\n2. Consult the relevant category under \\\"Rule Categories by Priority\\\" to understand the impact of your decisions.\\n3. Apply specific rules from the \\\"Quick Reference\\\" section below by reading their detailed rule files.\\n4. If you're building a new table, prioritize the `schema-` rules.\\n5. If you're extending functionality, consult the `logic-` and `api-` rules.\\n6. Validate your implementation against the `ops-` rules before deployment.\\n\\n## Examples\\n\\nSee the concrete examples embedded in each rule subsection below (GraphQL schemas, REST query patterns, and deployment workflow snippets).\\n\\n<!-- BEGIN GENERATED INDEX -->\\n\\n## Rule Categories by Priority\\n\\n| Priority | Category | Impact | Prefix |\\n| -------- | -------------------- | ------ | --------- |\\n| 1 | Schema & Data Design | HIGH | `schema-` |\\n| 2 | API & Communication | HIGH | `api-` |\\n| 3 | Logic & Extension | MEDIUM | `logic-` |\\n| 4 | Infrastructure & Ops | MEDIUM | `ops-` |\\n\\n## Quick Reference\\n\\n### 1. Schema & Data Design (HIGH)\\n\\n- `adding-tables-with-schemas` — Guidelines for adding tables to a Harper database using GraphQL schemas.\\n- `schema-design-tooling` — Best practices for Harper schema design, including core directives and GraphQL tooling configuration.\\n- `defining-relationships` — How to define and use relationships between tables in Harper using GraphQL.\\n- `vector-indexing` — How to enable and query vector indexes for similarity search in Harper.\\n- `using-blob-datatype` — How to use the Blob data type for efficient binary storage in Harper.\\n- `handling-binary-data` — How to store and serve binary data like images or audio in Harper.\\n\\n### 2. API & Communication (HIGH)\\n\\n- `automatic-apis` — How to use Harper's automatically generated REST and WebSocket APIs.\\n- `querying-rest-apis` — How to use query parameters to filter, sort, and paginate Harper REST APIs.\\n- `real-time-apps` — How to build real-time features in Harper using WebSockets and Pub/Sub.\\n- `checking-authentication` — How to handle user authentication and sessions in Harper Resources.\\n\\n### 3. Logic & Extension (MEDIUM)\\n\\n- `custom-resources` — How to define custom REST endpoints with JavaScript or TypeScript in Harper.\\n- `extending-tables` — How to add custom logic to automatically generated table resources in Harper.\\n- `programmatic-table-requests` — How to interact with Harper tables programmatically using the `tables` object.\\n- `typescript-type-stripping` — How to run TypeScript files directly in Harper without a build step.\\n- `caching` — How to implement integrated data caching in Harper from external sources.\\n\\n### 4. Infrastructure & Ops (MEDIUM)\\n\\n- `deploying-to-harper-fabric` — How to deploy a Harper application to the Harper Fabric cloud.\\n- `creating-a-fabric-account-and-cluster` — How to create a Harper Fabric account, organization, and cluster.\\n- `creating-harper-apps` — How to initialize a new Harper application using the CLI.\\n- `serving-web-content` — How to serve static files and integrated Vite/React applications in Harper.\\n- `logging` — Best practices for logging in Harper, including console capture, the granular logger interface, and programmatic log retrieval.\\n- `load-env` — How to load environment variables from .env files into a Harper application using the loadEnv plugin.\\n\\n<!-- END GENERATED INDEX -->\\n\\n## How to Use\\n\\nRead individual rule files for detailed explanations and code examples:\\n\\n```\\nrules/adding-tables-with-schemas.md\\nrules/schema-design-tooling.md\\nrules/automatic-apis.md\\nrules/creating-harper-apps.md\\nrules/logging.md\\n```\\n\\n## Full Compiled Document\\n\\nFor the complete guide with all rules expanded: `AGENTS.md`\\n\";\n","import { ruleNames } from '@harperfast/skills';\nimport { z } from 'zod';\nexport const inputSchema = z.object({\n skill: z.enum(ruleNames),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'readHarperSkill',\n description: 'Returns documentation for a Harper skill or best practice. Skills provide guidance on developing' +\n ' Harper applications.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { inputSchema } from '@harperfast/agent-tools/tools/readHarperSkill/inputSchema';\nimport { rules } from '@harperfast/skills';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { skill } }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\treturn {\n\t\tsuccess: !!rules[skill],\n\t\tmessage: rules[skill] || `No skill found with the name ${skill}`,\n\t};\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/readHarperSkill/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/readHarperSkill/serverSchema';\nimport { BookIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const readHarperSkill: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: BookIcon,\n\texecute,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n log_name: z.enum(['hdb.log', 'system.log']).default('hdb.log'),\n limit: z.string().or(z.null()).optional(),\n level: z\n .enum(['notify', 'error', 'warn', 'info', 'debug', 'trace', 'undefined'])\n .or(z.null())\n .optional(),\n from: z.string().or(z.null()).optional(),\n until: z.string().or(z.null()).optional(),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'readLogs',\n description: 'Returns the matching logs from the server.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { getReadLog } from '@/integrations/api/instance/status/getReadLog';\nimport { inputSchema } from '@harperfast/agent-tools/tools/readLogs/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input, instanceClientParams }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst data = await getReadLog({\n\t\t\t...instanceClientParams,\n\t\t\tlogFilters: input,\n\t\t\treplicated: instanceClientParams.entityType === 'cluster',\n\t\t});\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/readLogs/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/readLogs/serverSchema';\nimport { LogsIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const readLogs: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: LogsIcon,\n\texecute,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n database: z.string().trim(),\n table: z.string().trim(),\n pageIndex: z.number().default(0),\n pageSize: z.number().default(10),\n primaryKey: z.string(),\n conditions: z.array(z.object({\n search_attribute: z.string(),\n search_type: z.enum([\n 'between',\n 'eq',\n 'equals',\n 'greater_than',\n 'greater_than_equal',\n 'less_than',\n 'less_than_equal',\n 'ne',\n 'not_equal',\n 'starts_with',\n ]),\n search_value: z.any(),\n })),\n sort: z.object({\n attribute: z.string(),\n descending: z.boolean(),\n }),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'readTableRecords',\n description: 'Retrieves some or all table records from a database on the server.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { getSearchByConditions } from '@/integrations/api/instance/database/getSearchByConditions';\nimport { getSearchByValue } from '@/integrations/api/instance/database/getSearchByValue';\nimport { inputSchema } from '@harperfast/agent-tools/tools/readTableRecords/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { database, table, conditions, primaryKey, ...otherParams }, instanceClientParams }: ExecuteParams<\n\t\tz.infer<typeof inputSchema>\n\t>,\n): Promise<Output> {\n\ttry {\n\t\tif (!conditions.length) {\n\t\t\tconst { data } = await getSearchByValue({\n\t\t\t\t...instanceClientParams,\n\t\t\t\tdatabaseName: database,\n\t\t\t\ttableName: table,\n\t\t\t\tonlyIfCached: true,\n\t\t\t\tsearchAttribute: primaryKey,\n\t\t\t\t...otherParams,\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tdata,\n\t\t\t};\n\t\t}\n\t\tconst { data } = await getSearchByConditions({\n\t\t\t...instanceClientParams,\n\t\t\tdatabaseName: database,\n\t\t\ttableName: table,\n\t\t\tonlyIfCached: true,\n\t\t\tconditions,\n\t\t\t...otherParams,\n\t\t});\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/readTableRecords/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/readTableRecords/serverSchema';\nimport { SearchIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const readTableRecords: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: SearchIcon,\n\texecute,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'restartHTTPService',\n description: 'Restarts the HTTP service on the server to allow schema and resource changes to be applied.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { restartInstance } from '@/integrations/api/instance/status/restartInstance';\nimport { inputSchema } from '@harperfast/agent-tools/tools/restartHTTPService/inputSchema';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ instanceClientParams, baseURL }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\tconst toastId = toast.loading(`Restarting HTTP service...`, {\n\t\tdescription: 'This may take a bit.',\n\t\tduration: 300_000,\n\t});\n\n\ttry {\n\t\tawait restartInstance({\n\t\t\t...instanceClientParams,\n\t\t\toperation: 'restart_service',\n\t\t\treplicated: instanceClientParams.entityType === 'cluster',\n\t\t});\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n\n\ttoast.success(`Done!`, {\n\t\tdescription: `HTTP Service restarted!`,\n\t\tid: toastId,\n\t\tduration: 5_000,\n\t});\n\n\treturn {\n\t\tsuccess: true,\n\t\tmessage: `HTTP Service restarted!`,\n\t\twebURL: baseURL,\n\t};\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/restartHTTPService/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/restartHTTPService/serverSchema';\nimport { RefreshCwIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const restartHTTPService: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: RefreshCwIcon,\n\texecute,\n\trequiresApproval: true,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n path: z.string().trim(),\n payload: z.string(),\n encoding: z.enum(['utf8', 'ASCII', 'binary', 'hex', 'base64', 'utf16le', 'latin1', 'ucs2']),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'setComponentFile',\n description: 'Returns the contents of a component file by its full path (which was returned by getComponents)',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { setComponentFile } from '@/integrations/api/instance/applications/setComponentFile';\nimport { emitToListeners } from '@/lib/events/listener';\nimport { queryClient } from '@/react-query/queryClient';\nimport { inputSchema } from '@harperfast/agent-tools/tools/setComponentFile/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { path, encoding, payload }, instanceClientParams }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst parts = path.split('/');\n\t\tconst project = parts.shift()!;\n\t\tconst file = parts.join('/');\n\t\tconst data = await setComponentFile({ ...instanceClientParams, file, project, payload, encoding });\n\n\t\tawait queryClient.invalidateQueries({\n\t\t\tqueryKey: [instanceClientParams.entityId, 'get_component_file', project, file],\n\t\t});\n\t\temitToListeners('ReloadApplicationRootEntries', true);\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/setComponentFile/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/setComponentFile/serverSchema';\nimport { FilePenIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const setComponentFile: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: FilePenIcon,\n\texecute,\n\trequiresApproval: true,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n database: z.string().trim(),\n table: z.string().trim(),\n records: z.array(z.any()),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'updateTableRecords',\n description: 'Updates records in a particular table in a particular database on the server.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { updateTableRecords } from '@/integrations/api/instance/database/updateTableRecords';\nimport { queryClient } from '@/react-query/queryClient';\nimport { inputSchema } from '@harperfast/agent-tools/tools/updateTableRecords/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { database, table, records }, instanceClientParams, params }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst data = await updateTableRecords({\n\t\t\t...instanceClientParams,\n\t\t\tdatabaseName: database,\n\t\t\ttableName: table,\n\t\t\trecords,\n\t\t});\n\t\tconst { databaseName, tableName } = params;\n\t\tawait queryClient.invalidateQueries({ queryKey: [instanceClientParams.entityId, databaseName, tableName] });\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/updateTableRecords/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/updateTableRecords/serverSchema';\nimport { BetweenHorizonalStartIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const updateTableRecords: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: BetweenHorizonalStartIcon,\n\texecute,\n\trequiresApproval: true,\n};\n","import { ToolNames } from '@harperfast/agent-tools/types/toolNames';\nimport type { ClientSideTool } from '../types/clientSideTool';\nimport { collectFeedback } from './collectFeedback/clientTool';\nimport { createApp } from './createApp/clientTool';\nimport { deleteTableRecords } from './deleteTableRecords/clientTool';\nimport { dropComponentFile } from './dropComponentFile/clientTool';\nimport { getAnalytics } from './getAnalytics/clientTool';\nimport { getComponentFile } from './getComponentFile/clientTool';\nimport { getComponents } from './getComponents/clientTool';\nimport { getDescribeAll } from './getDescribeAll/clientTool';\nimport { getDescribeTable } from './getDescribeTable/clientTool';\nimport { getUserContext } from './getUserContext/clientTool';\nimport { insertTableRecords } from './insertTableRecords/clientTool';\nimport { listAnalyticsMetrics } from './listAnalyticsMetrics/clientTool';\nimport { readHarperSkill } from './readHarperSkill/clientTool';\nimport { readLogs } from './readLogs/clientTool';\nimport { readTableRecords } from './readTableRecords/clientTool';\nimport { restartHTTPService } from './restartHTTPService/clientTool';\nimport { setComponentFile } from './setComponentFile/clientTool';\nimport { updateTableRecords } from './updateTableRecords/clientTool';\n\nconst clientTools: Record<ToolNames, ClientSideTool> = {\n\t// Application management.\n\treadHarperSkill,\n\tcreateApp,\n\treadLogs,\n\tgetAnalytics,\n\tlistAnalyticsMetrics,\n\trestartHTTPService,\n\tcollectFeedback,\n\tgetUserContext,\n\t// File manipulation.\n\tgetComponentFile,\n\tgetComponents,\n\tsetComponentFile,\n\tdropComponentFile,\n\t// Database interaction.\n\tgetDescribeAll,\n\tgetDescribeTable,\n\tinsertTableRecords,\n\treadTableRecords,\n\tupdateTableRecords,\n\tdeleteTableRecords,\n};\n\nexport function getTool(name: ToolNames | string): ClientSideTool | undefined {\n\treturn clientTools[name as ToolNames];\n}\n","import { Button } from '@/components/ui/button';\nimport type { ToolNames } from '@harperfast/agent-tools/types/toolNames';\nimport { type DynamicToolUIPart, getToolName, type ToolUIPart } from 'ai';\nimport { Check, ChevronDown, ChevronUp, Info, Loader2, XCircle } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { getTool } from '../tools/clientTools';\n\ninterface ToolInvocationProps {\n\tpart: ToolUIPart | DynamicToolUIPart;\n\tonApprove?: (toolCallId: string) => void;\n\tonDeny?: (toolCallId: string) => void;\n\tonAlwaysApprove?: (toolCallId: string) => void;\n\tisApproving?: boolean;\n}\n\nexport function ToolInvocation({ part, onApprove, onDeny, onAlwaysApprove, isApproving }: ToolInvocationProps) {\n\tconst [isInputExpanded, setIsInputExpanded] = useState(false);\n\tconst [isOutputExpanded, setIsOutputExpanded] = useState(false);\n\tconst toolName = getToolName(part) as ToolNames;\n\tconst tool = getTool(toolName);\n\tconst Icon = tool?.icon || Info;\n\tconst requiresApproval = tool?.requiresApproval;\n\tconst isInputEmpty = useMemo(() => {\n\t\tif (!part.input) { return true; }\n\t\tif (typeof part.input !== 'object') { return false; }\n\t\treturn Object.keys(part.input).length === 0;\n\t}, [part.input]);\n\tconst input = useMemo(() => {\n\t\tconst json = JSON.stringify(part.input, null, '\\t');\n\t\treturn { json, lines: json ? json.split('\\n').length : 0 };\n\t}, [part.input]);\n\tconst output = useMemo(() => {\n\t\tconst json = JSON.stringify(part.output, null, '\\t');\n\t\treturn { json, lines: json ? json.split('\\n').length : 0 };\n\t}, [part.output]);\n\n\treturn (\n\t\t<div className={`tool-invocation ${part.state}`}>\n\t\t\t<div className=\"tool-info\">\n\t\t\t\t<div className=\"tool-name\">\n\t\t\t\t\t<Icon size={14} />\n\t\t\t\t\t<span>{toolName}</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"tool-status\">\n\t\t\t\t\t{part.state === 'input-streaming' && 'Thinking...'}\n\t\t\t\t\t{part.state === 'input-available'\n\t\t\t\t\t\t&& (isApproving ? 'Executing...' : (requiresApproval ? 'Awaiting Approval...' : 'Executing...'))}\n\t\t\t\t\t{part.state === 'output-available'\n\t\t\t\t\t\t&& ((part.output as any)?.error ? <XCircle size={14} className=\"text-destructive\" /> : <Check size={14} />)}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{part.state !== 'input-streaming' && (\n\t\t\t\t<div className=\"tool-io\">\n\t\t\t\t\t{!isInputEmpty && (\n\t\t\t\t\t\t<div className=\"tool-args\">\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-between gap-2 mb-1\">\n\t\t\t\t\t\t\t\t<strong>Input:</strong>\n\t\t\t\t\t\t\t\t{input.lines > 3 && (\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-6 px-2 text-[10px] uppercase tracking-wider text-muted-foreground hover:text-foreground\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => setIsInputExpanded(!isInputExpanded)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{isInputExpanded\n\t\t\t\t\t\t\t\t\t\t\t? (\n\t\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ChevronUp size={12} />\n\t\t\t\t\t\t\t\t\t\t\t\t\tHide\n\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t: (\n\t\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ChevronDown size={12} />\n\t\t\t\t\t\t\t\t\t\t\t\t\tShow\n\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={isInputExpanded ? 'whitespace-pre-wrap' : 'line-clamp-3 overflow-hidden whitespace-pre-wrap'}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{input.json}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{part.state === 'input-available' && requiresApproval && (\n\t\t\t\t\t\t<div className=\"flex gap-2 mt-3 pt-3 border-t\">\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tclassName=\"h-8 text-xs bg-green-600 hover:bg-green-700 text-white\"\n\t\t\t\t\t\t\t\tonClick={() => onApprove?.(part.toolCallId)}\n\t\t\t\t\t\t\t\tdisabled={isApproving}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isApproving ? <Loader2 className=\"mr-2 h-3 w-3 animate-spin\" /> : null}\n\t\t\t\t\t\t\t\tApprove\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\tclassName=\"h-8 text-xs\"\n\t\t\t\t\t\t\t\tonClick={() => onAlwaysApprove?.(part.toolCallId)}\n\t\t\t\t\t\t\t\tdisabled={isApproving}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tAlways Approve\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\tclassName=\"h-8 text-xs\"\n\t\t\t\t\t\t\t\tonClick={() => onDeny?.(part.toolCallId)}\n\t\t\t\t\t\t\t\tdisabled={isApproving}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tDeny\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{part.state === 'output-available' && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{tool?.render\n\t\t\t\t\t\t\t\t? (\n\t\t\t\t\t\t\t\t\ttool.render(part as any)\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: (\n\t\t\t\t\t\t\t\t\t<div className=\"tool-result\">\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-between gap-2 mb-1\">\n\t\t\t\t\t\t\t\t\t\t\t<strong>Result:</strong>\n\t\t\t\t\t\t\t\t\t\t\t{output.lines > 3 && (\n\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-6 px-2 text-[10px] uppercase tracking-wider text-muted-foreground hover:text-foreground\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => setIsOutputExpanded(!isOutputExpanded)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{isOutputExpanded\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ChevronUp size={12} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHide\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ChevronDown size={12} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tShow\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName={isOutputExpanded\n\t\t\t\t\t\t\t\t\t\t\t\t? 'whitespace-pre-wrap'\n\t\t\t\t\t\t\t\t\t\t\t\t: 'line-clamp-3 overflow-hidden whitespace-pre-wrap'}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{output.json}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { isTextUIPart, isToolUIPart, type UIMessage } from 'ai';\nimport { Bot, User } from 'lucide-react';\nimport { motion } from 'motion/react';\nimport { ToolInvocation } from './ToolInvocation';\n\ninterface MessageBubbleProps {\n\tmessage: UIMessage;\n\tonApprove?: (toolCallId: string) => void;\n\tonDeny?: (toolCallId: string) => void;\n\tonAlwaysApprove?: (toolCallId: string) => void;\n\tapprovingToolCallIds?: Set<string>;\n}\n\nexport function MessageBubble(\n\t{ message: m, onApprove, onDeny, onAlwaysApprove, approvingToolCallIds }: MessageBubbleProps,\n) {\n\treturn (\n\t\t<motion.div\n\t\t\tkey={m.id}\n\t\t\tinitial={{ opacity: 0, y: 10 }}\n\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\tclassName={`message-bubble ${m.role === 'user' ? 'user' : 'assistant'}`}\n\t\t>\n\t\t\t<div className=\"avatar\">\n\t\t\t\t{m.role === 'user' ? <User size={18} /> : <Bot size={18} />}\n\t\t\t</div>\n\t\t\t<div className=\"content\">\n\t\t\t\t{m.parts?.map((part, i) => {\n\t\t\t\t\tif (isTextUIPart(part)) {\n\t\t\t\t\t\treturn <div key={i} className=\"text-block\">{part.text}</div>;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isToolUIPart(part)) {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<ToolInvocation\n\t\t\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\t\t\tpart={part}\n\t\t\t\t\t\t\t\tonApprove={onApprove}\n\t\t\t\t\t\t\t\tonDeny={onDeny}\n\t\t\t\t\t\t\t\tonAlwaysApprove={onAlwaysApprove}\n\t\t\t\t\t\t\t\tisApproving={approvingToolCallIds?.has(part.toolCallId)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn null;\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</motion.div>\n\t);\n}\n","import { apiClient } from '@/config/apiClient';\nimport { queryOptions, useQuery } from '@tanstack/react-query';\nimport { useParams } from '@tanstack/react-router';\n\nexport interface ChatUsage {\n\tuserId: string;\n\tyearMonth: string;\n\tusageUSD: number;\n\tmonthlyLimitUSD: number;\n\tusageBarPercent: number;\n}\n\nfunction getChatUsageQueryOptions(orgId: string) {\n\treturn queryOptions({\n\t\tqueryKey: ['getMyUsage', orgId],\n\t\tqueryFn: async (): Promise<ChatUsage> => {\n\t\t\tconst { data } = await apiClient.get(`/Chat/Usage/${orgId}` as any);\n\t\t\treturn data;\n\t\t},\n\t});\n}\n\nexport function useChatUsage() {\n\tconst { organizationId }: { organizationId: string } = useParams({ strict: false });\n\treturn useQuery(getChatUsageQueryOptions(organizationId));\n}\n","import { useChatUsage } from '@/integrations/api/chat/getChatUsage';\n\nexport function UsageBar() {\n\tconst { data, isLoading, error } = useChatUsage();\n\n\tif (isLoading || error || !data) {\n\t\treturn null;\n\t}\n\n\tconst { usageUSD, monthlyLimitUSD, usageBarPercent } = data;\n\n\tconst formatUSD = (amount: number) =>\n\t\tnew Intl.NumberFormat('en-US', {\n\t\t\tstyle: 'currency',\n\t\t\tcurrency: 'USD',\n\t\t}).format(amount);\n\n\treturn (\n\t\t<div className=\"usage-container\">\n\t\t\t<div className=\"usage-info\">\n\t\t\t\t<span>Monthly Org Usage</span>\n\t\t\t\t<span>{formatUSD(usageUSD)} / {formatUSD(monthlyLimitUSD)}</span>\n\t\t\t\t<span>{Math.round(usageBarPercent)}%</span>\n\t\t\t</div>\n\t\t\t<div className=\"usage-bar-bg\">\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"usage-bar-fill\"\n\t\t\t\t\tstyle={{ width: `${usageBarPercent}%` }}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { useEntityRestURL } from '@/config/useEntityRestURL';\nimport { useInstanceClientIdParams } from '@/config/useInstanceClient';\nimport { ClearChat } from '@/features/instance/applications/components/Chat/components/ClearChat';\nimport { useLocalStorage } from '@/hooks/useLocalStorage';\nimport { useSessionStorage } from '@/hooks/useSessionStorage';\nimport { getChatMessages } from '@/integrations/api/chat/getChatMessages';\nimport { getChatTransport } from '@/integrations/api/chat/getChatTransport';\nimport { unique } from '@/lib/arrays/unique';\nimport { LocalStorageKeys } from '@/lib/storage/localStorageKeys';\nimport { useChat } from '@ai-sdk/react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useParams } from '@tanstack/react-router';\nimport { createIdGenerator, lastAssistantMessageIsCompleteWithToolCalls, type ToolCallPart } from 'ai';\nimport { Bot, X } from 'lucide-react';\nimport { SubmitEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { ChatInput } from './components/ChatInput';\nimport { LoadingState } from './components/LoadingState';\nimport { MessageBubble } from './components/MessageBubble';\nimport { UsageBar } from './components/UsageBar';\nimport { getTool } from './tools/clientTools';\nimport './Chat.css';\n\nexport function Chat({ autoFocus, closeChat }: { autoFocus: boolean; closeChat: () => void }) {\n\tconst params = useParams({ strict: false });\n\tconst { organizationId }: { organizationId: string } = params;\n\tconst [input, setInput] = useSessionStorage('ApplicationChat', '');\n\tconst [isLoadingInitial, setIsLoadingInitial] = useState(true);\n\tconst [pendingToolCalls, setPendingToolCalls] = useState<Record<string, ToolCallPart>>({});\n\tconst [approvingToolCallIds, setApprovingToolCallIds] = useState<Set<string>>(new Set());\n\tconst [alwaysApprovedToolsList, setAlwaysApprovedToolsList] = useLocalStorage<string[]>(\n\t\tLocalStorageKeys.ChatAlwaysApprovedTools,\n\t\t[],\n\t);\n\tconst alwaysApprovedTools = new Set(alwaysApprovedToolsList);\n\tconst baseURL = useEntityRestURL();\n\tconst instanceClientParams = useInstanceClientIdParams();\n\tconst queryClient = useQueryClient();\n\tconst { messages, sendMessage, status, addToolOutput, setMessages } = useChat({\n\t\ttransport: getChatTransport(organizationId),\n\t\tgenerateId: createIdGenerator(),\n\t\tsendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCalls,\n\t\tonFinish() {\n\t\t\tvoid queryClient.invalidateQueries({ queryKey: ['getMyUsage'] });\n\t\t},\n\t\tasync onToolCall({ toolCall }) {\n\t\t\t// Check if it's a dynamic tool first for proper type narrowing\n\t\t\tif (toolCall.dynamic) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst tool = getTool(toolCall.toolName);\n\t\t\tif (tool) {\n\t\t\t\tif (tool.requiresApproval && !alwaysApprovedTools.has(toolCall.toolName)) {\n\t\t\t\t\tconst toolCallPart: ToolCallPart = {\n\t\t\t\t\t\ttype: 'tool-call',\n\t\t\t\t\t\ttoolCallId: toolCall.toolCallId,\n\t\t\t\t\t\ttoolName: toolCall.toolName,\n\t\t\t\t\t\tinput: toolCall.input,\n\t\t\t\t\t};\n\t\t\t\t\tsetPendingToolCalls(prev => ({ ...prev, [toolCall.toolCallId]: toolCallPart }));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst output = await tool.execute({ input: toolCall.input, instanceClientParams, baseURL, params });\n\t\t\t\taddToolOutput({\n\t\t\t\t\ttool: toolCall.toolName,\n\t\t\t\t\ttoolCallId: toolCall.toolCallId,\n\t\t\t\t\toutput,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t});\n\n\tconst handleApprove = useCallback(\n\t\tasync (toolCallId: string) => {\n\t\t\tconst toolCall = pendingToolCalls[toolCallId];\n\t\t\tif (!toolCall) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetApprovingToolCallIds(prev => {\n\t\t\t\tconst next = new Set(prev);\n\t\t\t\tnext.add(toolCallId);\n\t\t\t\treturn next;\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\tconst tool = getTool(toolCall.toolName);\n\t\t\t\tif (tool) {\n\t\t\t\t\tconst output = await tool.execute({ input: toolCall.input, instanceClientParams, baseURL, params });\n\t\t\t\t\taddToolOutput({\n\t\t\t\t\t\ttool: toolCall.toolName,\n\t\t\t\t\t\ttoolCallId: toolCall.toolCallId,\n\t\t\t\t\t\toutput,\n\t\t\t\t\t});\n\t\t\t\t\tsetPendingToolCalls(prev => {\n\t\t\t\t\t\tconst next = { ...prev };\n\t\t\t\t\t\tdelete next[toolCallId];\n\t\t\t\t\t\treturn next;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tsetApprovingToolCallIds(prev => {\n\t\t\t\t\tconst next = new Set(prev);\n\t\t\t\t\tnext.delete(toolCallId);\n\t\t\t\t\treturn next;\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[pendingToolCalls, instanceClientParams, baseURL, addToolOutput, params],\n\t);\n\n\tconst handleDeny = useCallback(\n\t\t(toolCallId: string) => {\n\t\t\tconst toolCall = pendingToolCalls[toolCallId];\n\t\t\tif (!toolCall) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\taddToolOutput({\n\t\t\t\ttool: toolCall.toolName,\n\t\t\t\ttoolCallId: toolCall.toolCallId,\n\t\t\t\toutput: { error: 'User denied the tool execution.' },\n\t\t\t});\n\t\t\tsetPendingToolCalls(prev => {\n\t\t\t\tconst next = { ...prev };\n\t\t\t\tdelete next[toolCallId];\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[pendingToolCalls, addToolOutput],\n\t);\n\n\tconst handleAlwaysApprove = useCallback(\n\t\tasync (toolCallId: string) => {\n\t\t\tconst toolCall = pendingToolCalls[toolCallId];\n\t\t\tif (!toolCall) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetAlwaysApprovedToolsList(prev => unique([...prev, toolCall.toolName]));\n\t\t\tawait handleApprove(toolCallId);\n\t\t},\n\t\t[pendingToolCalls, setAlwaysApprovedToolsList, handleApprove],\n\t);\n\n\tuseEffect(() => {\n\t\tconst fetchInitialMessages = async () => {\n\t\t\ttry {\n\t\t\t\tconst data = await getChatMessages();\n\t\t\t\tif (Array.isArray(data)) {\n\t\t\t\t\tsetMessages(data);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Failed to fetch initial messages:', error);\n\t\t\t} finally {\n\t\t\t\tsetIsLoadingInitial(false);\n\t\t\t}\n\t\t};\n\n\t\tvoid fetchInitialMessages();\n\t}, [setMessages]);\n\n\tconst isStreaming = status === 'streaming' || status === 'submitted';\n\n\tconst messagesEndRef = useRef<HTMLDivElement>(null);\n\tuseEffect(() => {\n\t\tmessagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n\t}, [messages]);\n\n\tconst handleChatSubmit = (e: SubmitEvent) => {\n\t\te.preventDefault();\n\t\tif (input.trim() && !isStreaming && !isLoadingInitial) {\n\t\t\tvoid sendMessage({ text: input });\n\t\t\tsetInput('');\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col h-full\">\n\t\t\t<div className=\"flex items-start justify-between gap-6 px-4 py-2.5 border-b border-border bg-card\">\n\t\t\t\t<div className=\"flex flex-col gap-1 min-w-0 flex-1\">\n\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t<Bot className=\"text-primary\" size={20} />\n\t\t\t\t\t\t<span className=\"font-semibold text-foreground\">Harper Agent</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<UsageBar />\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex items-center gap-2 shrink-0\">\n\t\t\t\t\t<ClearChat setMessages={setMessages} />\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={closeChat}\n\t\t\t\t\t\tclassName=\"p-1 hover:bg-accent rounded-md transition-colors text-muted-foreground hover:text-foreground\"\n\t\t\t\t\t\ttitle=\"Close chat\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<X size={20} />\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex-1 overflow-hidden\">\n\t\t\t\t<div className=\"chat-interface h-full w-full\">\n\t\t\t\t\t<div className=\"messages-area\">\n\t\t\t\t\t\t{isLoadingInitial && <LoadingState />}\n\t\t\t\t\t\t{!isLoadingInitial && messages.length === 0 && (\n\t\t\t\t\t\t\t<div className=\"empty-state\">\n\t\t\t\t\t\t\t\t<Bot size={48} />\n\t\t\t\t\t\t\t\t<p>Ask me to create a Harper app!</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{messages.map(m => (\n\t\t\t\t\t\t\t<MessageBubble\n\t\t\t\t\t\t\t\tkey={m.id}\n\t\t\t\t\t\t\t\tmessage={m}\n\t\t\t\t\t\t\t\tonApprove={handleApprove}\n\t\t\t\t\t\t\t\tonDeny={handleDeny}\n\t\t\t\t\t\t\t\tonAlwaysApprove={handleAlwaysApprove}\n\t\t\t\t\t\t\t\tapprovingToolCallIds={approvingToolCallIds}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t<div ref={messagesEndRef} />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<ChatInput\n\t\t\t\t\t\tinput={input}\n\t\t\t\t\t\tsetInput={setInput}\n\t\t\t\t\t\tonSubmit={handleChatSubmit}\n\t\t\t\t\t\tdisabled={isLoadingInitial}\n\t\t\t\t\t\tautoFocus={autoFocus}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,11,12,13,14,15,17,18,21,22,25,26,29,30,33,34,37,38,41,42,45,46,49,50,53,54,57,58,61,62,65,66,70,71,72,75,76,79,80,83,84,87,88,91,92],"mappings":"wnCAcA,IAAM,GAAyB,EAAiB,2BAA4BA,CAJ1E,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,IAAK,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,QAAS,CAAC,EAC7E,CAAC,OAAQ,CAAE,EAAG,eAAgB,IAAK,QAAS,CAAC,EAC7C,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,IAAK,EAAG,IAAK,EAAG,KAAM,GAAI,IAAK,IAAK,QAAS,CAAC,CAEJA,CAAU,ECIhF,GAAO,EAAiB,OAAQC,CARpC,CACE,OACA,CACE,EAAG,yFACH,IAAK,QACP,CACF,CAEoCA,CAAU,ECC1C,GAAY,EAAiB,aAAcC,CAT/C,CAAC,OAAQ,CAAE,EAAG,2BAA4B,IAAK,QAAS,CAAC,EACzD,CACE,OACA,CACE,EAAG,uJACH,IAAK,QACP,CACF,CAE+CA,CAAU,ECLrD,GAAU,EAAiB,WAAYC,CAJ3C,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,QAAS,CAAC,EACzD,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAS,CAAC,EAC1C,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,CAEEA,CAAU,ECYjD,GAAU,EAAiB,WAAYC,CAhB3C,CACE,OACA,CACE,EAAG,8GACH,IAAK,QACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,0BAA2B,IAAK,QAAS,CAAC,EACxD,CACE,OACA,CACE,EAAG,gIACH,IAAK,QACP,CACF,CAE2CA,CAAU,ECNjD,GAAO,EAAiB,OAAQC,CAVpC,CAAC,OAAQ,CAAE,EAAG,SAAU,IAAK,QAAS,CAAC,EACvC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAS,CAAC,EACxC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAS,CAAC,EACxC,CAAC,OAAQ,CAAE,EAAG,SAAU,IAAK,QAAS,CAAC,EACvC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAS,CAAC,EACxC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAS,CAAC,EACxC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAS,CAAC,EACxC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,EACzC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,CAELA,CAAU,ECK1C,GAAqB,EAAiB,uBAAwBC,CAflE,CACE,OACA,CACE,EAAG,sHACH,IAAK,QACP,CACF,EACA,CACE,OACA,CACE,EAAG,sMACH,IAAK,QACP,CACF,CAEkEA,CAAU,ECNxE,GAAO,EAAiB,OAAQ,CATpC,CACE,OACA,CACE,EAAG,kIACH,IAAK,QACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,6BAA8B,IAAK,QAAS,CAAC,CAEvB,CAAU,ECjBhD,eAAsB,IAAoB,CACzC,MAAM,EAAU,OAAO,iBAAwB,CAChD,wBCAA,SAAgB,GAAU,CAAE,eAAwD,CACnF,GAAM,CAAC,EAAY,IAAA,EAAA,EAAA,UAA0B,EAAK,EAkBlD,OACC,EAAA,EAAA,MAAC,SAAD,CACC,KAAK,SACL,UAAU,0BACV,SAAA,EAAA,EAAA,aApBkC,SAAY,CAC3C,MAIJ,GAAc,EAAI,EAClB,GAAI,CACH,MAAM,GAAkB,EACxB,EAAY,CAAC,CAAC,CACf,OAAS,EAAO,CACf,QAAQ,MAAM,wBAAyB,CAAK,CAC7C,QAAU,CACT,EAAc,EAAK,CACpB,CARkB,CASnB,EAAG,CAAC,EAAY,CAAW,CAMhB,EACT,SAAU,EACV,MAAM,sBALP,CAOE,GAAa,EAAA,EAAA,KAAC,GAAD,CAAW,UAAU,eAAe,KAAM,EAAK,CAAA,GAAI,EAAA,EAAA,KAAC,GAAD,CAAQ,KAAM,EAAK,CAAA,EAAE,OAE/E,GAEV,CCjCA,eAAsB,IAAkB,CACvC,GAAM,CAAE,QAAS,MAAM,EAAU,IAAI,iBAAwB,EAC7D,OAAO,CACR,CCJA,IAAIC,GAAS,kBACTC,GAAS,OAAO,IAAID,EAAM,EAC1BE,GAAIC,GACJ,EAAa,MAAM,WAAqB,GAAK,MAAO,GAAKF,GAAQE,GAAI,CASvE,YAAY,CACV,KAAM,EACN,UACA,SACC,CACD,MAAM,CAAO,EACb,KAAKD,IAAM,GACX,KAAK,KAAO,EACZ,KAAK,MAAQ,CACf,CAMA,OAAO,WAAW,EAAO,CACvB,OAAO,EAAY,UAAU,EAAOF,EAAM,CAC5C,CACA,OAAO,UAAU,EAAO,EAAU,CAChC,IAAM,EAAe,OAAO,IAAI,CAAQ,EACxC,OAAwB,OAAO,GAAU,YAAlC,GAA8C,KAAgB,GAAS,OAAO,EAAM,IAAkB,WAAa,EAAM,KAAkB,EACpJ,CACF,EAuDA,SAAS,GAAgB,EAAO,CAU9B,OATI,GAAS,KACJ,gBAEL,OAAO,GAAU,SACZ,EAEL,aAAiB,MACZ,EAAM,QAER,KAAK,UAAU,CAAK,CAC7B,CAGA,IAAIY,GAAQ,0BACRC,GAAU,mBAAmBD,KAC7BE,GAAU,OAAO,IAAID,EAAO,EAC5BE,GAAK,GACL,GAAuB,eAAe,GAAM,EAAY,GAAMD,GAAS,GAAK,CAC9E,YAAY,CACV,UACA,QACA,YACC,CACD,MAAM,CAAE,KAAMF,GAAO,UAAS,OAAM,CAAC,EACrC,KAAKG,IAAO,GACZ,KAAK,SAAW,CAClB,CACA,OAAO,WAAW,EAAO,CACvB,OAAO,EAAW,UAAU,EAAOF,EAAO,CAC5C,CACF,EA0CIW,GAAQ,oBACRC,GAAU,mBAAmBD,KAC7BE,GAAU,OAAO,IAAID,EAAO,EAC5BE,GAAK,GACL,GAAiB,eAAe,GAAM,EAAY,GAAMD,GAAS,GAAK,CACxE,YAAY,CAAE,OAAM,SAAS,CAC3B,MAAM,CACJ,KAAMF,GACN,QAAS,8BAA8B,EAAK;iBACjC,GAAgB,CAAK,IAChC,OACF,CAAC,EACD,KAAKG,IAAO,GACZ,KAAK,KAAO,CACd,CACA,OAAO,WAAW,EAAO,CACvB,OAAO,EAAW,UAAU,EAAOF,EAAO,CAC5C,CACF,EAiGIuB,GAAS,yBACTC,GAAW,mBAAmBD,KAC9BE,GAAW,OAAO,IAAID,EAAQ,EAC9BE,GAAM,GACN,EAAsB,MAAM,WAA8B,GAAO,EAAY,GAAOD,GAAU,GAAM,CACtG,YAAY,CACV,QACA,QACA,WACC,CACD,IAAI,EAAgB,yBAIpB,GAHI,GAAmC,QACrC,GAAiB,QAAQ,EAAQ,SAE9B,GAAmC,YAAgB,GAAmC,SAAW,CACpG,GAAiB,KACjB,IAAM,EAAQ,CAAC,EACX,EAAQ,YACV,EAAM,KAAK,EAAQ,UAAU,EAE3B,EAAQ,UACV,EAAM,KAAK,QAAQ,EAAQ,SAAS,EAAE,EAExC,GAAiB,EAAM,KAAK,IAAI,EAChC,GAAiB,GACnB,CACA,MAAM,CACJ,KAAMF,GACN,QAAS,GAAG,EAAc,WAAW,KAAK,UAAU,CAAK,EAAE;iBAChD,GAAgB,CAAK,IAChC,OACF,CAAC,EACD,KAAKG,IAAQ,GACb,KAAK,MAAQ,EACb,KAAK,QAAU,CACjB,CACA,OAAO,WAAW,EAAO,CACvB,OAAO,EAAW,UAAU,EAAOF,EAAQ,CAC7C,CAYA,OAAO,KAAK,CACV,QACA,QACA,WACC,CAKD,OAHI,EAAqB,WAAW,CAAK,GAAK,EAAM,QAAU,GAAkB,EAAM,SAAiC,QAAY,GAAmC,OAAmB,EAAM,SAAiC,aAAiB,GAAmC,YAAsB,EAAM,SAA+B,WAAe,GAAmC,SACxX,EAEF,IAAI,EAAqB,CAAE,QAAO,QAAO,SAAQ,CAAC,CAC3D,CACF,ECnVM,GAAN,cAAyB,KAAM,CAC7B,YAAY,EAAS,EAAS,CAC5B,MAAM,CAAO,EAAG,KAAK,KAAO,aAAc,KAAK,KAAO,EAAQ,KAAM,KAAK,MAAQ,EAAQ,MAAO,KAAK,MAAQ,EAAQ,MAAO,KAAK,KAAO,EAAQ,IAClJ,CACF,EACM,GAAK,GAAI,GAAK,GAAI,EAAQ,GAChC,SAAS,GAAK,EAAM,CACpB,CACA,SAAS,GAAa,EAAQ,CAC5B,GAAI,OAAO,GAAU,WACnB,MAAU,UACR,iGACF,EACF,GAAM,CAAE,UAAU,GAAM,UAAU,GAAM,UAAU,GAAM,YAAW,iBAAkB,EAAQ,EAAmB,CAAC,EAC7G,EAAyB,EAAG,EAAe,CAAC,EAAG,EAAI,EAAO,GAAI,EAAY,EAAG,EAAW,EAAa,CAAC,EAC1G,SAAS,EAAK,EAAO,CACnB,GAAI,EACF,MAAU,MACR,yHACF,EACF,GAAI,IAAiB,EAAe,CAAC,EAAG,EAAM,WAAW,CAAC,IAAM,KAAO,EAAM,WAAW,CAAC,IAAM,KAAO,EAAM,WAAW,CAAC,IAAM,MAAQ,EAAQ,EAAM,MAAM,CAAC,IAAK,EAAiB,SAAW,EAAG,CAC7L,IAAM,EAAY,EAAa,CAAK,EACpC,IAAc,KAAO,EAAiB,KAAK,CAAS,EAAG,EAAyB,EAAU,QAAS,EAAgB,EACnH,MACF,CACA,GAAI,EAAM,QAAQ;CACrB,IAAM,IAAM,EAAM,QAAQ,IAAI,IAAM,GAAI,CACnC,EAAiB,KAAK,CAAK,EAAG,GAA0B,EAAM,OAAQ,EAAgB,EACtF,MACF,CACA,EAAiB,KAAK,CAAK,EAC3B,IAAM,EAAQ,EAAiB,KAAK,EAAE,EACtC,EAAiB,OAAS,EAAG,EAAyB,EACtD,IAAM,EAAW,EAAa,CAAK,EACnC,IAAa,KAAO,EAAiB,KAAK,CAAQ,EAAG,EAAyB,EAAS,QAAS,EAAgB,CAClH,CACA,SAAS,GAAkB,CACzB,IAAkB,IAAK,KAAM,EAAyB,EAAK,QAAU,IAAkB,EAAa,CAAC,EAAG,EAAiB,OAAS,EAAG,EAAyB,EAAG,EAAK,IAAK,GAAG,EAAO,GAAI,EAAY,EAAG,EAAY,IAAK,GAAG,EAC1N,IAAI,GAAW,6CAA6C,EAAc,aAAc,CACtF,KAAM,0BACR,CAAC,CACH,GACF,CACA,SAAS,EAAa,EAAO,CAC3B,IAAI,EAAc,EAClB,GAAI,EAAM,QAAQ,IAAI,IAAM,GAAI,CAC9B,IAAI,EAAU,EAAM,QAAQ;EAC/B,CAAW,EACR,KAAO,IAAY,IAAM,CACvB,GAAI,IAAgB,EAAS,CAC3B,EAAY,GAAK,EAAQ,CAAE,KAAI,MAAO,EAAW,MAAK,CAAC,EAAG,EAAK,IAAK,GAAG,EAAO,GAAI,EAAY,EAAG,EAAY,IAAK,GAAG,EAAc,EAAU,EAAG,EAAU,EAAM,QAAQ;EAC/K,CAAW,EACJ,QACF,CACA,IAAM,EAAgB,EAAM,WAAW,CAAW,EAClD,GAAI,GAAa,EAAO,EAAa,CAAa,EAAG,CACnD,IAAM,EAAa,EAAM,WAAW,EAAc,CAAC,IAAM,EAAQ,EAAc,EAAI,EAAc,EAAG,EAAQ,EAAM,MAAM,EAAY,CAAO,EAC3I,GAAI,IAAc,GAAK,EAAM,WAAW,EAAU,CAAC,IAAM,GAAI,CAC3D,EAAQ,CAAE,KAAI,MAAO,EAAW,KAAM,CAAM,CAAC,EAAG,EAAK,IAAK,GAAG,EAAO,GAAI,EAAY,IAAK,GAAG,EAAc,EAAU,EAAG,EAAU,EAAM,QAAQ;EACxJ,CAAW,EACF,QACF,CACA,EAAO,IAAc,EAAI,EAAQ,GAAG,EAAK;EACjD,IAAS,GACH,MAAO,GAAc,EAAO,EAAa,CAAa,EAAI,EAAY,EAAM,MAC1E,EAAM,WAAW,EAAc,CAAC,IAAM,EAAQ,EAAc,EAAI,EAAc,EAC9E,CACF,GAAK,IAAK,GAAI,EAAU,EAAO,EAAa,CAAO,EACnD,EAAc,EAAU,EAAG,EAAU,EAAM,QAAQ;EACxD,CAAW,CACR,CACA,OAAO,EAAM,MAAM,CAAW,CAChC,CACA,KAAO,EAAc,EAAM,QAAU,CACnC,IAAM,EAAU,EAAM,QAAQ,KAAM,CAAW,EAAG,EAAU,EAAM,QAAQ;EAC7E,CAAW,EACJ,EAAU,GACd,GAAI,IAAY,IAAM,IAAY,GAAK,EAAU,EAAU,EAAU,EAAU,EAAU,IAAY,GAAuE,IAAY,KAAO,EAAU,GAA/F,AAA8C,EAA9C,IAAY,EAAM,OAAS,EAAc,GAAe,EAAiD,IAAY,GAC7N,MACF,EAAU,EAAO,EAAa,CAAO,EAAG,EAAc,EAAU,EAAG,EAAM,WAAW,EAAc,CAAC,IAAM,IAAM,EAAM,WAAW,CAAW,IAAM,IAAM,GACzJ,CACA,OAAO,EAAM,MAAM,CAAW,CAChC,CACA,SAAS,EAAU,EAAO,EAAO,EAAK,CACpC,GAAI,IAAU,EAAK,CACjB,GAAc,EACd,MACF,CACA,IAAM,EAAgB,EAAM,WAAW,CAAK,EAC5C,GAAI,GAAa,EAAO,EAAO,CAAa,EAAG,CAC7C,IAAM,EAAa,EAAM,WAAW,EAAQ,CAAC,IAAM,EAAQ,EAAQ,EAAI,EAAQ,EAAG,EAAS,EAAM,MAAM,EAAY,CAAG,EACtH,EAAO,IAAc,EAAI,EAAS,GAAG,EAAK;EAC9C,IAAU,IACN,MACF,CACA,GAAI,GAAc,EAAO,EAAO,CAAa,EAAG,CAC9C,EAAY,EAAM,MAAM,EAAM,WAAW,EAAQ,CAAC,IAAM,EAAQ,EAAQ,EAAI,EAAQ,EAAG,CAAG,GAAK,IAAK,GACpG,MACF,CACA,GAAI,IAAkB,KAAO,EAAM,WAAW,EAAQ,CAAC,IAAM,KAAO,EAAM,WAAW,EAAQ,CAAC,IAAM,GAAI,CACtG,IAAM,EAAS,EAAM,MAAM,EAAM,WAAW,EAAQ,CAAC,IAAM,EAAQ,EAAQ,EAAI,EAAQ,EAAG,CAAG,EAC7F,EAAK,EAAO,SAAS,IAAI,EAAI,IAAK,GAAI,EACtC,MACF,CACA,GAAI,IAAkB,GAAI,CACpB,GAEF,EADc,EAAM,MAAM,EAAO,CACnB,EAAE,MAAM,EAAM,WAAW,EAAQ,CAAC,IAAM,EAAQ,EAAI,CAAC,CAAC,EAEtE,MACF,CACA,IAAM,EAAO,EAAM,MAAM,EAAO,CAAG,EAAG,EAAsB,EAAK,QAAQ,GAAG,EAC5E,GAAI,IAAwB,GAAI,CAC9B,EAAa,EAAM,GAAI,CAAI,EAC3B,MACF,CACA,IAAM,EAAQ,EAAK,MAAM,EAAG,CAAmB,EAAG,EAAS,EAAK,WAAW,EAAsB,CAAC,IAAM,EAAQ,EAAI,EACpH,EAAa,EADkH,EAAK,MAAM,EAAsB,CACxI,EAAG,CAAI,CACjC,CACA,SAAS,EAAa,EAAO,EAAO,EAAM,CACxC,OAAQ,EAAR,CACE,IAAK,QACH,EAAY,GAAS,IAAK,GAC1B,MACF,IAAK,OACH,EAAO,IAAc,EAAI,EAAQ,GAAG,EAAK;EAC/C,IAAS,IACH,MACF,IAAK,KACH,EAAK,EAAM,SAAS,IAAI,EAAI,IAAK,GAAI,EACrC,MACF,IAAK,QACH,QAAQ,KAAK,CAAK,EAAI,EAAQ,SAAS,EAAO,EAAE,CAAC,EAAI,EACnD,IAAI,GAAW,6BAA6B,EAAM,GAAI,CACpD,KAAM,gBACN,QACA,MACF,CAAC,CACH,EACA,MACF,QACE,EACE,IAAI,GACF,kBAAkB,EAAM,OAAS,GAAK,GAAG,EAAM,MAAM,EAAG,EAAE,EAAE,QAAU,EAAM,GAC5E,CAAE,KAAM,gBAAiB,QAAO,QAAO,MAAK,CAC9C,CACF,EACA,KACJ,CACF,CACA,SAAS,IAAgB,CACvB,EAAY,GAAK,EAAQ,CACvB,KACA,MAAO,EACP,MACF,CAAC,EAAG,EAAK,IAAK,GAAG,EAAO,GAAI,EAAY,EAAG,EAAY,IAAK,EAC9D,CACA,SAAS,EAAM,EAAU,CAAC,EAAG,CAC3B,GAAI,EAAQ,SAAW,EAAiB,OAAS,EAAG,CAClD,IAAM,EAAiB,EAAiB,KAAK,EAAE,EAC/C,EAAU,EAAgB,EAAG,EAAe,MAAM,CACpD,CACA,EAAe,CAAC,EAAG,EAAK,IAAK,GAAG,EAAO,GAAI,EAAY,EAAG,EAAY,IAAK,GAAG,EAAiB,OAAS,EAAG,EAAyB,EAAG,EAAa,CAAC,CACvJ,CACA,MAAO,CAAE,OAAM,OAAM,CACvB,CACA,SAAS,GAAa,EAAO,EAAG,EAAe,CAC7C,OAAO,IAAkB,KAAO,EAAM,WAAW,EAAI,CAAC,IAAM,IAAM,EAAM,WAAW,EAAI,CAAC,IAAM,KAAO,EAAM,WAAW,EAAI,CAAC,IAAM,IAAM,EAAM,WAAW,EAAI,CAAC,IAAM,EACrK,CACA,SAAS,GAAc,EAAO,EAAG,EAAe,CAC9C,OAAO,IAAkB,KAAO,EAAM,WAAW,EAAI,CAAC,IAAM,KAAO,EAAM,WAAW,EAAI,CAAC,IAAM,KAAO,EAAM,WAAW,EAAI,CAAC,IAAM,KAAO,EAAM,WAAW,EAAI,CAAC,IAAM,KAAO,EAAM,WAAW,EAAI,CAAC,IAAM,EAC1M,CCzKA,IAAM,GAAN,cAAsC,eAAgB,CACpD,YAAY,CAAE,UAAS,UAAS,YAAW,iBAAkB,CAAC,EAAG,CAC/D,IAAI,EACJ,MAAM,CACJ,MAAM,EAAY,CAChB,EAAS,GAAa,CACpB,QAAU,GAAU,CAClB,EAAW,QAAQ,CAAK,CAC1B,EACA,QAAQ,EAAO,CACb,OAAO,GAAW,YAAc,EAAQ,CAAK,GAAI,IAAY,aAAe,EAAM,OAAS,6BAA+B,EAAW,MAAM,CAAK,CAClJ,EACA,UACA,YACA,eACF,CAAC,CACH,EACA,UAAU,EAAO,CACf,EAAO,KAAK,CAAK,CACnB,CACF,CAAC,CACH,CACF,EC2II,CAAE,QAAM,SAAS,WAqQjB,GAAqB,CACvB,SACA,OAAO,GACP,WAAW,iEACX,YAAY,KACV,CAAC,IAAM,CACT,IAAM,MAAkB,CACtB,IAAM,EAAiB,EAAS,OAC1B,EAAY,MAAM,CAAI,EAC5B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,IACxB,EAAM,GAAK,EAAS,KAAK,OAAO,EAAI,EAAiB,GAEvD,OAAO,EAAM,KAAK,EAAE,CACtB,EACA,GAAI,GAAU,KACZ,OAAO,EAET,GAAI,EAAS,SAAS,CAAS,EAC7B,MAAM,IAAI,GAAqB,CAC7B,SAAU,YACV,QAAS,kBAAkB,EAAU,sCAAsC,EAAS,GACtF,CAAC,EAEH,UAAa,GAAG,IAAS,IAAY,EAAU,GACjD,EACI,GAAa,EAAkB,EAqGnC,SAAS,EAAiB,EAAS,CACjC,GAAI,GAAW,KACb,MAAO,CAAC,EAEV,IAAM,EAAa,CAAC,EACpB,GAAI,aAAmB,QACrB,EAAQ,SAAS,EAAO,IAAQ,CAC9B,EAAW,EAAI,YAAY,GAAK,CAClC,CAAC,MACI,CACA,MAAM,QAAQ,CAAO,IACxB,EAAU,OAAO,QAAQ,CAAO,GAElC,IAAK,GAAM,CAAC,EAAK,KAAU,EACrB,GAAS,OACX,EAAW,EAAI,YAAY,GAAK,EAGtC,CACA,OAAO,CACT,CA4PA,IAAI,GAAiB,gJACjB,GAAuB,iKAC3B,SAAS,GAAO,EAAM,CACpB,IAAM,EAAM,KAAK,MAAM,CAAI,EAO3B,OANoB,OAAO,GAAQ,WAA/B,GAGA,GAAe,KAAK,CAAI,IAAM,IAAS,GAAqB,KAAK,CAAI,IAAM,GACtE,EAEF,GAAO,CAAG,CACnB,CACA,SAAS,GAAO,EAAK,CACnB,IAAI,EAAO,CAAC,CAAG,EACf,KAAO,EAAK,QAAQ,CAClB,IAAM,EAAQ,EACd,EAAO,CAAC,EACR,IAAK,IAAM,KAAQ,EAAO,CAIxB,GAHI,OAAO,UAAU,eAAe,KAAK,EAAM,WAAW,GAGtD,OAAO,UAAU,eAAe,KAAK,EAAM,aAAa,GAAK,EAAK,cAAgB,MAAQ,OAAO,EAAK,aAAgB,UAAY,OAAO,UAAU,eAAe,KAAK,EAAK,YAAa,WAAW,EACtM,MAAU,YAAY,8CAA8C,EAEtE,IAAK,IAAM,KAAO,EAAM,CACtB,IAAM,EAAQ,EAAK,GACf,GAAS,OAAO,GAAU,UAC5B,EAAK,KAAK,CAAK,CAEnB,CACF,CACF,CACA,OAAO,CACT,CACA,SAAS,GAAgB,EAAM,CAC7B,GAAM,CAAE,mBAAoB,MAC5B,GAAI,CACF,MAAM,gBAAkB,CAC1B,MAAY,CACV,OAAO,GAAO,CAAI,CACpB,CACA,GAAI,CACF,OAAO,GAAO,CAAI,CACpB,QAAU,CACR,MAAM,gBAAkB,CAC1B,CACF,CAYA,SAAS,GAAoC,EAAa,CACxD,GAAI,EAAY,OAAS,UAAY,MAAM,QAAQ,EAAY,IAAI,GAAK,EAAY,KAAK,SAAS,QAAQ,EAAG,CAC3G,EAAY,qBAAuB,GACnC,GAAM,CAAE,cAAe,EACvB,GAAI,GAAc,KAChB,IAAK,IAAM,KAAO,OAAO,KAAK,CAAU,EACtC,EAAW,GAAO,EAAM,EAAW,EAAI,CAG7C,CACI,EAAY,OAAS,OACvB,EAAY,MAAQ,MAAM,QAAQ,EAAY,KAAK,EAAI,EAAY,MAAM,IAAI,CAAK,EAAI,EAAM,EAAY,KAAK,GAE3G,EAAY,OAAS,OACvB,EAAY,MAAQ,EAAY,MAAM,IAAI,CAAK,GAE7C,EAAY,OAAS,OACvB,EAAY,MAAQ,EAAY,MAAM,IAAI,CAAK,GAE7C,EAAY,OAAS,OACvB,EAAY,MAAQ,EAAY,MAAM,IAAI,CAAK,GAEjD,GAAM,CAAE,eAAgB,EACxB,GAAI,GAAe,KACjB,IAAK,IAAM,KAAO,OAAO,KAAK,CAAW,EACvC,EAAY,GAAO,EAAM,EAAY,EAAI,EAG7C,OAAO,CACT,CACA,SAAS,EAAM,EAAK,CAElB,OADI,OAAO,GAAQ,UAAkB,EAC9B,GAAoC,CAAG,CAChD,CAGA,IAAI,GAAiC,OACnC,mDACF,EACI,GAAiB,CACnB,KAAM,IAAK,GACX,aAAc,OACd,SAAU,CAAC,GAAG,EACd,eAAgB,QAChB,aAAc,MACd,aAAc,mBACd,YAAa,UACb,yBAA0B,cAC1B,4BAA6B,GAC7B,6BAA8B,GAC9B,eAAgB,cAChB,aAAc,GACd,YAAa,CAAC,EACd,cAAe,GACf,gBAAiB,SACjB,gBAAiB,GACjB,cAAe,eACf,eAAgB,yBAChB,aAAc,KAChB,EACI,GAAqB,GAAY,OAAO,GAAY,SAAW,CACjE,GAAG,GACH,KAAM,CACR,EAAI,CACF,GAAG,GACH,GAAG,CACL,EAMA,SAAS,GAAc,CACrB,MAAO,CAAC,CACV,CAIA,SAAS,GAAc,EAAK,EAAM,CAEhC,IAAM,EAAM,CACV,KAAM,OACR,EAiBA,OAhBY,EAAI,MAA6B,MAAuB,EAAI,MAA6B,MAA4B,WAAc,EAAsB,SACnK,EAAI,MAAQ,EAAS,EAAI,KAAK,KAAM,CAClC,GAAG,EACH,YAAa,CAAC,GAAG,EAAK,YAAa,OAAO,CAC5C,CAAC,GAEC,EAAI,YACN,EAAI,SAAW,EAAI,UAAU,OAE3B,EAAI,YACN,EAAI,SAAW,EAAI,UAAU,OAE3B,EAAI,cACN,EAAI,SAAW,EAAI,YAAY,MAC/B,EAAI,SAAW,EAAI,YAAY,OAE1B,CACT,CAGA,SAAS,GAAe,EAAK,CAC3B,IAAM,EAAM,CACV,KAAM,UACN,OAAQ,OACV,EACA,GAAI,CAAC,EAAI,OAAQ,OAAO,EACxB,IAAK,IAAM,KAAS,EAAI,OACtB,OAAQ,EAAM,KAAd,CACE,IAAK,MACC,EAAM,UACR,EAAI,QAAU,EAAM,MAEpB,EAAI,iBAAmB,EAAM,MAE/B,MACF,IAAK,MACC,EAAM,UACR,EAAI,QAAU,EAAM,MAEpB,EAAI,iBAAmB,EAAM,MAE/B,MACF,IAAK,aACH,EAAI,WAAa,EAAM,MACvB,KACJ,CAEF,OAAO,CACT,CAGA,SAAS,IAAkB,CACzB,MAAO,CAAE,KAAM,SAAU,CAC3B,CAGA,SAAS,GAAgB,EAAM,EAAM,CACnC,OAAO,EAAS,EAAK,KAAK,KAAM,CAAI,CACtC,CAGA,IAAI,IAAiB,EAAK,IACjB,EAAS,EAAI,UAAU,KAAM,CAAI,EAI1C,SAAS,GAAa,EAAK,EAAM,EAAsB,CACrD,IAAM,EAAW,GAAsD,EAAK,aAC5E,GAAI,MAAM,QAAQ,CAAQ,EACxB,MAAO,CACL,MAAO,EAAS,KAAK,EAAM,IAAM,GAAa,EAAK,EAAM,CAAI,CAAC,CAChE,EAEF,OAAQ,EAAR,CACE,IAAK,SACL,IAAK,mBACH,MAAO,CACL,KAAM,SACN,OAAQ,WACV,EACF,IAAK,cACH,MAAO,CACL,KAAM,SACN,OAAQ,MACV,EACF,IAAK,UACH,OAAO,GAAkB,CAAG,CAChC,CACF,CACA,IAAI,GAAqB,GAAQ,CAC/B,IAAM,EAAM,CACV,KAAM,UACN,OAAQ,WACV,EACA,IAAK,IAAM,KAAS,EAAI,OACtB,OAAQ,EAAM,KAAd,CACE,IAAK,MACH,EAAI,QAAU,EAAM,MACpB,MACF,IAAK,MACH,EAAI,QAAU,EAAM,MACpB,KACJ,CAEF,OAAO,CACT,EAGA,SAAS,GAAgB,EAAM,EAAM,CACnC,MAAO,CACL,GAAG,EAAS,EAAK,UAAU,KAAM,CAAI,EACrC,QAAS,EAAK,aAAa,CAC7B,CACF,CAGA,SAAS,GAAgB,EAAM,EAAM,CACnC,OAAO,EAAK,iBAAmB,QAAU,EAAS,EAAK,OAAO,KAAM,CAAI,EAAI,EAAY,CAC1F,CAGA,SAAS,GAAa,EAAK,CACzB,MAAO,CACL,KAAM,SACN,KAAM,MAAM,KAAK,EAAI,MAAM,CAC7B,CACF,CAGA,IAAI,GAA0B,GACxB,SAAU,GAAQ,EAAK,OAAS,SAAiB,GAC9C,UAAW,EAEpB,SAAS,GAAqB,EAAK,EAAM,CACvC,IAAM,EAAQ,CACZ,EAAS,EAAI,KAAK,KAAM,CACtB,GAAG,EACH,YAAa,CAAC,GAAG,EAAK,YAAa,QAAS,GAAG,CACjD,CAAC,EACD,EAAS,EAAI,MAAM,KAAM,CACvB,GAAG,EACH,YAAa,CAAC,GAAG,EAAK,YAAa,QAAS,GAAG,CACjD,CAAC,CACH,EAAE,OAAQ,GAAM,CAAC,CAAC,CAAC,EACb,EAAc,CAAC,EAarB,OAZA,EAAM,QAAS,GAAW,CACxB,GAAI,GAAuB,CAAM,EAC/B,EAAY,KAAK,GAAG,EAAO,KAAK,MAC3B,CACL,IAAI,EAAe,EACnB,GAAI,yBAA0B,GAAU,EAAO,uBAAyB,GAAO,CAC7E,GAAM,CAAE,uBAAsB,GAAG,GAAS,EAC1C,EAAe,CACjB,CACA,EAAY,KAAK,CAAY,CAC/B,CACF,CAAC,EACM,EAAY,OAAS,CAAE,MAAO,CAAY,EAAI,IAAK,EAC5D,CAGA,SAAS,GAAgB,EAAK,CAC5B,IAAM,EAAa,OAAO,EAAI,MAM9B,OALI,IAAe,UAAY,IAAe,UAAY,IAAe,WAAa,IAAe,SAC5F,CACL,KAAM,MAAM,QAAQ,EAAI,KAAK,EAAI,QAAU,QAC7C,EAEK,CACL,KAAM,IAAe,SAAW,UAAY,EAC5C,MAAO,EAAI,KACb,CACF,CAQA,IAAI,GAAa,IAAK,GAClB,EAAc,CAIhB,KAAM,mBACN,MAAO,cACP,KAAM,2BAIN,MAAO,mGAYP,WACM,KAAe,IAAK,KACtB,GAAa,OACX,uDACA,GACF,GAEK,IAKT,KAAM,wFAIN,KAAM,sHACN,SAAU,2IAIV,KAAM,+XACN,SAAU,0rBACV,OAAQ,mEACR,UAAW,yEACX,OAAQ,sBACR,IAAK,kDACP,EACA,SAAS,GAAe,EAAK,EAAM,CACjC,IAAM,EAAM,CACV,KAAM,QACR,EACA,GAAI,EAAI,OACN,IAAK,IAAM,KAAS,EAAI,OACtB,OAAQ,EAAM,KAAd,CACE,IAAK,MACH,EAAI,UAAY,OAAO,EAAI,WAAc,SAAW,KAAK,IAAI,EAAI,UAAW,EAAM,KAAK,EAAI,EAAM,MACjG,MACF,IAAK,MACH,EAAI,UAAY,OAAO,EAAI,WAAc,SAAW,KAAK,IAAI,EAAI,UAAW,EAAM,KAAK,EAAI,EAAM,MACjG,MACF,IAAK,QACH,OAAQ,EAAK,cAAb,CACE,IAAK,eACH,EAAU,EAAK,QAAS,EAAM,QAAS,CAAI,EAC3C,MACF,IAAK,mBACH,EAAU,EAAK,YAAa,EAAM,QAAS,CAAI,EAC/C,MACF,IAAK,cACH,EAAW,EAAK,EAAY,MAAO,EAAM,QAAS,CAAI,EACtD,KACJ,CACA,MACF,IAAK,MACH,EAAU,EAAK,MAAO,EAAM,QAAS,CAAI,EACzC,MACF,IAAK,OACH,EAAU,EAAK,OAAQ,EAAM,QAAS,CAAI,EAC1C,MACF,IAAK,QACH,EAAW,EAAK,EAAM,MAAO,EAAM,QAAS,CAAI,EAChD,MACF,IAAK,OACH,EAAW,EAAK,EAAY,KAAM,EAAM,QAAS,CAAI,EACrD,MACF,IAAK,QACH,EAAW,EAAK,EAAY,MAAO,EAAM,QAAS,CAAI,EACtD,MACF,IAAK,aACH,EACE,EACA,OAAO,IAAI,GAAwB,EAAM,MAAO,CAAI,GAAG,EACvD,EAAM,QACN,CACF,EACA,MACF,IAAK,WACH,EACE,EACA,OAAO,GAAG,GAAwB,EAAM,MAAO,CAAI,EAAE,EAAE,EACvD,EAAM,QACN,CACF,EACA,MACF,IAAK,WACH,EAAU,EAAK,YAAa,EAAM,QAAS,CAAI,EAC/C,MACF,IAAK,OACH,EAAU,EAAK,OAAQ,EAAM,QAAS,CAAI,EAC1C,MACF,IAAK,OACH,EAAU,EAAK,OAAQ,EAAM,QAAS,CAAI,EAC1C,MACF,IAAK,WACH,EAAU,EAAK,WAAY,EAAM,QAAS,CAAI,EAC9C,MACF,IAAK,SACH,EAAI,UAAY,OAAO,EAAI,WAAc,SAAW,KAAK,IAAI,EAAI,UAAW,EAAM,KAAK,EAAI,EAAM,MACjG,EAAI,UAAY,OAAO,EAAI,WAAc,SAAW,KAAK,IAAI,EAAI,UAAW,EAAM,KAAK,EAAI,EAAM,MACjG,MACF,IAAK,WACH,EACE,EACA,OAAO,GAAwB,EAAM,MAAO,CAAI,CAAC,EACjD,EAAM,QACN,CACF,EACA,MAEF,IAAK,KACC,EAAM,UAAY,MACpB,EAAU,EAAK,OAAQ,EAAM,QAAS,CAAI,EAExC,EAAM,UAAY,MACpB,EAAU,EAAK,OAAQ,EAAM,QAAS,CAAI,EAE5C,MAEF,IAAK,YACH,EAAW,EAAK,EAAY,UAAW,EAAM,QAAS,CAAI,EAC1D,MACF,IAAK,MACH,EAAW,EAAK,EAAY,IAAK,EAAM,QAAS,CAAI,EACpD,MACF,IAAK,OACC,EAAM,UAAY,MACpB,EAAW,EAAK,EAAY,SAAU,EAAM,QAAS,CAAI,EAEvD,EAAM,UAAY,MACpB,EAAW,EAAK,EAAY,SAAU,EAAM,QAAS,CAAI,EAE3D,MAEF,IAAK,QACH,EAAW,EAAK,EAAY,MAAM,EAAG,EAAM,QAAS,CAAI,EACxD,MACF,IAAK,OACH,EAAW,EAAK,EAAY,KAAM,EAAM,QAAS,CAAI,EACrD,MAEF,IAAK,SACH,OAAQ,EAAK,eAAb,CACE,IAAK,gBACH,EAAU,EAAK,SAAU,EAAM,QAAS,CAAI,EAC5C,MAEF,IAAK,yBACH,EAAI,gBAAkB,SACtB,MAEF,IAAK,cACH,EAAW,EAAK,EAAY,OAAQ,EAAM,QAAS,CAAI,EACvD,KAEJ,CACA,MAEF,IAAK,SACH,EAAW,EAAK,EAAY,OAAQ,EAAM,QAAS,CAAI,EAEzD,IAAK,cACL,IAAK,cACL,IAAK,OACH,MACF,QAGF,CAGJ,OAAO,CACT,CACA,SAAS,GAAwB,EAAS,EAAM,CAC9C,OAAO,EAAK,kBAAoB,SAAW,GAAsB,CAAO,EAAI,CAC9E,CACA,IAAI,GAAgB,IAAI,IACtB,8DACF,EACA,SAAS,GAAsB,EAAQ,CACrC,IAAI,EAAS,GACb,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,OAAQ,IAC5B,GAAc,IAAI,EAAO,EAAE,IAC9B,GAAU,MAEZ,GAAU,EAAO,GAEnB,OAAO,CACT,CACA,SAAS,EAAU,EAAQ,EAAO,EAAS,EAAM,CAE3C,EAAO,QAAkB,EAAO,OAA8B,KAAM,GAAM,EAAE,MAAM,GACpF,AACE,EAAO,QAAQ,CAAC,EAEd,EAAO,SACT,EAAO,MAAM,KAAK,CAChB,OAAQ,EAAO,MACjB,CAAC,EACD,OAAO,EAAO,QAEhB,EAAO,MAAM,KAAK,CAChB,OAAQ,EACR,GAAG,GAAW,EAAK,eAAiB,CAAE,aAAc,CAAE,OAAQ,CAAQ,CAAE,CAC1E,CAAC,GAED,EAAO,OAAS,CAEpB,CACA,SAAS,EAAW,EAAQ,EAAO,EAAS,EAAM,CAE5C,EAAO,SAAmB,EAAO,OAA8B,KAAM,GAAM,EAAE,OAAO,GACtF,AACE,EAAO,QAAQ,CAAC,EAEd,EAAO,UACT,EAAO,MAAM,KAAK,CAChB,QAAS,EAAO,OAClB,CAAC,EACD,OAAO,EAAO,SAEhB,EAAO,MAAM,KAAK,CAChB,QAAS,GAAyB,EAAO,CAAI,EAC7C,GAAG,GAAW,EAAK,eAAiB,CAAE,aAAc,CAAE,QAAS,CAAQ,CAAE,CAC3E,CAAC,GAED,EAAO,QAAU,GAAyB,EAAO,CAAI,CAEzD,CACA,SAAS,GAAyB,EAAO,EAAM,CAE7C,GAAI,CAAC,EAAK,iBAAmB,CAAC,EAAM,MAClC,OAAO,EAAM,OAEf,IAAM,EAAQ,CACZ,EAAG,EAAM,MAAM,SAAS,GAAG,EAE3B,EAAG,EAAM,MAAM,SAAS,GAAG,EAE3B,EAAG,EAAM,MAAM,SAAS,GAAG,CAE7B,EACM,EAAS,EAAM,EAAI,EAAM,OAAO,YAAY,EAAI,EAAM,OACxD,EAAU,GACV,EAAY,GACZ,EAAc,GACd,EAAc,GAClB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,OAAQ,IAAK,CACtC,GAAI,EAAW,CACb,GAAW,EAAO,GAClB,EAAY,GACZ,QACF,CACA,GAAI,EAAM,MACJ,MACE,EAAO,GAAG,MAAM,OAAO,EAAG,CACxB,GACF,GAAW,EAAO,GAClB,GAAW,GAAG,EAAO,EAAI,GAAG,GAAG,EAAO,KAAK,YAAY,EACvD,EAAc,IACL,EAAO,EAAI,KAAO,KAAe,EAAO,EAAI,IAA2B,MAAM,OAAO,GAC7F,GAAW,EAAO,GAClB,EAAc,IAEd,GAAW,GAAG,EAAO,KAAK,EAAO,GAAG,YAAY,IAElD,QACF,OACK,GAAI,EAAO,GAAG,MAAM,OAAO,EAAG,CACnC,GAAW,IAAI,EAAO,KAAK,EAAO,GAAG,YAAY,EAAE,GACnD,QACF,EAEF,GAAI,EAAM,MACJ,EAAO,KAAO,IAAK,CACrB,GAAW;KAEX,QACF,MAAO,GAAI,EAAO,KAAO,IAAK,CAC5B,GAAW;KAEX,QACF,EAEF,GAAI,EAAM,GAAK,EAAO,KAAO,IAAK,CAChC,GAAW,EAAc,GAAG,EAAO,GAAG;EACxC,IAAI,EAAO,GAAG;GAEZ,QACF,CACA,GAAW,EAAO,GACd,EAAO,KAAO,KAChB,EAAY,GACH,GAAe,EAAO,KAAO,IACtC,EAAc,GACL,CAAC,GAAe,EAAO,KAAO,MACvC,EAAc,GAElB,CACA,GAAI,CACF,IAAI,OAAO,CAAO,CACpB,MAAY,CAMV,OALA,QAAQ,KACN,sCAAsC,EAAK,YAAY,KACrD,GACF,EAAE,sEACJ,EACO,EAAM,MACf,CACA,OAAO,CACT,CAGA,SAAS,GAAe,EAAK,EAAM,CAEjC,IAAM,EAAS,CACb,KAAM,SACN,qBAA6B,EAAS,EAAI,UAAU,KAAM,CACxD,GAAG,EACH,YAAa,CAAC,GAAG,EAAK,YAAa,sBAAsB,CAC3D,CAAC,GAAmB,EAAK,2BAC3B,EACA,GAAY,EAAI,SAAgC,KAAK,WAAcW,EAAuB,WAAoB,EAAI,QAAQ,KAAK,QAA8B,OAAS,CACpK,GAAM,CAAE,OAAM,GAAG,GAAY,GAAe,EAAI,QAAQ,KAAM,CAAI,EAClE,MAAO,CACL,GAAG,EACH,cAAe,CACjB,CACF,MAAO,GAAW,EAAI,SAA+B,KAAK,WAAcA,EAAuB,QAC7F,MAAO,CACL,GAAG,EACH,cAAe,CACb,KAAM,EAAI,QAAQ,KAAK,MACzB,CACF,OACK,GAAW,EAAI,SAA+B,KAAK,WAAcA,EAAuB,YAAc,EAAI,QAAQ,KAAK,KAAK,KAAK,WAAaA,EAAuB,WAAoB,EAAI,QAAQ,KAAK,KAAK,KAAK,QAA8B,OAAS,CAChQ,GAAM,CAAE,OAAM,GAAG,GAAY,GAC3B,EAAI,QAAQ,KACZ,CACF,EACA,MAAO,CACL,GAAG,EACH,cAAe,CACjB,CACF,CACA,OAAO,CACT,CAGA,SAAS,GAAY,EAAK,EAAM,CAY9B,OAXI,EAAK,cAAgB,SAChB,GAAe,EAAK,CAAI,EAU1B,CACL,KAAM,QACN,SAAU,IACV,MAAO,CACL,KAAM,QACN,MAAO,CAbE,EAAS,EAAI,QAAQ,KAAM,CACtC,GAAG,EACH,YAAa,CAAC,GAAG,EAAK,YAAa,QAAS,QAAS,GAAG,CAC1D,CAAC,GAAK,EAAY,EACH,EAAS,EAAI,UAAU,KAAM,CAC1C,GAAG,EACH,YAAa,CAAC,GAAG,EAAK,YAAa,QAAS,QAAS,GAAG,CAC1D,CAAC,GAAK,EAAY,CAMM,EACpB,SAAU,EACV,SAAU,CACZ,CACF,CACF,CAGA,SAAS,GAAmB,EAAK,CAC/B,IAAM,EAAS,EAAI,OAIb,EAHa,OAAO,KAAK,EAAI,MAAM,EAAE,OAAQ,GAC1C,OAAO,EAAO,EAAO,KAAU,QAEV,EAAE,IAAK,GAAQ,EAAO,EAAI,EAClD,EAAc,MAAM,KACxB,IAAI,IAAI,EAAa,IAAK,GAAW,OAAO,CAAM,CAAC,CACrD,EACA,MAAO,CACL,KAAM,EAAY,SAAW,EAAI,EAAY,KAAO,SAAW,SAAW,SAAW,CAAC,SAAU,QAAQ,EACxG,KAAM,CACR,CACF,CAGA,SAAS,IAAgB,CACvB,MAAO,CAAE,IAAK,EAAY,CAAE,CAC9B,CAGA,SAAS,IAAe,CACtB,MAAO,CACL,KAAM,MACR,CACF,CAGA,IAAI,GAAoB,CACtB,UAAW,SACX,UAAW,SACX,UAAW,UACX,WAAY,UACZ,QAAS,MACX,EACA,SAAS,GAAc,EAAK,EAAM,CAChC,IAAM,EAAU,EAAI,mBAAmB,IAAM,MAAM,KAAK,EAAI,QAAQ,OAAO,CAAC,EAAI,EAAI,QACpF,GAAI,EAAQ,MACT,GAAM,EAAE,KAAK,YAAY,KAAsB,CAAC,EAAE,KAAK,QAAU,CAAC,EAAE,KAAK,OAAO,OACnF,EAAG,CACD,IAAM,EAAQ,EAAQ,QAAQ,EAAQ,IAAM,CAC1C,IAAM,EAAO,GAAkB,EAAE,KAAK,UACtC,OAAO,GAAQ,CAAC,EAAO,SAAS,CAAI,EAAI,CAAC,GAAG,EAAQ,CAAI,EAAI,CAC9D,EAAG,CAAC,CAAC,EACL,MAAO,CACL,KAAM,EAAM,OAAS,EAAI,EAAQ,EAAM,EACzC,CACF,MAAO,GAAI,EAAQ,MAAO,GAAM,EAAE,KAAK,WAAa,cAAgB,CAAC,EAAE,WAAW,EAAG,CACnF,IAAM,EAAQ,EAAQ,QACnB,EAAK,IAAM,CACV,IAAM,EAAO,OAAO,EAAE,KAAK,MAC3B,OAAQ,EAAR,CACE,IAAK,SACL,IAAK,SACL,IAAK,UACH,MAAO,CAAC,GAAG,EAAK,CAAI,EACtB,IAAK,SACH,MAAO,CAAC,GAAG,EAAK,SAAS,EAC3B,IAAK,SACH,GAAI,EAAE,KAAK,QAAU,KAAM,MAAO,CAAC,GAAG,EAAK,MAAM,EAInD,QACE,OAAO,CACX,CACF,EACA,CAAC,CACH,EACA,GAAI,EAAM,SAAW,EAAQ,OAAQ,CACnC,IAAM,EAAc,EAAM,QAAQ,EAAG,EAAG,IAAM,EAAE,QAAQ,CAAC,IAAM,CAAC,EAChE,MAAO,CACL,KAAM,EAAY,OAAS,EAAI,EAAc,EAAY,GACzD,KAAM,EAAQ,QACX,EAAK,IACG,EAAI,SAAS,EAAE,KAAK,KAAK,EAAI,EAAM,CAAC,GAAG,EAAK,EAAE,KAAK,KAAK,EAEjE,CAAC,CACH,CACF,CACF,CACF,MAAO,GAAI,EAAQ,MAAO,GAAM,EAAE,KAAK,WAAa,SAAS,EAC3D,MAAO,CACL,KAAM,SACN,KAAM,EAAQ,QACX,EAAK,IAAM,CACV,GAAG,EACH,GAAG,EAAE,KAAK,OAAO,OAAQ,GAAO,CAAC,EAAI,SAAS,CAAE,CAAC,CACnD,EACA,CAAC,CACH,CACF,EAEF,OAAO,GAAQ,EAAK,CAAI,CAC1B,CACA,IAAI,IAAW,EAAK,IAAS,CAC3B,IAAM,GAAS,EAAI,mBAAmB,IAAM,MAAM,KAAK,EAAI,QAAQ,OAAO,CAAC,EAAI,EAAI,SAAS,KACzF,EAAG,IAAM,EAAS,EAAE,KAAM,CACzB,GAAG,EACH,YAAa,CAAC,GAAG,EAAK,YAAa,QAAS,GAAG,GAAG,CACpD,CAAC,CACH,EAAE,OACC,GAAM,CAAC,CAAC,IAAM,CAAC,EAAK,cAAgB,OAAO,GAAM,UAAY,OAAO,KAAK,CAAC,EAAE,OAAS,EACxF,EACA,OAAO,EAAM,OAAS,CAAE,OAAM,EAAI,IAAK,EACzC,EAGA,SAAS,GAAiB,EAAK,EAAM,CACnC,GAAI,CAAC,YAAa,YAAa,YAAa,aAAc,SAAS,EAAE,SACnE,EAAI,UAAU,KAAK,QACrB,IAAM,CAAC,EAAI,UAAU,KAAK,QAAU,CAAC,EAAI,UAAU,KAAK,OAAO,QAC7D,MAAO,CACL,KAAM,CACJ,GAAkB,EAAI,UAAU,KAAK,UACrC,MACF,CACF,EAEF,IAAM,EAAO,EAAS,EAAI,UAAU,KAAM,CACxC,GAAG,EACH,YAAa,CAAC,GAAG,EAAK,YAAa,QAAS,GAAG,CACjD,CAAC,EACD,OAAO,GAAQ,CAAE,MAAO,CAAC,EAAM,CAAE,KAAM,MAAO,CAAC,CAAE,CACnD,CAGA,SAAS,GAAe,EAAK,CAC3B,IAAM,EAAM,CACV,KAAM,QACR,EACA,GAAI,CAAC,EAAI,OAAQ,OAAO,EACxB,IAAK,IAAM,KAAS,EAAI,OACtB,OAAQ,EAAM,KAAd,CACE,IAAK,MACH,EAAI,KAAO,UACX,MACF,IAAK,MACC,EAAM,UACR,EAAI,QAAU,EAAM,MAEpB,EAAI,iBAAmB,EAAM,MAE/B,MACF,IAAK,MACC,EAAM,UACR,EAAI,QAAU,EAAM,MAEpB,EAAI,iBAAmB,EAAM,MAE/B,MACF,IAAK,aACH,EAAI,WAAa,EAAM,MACvB,KACJ,CAEF,OAAO,CACT,CAGA,SAAS,GAAe,EAAK,EAAM,CACjC,IAAM,EAAS,CACb,KAAM,SACN,WAAY,CAAC,CACf,EACM,EAAW,CAAC,EACZ,EAAQ,EAAI,MAAM,EACxB,IAAK,IAAM,KAAY,EAAO,CAC5B,IAAI,EAAU,EAAM,GACpB,GAAI,IAAY,IAAK,IAAK,EAAQ,OAAS,IAAK,GAC9C,SAEF,IAAM,EAAe,GAAe,CAAO,EACrC,EAAY,EAAS,EAAQ,KAAM,CACvC,GAAG,EACH,YAAa,CAAC,GAAG,EAAK,YAAa,aAAc,CAAQ,EACzD,aAAc,CAAC,GAAG,EAAK,YAAa,aAAc,CAAQ,CAC5D,CAAC,EACG,IAAc,IAAK,KAGvB,EAAO,WAAW,GAAY,EACzB,GACH,EAAS,KAAK,CAAQ,EAE1B,CACI,EAAS,SACX,EAAO,SAAW,GAEpB,IAAM,EAAuB,GAA2B,EAAK,CAAI,EAIjE,OAHI,IAAyB,IAAK,KAChC,EAAO,qBAAuB,GAEzB,CACT,CACA,SAAS,GAA2B,EAAK,EAAM,CAC7C,GAAI,EAAI,SAAS,KAAK,WAAa,WACjC,OAAO,EAAS,EAAI,SAAS,KAAM,CACjC,GAAG,EACH,YAAa,CAAC,GAAG,EAAK,YAAa,sBAAsB,CAC3D,CAAC,EAEH,OAAQ,EAAI,YAAZ,CACE,IAAK,cACH,OAAO,EAAK,4BACd,IAAK,SACH,OAAO,EAAK,6BACd,IAAK,QACH,OAAO,EAAK,2BAA6B,SAAW,EAAK,4BAA8B,EAAK,4BAChG,CACF,CACA,SAAS,GAAe,EAAQ,CAC9B,GAAI,CACF,OAAO,EAAO,WAAW,CAC3B,MAAY,CACV,MAAO,EACT,CACF,CAGA,IAAI,IAAoB,EAAK,IAAS,CAEpC,GAAI,EAAK,YAAY,SAAS,IAAc,EAAK,cAAqC,SAAS,EAC7F,OAAO,EAAS,EAAI,UAAU,KAAM,CAAI,EAE1C,IAAM,EAAc,EAAS,EAAI,UAAU,KAAM,CAC/C,GAAG,EACH,YAAa,CAAC,GAAG,EAAK,YAAa,QAAS,GAAG,CACjD,CAAC,EACD,OAAO,EAAc,CAAE,MAAO,CAAC,CAAE,IAAK,EAAY,CAAE,EAAG,CAAW,CAAE,EAAI,EAAY,CACtF,EAGI,IAAoB,EAAK,IAAS,CACpC,GAAI,EAAK,eAAiB,QACxB,OAAO,EAAS,EAAI,GAAG,KAAM,CAAI,EAC5B,GAAI,EAAK,eAAiB,SAC/B,OAAO,EAAS,EAAI,IAAI,KAAM,CAAI,EAEpC,IAAM,EAAI,EAAS,EAAI,GAAG,KAAM,CAC9B,GAAG,EACH,YAAa,CAAC,GAAG,EAAK,YAAa,QAAS,GAAG,CACjD,CAAC,EAKD,MAAO,CACL,MAAO,CAAC,EALA,EAAS,EAAI,IAAI,KAAM,CAC/B,GAAG,EACH,YAAa,CAAC,GAAG,EAAK,YAAa,QAAS,EAAI,IAAM,GAAG,CAC3D,CAEa,CAAC,EAAE,OAAQ,GAAM,IAAM,IAAK,EAAC,CAC1C,CACF,EAGA,SAAS,GAAgB,EAAK,EAAM,CAClC,OAAO,EAAS,EAAI,KAAK,KAAM,CAAI,CACrC,CAGA,SAAS,GAAY,EAAK,EAAM,CAK9B,IAAM,EAAS,CACb,KAAM,QACN,YAAa,GACb,MAPY,EAAS,EAAI,UAAU,KAAM,CACzC,GAAG,EACH,YAAa,CAAC,GAAG,EAAK,YAAa,OAAO,CAC5C,CAIM,CACN,EAOA,OANI,EAAI,UACN,EAAO,SAAW,EAAI,QAAQ,OAE5B,EAAI,UACN,EAAO,SAAW,EAAI,QAAQ,OAEzB,CACT,CAGA,SAAS,GAAc,EAAK,EAAM,CAoB9B,OAnBE,EAAI,KACC,CACL,KAAM,QACN,SAAU,EAAI,MAAM,OACpB,MAAO,EAAI,MAAM,KACd,EAAG,IAAM,EAAS,EAAE,KAAM,CACzB,GAAG,EACH,YAAa,CAAC,GAAG,EAAK,YAAa,QAAS,GAAG,GAAG,CACpD,CAAC,CACH,EAAE,QACC,EAAK,IAAM,IAAM,IAAK,GAAI,EAAM,CAAC,GAAG,EAAK,CAAC,EAC3C,CAAC,CACH,EACA,gBAAiB,EAAS,EAAI,KAAK,KAAM,CACvC,GAAG,EACH,YAAa,CAAC,GAAG,EAAK,YAAa,iBAAiB,CACtD,CAAC,CACH,EAEO,CACL,KAAM,QACN,SAAU,EAAI,MAAM,OACpB,SAAU,EAAI,MAAM,OACpB,MAAO,EAAI,MAAM,KACd,EAAG,IAAM,EAAS,EAAE,KAAM,CACzB,GAAG,EACH,YAAa,CAAC,GAAG,EAAK,YAAa,QAAS,GAAG,GAAG,CACpD,CAAC,CACH,EAAE,QACC,EAAK,IAAM,IAAM,IAAK,GAAI,EAAM,CAAC,GAAG,EAAK,CAAC,EAC3C,CAAC,CACH,CACF,CAEJ,CAGA,SAAS,IAAoB,CAC3B,MAAO,CACL,IAAK,EAAY,CACnB,CACF,CAGA,SAAS,IAAkB,CACzB,OAAO,EAAY,CACrB,CAGA,IAAI,IAAoB,EAAK,IACpB,EAAS,EAAI,UAAU,KAAM,CAAI,EAItC,IAAgB,EAAK,EAAU,IAAS,CAC1C,OAAQ,EAAR,CACE,KAAKC,EAAuB,UAC1B,OAAO,GAAe,EAAK,CAAI,EACjC,KAAKA,EAAuB,UAC1B,OAAO,GAAe,CAAG,EAC3B,KAAKA,EAAuB,UAC1B,OAAO,GAAe,EAAK,CAAI,EACjC,KAAKA,EAAuB,UAC1B,OAAO,GAAe,CAAG,EAC3B,KAAKA,EAAuB,WAC1B,OAAO,GAAgB,EACzB,KAAKA,EAAuB,QAC1B,OAAO,GAAa,EAAK,CAAI,EAC/B,KAAKA,EAAuB,aAC1B,OAAO,GAAkB,EAC3B,KAAKA,EAAuB,QAC1B,OAAO,GAAa,EACtB,KAAKA,EAAuB,SAC1B,OAAO,GAAc,EAAK,CAAI,EAChC,KAAKA,EAAuB,SAC5B,KAAKA,EAAuB,sBAC1B,OAAO,GAAc,EAAK,CAAI,EAChC,KAAKA,EAAuB,gBAC1B,OAAO,GAAqB,EAAK,CAAI,EACvC,KAAKA,EAAuB,SAC1B,OAAO,GAAc,EAAK,CAAI,EAChC,KAAKA,EAAuB,UAC1B,OAAO,GAAe,EAAK,CAAI,EACjC,KAAKA,EAAuB,WAC1B,OAAO,GAAgB,CAAG,EAC5B,KAAKA,EAAuB,QAC1B,OAAO,GAAa,CAAG,EACzB,KAAKA,EAAuB,cAC1B,OAAO,GAAmB,CAAG,EAC/B,KAAKA,EAAuB,YAC1B,OAAO,GAAiB,EAAK,CAAI,EACnC,KAAKA,EAAuB,YAC1B,OAAO,GAAiB,EAAK,CAAI,EACnC,KAAKA,EAAuB,OAC1B,OAAO,GAAY,EAAK,CAAI,EAC9B,KAAKA,EAAuB,OAC1B,OAAO,GAAY,EAAK,CAAI,EAC9B,KAAKA,EAAuB,QAC1B,UAAa,EAAI,OAAO,EAAE,KAC5B,KAAKA,EAAuB,WAC1B,OAAO,GAAgB,EAAK,CAAI,EAClC,KAAKA,EAAuB,OAC5B,KAAKA,EAAuB,SAC1B,OAAO,GAAc,EACvB,KAAKA,EAAuB,WAC1B,OAAO,GAAgB,EAAK,CAAI,EAClC,KAAKA,EAAuB,OAC1B,OAAO,EAAY,EACrB,KAAKA,EAAuB,WAC1B,OAAO,GAAgB,EACzB,KAAKA,EAAuB,WAC1B,OAAO,GAAgB,EAAK,CAAI,EAClC,KAAKA,EAAuB,WAC1B,OAAO,GAAgB,EAAK,CAAI,EAClC,KAAKA,EAAuB,YAC1B,OAAO,GAAiB,EAAK,CAAI,EACnC,KAAKA,EAAuB,SAC1B,OAAO,GAAc,EAAK,CAAI,EAChC,KAAKA,EAAuB,YAC1B,OAAO,GAAiB,EAAK,CAAI,EACnC,KAAKA,EAAuB,YAC5B,KAAKA,EAAuB,QAC5B,KAAKA,EAAuB,UAC1B,OACF,QACE,OAAyB,GAAM,IAAK,IAAG,CAAQ,CACnD,CACF,EAGI,IAAmB,EAAO,IAAU,CACtC,IAAI,EAAI,EACR,KAAO,EAAI,EAAM,QAAU,EAAI,EAAM,QAC/B,EAAM,KAAO,EAAM,GADoB,KAG7C,MAAO,EAAE,EAAM,OAAS,GAAG,SAAS,EAAG,GAAG,EAAM,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG,CACpE,EAGA,SAAS,EAAS,EAAK,EAAM,EAAkB,GAAO,CAEpD,IAAM,EAAW,EAAK,KAAK,IAAI,CAAG,EAClC,GAAI,EAAK,SAAU,CACjB,IAAM,EAAwB,EAAK,UAAiC,KAClE,EACA,EACA,EACA,EACA,CACF,EACA,GAAI,IAAmB,GACrB,OAAO,CAEX,CACA,GAAI,GAAY,CAAC,EAAiB,CAChC,IAAM,EAAa,GAAQ,EAAU,CAAI,EACzC,GAAI,IAAe,IAAK,GACtB,OAAO,CAEX,CACA,IAAM,EAAU,CAAE,MAAK,KAAM,EAAK,YAAa,WAAY,IAAK,EAAE,EAClE,EAAK,KAAK,IAAI,EAAK,CAAO,EAC1B,IAAM,EAAqB,GAAa,EAAK,EAAI,SAAU,CAAI,EACzD,EAAc,OAAO,GAAuB,WAAa,EAAS,EAAmB,EAAG,CAAI,EAAI,EAItG,GAHI,GACF,GAAQ,EAAK,EAAM,CAAW,EAE5B,EAAK,YAAa,CACpB,IAAM,EAAoB,EAAK,YAAY,EAAa,EAAK,CAAI,EAEjE,MADA,GAAQ,WAAa,EACd,CACT,CAEA,MADA,GAAQ,WAAa,EACd,CACT,CACA,IAAI,IAAW,EAAM,IAAS,CAC5B,OAAQ,EAAK,aAAb,CACE,IAAK,OACH,MAAO,CAAE,KAAM,EAAK,KAAK,KAAK,GAAG,CAAE,EACrC,IAAK,WACH,MAAO,CAAE,KAAM,GAAgB,EAAK,YAAa,EAAK,IAAI,CAAE,EAC9D,IAAK,OACL,IAAK,OASH,OARI,EAAK,KAAK,OAAS,EAAK,YAAY,QAAU,EAAK,KAAK,OAAO,EAAO,IAAU,EAAK,YAAY,KAAW,CAAK,GACnH,QAAQ,KACN,mCAAmC,EAAK,YAAY,KAClD,GACF,EAAE,oBACJ,EACO,EAAY,GAEd,EAAK,eAAiB,OAAS,EAAY,EAAI,IAAK,EAE/D,CACF,EACI,IAAW,EAAK,EAAM,KACpB,EAAI,cACN,EAAY,YAAc,EAAI,aAEzB,GAIL,GAAW,GAAY,CACzB,IAAM,EAAW,GAAkB,CAAO,EACpC,EAAc,EAAS,OAAS,IAAK,GAAqE,EAAS,SAA1E,CAAC,GAAG,EAAS,SAAU,EAAS,eAAgB,EAAS,IAAI,EAC5G,MAAO,CACL,GAAG,EACH,cACA,aAAc,IAAK,GACnB,KAAM,IAAI,IACR,OAAO,QAAQ,EAAS,WAAW,EAAE,KAAK,CAAC,EAAO,KAAS,CACzD,EAAI,KACJ,CACE,IAAK,EAAI,KACT,KAAM,CAAC,GAAG,EAAS,SAAU,EAAS,eAAgB,CAAK,EAE3D,WAAY,IAAK,EACnB,CACF,CAAC,CACH,CACF,CACF,EAGI,IAAoB,EAAQ,IAAY,CAE1C,IAAM,EAAO,GAAQ,CAAO,EACxB,EAAc,OAAO,GAAY,UAAY,EAAQ,YAAc,OAAO,QAAQ,EAAQ,WAAW,EAAE,QACxG,EAAK,CAAC,EAAO,MAEL,CACL,GAAG,GACF,GAAe,EACd,EAAQ,KACR,CACE,GAAG,EACH,YAAa,CAAC,GAAG,EAAK,SAAU,EAAK,eAAgB,CAAK,CAC5D,EACA,EACF,GAAmB,EAAY,CACjC,GAEF,CAAC,CACH,EAAI,IAAK,GACH,EAAQ,OAAO,GAAY,SAAW,EAAW,GAAmC,eAAkB,QAAU,IAAK,GAAI,GAAmC,KAC5J,EAAc,EAClB,EAAO,KACP,IAAU,IAAK,GAAI,EAAO,CACxB,GAAG,EACH,YAAa,CAAC,GAAG,EAAK,SAAU,EAAK,eAAgB,CAAK,CAC5D,EACA,EACF,GAAmB,EAAY,EACzB,EAAQ,OAAO,GAAY,UAAY,EAAQ,OAAS,IAAK,IAAK,EAAQ,eAAiB,QAAU,EAAQ,KAAO,IAAK,GAC3H,IAAU,IAAK,KACjB,EAAK,MAAQ,GAEf,IAAM,EAAW,IAAU,IAAK,GAAI,EAAc,CAChD,GAAG,GACF,EAAK,gBAAiB,CACzB,EAAI,EAAO,CACT,KAAM,CACJ,GAAG,EAAK,eAAiB,WAAa,CAAC,EAAI,EAAK,SAChD,EAAK,eACL,CACF,EAAE,KAAK,GAAG,GACT,EAAK,gBAAiB,CACrB,GAAG,GACF,GAAQ,CACX,CACF,EAEA,MADA,GAAS,QAAU,0CACZ,CACT,EAGI,GAA+B,OAAO,IAAI,kBAAkB,EAChE,SAAS,GAAW,EAAc,CAChC,IAAI,EACJ,WACE,AACE,IAAS,EAAa,EAEjB,EAEX,CACA,SAAS,GAAW,EAAa,CAC/B,YACE,CAAC,EAAG,CACN,MAAO,EACJ,IAAe,GAChB,MAAO,IAAK,GAEZ,IAAI,YAAa,CAIf,OAHI,OAAO,GAAgB,aACzB,EAAc,EAAY,GAErB,CACT,EACA,UACF,CACF,CACA,SAAS,GAAS,EAAO,CACvB,OAAO,OAAO,GAAU,YAAY,GAAkB,MAAgB,GAAS,EAAM,MAAkB,IAAQ,eAAgB,GAAS,aAAc,CACxJ,CACA,SAAS,GAAS,EAAQ,CACxB,OAAO,GAAU,KAAO,GAAW,CAAE,WAAY,CAAC,EAAG,qBAAsB,EAAM,CAAC,EAAI,GAAS,CAAM,EAAI,EAAS,cAAe,EAAS,EAAO,aAAa,SAAW,MAAQ,GAAU,CAAM,EAAI,GAAe,CAAM,EAAI,EAAO,CACvO,CACA,SAAS,GAAe,EAAiB,CACvC,OAAO,OACC,GACJ,EAAgB,aAAa,WAAW,MAAM,CAC5C,OAAQ,UACV,CAAC,CACH,EACA,CACE,SAAU,KAAO,IAAU,CACzB,IAAM,EAAS,MAAM,EAAgB,aAAa,SAAS,CAAK,EAChE,MAAO,UAAW,EAAS,CAAE,QAAS,GAAM,MAAO,EAAO,KAAM,EAAI,CAClE,QAAS,GACT,MAAO,IAAI,EAAoB,CAC7B,QACA,MAAO,EAAO,MAChB,CAAC,CACH,CACF,CACF,CACF,CACF,CACA,SAAS,GAAW,EAAY,EAAS,CAEvC,IAAM,EAAuB,GAAmC,eAA+B,GAC/F,OAAO,OAEC,GAAiB,EAAY,CACjC,aAAc,EAAgB,OAAS,MACzC,CAAC,EACD,CACE,SAAU,KAAO,IAAU,CACzB,IAAM,EAAS,MAAM,EAAW,eAAe,CAAK,EACpD,OAAO,EAAO,QAAU,CAAE,QAAS,GAAM,MAAO,EAAO,IAAK,EAAI,CAAE,QAAS,GAAO,MAAO,EAAO,KAAM,CACxG,CACF,CACF,CACF,CACA,SAAS,GAAW,EAAY,EAAS,CAEvC,IAAM,EAAuB,GAAmC,eAA+B,GAC/F,OAAO,OAEC,GACJC,EAAgB,EAAY,CAC1B,OAAQ,UACR,GAAI,QACJ,OAAQ,EAAgB,MAAQ,QAClC,CAAC,CACH,EACA,CACE,SAAU,KAAO,IAAU,CACzB,IAAM,EAAS,MAAMC,EAAkB,EAAY,CAAK,EACxD,OAAO,EAAO,QAAU,CAAE,QAAS,GAAM,MAAO,EAAO,IAAK,EAAI,CAAE,QAAS,GAAO,MAAO,EAAO,KAAM,CACxG,CACF,CACF,CACF,CACA,SAAS,GAAa,EAAY,CAChC,MAAO,SAAU,CACnB,CACA,SAAS,GAAU,EAAY,EAAS,CAIpC,OAHE,GAAa,CAAU,EAClB,GAAW,EAAY,CAAO,EAE9B,GAAW,EAAY,CAAO,CAEzC,CAGA,eAAe,GAAc,CAC3B,QACA,SACA,WACC,CACD,IAAM,EAAS,MAAM,EAAkB,CAAE,QAAO,SAAQ,SAAQ,CAAC,EACjE,GAAI,CAAC,EAAO,QACV,MAAMC,EAAqB,KAAK,CAAE,QAAO,MAAO,EAAO,MAAO,SAAQ,CAAC,EAEzE,OAAO,EAAO,KAChB,CACA,eAAe,EAAkB,CAC/B,QACA,SACA,WACC,CACD,IAAM,EAAe,GAAS,CAAM,EACpC,GAAI,CACF,GAAI,EAAa,UAAY,KAC3B,MAAO,CAAE,QAAS,GAAM,QAAO,SAAU,CAAM,EAEjD,IAAM,EAAS,MAAM,EAAa,SAAS,CAAK,EAIhD,OAHI,EAAO,QACF,CAAE,QAAS,GAAM,MAAO,EAAO,MAAO,SAAU,CAAM,EAExD,CACL,QAAS,GACT,MAAOA,EAAqB,KAAK,CAAE,QAAO,MAAO,EAAO,MAAO,SAAQ,CAAC,EACxE,SAAU,CACZ,CACF,OAAS,EAAO,CACd,MAAO,CACL,QAAS,GACT,MAAOA,EAAqB,KAAK,CAAE,QAAO,MAAO,EAAO,SAAQ,CAAC,EACjE,SAAU,CACZ,CACF,CACF,CAoBA,eAAe,EAAc,CAC3B,OACA,UACC,CACD,GAAI,CACF,IAAM,EAAQ,GAAgB,CAAI,EAIlC,OAHI,GAAU,KACL,CAAE,QAAS,GAAM,QAAO,SAAU,CAAM,EAE1C,MAAM,EAAkB,CAAE,QAAO,QAAO,CAAC,CAClD,OAAS,EAAO,CACd,MAAO,CACL,QAAS,GACT,MAAO,GAAe,WAAW,CAAK,EAAI,EAAQ,IAAI,GAAe,CAAE,OAAM,MAAO,CAAM,CAAC,EAC3F,SAAU,IAAK,EACjB,CACF,CACF,CAcA,SAAS,GAAqB,CAC5B,SACA,UACC,CACD,OAAO,EAAO,YAAY,IAAI,iBAAmB,EAAE,YAAY,IAAI,EAAyB,EAAE,YAC5F,IAAI,gBAAgB,CAClB,MAAM,UAAU,CAAE,QAAQ,EAAY,CAChC,IAAS,UAGb,EAAW,QAAQ,MAAM,EAAc,CAAE,KAAM,EAAM,QAAO,CAAC,CAAC,CAChE,CACF,CAAC,CACH,CACF,CAwNA,eAAe,EAAQ,EAAO,CAI5B,OAHI,OAAO,GAAU,aACnB,EAAQ,EAAM,GAET,QAAQ,QAAQ,CAAK,CAC9B,CCx9EA,IAAI,GAAY,OAAO,eACnB,IAAY,EAAQ,IAAQ,CAC9B,IAAK,IAAI,KAAU,EACjB,GAAU,EAAQ,EAAQ,CAAE,IAAK,EAAI,GAAS,WAAY,EAAK,CAAC,CACpE,EA8MI,GAAQ,4BACR,GAAU,mBAAmB,KAC7B,GAAU,OAAO,IAAI,EAAO,EAC5B,GACA,EAAyB,cAAcC,CAAY,CACrD,YAAY,CACV,UAAU,uBACV,QACA,KAAM,EACN,WACA,QACA,gBACC,CACD,MAAM,CAAE,KAAM,GAAO,UAAS,OAAM,CAAC,EACrC,KAAK,IAAO,GACZ,KAAK,KAAO,EACZ,KAAK,SAAW,EAChB,KAAK,MAAQ,EACb,KAAK,aAAe,CACtB,CACA,OAAO,WAAW,EAAO,CACvB,OAAOA,EAAY,UAAU,EAAO,EAAO,CAC7C,CACF,EACA,GAAM,GAKN,IAiKI,GAAS,0BACT,GAAW,mBAAmB,KAC9B,GAAW,OAAO,IAAI,EAAQ,EAC9B,GACA,EAAuB,cAAcC,CAAa,CACpD,YAAY,CACV,YACA,UACA,WACC,CACD,MAAM,CAAE,KAAM,GAAQ,SAAQ,CAAC,EAC/B,KAAK,IAAQ,GACb,KAAK,UAAY,EACjB,KAAK,QAAU,CACjB,CACA,OAAO,WAAW,EAAO,CACvB,OAAOA,EAAa,UAAU,EAAO,EAAQ,CAC/C,CACF,EACA,GAAO,GAKP,IAiyBI,GAAoBE,EAAQ,CAC9BC,EAAS,EACTC,EAAa,UAAU,EACvBA,EAAa,WAAW,EACxBC,GAEG,GAEsB,WAAW,QAAgC,SAAS,CAAK,GAAkB,GAElG,CAAE,QAAS,kBAAmB,CAChC,CACF,CAAC,EAypBG,EAAkBC,MACdC,EAAS,CACbC,EAAQ,EACRC,EAAU,EACVC,EAAU,EACVC,EAAW,EACXC,EAAUH,EAAU,EAAG,EAAgB,SAAS,CAAC,EACjDI,EAAS,CAAe,CAC1B,CAAC,CACH,EAGI,EAAyBC,EAC3BC,EAAU,EACVD,EAAUC,EAAU,EAAG,EAAgB,SAAS,CAAC,CACnD,EAII,GAAiBC,EAAU,CAC7B,KAAMC,EAAW,MAAM,EACvB,KAAMC,EAAU,EAChB,gBAAiB,EAAuB,SAAS,CACnD,CAAC,EACG,GAAkBF,EAAU,CAC9B,KAAMC,EAAW,OAAO,EACxB,MAAOE,EAAS,CAAC,GAAmBC,EAAc,GAAG,CAAC,CAAC,EACvD,UAAWF,EAAU,EAAE,SAAS,EAChC,gBAAiB,EAAuB,SAAS,CACnD,CAAC,EACG,GAAiBF,EAAU,CAC7B,KAAMC,EAAW,MAAM,EACvB,KAAME,EAAS,CAAC,GAAmBC,EAAc,GAAG,CAAC,CAAC,EACtD,SAAUF,EAAU,EAAE,SAAS,EAC/B,UAAWA,EAAU,EACrB,gBAAiB,EAAuB,SAAS,CACnD,CAAC,EACG,GAAsBF,EAAU,CAClC,KAAMC,EAAW,WAAW,EAC5B,KAAMC,EAAU,EAChB,gBAAiB,EAAuB,SAAS,CACnD,CAAC,EACG,GAAqBF,EAAU,CACjC,KAAMC,EAAW,WAAW,EAC5B,WAAYC,EAAU,EACtB,SAAUA,EAAU,EACpB,MAAOG,EAAW,EAClB,gBAAiB,EAAuB,SAAS,EACjD,iBAAkBC,EAAW,EAAE,SAAS,CAC1C,CAAC,EACG,GAAeC,EACjB,OACA,CACEP,EAAU,CACR,KAAMC,EAAW,MAAM,EACvB,MAAOC,EAAU,EACjB,gBAAiB,EAAuB,SAAS,CACnD,CAAC,EACDF,EAAU,CACR,KAAMC,EAAW,MAAM,EACvB,MAAO,EACP,gBAAiB,EAAuB,SAAS,CACnD,CAAC,EACDD,EAAU,CACR,KAAMC,EAAW,kBAAkB,EACnC,OAAQC,EAAU,EAAE,SAAS,EAC7B,gBAAiB,EAAuB,SAAS,CACnD,CAAC,EACDF,EAAU,CACR,KAAMC,EAAW,YAAY,EAC7B,MAAOC,EAAU,EACjB,gBAAiB,EAAuB,SAAS,CACnD,CAAC,EACDF,EAAU,CACR,KAAMC,EAAW,YAAY,EAC7B,MAAO,EACP,gBAAiB,EAAuB,SAAS,CACnD,CAAC,EACDD,EAAU,CACR,KAAMC,EAAW,SAAS,EAC1B,MAAOO,EACLL,EAAS,CACPH,EAAU,CACR,KAAMC,EAAW,MAAM,EACvB,KAAMC,EAAU,EAChB,gBAAiB,EAAuB,SAAS,CACnD,CAAC,EACDF,EAAU,CACR,KAAMC,EAAW,OAAO,EACxB,KAAMC,EAAU,EAChB,UAAWA,EAAU,CACvB,CAAC,EACDF,EAAU,CACR,KAAMC,EAAW,WAAW,EAC5B,KAAMC,EAAU,EAChB,UAAWA,EAAU,EACrB,SAAUA,EAAU,EAAE,SAAS,EAC/B,gBAAiB,EAAuB,SAAS,CACnD,CAAC,EACDF,EAAU,CACR,KAAMC,EAAW,UAAU,EAC3B,IAAKC,EAAU,EACf,gBAAiB,EAAuB,SAAS,CACnD,CAAC,EACDF,EAAU,CACR,KAAMC,EAAW,SAAS,EAC1B,OAAQE,EAAS,CAACD,EAAU,EAAGO,EAAUP,EAAU,EAAGA,EAAU,CAAC,CAAC,CAAC,EACnE,gBAAiB,EAAuB,SAAS,CACnD,CAAC,EACDF,EAAU,CACR,KAAMC,EAAW,YAAY,EAC7B,KAAMC,EAAU,EAChB,UAAWA,EAAU,EACrB,gBAAiB,EAAuB,SAAS,CACnD,CAAC,EACDF,EAAU,CACR,KAAMC,EAAW,WAAW,EAC5B,IAAKC,EAAU,EACf,gBAAiB,EAAuB,SAAS,CACnD,CAAC,EACDF,EAAU,CACR,KAAMC,EAAW,eAAe,EAChC,OAAQE,EAAS,CAACD,EAAU,EAAGO,EAAUP,EAAU,EAAGA,EAAU,CAAC,CAAC,CAAC,EACnE,gBAAiB,EAAuB,SAAS,CACnD,CAAC,EACDF,EAAU,CACR,KAAMC,EAAW,QAAQ,EACzB,gBAAiB,EAAuB,SAAS,CACnD,CAAC,CACH,CAAC,CACH,CACF,CAAC,CACH,CACF,EACI,GAAuBD,EAAU,CACnC,KAAMC,EAAW,aAAa,EAC9B,WAAYC,EAAU,EACtB,SAAUA,EAAU,EACpB,OAAQ,GACR,gBAAiB,EAAuB,SAAS,CACnD,CAAC,EACG,GAA4BF,EAAU,CACxC,KAAMC,EAAW,uBAAuB,EACxC,WAAYC,EAAU,EACtB,WAAYA,EAAU,CACxB,CAAC,EACG,GAA6BF,EAAU,CACzC,KAAMC,EAAW,wBAAwB,EACzC,WAAYC,EAAU,EACtB,SAAUI,EAAW,EACrB,OAAQJ,EAAU,EAAE,SAAS,CAC/B,CAAC,EAwCwBW,EAAS,CArCHH,EAC7B,CACE,KAAMC,EAAW,QAAQ,EACzB,QAASC,EAAU,EACnB,gBAAiB,EAAuB,SAAS,CACnD,CAiCA,EA/B2BF,EAAU,CACrC,KAAMC,EAAW,MAAM,EACvB,QAASE,EAAS,CAChBD,EAAU,EACVE,EAASD,EAAS,CAAC,GAAgB,GAAiB,EAAc,CAAC,CAAC,CACtE,CAAC,EACD,gBAAiB,EAAuB,SAAS,CACnD,CAyBE,EAxBgCH,EAAU,CAC1C,KAAMC,EAAW,WAAW,EAC5B,QAASE,EAAS,CAChBD,EAAU,EACVE,EACED,EAAS,CACP,GACA,GACA,GACA,GACA,GACA,EACF,CAAC,CACH,CACF,CAAC,EACD,gBAAiB,EAAuB,SAAS,CACnD,CASE,EAR2BH,EAAU,CACrC,KAAMC,EAAW,MAAM,EACvB,QAASG,EAASD,EAAS,CAAC,GAAsB,EAA0B,CAAC,CAAC,EAC9E,gBAAiB,EAAuB,SAAS,CACnD,CAKE,CACF,CAAC,EAqeD,SAAS,GAAa,EAAM,EAAW,CACrC,GAAI,IAAS,IAAK,IAAK,IAAc,IAAK,GACxC,OAEF,GAAI,IAAS,IAAK,GAChB,OAAO,EAET,GAAI,IAAc,IAAK,GACrB,OAAO,EAET,IAAM,EAAS,CAAE,GAAG,CAAK,EACzB,IAAK,IAAM,KAAO,EACZ,SAAQ,aAAe,IAAQ,eAAiB,IAAQ,cAGxD,OAAO,UAAU,eAAe,KAAK,EAAW,CAAG,EAAG,CACxD,IAAM,EAAiB,EAAU,GACjC,GAAI,IAAmB,IAAK,GAC1B,SACF,IAAM,EAAY,KAAO,EAAO,EAAK,GAAO,IAAK,GAC3C,EAA4C,OAAO,GAAmB,YAArD,GAAiE,CAAC,MAAM,QAAQ,CAAc,GAAK,EAAE,aAA0B,OAAS,EAAE,aAA0B,QACrL,EAA+D,OAAO,GAAc,YAAnE,GAA+E,CAAC,MAAM,QAAQ,CAAS,GAAK,EAAE,aAAqB,OAAS,EAAE,aAAqB,QACtL,GAAkB,EACpB,EAAO,GAAO,GACZ,EACA,CACF,EAEA,EAAO,GAAO,CAElB,CAEF,OAAO,CACT,CA4aA,GAAS,CAAA,EAAgB,CACvB,UAAa,GACb,WAAc,GACd,SAAY,GACZ,WAAc,GACd,SAAY,EACd,CAAC,EAeD,SAAS,GAAQ,EAAO,CACtB,IAAM,EAAQ,CAAC,MAAM,EACjB,EAAiB,GACjB,EAAe,KACnB,SAAS,EAAkB,EAAM,EAAG,EAAW,CAE3C,OAAQ,EAAR,CACE,IAAK,IACH,EAAiB,EACjB,EAAM,IAAI,EACV,EAAM,KAAK,CAAS,EACpB,EAAM,KAAK,eAAe,EAC1B,MAEF,IAAK,IACL,IAAK,IACL,IAAK,IACH,EAAiB,EACjB,EAAe,EACf,EAAM,IAAI,EACV,EAAM,KAAK,CAAS,EACpB,EAAM,KAAK,gBAAgB,EAC3B,MAEF,IAAK,IACH,EAAM,IAAI,EACV,EAAM,KAAK,CAAS,EACpB,EAAM,KAAK,eAAe,EAC1B,MAEF,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACH,EAAiB,EACjB,EAAM,IAAI,EACV,EAAM,KAAK,CAAS,EACpB,EAAM,KAAK,eAAe,EAC1B,MAEF,IAAK,IACH,EAAiB,EACjB,EAAM,IAAI,EACV,EAAM,KAAK,CAAS,EACpB,EAAM,KAAK,qBAAqB,EAChC,MAEF,IAAK,IACH,EAAiB,EACjB,EAAM,IAAI,EACV,EAAM,KAAK,CAAS,EACpB,EAAM,KAAK,oBAAoB,EAC/B,KAEJ,CAEJ,CACA,SAAS,EAAwB,EAAM,EAAG,CACxC,OAAQ,EAAR,CACE,IAAK,IACH,EAAM,IAAI,EACV,EAAM,KAAK,2BAA2B,EACtC,MAEF,IAAK,IACH,EAAiB,EACjB,EAAM,IAAI,EACV,KAEJ,CACF,CACA,SAAS,EAAuB,EAAM,EAAG,CACvC,OAAQ,EAAR,CACE,IAAK,IACH,EAAM,IAAI,EACV,EAAM,KAAK,0BAA0B,EACrC,MAEF,IAAK,IACH,EAAiB,EACjB,EAAM,IAAI,EACV,KAEJ,CACF,CACA,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAAK,CACrC,IAAM,EAAO,EAAM,GAEnB,OADqB,EAAM,EAAM,OAAS,GAC1C,CACE,IAAK,OACH,EAAkB,EAAM,EAAG,QAAQ,EACnC,MACF,IAAK,sBACH,OAAQ,EAAR,CACE,IAAK,IACH,EAAM,IAAI,EACV,EAAM,KAAK,mBAAmB,EAC9B,MAEF,IAAK,IACH,EAAiB,EACjB,EAAM,IAAI,EACV,KAEJ,CACA,MAEF,IAAK,4BACH,OAAQ,EAAR,CACE,IAAK,IACH,EAAM,IAAI,EACV,EAAM,KAAK,mBAAmB,EAC9B,KAEJ,CACA,MAEF,IAAK,oBACH,OAAQ,EAAR,CACE,IAAK,IACH,EAAM,IAAI,EACV,EAAM,KAAK,yBAAyB,EACpC,KAEJ,CACA,MAEF,IAAK,0BACH,OAAQ,EAAR,CACE,IAAK,IACH,EAAM,IAAI,EACV,EAAM,KAAK,4BAA4B,EACvC,KAEJ,CACA,MAEF,IAAK,6BACH,EAAkB,EAAM,EAAG,2BAA2B,EACtD,MAEF,IAAK,4BACH,EAAwB,EAAM,CAAC,EAC/B,MAEF,IAAK,gBACH,OAAQ,EAAR,CACE,IAAK,IACH,EAAM,IAAI,EACV,EAAiB,EACjB,MAEF,IAAK,KACH,EAAM,KAAK,sBAAsB,EACjC,MAEF,QACE,EAAiB,CAErB,CACA,MAEF,IAAK,qBACH,OAAQ,EAAR,CACE,IAAK,IACH,EAAiB,EACjB,EAAM,IAAI,EACV,MAEF,QACE,EAAiB,EACjB,EAAkB,EAAM,EAAG,0BAA0B,EACrD,KAEJ,CACA,MAEF,IAAK,2BACH,OAAQ,EAAR,CACE,IAAK,IACH,EAAM,IAAI,EACV,EAAM,KAAK,0BAA0B,EACrC,MAEF,IAAK,IACH,EAAiB,EACjB,EAAM,IAAI,EACV,MAEF,QACE,EAAiB,EACjB,KAEJ,CACA,MAEF,IAAK,2BACH,EAAkB,EAAM,EAAG,0BAA0B,EACrD,MAEF,IAAK,uBACH,EAAM,IAAI,EACV,EAAiB,EACjB,MAEF,IAAK,gBACH,OAAQ,EAAR,CACE,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACH,EAAiB,EACjB,MAEF,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACH,MAEF,IAAK,IACH,EAAM,IAAI,EACN,EAAM,EAAM,OAAS,KAAO,4BAC9B,EAAuB,EAAM,CAAC,EAE5B,EAAM,EAAM,OAAS,KAAO,6BAC9B,EAAwB,EAAM,CAAC,EAEjC,MAEF,IAAK,IACH,EAAM,IAAI,EACN,EAAM,EAAM,OAAS,KAAO,6BAC9B,EAAwB,EAAM,CAAC,EAEjC,MAEF,IAAK,IACH,EAAM,IAAI,EACN,EAAM,EAAM,OAAS,KAAO,4BAC9B,EAAuB,EAAM,CAAC,EAEhC,MAEF,QACE,EAAM,IAAI,EACV,KAEJ,CACA,MAEF,IAAK,iBAAkB,CACrB,IAAM,EAAiB,EAAM,UAAU,EAAc,EAAI,CAAC,EACtD,CAAC,QAAQ,WAAW,CAAc,GAAK,CAAC,OAAO,WAAW,CAAc,GAAK,CAAC,OAAO,WAAW,CAAc,GAChH,EAAM,IAAI,EACN,EAAM,EAAM,OAAS,KAAO,4BAC9B,EAAwB,EAAM,CAAC,EACtB,EAAM,EAAM,OAAS,KAAO,4BACrC,EAAuB,EAAM,CAAC,GAGhC,EAAiB,EAEnB,KACF,CACF,CACF,CACA,IAAI,EAAS,EAAM,MAAM,EAAG,EAAiB,CAAC,EAC9C,IAAK,IAAI,EAAI,EAAM,OAAS,EAAG,GAAK,EAAG,IAErC,OADc,EAAM,GACpB,CACE,IAAK,gBACH,GAAU,IACV,MAEF,IAAK,oBACL,IAAK,0BACL,IAAK,4BACL,IAAK,sBACL,IAAK,6BACL,IAAK,4BACH,GAAU,IACV,MAEF,IAAK,qBACL,IAAK,2BACL,IAAK,2BACH,GAAU,IACV,MAEF,IAAK,iBAAkB,CACrB,IAAM,EAAiB,EAAM,UAAU,EAAc,EAAM,MAAM,EAC7D,OAAO,WAAW,CAAc,EAClC,GAAU,OAAO,MAAM,EAAe,MAAM,EACnC,QAAQ,WAAW,CAAc,EAC1C,GAAU,QAAQ,MAAM,EAAe,MAAM,EACpC,OAAO,WAAW,CAAc,IACzC,GAAU,OAAO,MAAM,EAAe,MAAM,EAEhD,CACF,CAEF,OAAO,CACT,CAGA,eAAe,EAAiB,EAAU,CACxC,GAAI,IAAa,IAAK,GACpB,MAAO,CAAE,MAAO,IAAK,GAAG,MAAO,iBAAkB,EAEnD,IAAI,EAAS,MAAM,EAAc,CAAE,KAAM,CAAS,CAAC,EAQnD,OAPI,EAAO,QACF,CAAE,MAAO,EAAO,MAAO,MAAO,kBAAmB,GAE1D,EAAS,MAAM,EAAc,CAAE,KAAM,GAAQ,CAAQ,CAAE,CAAC,EACpD,EAAO,QACF,CAAE,MAAO,EAAO,MAAO,MAAO,gBAAiB,EAEjD,CAAE,MAAO,IAAK,GAAG,MAAO,cAAe,EAChD,CAGA,IAAI,QAAc,CAChB,KAAM,OACN,eAAgB,QAAQ,QAAQ,CAAE,KAAM,MAAO,CAAC,EAChD,MAAM,oBAAoB,CAAE,KAAM,GAAS,CACzC,OAAO,CACT,EACA,MAAM,mBAAmB,CAAE,KAAM,GAAS,CACxC,MAAO,CAAE,QAAS,CAAM,CAC1B,EACA,8BAA+B,CAE/B,CACF,GACI,IAAU,CACZ,OAAQ,EACR,KAAM,EACN,iBACI,CACJ,IAAM,EAASE,GAAU,CAAW,EACpC,MAAO,CACL,KAAM,SACN,eAAgB,EAAQ,EAAO,UAAU,EAAE,KAAM,IAAiB,CAChE,KAAM,OACN,OAAQ,EACR,GAAG,GAAU,MAAQ,CAAE,KAAM,CAAO,EACpC,GAAG,GAAe,MAAQ,CAAE,aAAY,CAC1C,EAAE,EACF,MAAM,oBAAoB,CAAE,KAAM,GAAS,EAAU,CACnD,IAAM,EAAc,MAAMC,EAAe,CAAE,KAAM,CAAM,CAAC,EACxD,GAAI,CAAC,EAAY,QACf,MAAM,IAAI,EAAuB,CAC/B,QAAS,qDACT,MAAO,EAAY,MACnB,KAAM,EACN,SAAU,EAAS,SACnB,MAAO,EAAS,MAChB,aAAc,EAAS,YACzB,CAAC,EAEH,IAAM,EAAmB,MAAMC,EAAmB,CAChD,MAAO,EAAY,MACnB,QACF,CAAC,EACD,GAAI,CAAC,EAAiB,QACpB,MAAM,IAAI,EAAuB,CAC/B,QAAS,sDACT,MAAO,EAAiB,MACxB,KAAM,EACN,SAAU,EAAS,SACnB,MAAO,EAAS,MAChB,aAAc,EAAS,YACzB,CAAC,EAEH,OAAO,EAAiB,KAC1B,EACA,MAAM,mBAAmB,CAAE,KAAM,GAAS,CACxC,IAAM,EAAS,MAAM,EAAiB,CAAK,EAC3C,OAAQ,EAAO,MAAf,CACE,IAAK,eACL,IAAK,kBACH,OAEF,IAAK,iBACL,IAAK,mBACH,MAAO,CAEL,QAAS,EAAO,KAClB,CAEJ,CACF,EACA,8BAA+B,CAE/B,CACF,CACF,EACI,IAAS,CACX,QAAS,EACT,KAAM,EACN,iBACI,CACJ,IAAM,EAAgBF,GAAU,CAAkB,EAClD,MAAO,CACL,KAAM,QAEN,eAAgB,EAAQ,EAAc,UAAU,EAAE,KAAM,GAAgB,CACtE,GAAM,CAAE,UAAS,GAAG,GAAe,EACnC,MAAO,CACL,KAAM,OACN,OAAQ,CACN,QAAS,0CACT,KAAM,SACN,WAAY,CACV,SAAU,CAAE,KAAM,QAAS,MAAO,CAAW,CAC/C,EACA,SAAU,CAAC,UAAU,EACrB,qBAAsB,EACxB,EACA,GAAG,GAAU,MAAQ,CAAE,KAAM,CAAO,EACpC,GAAG,GAAe,MAAQ,CAAE,aAAY,CAC1C,CACF,CAAC,EACD,MAAM,oBAAoB,CAAE,KAAM,GAAS,EAAU,CACnD,IAAM,EAAc,MAAMC,EAAe,CAAE,KAAM,CAAM,CAAC,EACxD,GAAI,CAAC,EAAY,QACf,MAAM,IAAI,EAAuB,CAC/B,QAAS,qDACT,MAAO,EAAY,MACnB,KAAM,EACN,SAAU,EAAS,SACnB,MAAO,EAAS,MAChB,aAAc,EAAS,YACzB,CAAC,EAEH,IAAM,EAAa,EAAY,MAC/B,GAA0B,OAAO,GAAe,WAA5C,GAAwD,EAAE,aAAc,IAAe,CAAC,MAAM,QAAQ,EAAW,QAAQ,EAC3H,MAAM,IAAI,EAAuB,CAC/B,QAAS,sDACT,MAAO,IAAIE,EAAqB,CAC9B,MAAO,EACP,MAAO,mDACT,CAAC,EACD,KAAM,EACN,SAAU,EAAS,SACnB,MAAO,EAAS,MAChB,aAAc,EAAS,YACzB,CAAC,EAEH,IAAK,IAAM,KAAW,EAAW,SAAU,CACzC,IAAM,EAAmB,MAAMD,EAAmB,CAChD,MAAO,EACP,OAAQ,CACV,CAAC,EACD,GAAI,CAAC,EAAiB,QACpB,MAAM,IAAI,EAAuB,CAC/B,QAAS,sDACT,MAAO,EAAiB,MACxB,KAAM,EACN,SAAU,EAAS,SACnB,MAAO,EAAS,MAChB,aAAc,EAAS,YACzB,CAAC,CAEL,CACA,OAAO,EAAW,QACpB,EACA,MAAM,mBAAmB,CAAE,KAAM,GAAS,CACxC,IAAM,EAAS,MAAM,EAAiB,CAAK,EAC3C,OAAQ,EAAO,MAAf,CACE,IAAK,eACL,IAAK,kBACH,OAEF,IAAK,iBACL,IAAK,mBAAoB,CACvB,IAAM,EAAa,EAAO,MAC1B,GAA0B,OAAO,GAAe,WAA5C,GAAwD,EAAE,aAAc,IAAe,CAAC,MAAM,QAAQ,EAAW,QAAQ,EAC3H,OAEF,IAAM,EAAc,EAAO,QAAU,kBAAoB,EAAW,SAAS,OAAS,EAAI,EAAW,SAAS,MAAM,EAAG,EAAE,EAAI,EAAW,SAClI,EAAiB,CAAC,EACxB,IAAK,IAAM,KAAc,EAAa,CACpC,IAAM,EAAmB,MAAMA,EAAmB,CAChD,MAAO,EACP,OAAQ,CACV,CAAC,EACG,EAAiB,SACnB,EAAe,KAAK,EAAiB,KAAK,CAE9C,CACA,MAAO,CAAE,QAAS,CAAe,CACnC,CACF,CACF,EACA,8BAA+B,CAC7B,IAAI,EAAoB,EACxB,OAAO,IAAI,gBAAgB,CACzB,UAAU,CAAE,iBAAiB,EAAY,CACvC,GAAI,GAAiB,KACnB,KAAO,EAAoB,EAAc,OAAQ,IAC/C,EAAW,QAAQ,EAAc,EAAkB,CAGzD,CACF,CAAC,CACH,CACF,CACF,EACI,IAAU,CACZ,QAAS,EACT,KAAM,EACN,kBAEO,CACL,KAAM,SAEN,eAAgB,QAAQ,QAAQ,CAC9B,KAAM,OACN,OAAQ,CACN,QAAS,0CACT,KAAM,SACN,WAAY,CACV,OAAQ,CAAE,KAAM,SAAU,KAAM,CAAc,CAChD,EACA,SAAU,CAAC,QAAQ,EACnB,qBAAsB,EACxB,EACA,GAAG,GAAU,MAAQ,CAAE,KAAM,CAAO,EACpC,GAAG,GAAe,MAAQ,CAAE,aAAY,CAC1C,CAAC,EACD,MAAM,oBAAoB,CAAE,KAAM,GAAS,EAAU,CACnD,IAAM,EAAc,MAAMD,EAAe,CAAE,KAAM,CAAM,CAAC,EACxD,GAAI,CAAC,EAAY,QACf,MAAM,IAAI,EAAuB,CAC/B,QAAS,qDACT,MAAO,EAAY,MACnB,KAAM,EACN,SAAU,EAAS,SACnB,MAAO,EAAS,MAChB,aAAc,EAAS,YACzB,CAAC,EAEH,IAAM,EAAa,EAAY,MAC/B,GAA0B,OAAO,GAAe,WAA5C,GAAwD,EAAE,WAAY,IAAe,OAAO,EAAW,QAAW,UAAY,CAAC,EAAc,SAAS,EAAW,MAAM,EACzK,MAAM,IAAI,EAAuB,CAC/B,QAAS,sDACT,MAAO,IAAIE,EAAqB,CAC9B,MAAO,EACP,MAAO,0DACT,CAAC,EACD,KAAM,EACN,SAAU,EAAS,SACnB,MAAO,EAAS,MAChB,aAAc,EAAS,YACzB,CAAC,EAEH,OAAO,EAAW,MACpB,EACA,MAAM,mBAAmB,CAAE,KAAM,GAAS,CACxC,IAAM,EAAS,MAAM,EAAiB,CAAK,EAC3C,OAAQ,EAAO,MAAf,CACE,IAAK,eACL,IAAK,kBACH,OAEF,IAAK,iBACL,IAAK,mBAAoB,CACvB,IAAM,EAAa,EAAO,MAC1B,GAA0B,OAAO,GAAe,WAA5C,GAAwD,EAAE,WAAY,IAAe,OAAO,EAAW,QAAW,SACpH,OAEF,IAAM,EAAmB,EAAc,OACpC,GAAiB,EAAa,WAAW,EAAW,MAAM,CAC7D,EAIE,OAHE,EAAO,QAAU,mBACZ,EAAiB,SAAS,EAAW,MAAM,EAAI,CAAE,QAAS,EAAW,MAAO,EAAI,IAAK,GAErF,EAAiB,SAAW,EAAI,CAAE,QAAS,EAAiB,EAAG,EAAI,IAAK,EAEnF,CACF,CACF,EACA,8BAA+B,CAE/B,CACF,GAEE,IAAQ,CACV,KAAM,EACN,eACE,CAAC,KACI,CACL,KAAM,OACN,eAAgB,QAAQ,QAAQ,CAC9B,KAAM,OACN,GAAG,GAAU,MAAQ,CAAE,KAAM,CAAO,EACpC,GAAG,GAAe,MAAQ,CAAE,aAAY,CAC1C,CAAC,EACD,MAAM,oBAAoB,CAAE,KAAM,GAAS,EAAU,CACnD,IAAM,EAAc,MAAMF,EAAe,CAAE,KAAM,CAAM,CAAC,EACxD,GAAI,CAAC,EAAY,QACf,MAAM,IAAI,EAAuB,CAC/B,QAAS,qDACT,MAAO,EAAY,MACnB,KAAM,EACN,SAAU,EAAS,SACnB,MAAO,EAAS,MAChB,aAAc,EAAS,YACzB,CAAC,EAEH,OAAO,EAAY,KACrB,EACA,MAAM,mBAAmB,CAAE,KAAM,GAAS,CACxC,IAAM,EAAS,MAAM,EAAiB,CAAK,EAC3C,OAAQ,EAAO,MAAf,CACE,IAAK,eACL,IAAK,kBACH,OAEF,IAAK,iBACL,IAAK,mBACH,OAAO,EAAO,QAAU,IAAK,GAAI,IAAK,GAAI,CAAE,QAAS,EAAO,KAAM,CAEtE,CACF,EACA,8BAA+B,CAE/B,CACF,GAsYuB,EAAkB,CACzC,OAAQ,QACR,KAAM,EACR,CAAC,EAy9B4C,gBAgE7C,IAAI,GAAqBG,EACvBC,EAAU,EACV,EAAgB,SAAS,CAC3B,EACI,GAAuB,OACnB,GACJC,EAAS,CACPC,EAAgB,CACd,KAAMC,EAAW,YAAY,EAC7B,GAAIH,EAAU,EACd,iBAAkB,EAAuB,SAAS,CACpD,CAAC,EACDE,EAAgB,CACd,KAAMC,EAAW,YAAY,EAC7B,GAAIH,EAAU,EACd,MAAOA,EAAU,EACjB,iBAAkB,EAAuB,SAAS,CACpD,CAAC,EACDE,EAAgB,CACd,KAAMC,EAAW,UAAU,EAC3B,GAAIH,EAAU,EACd,iBAAkB,EAAuB,SAAS,CACpD,CAAC,EACDE,EAAgB,CACd,KAAMC,EAAW,OAAO,EACxB,UAAWH,EAAU,CACvB,CAAC,EACDE,EAAgB,CACd,KAAMC,EAAW,kBAAkB,EACnC,WAAYH,EAAU,EACtB,SAAUA,EAAU,EACpB,iBAAkBI,EAAW,EAAE,SAAS,EACxC,iBAAkB,EAAuB,SAAS,EAClD,aAAc,GAAmB,SAAS,EAC1C,QAASA,EAAW,EAAE,SAAS,EAC/B,MAAOJ,EAAU,EAAE,SAAS,CAC9B,CAAC,EACDE,EAAgB,CACd,KAAMC,EAAW,kBAAkB,EACnC,WAAYH,EAAU,EACtB,eAAgBA,EAAU,CAC5B,CAAC,EACDE,EAAgB,CACd,KAAMC,EAAW,sBAAsB,EACvC,WAAYH,EAAU,EACtB,SAAUA,EAAU,EACpB,MAAOK,EAAW,EAClB,iBAAkBD,EAAW,EAAE,SAAS,EACxC,iBAAkB,EAAuB,SAAS,EAClD,aAAc,GAAmB,SAAS,EAC1C,QAASA,EAAW,EAAE,SAAS,EAC/B,MAAOJ,EAAU,EAAE,SAAS,CAC9B,CAAC,EACDE,EAAgB,CACd,KAAMC,EAAW,kBAAkB,EACnC,WAAYH,EAAU,EACtB,SAAUA,EAAU,EACpB,MAAOK,EAAW,EAClB,iBAAkBD,EAAW,EAAE,SAAS,EACxC,iBAAkB,EAAuB,SAAS,EAClD,aAAc,GAAmB,SAAS,EAC1C,QAASA,EAAW,EAAE,SAAS,EAC/B,UAAWJ,EAAU,EACrB,MAAOA,EAAU,EAAE,SAAS,CAC9B,CAAC,EACDE,EAAgB,CACd,KAAMC,EAAW,uBAAuB,EACxC,WAAYH,EAAU,EACtB,WAAYA,EAAU,CACxB,CAAC,EACDE,EAAgB,CACd,KAAMC,EAAW,uBAAuB,EACxC,WAAYH,EAAU,EACtB,OAAQK,EAAW,EACnB,iBAAkBD,EAAW,EAAE,SAAS,EACxC,iBAAkB,EAAuB,SAAS,EAClD,aAAc,GAAmB,SAAS,EAC1C,QAASA,EAAW,EAAE,SAAS,EAC/B,YAAaA,EAAW,EAAE,SAAS,CACrC,CAAC,EACDF,EAAgB,CACd,KAAMC,EAAW,mBAAmB,EACpC,WAAYH,EAAU,EACtB,UAAWA,EAAU,EACrB,iBAAkBI,EAAW,EAAE,SAAS,EACxC,iBAAkB,EAAuB,SAAS,EAClD,aAAc,GAAmB,SAAS,EAC1C,QAASA,EAAW,EAAE,SAAS,CACjC,CAAC,EACDF,EAAgB,CACd,KAAMC,EAAW,oBAAoB,EACrC,WAAYH,EAAU,CACxB,CAAC,EACDE,EAAgB,CACd,KAAMC,EAAW,iBAAiB,EAClC,GAAIH,EAAU,EACd,iBAAkB,EAAuB,SAAS,CACpD,CAAC,EACDE,EAAgB,CACd,KAAMC,EAAW,iBAAiB,EAClC,GAAIH,EAAU,EACd,MAAOA,EAAU,EACjB,iBAAkB,EAAuB,SAAS,CACpD,CAAC,EACDE,EAAgB,CACd,KAAMC,EAAW,eAAe,EAChC,GAAIH,EAAU,EACd,iBAAkB,EAAuB,SAAS,CACpD,CAAC,EACDE,EAAgB,CACd,KAAMC,EAAW,YAAY,EAC7B,SAAUH,EAAU,EACpB,IAAKA,EAAU,EACf,MAAOA,EAAU,EAAE,SAAS,EAC5B,iBAAkB,EAAuB,SAAS,CACpD,CAAC,EACDE,EAAgB,CACd,KAAMC,EAAW,iBAAiB,EAClC,SAAUH,EAAU,EACpB,UAAWA,EAAU,EACrB,MAAOA,EAAU,EACjB,SAAUA,EAAU,EAAE,SAAS,EAC/B,iBAAkB,EAAuB,SAAS,CACpD,CAAC,EACDE,EAAgB,CACd,KAAMC,EAAW,MAAM,EACvB,IAAKH,EAAU,EACf,UAAWA,EAAU,EACrB,iBAAkB,EAAuB,SAAS,CACpD,CAAC,EACDE,EAAgB,CACd,KAAMI,GACH,GAAU,OAAO,GAAU,UAAY,EAAM,WAAW,OAAO,EAChE,CAAE,QAAS,8BAA+B,CAC5C,EACA,GAAIN,EAAU,EAAE,SAAS,EACzB,KAAMK,EAAW,EACjB,UAAWD,EAAW,EAAE,SAAS,CACnC,CAAC,EACDF,EAAgB,CACd,KAAMC,EAAW,YAAY,CAC/B,CAAC,EACDD,EAAgB,CACd,KAAMC,EAAW,aAAa,CAChC,CAAC,EACDD,EAAgB,CACd,KAAMC,EAAW,OAAO,EACxB,UAAWH,EAAU,EAAE,SAAS,EAChC,gBAAiBK,EAAW,EAAE,SAAS,CACzC,CAAC,EACDH,EAAgB,CACd,KAAMC,EAAW,QAAQ,EACzB,aAAcI,EAAQ,CACpB,OACA,SACA,iBACA,aACA,QACA,OACF,CAAC,EAAE,SAAS,EACZ,gBAAiBF,EAAW,EAAE,SAAS,CACzC,CAAC,EACDH,EAAgB,CACd,KAAMC,EAAW,OAAO,EACxB,OAAQH,EAAU,EAAE,SAAS,CAC/B,CAAC,EACDE,EAAgB,CACd,KAAMC,EAAW,kBAAkB,EACnC,gBAAiBE,EAAW,CAC9B,CAAC,CACH,CAAC,CACH,CACF,EACA,SAAS,GAAqB,EAAO,CACnC,OAAO,EAAM,KAAK,WAAW,OAAO,CACtC,CAMA,SAAS,GAAa,EAAM,CAC1B,OAAO,EAAK,OAAS,MACvB,CAOA,SAAS,GAAmB,EAAM,CAChC,OAAO,EAAK,KAAK,WAAW,OAAO,CACrC,CACA,SAAS,GAAoB,EAAM,CACjC,OAAO,EAAK,OAAS,cACvB,CACA,SAAS,EAAa,EAAM,CAC1B,OAAO,GAAmB,CAAI,GAAK,GAAoB,CAAI,CAC7D,CAEA,SAAS,GAAkB,EAAM,CAC/B,OAAO,EAAK,KAAK,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,CAC/C,CACA,SAAS,GAAY,EAAM,CACzB,OAAO,GAAoB,CAAI,EAAI,EAAK,SAAW,GAAkB,CAAI,CAC3E,CAIA,SAAS,GAA8B,CACrC,cACA,aACC,CACD,MAAO,CACL,QAAU,GAA2C,OAAU,YAAc,EAAc,CACzF,GAAI,EACJ,SAAU,IAAK,GACf,KAAM,YACN,MAAO,CAAC,CACV,EACA,gBAAiB,CAAC,EAClB,qBAAsB,CAAC,EACvB,iBAAkB,CAAC,CACrB,CACF,CACA,SAAS,GAAuB,CAC9B,SACA,wBACA,kBACA,sBACA,UACA,aACA,UACC,CACD,OAAO,EAAO,YACZ,IAAI,gBAAgB,CAClB,MAAM,UAAU,EAAO,EAAY,CACjC,MAAM,EAAoB,MAAO,CAAE,QAAO,WAAY,CAEpD,SAAS,EAAkB,EAAY,CAErC,IAAM,EADkB,EAAM,QAAQ,MAAM,OAAO,CACd,EAAE,KACpC,GAAe,EAAW,aAAe,CAC5C,EACA,GAAI,GAAkB,KACpB,MAAM,IAAI,EAAqB,CAC7B,UAAW,kBACX,QAAS,EACT,QAAS,8CAA8C,EAAW,GACpE,CAAC,EAEH,OAAO,CACT,CACA,SAAS,EAAe,EAAS,CAE/B,IAAM,EAAO,EAAM,QAAQ,MAAM,KAC9B,GAAU,GAAmB,CAAK,GAAK,EAAM,aAAe,EAAQ,UACvE,EACM,EAAa,EACb,EAAU,EAChB,GAAI,GAAQ,KAAM,CAChB,EAAK,MAAQ,EAAQ,MACrB,EAAQ,MAAQ,EAAW,MAC3B,EAAQ,OAAS,EAAW,OAC5B,EAAQ,UAAY,EAAW,UAC/B,EAAQ,SAAW,EAAW,SAC9B,EAAQ,YAAc,EAAW,YAC7B,EAAQ,QAAU,IAAK,KACzB,EAAQ,MAAQ,EAAQ,OAEtB,EAAQ,eAAiB,IAAK,KAChC,EAAQ,aAAe,EAAQ,cAEjC,EAAQ,iBAA2B,EAAW,kBAAmC,EAAK,iBACtF,IAAM,EAAmB,EAAW,iBACpC,GAAI,GAAoB,KACtB,GAAI,EAAQ,QAAU,oBAAsB,EAAQ,QAAU,eAAgB,CAC5E,IAAM,EAAa,EACnB,EAAW,uBAAyB,CACtC,MACE,EAAK,qBAAuB,CAGlC,MACE,EAAM,QAAQ,MAAM,KAAK,CACvB,KAAM,QAAQ,EAAQ,WACtB,WAAY,EAAQ,WACpB,MAAO,EAAQ,MACf,MAAO,EAAQ,MACf,GAAG,EAAQ,eAAiB,IAAK,GAA6C,CAAC,EAA1C,CAAE,aAAc,EAAQ,YAAa,EAC1E,MAAO,EAAW,MAClB,OAAQ,EAAW,OACnB,SAAU,EAAW,SACrB,UAAW,EAAW,UACtB,iBAAkB,EAAW,iBAC7B,YAAa,EAAW,YACxB,GAAG,EAAW,kBAAoB,OAAS,EAAQ,QAAU,oBAAsB,EAAQ,QAAU,gBAAkB,CAAE,uBAAwB,EAAW,gBAAiB,EAAI,CAAC,EAClL,GAAG,EAAW,kBAAoB,MAAQ,EAAE,EAAQ,QAAU,oBAAsB,EAAQ,QAAU,gBAAkB,CAAE,qBAAsB,EAAW,gBAAiB,EAAI,CAAC,CACnL,CAAC,CAEL,CACA,SAAS,EAAsB,EAAS,CAEtC,IAAM,EAAO,EAAM,QAAQ,MAAM,KAC9B,GAAU,EAAM,OAAS,gBAAkB,EAAM,aAAe,EAAQ,UAC3E,EACM,EAAa,EACb,EAAU,EAChB,GAAI,GAAQ,KAAM,CAChB,EAAK,MAAQ,EAAQ,MACrB,EAAQ,SAAW,EAAQ,SAC3B,EAAQ,MAAQ,EAAW,MAC3B,EAAQ,OAAS,EAAW,OAC5B,EAAQ,UAAY,EAAW,UAC/B,EAAQ,SAAmB,EAAW,UAA2B,EAAQ,SACzE,EAAQ,YAAc,EAAW,YAC7B,EAAQ,QAAU,IAAK,KACzB,EAAQ,MAAQ,EAAQ,OAEtB,EAAQ,eAAiB,IAAK,KAChC,EAAQ,aAAe,EAAQ,cAEjC,EAAQ,iBAA0B,EAAW,kBAAkC,EAAK,iBACpF,IAAM,EAAmB,EAAW,iBACpC,GAAI,GAAoB,KACtB,GAAI,EAAQ,QAAU,oBAAsB,EAAQ,QAAU,eAAgB,CAC5E,IAAM,EAAa,EACnB,EAAW,uBAAyB,CACtC,MACE,EAAK,qBAAuB,CAGlC,MACE,EAAM,QAAQ,MAAM,KAAK,CACvB,KAAM,eACN,SAAU,EAAQ,SAClB,WAAY,EAAQ,WACpB,MAAO,EAAQ,MACf,MAAO,EAAW,MAClB,OAAQ,EAAW,OACnB,UAAW,EAAW,UACtB,YAAa,EAAW,YACxB,iBAAkB,EAAW,iBAC7B,MAAO,EAAQ,MACf,GAAG,EAAQ,eAAiB,IAAK,GAA6C,CAAC,EAA1C,CAAE,aAAc,EAAQ,YAAa,EAC1E,GAAG,EAAW,kBAAoB,OAAS,EAAQ,QAAU,oBAAsB,EAAQ,QAAU,gBAAkB,CAAE,uBAAwB,EAAW,gBAAiB,EAAI,CAAC,EAClL,GAAG,EAAW,kBAAoB,MAAQ,EAAE,EAAQ,QAAU,oBAAsB,EAAQ,QAAU,gBAAkB,CAAE,qBAAsB,EAAW,gBAAiB,EAAI,CAAC,CACnL,CAAC,CAEL,CACA,eAAe,EAAsB,EAAU,CAC7C,GAAI,GAAY,KAAM,CACpB,IAAM,EAAiB,EAAM,QAAQ,UAAY,KAAwD,EAAjD,GAAa,EAAM,QAAQ,SAAU,CAAQ,EACjG,GAAyB,MAC3B,MAAM,GAAc,CAClB,MAAO,EACP,OAAQ,EACR,QAAS,CACP,MAAO,mBACP,SAAU,EAAM,QAAQ,EAC1B,CACF,CAAC,EAEH,EAAM,QAAQ,SAAW,CAC3B,CACF,CACA,OAAQ,EAAM,KAAd,CACE,IAAK,aAAc,CACjB,IAAM,EAAW,CACf,KAAM,OACN,KAAM,GACN,iBAAkB,EAAM,iBACxB,MAAO,WACT,EACA,EAAM,gBAAgB,EAAM,IAAM,EAClC,EAAM,QAAQ,MAAM,KAAK,CAAQ,EACjC,EAAM,EACN,KACF,CACA,IAAK,aAAc,CACjB,IAAM,EAAW,EAAM,gBAAgB,EAAM,IAC7C,GAAI,GAAY,KACd,MAAM,IAAI,EAAqB,CAC7B,UAAW,aACX,QAAS,EAAM,GACf,QAAS,sDAAsD,EAAM,GAAG,uEAC1E,CAAC,EAEH,EAAS,MAAQ,EAAM,MACvB,EAAS,iBAA2B,EAAM,kBAAmC,EAAS,iBACtF,EAAM,EACN,KACF,CACA,IAAK,WAAY,CACf,IAAM,EAAW,EAAM,gBAAgB,EAAM,IAC7C,GAAI,GAAY,KACd,MAAM,IAAI,EAAqB,CAC7B,UAAW,WACX,QAAS,EAAM,GACf,QAAS,oDAAoD,EAAM,GAAG,qEACxE,CAAC,EAEH,EAAS,MAAQ,OACjB,EAAS,iBAAyB,EAAM,kBAAiC,EAAS,iBAClF,OAAO,EAAM,gBAAgB,EAAM,IACnC,EAAM,EACN,KACF,CACA,IAAK,kBAAmB,CACtB,IAAM,EAAgB,CACpB,KAAM,YACN,KAAM,GACN,iBAAkB,EAAM,iBACxB,MAAO,WACT,EACA,EAAM,qBAAqB,EAAM,IAAM,EACvC,EAAM,QAAQ,MAAM,KAAK,CAAa,EACtC,EAAM,EACN,KACF,CACA,IAAK,kBAAmB,CACtB,IAAM,EAAgB,EAAM,qBAAqB,EAAM,IACvD,GAAI,GAAiB,KACnB,MAAM,IAAI,EAAqB,CAC7B,UAAW,kBACX,QAAS,EAAM,GACf,QAAS,gEAAgE,EAAM,GAAG,iFACpF,CAAC,EAEH,EAAc,MAAQ,EAAM,MAC5B,EAAc,iBAAyB,EAAM,kBAAiC,EAAc,iBAC5F,EAAM,EACN,KACF,CACA,IAAK,gBAAiB,CACpB,IAAM,EAAgB,EAAM,qBAAqB,EAAM,IACvD,GAAI,GAAiB,KACnB,MAAM,IAAI,EAAqB,CAC7B,UAAW,gBACX,QAAS,EAAM,GACf,QAAS,8DAA8D,EAAM,GAAG,+EAClF,CAAC,EAEH,EAAc,iBAAyB,EAAM,kBAAiC,EAAc,iBAC5F,EAAc,MAAQ,OACtB,OAAO,EAAM,qBAAqB,EAAM,IACxC,EAAM,EACN,KACF,CACA,IAAK,OACH,EAAM,QAAQ,MAAM,KAAK,CACvB,KAAM,OACN,UAAW,EAAM,UACjB,IAAK,EAAM,IACX,GAAG,EAAM,kBAAoB,KAAsD,CAAC,EAAhD,CAAE,iBAAkB,EAAM,gBAAiB,CACjF,CAAC,EACD,EAAM,EACN,MAEF,IAAK,aACH,EAAM,QAAQ,MAAM,KAAK,CACvB,KAAM,aACN,SAAU,EAAM,SAChB,IAAK,EAAM,IACX,MAAO,EAAM,MACb,iBAAkB,EAAM,gBAC1B,CAAC,EACD,EAAM,EACN,MAEF,IAAK,kBACH,EAAM,QAAQ,MAAM,KAAK,CACvB,KAAM,kBACN,SAAU,EAAM,SAChB,UAAW,EAAM,UACjB,MAAO,EAAM,MACb,SAAU,EAAM,SAChB,iBAAkB,EAAM,gBAC1B,CAAC,EACD,EAAM,EACN,MAEF,IAAK,mBAAoB,CACvB,IAAM,EAAkB,EAAM,QAAQ,MAAM,OAAO,EAAkB,EACrE,EAAM,iBAAiB,EAAM,YAAc,CACzC,KAAM,GACN,SAAU,EAAM,SAChB,MAAO,EAAgB,OACvB,QAAS,EAAM,QACf,MAAO,EAAM,MACb,aAAc,EAAM,YACtB,EACI,EAAM,QACR,EAAsB,CACpB,WAAY,EAAM,WAClB,SAAU,EAAM,SAChB,MAAO,kBACP,MAAO,IAAK,GACZ,iBAAkB,EAAM,iBACxB,MAAO,EAAM,MACb,aAAc,EAAM,aACpB,iBAAkB,EAAM,gBAC1B,CAAC,EAED,EAAe,CACb,WAAY,EAAM,WAClB,SAAU,EAAM,SAChB,MAAO,kBACP,MAAO,IAAK,GACZ,iBAAkB,EAAM,iBACxB,MAAO,EAAM,MACb,aAAc,EAAM,aACpB,iBAAkB,EAAM,gBAC1B,CAAC,EAEH,EAAM,EACN,KACF,CACA,IAAK,mBAAoB,CACvB,IAAM,EAAkB,EAAM,iBAAiB,EAAM,YACrD,GAAI,GAAmB,KACrB,MAAM,IAAI,EAAqB,CAC7B,UAAW,mBACX,QAAS,EAAM,WACf,QAAS,4DAA4D,EAAM,WAAW,mFACxF,CAAC,EAEH,EAAgB,MAAQ,EAAM,eAC9B,GAAM,CAAE,MAAO,GAAgB,MAAM,EACnC,EAAgB,IAClB,EACI,EAAgB,QAClB,EAAsB,CACpB,WAAY,EAAM,WAClB,SAAU,EAAgB,SAC1B,MAAO,kBACP,MAAO,EACP,MAAO,EAAgB,MACvB,aAAc,EAAgB,YAChC,CAAC,EAED,EAAe,CACb,WAAY,EAAM,WAClB,SAAU,EAAgB,SAC1B,MAAO,kBACP,MAAO,EACP,MAAO,EAAgB,MACvB,aAAc,EAAgB,YAChC,CAAC,EAEH,EAAM,EACN,KACF,CACA,IAAK,uBACC,EAAM,QACR,EAAsB,CACpB,WAAY,EAAM,WAClB,SAAU,EAAM,SAChB,MAAO,kBACP,MAAO,EAAM,MACb,iBAAkB,EAAM,iBACxB,iBAAkB,EAAM,iBACxB,MAAO,EAAM,MACb,aAAc,EAAM,YACtB,CAAC,EAED,EAAe,CACb,WAAY,EAAM,WAClB,SAAU,EAAM,SAChB,MAAO,kBACP,MAAO,EAAM,MACb,iBAAkB,EAAM,iBACxB,iBAAkB,EAAM,iBACxB,MAAO,EAAM,MACb,aAAc,EAAM,YACtB,CAAC,EAEH,EAAM,EACF,GAAc,CAAC,EAAM,kBACvB,MAAM,EAAW,CACf,SAAU,CACZ,CAAC,EAEH,MAEF,IAAK,mBAAoB,CACvB,IAAM,EAAe,EAAM,QAAQ,MAAM,OAAO,CAAY,EAAE,KAAM,GAAM,EAAE,aAAe,EAAM,UAAU,GACzF,GAAgB,KAAgD,EAAM,QAA/C,EAAa,OAAS,gBAE7D,EAAsB,CACpB,WAAY,EAAM,WAClB,SAAU,EAAM,SAChB,MAAO,eACP,MAAO,EAAM,MACb,UAAW,EAAM,UACjB,iBAAkB,EAAM,iBACxB,iBAAkB,EAAM,iBACxB,aAAc,EAAM,YACtB,CAAC,EAED,EAAe,CACb,WAAY,EAAM,WAClB,SAAU,EAAM,SAChB,MAAO,eACP,MAAO,IAAK,GACZ,SAAU,EAAM,MAChB,UAAW,EAAM,UACjB,iBAAkB,EAAM,iBACxB,iBAAkB,EAAM,iBACxB,aAAc,EAAM,YACtB,CAAC,EAEH,EAAM,EACN,KACF,CACA,IAAK,wBAAyB,CAC5B,IAAM,EAAiB,EAAkB,EAAM,UAAU,EACzD,EAAe,MAAQ,qBACvB,EAAe,SAAW,CAAE,GAAI,EAAM,UAAW,EACjD,EAAM,EACN,KACF,CACA,IAAK,qBAAsB,CACzB,IAAM,EAAiB,EAAkB,EAAM,UAAU,EACzD,EAAe,MAAQ,gBACvB,EAAM,EACN,KACF,CACA,IAAK,wBAAyB,CAC5B,IAAM,EAAiB,EAAkB,EAAM,UAAU,EACrD,EAAe,OAAS,eAC1B,EAAsB,CACpB,WAAY,EAAM,WAClB,SAAU,EAAe,SACzB,MAAO,mBACP,MAAO,EAAe,MACtB,OAAQ,EAAM,OACd,YAAa,EAAM,YACnB,iBAAkB,EAAM,iBACxB,iBAAkB,EAAM,iBACxB,MAAO,EAAe,MACtB,aAAc,EAAe,YAC/B,CAAC,EAED,EAAe,CACb,WAAY,EAAM,WAClB,SAAU,GAAkB,CAAc,EAC1C,MAAO,mBACP,MAAO,EAAe,MACtB,OAAQ,EAAM,OACd,iBAAkB,EAAM,iBACxB,YAAa,EAAM,YACnB,iBAAkB,EAAM,iBACxB,MAAO,EAAe,MACtB,aAAc,EAAe,YAC/B,CAAC,EAEH,EAAM,EACN,KACF,CACA,IAAK,oBAAqB,CACxB,IAAM,EAAiB,EAAkB,EAAM,UAAU,EACrD,EAAe,OAAS,eAC1B,EAAsB,CACpB,WAAY,EAAM,WAClB,SAAU,EAAe,SACzB,MAAO,eACP,MAAO,EAAe,MACtB,UAAW,EAAM,UACjB,iBAAkB,EAAM,iBACxB,iBAAkB,EAAM,iBACxB,MAAO,EAAe,MACtB,aAAc,EAAe,YAC/B,CAAC,EAED,EAAe,CACb,WAAY,EAAM,WAClB,SAAU,GAAkB,CAAc,EAC1C,MAAO,eACP,MAAO,EAAe,MACtB,SAAU,EAAe,SACzB,UAAW,EAAM,UACjB,iBAAkB,EAAM,iBACxB,iBAAkB,EAAM,iBACxB,MAAO,EAAe,MACtB,aAAc,EAAe,YAC/B,CAAC,EAEH,EAAM,EACN,KACF,CACA,IAAK,aACH,EAAM,QAAQ,MAAM,KAAK,CAAE,KAAM,YAAa,CAAC,EAC/C,MAEF,IAAK,cACH,EAAM,gBAAkB,CAAC,EACzB,EAAM,qBAAuB,CAAC,EAC9B,MAEF,IAAK,QACC,EAAM,WAAa,OACrB,EAAM,QAAQ,GAAK,EAAM,WAE3B,MAAM,EAAsB,EAAM,eAAe,GAC7C,EAAM,WAAa,MAAQ,EAAM,iBAAmB,OACtD,EAAM,EAER,MAEF,IAAK,SACC,EAAM,cAAgB,OACxB,EAAM,aAAe,EAAM,cAE7B,MAAM,EAAsB,EAAM,eAAe,EAC7C,EAAM,iBAAmB,MAC3B,EAAM,EAER,MAEF,IAAK,mBACH,MAAM,EAAsB,EAAM,eAAe,EAC7C,EAAM,iBAAmB,MAC3B,EAAM,EAER,MAEF,IAAK,QACH,IAAuC,MAAM,EAAM,SAAS,CAAC,EAC7D,MAEF,QACE,GAAI,GAAqB,CAAK,EAAG,CAC/B,GAAK,IAAmD,EAAM,OAAU,KAAM,CAC5E,IAAM,EAAU,EAAM,QAAQ,MAAM,UACjC,GAAM,OAAQ,GAAK,SAAU,GAAK,EAAE,KAAO,EAAM,IAAM,EAAE,OAAS,EAAM,IAC3E,EACM,EAAgB,GAAW,EAAI,EAAU,EAAM,QAAQ,MAAM,OACnE,MAAM,GAAc,CAClB,MAAO,EAAM,KACb,OAAQ,EAAgB,EAAM,MAC9B,QAAS,CACP,MAAO,iBAAiB,EAAc,QACtC,WAAY,EAAM,KAClB,SAAU,EAAM,EAClB,CACF,CAAC,CACH,CACA,IAAM,EAAY,EAClB,GAAI,EAAU,UAAW,CACvB,IAAiC,CAAS,EAC1C,KACF,CACA,IAAM,EAAiB,EAAU,IAAM,KAEnC,IAAK,GAFqC,EAAM,QAAQ,MAAM,KAC/D,GAAa,EAAU,OAAS,EAAS,MAAQ,EAAU,KAAO,EAAS,EAC9E,EACI,GAAkB,KAGpB,EAAM,QAAQ,MAAM,KAAK,CAAS,EAFlC,EAAe,KAAO,EAAU,KAIlC,IAAiC,CAAS,EAC1C,EAAM,CACR,CAEJ,CACA,EAAW,QAAQ,CAAK,CAC1B,CAAC,CACH,CACF,CAAC,CACH,CACF,CAkMA,eAAe,GAAc,CAC3B,SACA,WACC,CACD,IAAM,EAAS,EAAO,UAAU,EAChC,GAAI,CACF,OAAa,CACX,GAAM,CAAE,QAAS,MAAM,EAAO,KAAK,EACnC,GAAI,EACF,KACJ,CACF,OAAS,EAAO,CACd,IAAmC,CAAK,CAC1C,QAAU,CACR,EAAO,YAAY,CACrB,CACF,CAiW0BG,EAAmB,CAC3C,OAAQ,QACR,KAAM,EACR,CAAC,EAoqEyBC,EACxBC,EAAU,EACV,EAAgB,SAAS,CAC3B,EAg/C0BW,EAAmB,CAAE,OAAQ,QAAS,KAAM,EAAG,CAAC,EAuW1E,IAAI,GAAoB,KAAM,CAC5B,aAAc,CACZ,KAAK,MAAQ,CAAC,EACd,KAAK,aAAe,EACtB,CACA,MAAM,cAAe,CACf,SAAK,aAIT,KADA,KAAK,aAAe,GACb,KAAK,MAAM,OAAS,GACzB,MAAM,KAAK,MAAM,GAAG,EACpB,KAAK,MAAM,MAAM,EAEnB,KAAK,aAAe,EADpB,CAEF,CACA,MAAM,IAAI,EAAK,CACb,OAAO,IAAI,SAAS,EAAU,IAAW,CACvC,KAAK,MAAM,KAAK,SAAY,CAC1B,GAAI,CACF,MAAM,EAAI,EACV,EAAS,CACX,OAAS,EAAO,CACd,EAAO,CAAK,CACd,CACF,CAAC,EACD,KAAU,aAAa,CACzB,CAAC,CACH,CACF,EA0B0BC,EAAmB,CAAE,OAAQ,QAAS,KAAM,EAAG,CAAC,EA6sE1E,eAAe,GAA6B,EAAO,CACjD,GAAI,GAAS,KACX,MAAO,CAAC,EAEV,GAAI,CAAC,WAAW,UAAY,EAAE,aAAiB,WAAW,UACxD,MAAU,MAAM,sDAAsD,EAExE,OAAO,QAAQ,IACb,MAAM,KAAK,CAAK,EAAE,IAAI,KAAO,IAAS,CACpC,GAAM,CAAE,KAAM,EAAQ,QAAS,EAU/B,MAAO,CACL,KAAM,OACN,UAAW,EACX,SAAU,EACV,IAAK,MAbe,IAAI,SAAS,EAAU,IAAW,CACtD,IAAM,EAAS,IAAI,WACnB,EAAO,OAAU,GAAgB,CAE/B,EAAiB,EAAY,QAAgC,MAAM,CACrE,EACA,EAAO,QAAW,GAAU,EAAO,CAAK,EACxC,EAAO,cAAc,CAAI,CAC3B,CAAC,CAMD,CACF,CAAC,CACH,CACF,CAUA,IAAI,GAAoB,KAAM,CAC5B,YAAY,CACV,MAAM,YACN,cACA,UACA,OACA,MAAO,EACP,6BACA,mCACC,CACD,KAAK,IAAM,EACX,KAAK,YAAc,EACnB,KAAK,QAAU,EACf,KAAK,KAAO,EACZ,KAAK,MAAQ,EACb,KAAK,2BAA6B,EAClC,KAAK,gCAAkC,CACzC,CACA,MAAM,aAAa,CACjB,cACA,GAAG,GACF,CAED,IAAM,EAAe,MAAMC,EAAS,KAAK,IAAI,EACvC,EAAkB,MAAMA,EAAS,KAAK,OAAO,EAC7C,EAAsB,MAAMA,EAAS,KAAK,WAAW,EACrD,EAAc,CAClB,GAAG,EAAiB,CAAe,EACnC,GAAG,EAAiB,EAAQ,OAAO,CACrC,EACM,EAAkB,MAAe,KAAK,4BAAoD,KAAK,KAAM,CACzG,IAAK,KAAK,IACV,GAAI,EAAQ,OACZ,SAAU,EAAQ,SAClB,KAAM,CAAE,GAAG,EAAc,GAAG,EAAQ,IAAK,EACzC,QAAS,EACT,YAAa,EACb,gBAAiB,EAAQ,SACzB,QAAS,EAAQ,QACjB,UAAW,EAAQ,SACrB,CAAC,EACK,EAAY,GAAmD,KAAoB,KAAK,IACxF,EAAW,GAAmD,UAAa,IAAK,GAAgD,EAA5C,EAAiB,EAAgB,OAAO,EAC5H,EAAQ,GAAmD,OAAU,IAAK,GAA2B,CACzG,GAAG,EACH,GAAG,EAAQ,KACX,GAAI,EAAQ,OACZ,SAAU,EAAQ,SAClB,QAAS,EAAQ,QACjB,UAAW,EAAQ,SACrB,EAPoF,EAAgB,KAQ9F,EAAoB,GAAmD,aAA4B,EAEnG,EAAW,MADI,KAAK,OAAsB,WAAW,OAC7B,EAAK,CACjC,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,GAAG,CACL,EACA,KAAM,KAAK,UAAU,CAAI,EACzB,cACA,OAAQ,CACV,CAAC,EACD,GAAI,CAAC,EAAS,GACZ,MAAU,MACF,MAAM,EAAS,KAAK,GAAkB,oCAC9C,EAEF,GAAI,CAAC,EAAS,KACZ,MAAU,MAAM,6BAA6B,EAE/C,OAAO,KAAK,sBAAsB,EAAS,IAAI,CACjD,CACA,MAAM,kBAAkB,EAAS,CAE/B,IAAM,EAAe,MAAMA,EAAS,KAAK,IAAI,EACvC,EAAkB,MAAMA,EAAS,KAAK,OAAO,EAC7C,EAAsB,MAAMA,EAAS,KAAK,WAAW,EACrD,EAAc,CAClB,GAAG,EAAiB,CAAe,EACnC,GAAG,EAAiB,EAAQ,OAAO,CACrC,EACM,EAAkB,MAAe,KAAK,iCAAyD,KAAK,KAAM,CAC9G,IAAK,KAAK,IACV,GAAI,EAAQ,OACZ,KAAM,CAAE,GAAG,EAAc,GAAG,EAAQ,IAAK,EACzC,QAAS,EACT,YAAa,EACb,gBAAiB,EAAQ,QAC3B,CAAC,EACK,EAAY,GAAmD,KAAoB,GAAG,KAAK,IAAI,GAAG,EAAQ,OAAO,SACjH,EAAW,GAAmD,UAAa,IAAK,GAAgD,EAA5C,EAAiB,EAAgB,OAAO,EAC5H,EAAoB,GAAmD,aAA4B,EAEnG,EAAW,MADI,KAAK,OAAsB,WAAW,OAC7B,EAAK,CACjC,OAAQ,MACR,UACA,aACF,CAAC,EACD,GAAI,EAAS,SAAW,IACtB,OAAO,KAET,GAAI,CAAC,EAAS,GACZ,MAAU,MACF,MAAM,EAAS,KAAK,GAAkB,oCAC9C,EAEF,GAAI,CAAC,EAAS,KACZ,MAAU,MAAM,6BAA6B,EAE/C,OAAO,KAAK,sBAAsB,EAAS,IAAI,CACjD,CACF,EAGI,GAAuB,cAAc,EAAkB,CACzD,YAAY,EAAU,CAAC,EAAG,CACxB,MAAM,CAAO,CACf,CACA,sBAAsB,EAAQ,CAC5B,OAAOC,GAAsB,CAC3B,SACA,OAAQ,EACV,CAAC,EAAE,YACD,IAAI,gBAAgB,CAClB,MAAM,UAAU,EAAO,EAAY,CACjC,GAAI,CAAC,EAAM,QACT,MAAM,EAAM,MAEd,EAAW,QAAQ,EAAM,KAAK,CAChC,CACF,CAAC,CACH,CACF,CACF,EAGI,GAAe,KAAM,CACvB,YAAY,CACV,WAAY,EAAcC,GAC1B,KAAK,EAAY,EACjB,YAAY,IAAI,GAChB,wBACA,kBACA,QACA,UACA,aACA,WACA,SACA,yBACC,CACD,KAAK,eAAiB,IAAK,GAC3B,KAAK,YAAc,IAAI,GAOvB,KAAK,YAAc,MAAO,EAAS,IAAY,CAE7C,GAAI,GAAW,KAAM,CACnB,MAAM,KAAK,YAAY,CACrB,QAAS,iBACT,UAAmB,KAAK,aAAqC,GAC7D,GAAG,CACL,CAAC,EACD,MACF,CACA,IAAI,EAYJ,GAXA,AASE,EATE,SAAU,GAAW,UAAW,EAEtB,CACV,MAAO,CACL,GAHc,MAAM,QAAQ,EAAQ,KAAK,EAAI,EAAQ,MAAQ,MAAM,GAA6B,EAAQ,KAAK,EAI7G,GAAG,SAAU,GAAW,EAAQ,MAAQ,KAAO,CAAC,CAAE,KAAM,OAAQ,KAAM,EAAQ,IAAK,CAAC,EAAI,CAAC,CAC3F,CACF,EAEY,EAEV,EAAQ,WAAa,KAAM,CAC7B,IAAM,EAAe,KAAK,MAAM,SAAS,UACtC,GAAM,EAAE,KAAO,EAAQ,SAC1B,EACA,GAAI,IAAiB,GACnB,MAAU,MAAM,mBAAmB,EAAQ,UAAU,WAAW,EAElE,GAAI,KAAK,MAAM,SAAS,GAAc,OAAS,OAC7C,MAAU,MACR,mBAAmB,EAAQ,UAAU,uBACvC,EAEF,KAAK,MAAM,SAAW,KAAK,MAAM,SAAS,MAAM,EAAG,EAAe,CAAC,EACnE,KAAK,MAAM,eAAe,EAAc,CACtC,GAAG,EACH,GAAI,EAAQ,UACZ,KAAY,EAAU,MAAqB,OAC3C,SAAU,EAAQ,QACpB,CAAC,CACH,MACE,KAAK,MAAM,YAAY,CACrB,GAAG,EACH,GAAU,EAAU,IAAmB,KAAK,WAAW,EACvD,KAAY,EAAU,MAAqB,OAC3C,SAAU,EAAQ,QACpB,CAAC,EAEH,MAAM,KAAK,YAAY,CACrB,QAAS,iBACT,UAAW,EAAQ,UACnB,GAAG,CACL,CAAC,CACH,EAKA,KAAK,WAAa,MAAO,CACvB,YACA,GAAG,GACD,CAAC,IAAM,CACT,IAAM,EAAe,GAAa,KAAO,KAAK,MAAM,SAAS,OAAS,EAAI,KAAK,MAAM,SAAS,UAAW,GAAY,EAAQ,KAAO,CAAS,EAC7I,GAAI,IAAiB,GACnB,MAAU,MAAM,WAAW,EAAU,WAAW,EAElD,KAAK,MAAM,SAAW,KAAK,MAAM,SAAS,MACxC,EAEA,KAAK,SAAS,GAAc,OAAS,YAAc,EAAe,EAAe,CACnF,EACA,MAAM,KAAK,YAAY,CACrB,QAAS,qBACT,YACA,GAAG,CACL,CAAC,CACH,EAIA,KAAK,aAAe,MAAO,EAAU,CAAC,IAAM,CAC1C,MAAM,KAAK,YAAY,CAAE,QAAS,gBAAiB,GAAG,CAAQ,CAAC,CACjE,EAIA,KAAK,eAAmB,CAClB,KAAK,SAAW,UAClB,KAAK,MAAM,MAAQ,IAAK,GACxB,KAAK,UAAU,CAAE,OAAQ,OAAQ,CAAC,EAEtC,EACA,KAAK,wBAA0B,MAAO,CACpC,KACA,WACA,SACA,aACI,KAAK,YAAY,IAAI,SAAY,CACrC,IAAM,EAAW,KAAK,MAAM,SACtB,EAAc,EAAS,EAAS,OAAS,GACzC,EAAc,GAAS,EAAa,CAAI,GAAK,EAAK,QAAU,sBAAwB,EAAK,SAAS,KAAO,EAAK,CAClH,GAAG,EACH,MAAO,qBACP,SAAU,CAAE,KAAI,WAAU,QAAO,CACnC,EAAI,EACJ,KAAK,MAAM,eAAe,EAAS,OAAS,EAAG,CAC7C,GAAG,EACH,MAAO,EAAY,MAAM,IAAI,CAAU,CACzC,CAAC,EACG,KAAK,iBACP,KAAK,eAAe,MAAM,QAAQ,MAAQ,KAAK,eAAe,MAAM,QAAQ,MAAM,IAAI,CAAU,GAE9F,KAAK,SAAW,aAAe,KAAK,SAAW,aAAe,KAAK,uBACrE,KAAK,wBAAwB,EAAE,KAAM,GAAe,CAE9C,GACF,KAAK,YAAY,CACf,QAAS,iBACT,UAAmB,KAAK,aAAqC,GAC7D,GAAG,CACL,CAAC,CAEL,CAAC,CAEL,CAAC,EACD,KAAK,cAAgB,MAAO,CAC1B,QAAQ,mBACR,aACA,SACA,YACA,aACI,KAAK,YAAY,IAAI,SAAY,CACrC,IAAM,EAAW,KAAK,MAAM,SACtB,EAAc,EAAS,EAAS,OAAS,GACzC,EAAc,GAAS,EAAa,CAAI,GAAK,EAAK,aAAe,EAAa,CAAE,GAAG,EAAM,QAAO,SAAQ,WAAU,EAAI,EAC5H,KAAK,MAAM,eAAe,EAAS,OAAS,EAAG,CAC7C,GAAG,EACH,MAAO,EAAY,MAAM,IAAI,CAAU,CACzC,CAAC,EACG,KAAK,iBACP,KAAK,eAAe,MAAM,QAAQ,MAAQ,KAAK,eAAe,MAAM,QAAQ,MAAM,IAAI,CAAU,GAE9F,KAAK,SAAW,aAAe,KAAK,SAAW,aAAe,KAAK,uBACrE,KAAK,wBAAwB,EAAE,KAAM,GAAe,CAE9C,GACF,KAAK,YAAY,CACf,QAAS,iBACT,UAAmB,KAAK,aAAqC,GAC7D,GAAG,CACL,CAAC,CAEL,CAAC,CAEL,CAAC,EAED,KAAK,cAAgB,KAAK,cAI1B,KAAK,KAAO,SAAY,CAElB,KAAK,SAAW,aAAe,KAAK,SAAW,aAEvC,KAAK,gBAAwC,iBACvD,KAAK,eAAe,gBAAgB,MAAM,CAE9C,EACA,KAAK,GAAK,EACV,KAAK,UAAY,EACjB,KAAK,WAAa,EAClB,KAAK,sBAAwB,EAC7B,KAAK,gBAAkB,EACvB,KAAK,MAAQ,EACb,KAAK,QAAU,EACf,KAAK,WAAa,EAClB,KAAK,SAAW,EAChB,KAAK,OAAS,EACd,KAAK,sBAAwB,CAC/B,CASA,IAAI,QAAS,CACX,OAAO,KAAK,MAAM,MACpB,CACA,UAAU,CACR,SACA,SACC,CACG,KAAK,SAAW,IAEpB,KAAK,MAAM,OAAS,EACpB,KAAK,MAAM,MAAQ,EACrB,CACA,IAAI,OAAQ,CACV,OAAO,KAAK,MAAM,KACpB,CACA,IAAI,UAAW,CACb,OAAO,KAAK,MAAM,QACpB,CACA,IAAI,aAAc,CAChB,OAAO,KAAK,MAAM,SAAS,KAAK,MAAM,SAAS,OAAS,EAC1D,CACA,IAAI,SAAS,EAAU,CACrB,KAAK,MAAM,SAAW,CACxB,CACA,MAAM,yBAA0B,CAC9B,GAAI,CAAC,KAAK,sBACR,MAAO,GACT,IAAM,EAAS,KAAK,sBAAsB,CACxC,SAAU,KAAK,MAAM,QACvB,CAAC,EAID,OAHI,GAAU,OAAO,GAAW,UAAY,SAAU,EAC7C,MAAM,EAER,CACT,CACA,MAAM,YAAY,CAChB,UACA,WACA,UACA,OACA,aACC,CACD,IAAU,EACV,IAAI,EACJ,GAAI,IAAY,gBACd,GAAI,CACF,IAAM,EAAY,MAAM,KAAK,UAAU,kBAAkB,CACvD,OAAQ,KAAK,GACb,WACA,UACA,MACF,CAAC,EACD,GAAI,GAAa,KACf,OAEF,EAAe,CACjB,OAAS,EAAK,CACR,KAAK,SAAW,aAAe,OACjC,KAAK,QAAQ,CAAG,EAElB,KAAK,UAAU,CAAE,OAAQ,QAAS,MAAO,CAAI,CAAC,EAC9C,MACF,CAEF,KAAK,UAAU,CAAE,OAAQ,YAAa,MAAO,IAAK,EAAE,CAAC,EACrD,IAAM,EAAc,KAAK,YACrB,EAAU,GACV,EAAe,GACf,EAAU,GACd,GAAI,CACF,IAAM,EAAiB,CACrB,MAAO,GAA8B,CACnC,YAAa,KAAK,MAAM,SAAS,CAAW,EAC5C,UAAW,KAAK,WAAW,CAC7B,CAAC,EACD,gBAAiB,IAAI,eACvB,EACA,EAAe,gBAAgB,OAAO,iBAAiB,YAAe,CACpE,EAAU,EACZ,CAAC,EACD,KAAK,eAAiB,EACtB,IAAI,EACJ,AAGE,EAHE,IAAY,gBACL,EAEA,MAAM,KAAK,UAAU,aAAa,CACzC,OAAQ,KAAK,GACb,SAAU,KAAK,MAAM,SACrB,YAAa,EAAe,gBAAgB,OAC5C,WACA,UACA,OACA,UACA,WACF,CAAC,EAuBH,MAAM,GAAc,CAClB,OAAQ,GAAuB,CAC7B,SACA,WAAY,KAAK,WACjB,OAAQ,KAAK,OACb,sBAAuB,KAAK,sBAC5B,gBAAiB,KAAK,gBACtB,oBA5ByB,GAE3B,KAAK,YAAY,QACT,EAAI,CACR,MAAO,EAAe,MACtB,UAAa,CAEX,KAAK,UAAU,CAAE,OAAQ,WAAY,CAAC,EACX,EAAe,MAAM,QAAQ,KAAgB,KAAK,aAAqC,GAEhH,KAAK,MAAM,eACT,KAAK,MAAM,SAAS,OAAS,EAC7B,EAAe,MAAM,OACvB,EAEA,KAAK,MAAM,YAAY,EAAe,MAAM,OAAO,CAEvD,CACF,CAAC,CACH,EAUE,QAAU,GAAU,CAClB,MAAM,CACR,CACF,CAAC,EACD,QAAU,GAAU,CAClB,MAAM,CACR,CACF,CAAC,EACD,KAAK,UAAU,CAAE,OAAQ,OAAQ,CAAC,CACpC,OAAS,EAAK,CACZ,GAAI,GAAW,EAAI,OAAS,aAG1B,MAFA,GAAU,GACV,KAAK,UAAU,CAAE,OAAQ,OAAQ,CAAC,EAC3B,KAET,EAAU,GACN,aAAe,YAAc,EAAI,QAAQ,YAAY,EAAE,SAAS,OAAO,GAAK,EAAI,QAAQ,YAAY,EAAE,SAAS,SAAS,KAC1H,EAAe,IAEb,KAAK,SAAW,aAAe,OACjC,KAAK,QAAQ,CAAG,EAElB,KAAK,UAAU,CAAE,OAAQ,QAAS,MAAO,CAAI,CAAC,CAChD,QAAU,CACR,GAAI,EACD,EAAK,KAAK,WAAa,MAAgB,EAAG,KAAK,KAAM,CACpD,QAAS,KAAK,eAAe,MAAM,QACnC,SAAU,KAAK,MAAM,SACrB,UACA,eACA,UACA,aAAsB,KAAK,gBAAwC,MAAM,YAC3E,CAAC,CACH,OAAS,EAAK,CACZ,QAAQ,MAAM,CAAG,CACnB,CACA,KAAK,eAAiB,IAAK,EAC7B,CACI,CAAC,GAAW,MAAM,KAAK,wBAAwB,GACjD,MAAM,KAAK,YAAY,CACrB,QAAS,iBACT,UAAiB,KAAK,aAAmC,GACzD,WACA,UACA,MACF,CAAC,CAEL,CACF,EAmEA,SAAS,GAA4C,CACnD,YACC,CACD,IAAM,EAAU,EAAS,EAAS,OAAS,GAI3C,GAHI,CAAC,GAGD,EAAQ,OAAS,YACnB,MAAO,GAET,IAAM,EAAqB,EAAQ,MAAM,QAAQ,EAAW,EAAM,IACzD,EAAK,OAAS,aAAe,EAAQ,EAC3C,EAAE,EACC,EAA0B,EAAQ,MAAM,MAAM,EAAqB,CAAC,EAAE,OAAO,CAAY,EAAE,OAAQ,GAAS,CAAC,EAAK,gBAAgB,EACxI,OAAO,EAAwB,OAAS,GAAK,EAAwB,MAClE,GAAS,EAAK,QAAU,oBAAsB,EAAK,QAAU,cAChE,CACF,CCvtaA,SAAgB,GAAiB,EAAe,CAC/C,OAAO,IAAI,GAAqB,CAC/B,IAAK,GAAA,IAA8D,gBAAgB,EACnF,YAAa,UACb,KAAM,CAAE,OAAM,CACf,CAAC,CACF,qBCTA,SAAS,EAAS,EAAW,EAAM,CAClC,GAAI,OAAO,GAAc,WACxB,MAAU,UAAU,2DAA2D,OAAO,EAAU,IAAI,EAKrG,IAAI,EACA,EAAe,EAEnB,OAAO,SAAmB,GAAG,EAAY,CACxC,aAAa,CAAS,EAEtB,IAAM,EAAM,KAAK,IAAI,EAEf,EAAmB,GADC,EAAM,GAG5B,GAAoB,GACvB,EAAe,EACf,EAAU,MAAM,KAAM,CAAU,GAEhC,EAAY,eAAiB,CAC5B,EAAe,KAAK,IAAI,EACxB,EAAU,MAAM,KAAM,CAAU,CACjC,EAAG,CAAgB,CAErB,CACD,CAEA,EAAO,QAAU,UC7Bb,IAAiB,EAAK,EAAQ,IAAQ,CACxC,GAAI,CAAC,EAAO,IAAI,CAAG,EACjB,MAAM,UAAU,UAAY,CAAG,CACnC,EACI,GAAgB,EAAK,EAAQ,KAC/B,GAAc,EAAK,EAAQ,yBAAyB,EAC7C,EAAS,EAAO,KAAK,CAAG,EAAI,EAAO,IAAI,CAAG,GAE/C,GAAgB,EAAK,EAAQ,IAAU,CACzC,GAAI,EAAO,IAAI,CAAG,EAChB,MAAM,UAAU,mDAAmD,EACrE,aAAkB,QAAU,EAAO,IAAI,CAAG,EAAI,EAAO,IAAI,EAAK,CAAK,CACrE,EACI,GAAgB,EAAK,EAAQ,EAAO,KACtC,GAAc,EAAK,EAAQ,wBAAwB,EACnD,EAAS,EAAO,KAAK,EAAK,CAAK,EAAI,EAAO,IAAI,EAAK,CAAK,EACjD,GAaT,SAAS,GAAS,EAAI,EAAQ,CAC5B,OAAO,GAAU,KAAsC,GAAtC,EAAA,GAAA,SAAwB,EAAI,CAAM,CACrD,CAGA,IAAI,EAAW,GAAS,GAAQ,GAAoB,GAAkB,EAAiB,EAAwB,GAAsB,GACjI,GAAiB,KAAM,CACzB,YAAY,EAAkB,CAAC,EAAG,CAChC,EAAa,KAAM,EAAW,IAAK,EAAC,EACpC,EAAa,KAAM,GAAS,OAAO,EACnC,EAAa,KAAM,GAAQ,IAAK,EAAC,EACjC,EAAa,KAAM,GAAoC,IAAI,GAAK,EAChE,EAAa,KAAM,GAAkC,IAAI,GAAK,EAC9D,EAAa,KAAM,EAAiC,IAAI,GAAK,EAC7D,KAAK,YAAe,GAAY,CAC9B,EAAa,KAAM,EAAW,EAAa,KAAM,CAAS,EAAE,OAAO,CAAO,CAAC,EAC3E,EAAa,KAAM,CAAsB,EAAE,KAAK,IAAI,CACtD,EACA,KAAK,eAAmB,CACtB,EAAa,KAAM,EAAW,EAAa,KAAM,CAAS,EAAE,MAAM,EAAG,EAAE,CAAC,EACxE,EAAa,KAAM,CAAsB,EAAE,KAAK,IAAI,CACtD,EACA,KAAK,gBAAkB,EAAO,IAAY,CACxC,EAAa,KAAM,EAAW,CAC5B,GAAG,EAAa,KAAM,CAAS,EAAE,MAAM,EAAG,CAAK,EAE/C,KAAK,SAAS,CAAO,EACrB,GAAG,EAAa,KAAM,CAAS,EAAE,MAAM,EAAQ,CAAC,CAClD,CAAC,EACD,EAAa,KAAM,CAAsB,EAAE,KAAK,IAAI,CACtD,EACA,KAAK,SAAY,GAAU,gBAAgB,CAAK,EAChD,KAAK,8BAAgC,EAAU,IAAmB,CAChE,IAAM,EAAW,EAAiB,GAAS,EAAU,CAAc,EAAI,EAEvE,OADA,EAAa,KAAM,EAAkB,EAAE,IAAI,CAAQ,MACtC,CACX,EAAa,KAAM,EAAkB,EAAE,OAAO,CAAQ,CACxD,CACF,EACA,KAAK,2BAA8B,IACjC,EAAa,KAAM,EAAgB,EAAE,IAAI,CAAQ,MACpC,CACX,EAAa,KAAM,EAAgB,EAAE,OAAO,CAAQ,CACtD,GAEF,KAAK,0BAA6B,IAChC,EAAa,KAAM,CAAe,EAAE,IAAI,CAAQ,MACnC,CACX,EAAa,KAAM,CAAe,EAAE,OAAO,CAAQ,CACrD,GAEF,EAAa,KAAM,MAA8B,CAC/C,EAAa,KAAM,EAAkB,EAAE,QAAS,GAAa,EAAS,CAAC,CACzE,CAAC,EACD,EAAa,KAAM,OAA4B,CAC7C,EAAa,KAAM,EAAgB,EAAE,QAAS,GAAa,EAAS,CAAC,CACvE,CAAC,EACD,EAAa,KAAM,OAA2B,CAC5C,EAAa,KAAM,CAAe,EAAE,QAAS,GAAa,EAAS,CAAC,CACtE,CAAC,EACD,EAAa,KAAM,EAAW,CAAe,CAC/C,CACA,IAAI,QAAS,CACX,OAAO,EAAa,KAAM,EAAO,CACnC,CACA,IAAI,OAAO,EAAW,CACpB,EAAa,KAAM,GAAS,CAAS,EACrC,EAAa,KAAM,EAAoB,EAAE,KAAK,IAAI,CACpD,CACA,IAAI,OAAQ,CACV,OAAO,EAAa,KAAM,EAAM,CAClC,CACA,IAAI,MAAM,EAAU,CAClB,EAAa,KAAM,GAAQ,CAAQ,EACnC,EAAa,KAAM,EAAmB,EAAE,KAAK,IAAI,CACnD,CACA,IAAI,UAAW,CACb,OAAO,EAAa,KAAM,CAAS,CACrC,CACA,IAAI,SAAS,EAAa,CACxB,EAAa,KAAM,EAAW,CAAC,GAAG,CAAW,CAAC,EAC9C,EAAa,KAAM,CAAsB,EAAE,KAAK,IAAI,CACtD,CACF,EACA,EAAY,IAAI,QAChB,GAAU,IAAI,QACd,GAAS,IAAI,QACb,GAAqB,IAAI,QACzB,GAAmB,IAAI,QACvB,EAAkB,IAAI,QACtB,EAAyB,IAAI,QAC7B,GAAuB,IAAI,QAC3B,GAAsB,IAAI,QAC1B,IAAI,EACAC,GAAO,cAAc,EAAa,CACpC,YAAY,CAAE,WAAU,GAAG,GAAQ,CACjC,IAAM,EAAQ,IAAI,GAAe,CAAQ,EACzC,MAAM,CAAE,GAAG,EAAM,OAAM,CAAC,EACxB,EAAa,KAAM,EAAQ,IAAK,EAAC,EACjC,KAAK,8BAAgC,EAAU,IAAmB,EAAa,KAAM,CAAM,EAAE,6BAA6B,EAAU,CAAc,EAClJ,KAAK,2BAA8B,GAAa,EAAa,KAAM,CAAM,EAAE,2BAA2B,CAAQ,EAC9G,KAAK,0BAA6B,GAAa,EAAa,KAAM,CAAM,EAAE,0BAA0B,CAAQ,EAC5G,EAAa,KAAM,EAAQ,CAAK,CAClC,CACF,EACA,EAAS,IAAI,QAGb,SAAS,GAAQ,CACf,sBAAuB,EACvB,SAAS,GACT,GAAG,GACD,CAAC,EAAG,CACN,IAAM,GAAA,EAAA,EAAA,QACF,SAAU,EAMR,CAAC,EANkB,CACrB,WAAY,EAAQ,WACpB,OAAQ,EAAQ,OAChB,SAAU,EAAQ,SAClB,QAAS,EAAQ,QACjB,sBAAuB,EAAQ,qBACjC,CACF,EACM,SAAU,IACd,EAAa,QAAU,CACrB,WAAY,EAAQ,WACpB,OAAQ,EAAQ,OAChB,SAAU,EAAQ,SAClB,QAAS,EAAQ,QACjB,sBAAuB,EAAQ,qBACjC,GAEF,IAAM,EAAuB,CAC3B,GAAG,EACH,WAAa,GAAQ,CACnB,IAAI,EACJ,OAAc,EAAK,EAAa,SAAS,YAAkC,KAAK,EAAI,CAAG,CACzF,EACA,OAAS,GAAQ,CACf,IAAI,EACJ,OAAc,EAAK,EAAa,SAAS,QAA8B,KAAK,EAAI,CAAG,CACrF,EACA,SAAW,GAAQ,CACjB,IAAI,EACJ,OAAc,EAAK,EAAa,SAAS,UAAgC,KAAK,EAAI,CAAG,CACvF,EACA,QAAU,GAAQ,CAChB,IAAI,EACJ,OAAc,EAAK,EAAa,SAAS,SAA+B,KAAK,EAAI,CAAG,CACtF,EACA,sBAAwB,GAAQ,CAC9B,IAAI,EACJ,OAAoB,EAAK,EAAa,SAAS,uBAA6C,KAAK,EAAI,CAAG,GAAkB,EAC5H,CACF,EACM,GAAA,EAAA,EAAA,QACJ,SAAU,EAAU,EAAQ,KAAO,IAAIA,GAAK,CAAoB,CAClE,GAC2B,SAAU,GAAW,EAAQ,OAAS,EAAQ,SAAW,OAAQ,GAAW,EAAQ,QAAQ,KAAO,EAAQ,MAEpI,EAAQ,QAAU,SAAU,EAAU,EAAQ,KAAO,IAAIA,GAAK,CAAoB,GAQpF,IAAM,GAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,aALH,GAAW,EAAQ,QAAQ,6BAA6B,EAAQ,CAAc,EAG/E,CAAC,EAAgB,EAAQ,QAAQ,EAAE,CAGjB,MACZ,EAAQ,QAAQ,aAChB,EAAQ,QAAQ,QACxB,EACM,GAAA,EAAA,EAAA,sBACJ,EAAQ,QAAQ,+BACV,EAAQ,QAAQ,WAChB,EAAQ,QAAQ,MACxB,EACM,GAAA,EAAA,EAAA,sBACJ,EAAQ,QAAQ,8BACV,EAAQ,QAAQ,UAChB,EAAQ,QAAQ,KACxB,EACM,GAAA,EAAA,EAAA,aACH,GAAkB,CACb,OAAO,GAAkB,aAC3B,EAAgB,EAAc,EAAQ,QAAQ,QAAQ,GAExD,EAAQ,QAAQ,SAAW,CAC7B,EACA,CAAC,CAAO,CACV,EAMA,OALA,EAAA,EAAA,eAAgB,CACV,GACF,EAAQ,QAAQ,aAAa,CAEjC,EAAG,CAAC,EAAQ,CAAO,CAAC,EACb,CACL,GAAI,EAAQ,QAAQ,GACpB,WACA,cACA,YAAa,EAAQ,QAAQ,YAC7B,WAAY,EAAQ,QAAQ,WAC5B,WAAY,EAAQ,QAAQ,WAC5B,KAAM,EAAQ,QAAQ,KACtB,QACA,aAAc,EAAQ,QAAQ,aAC9B,SAIA,cAAe,EAAQ,QAAQ,cAC/B,cAAe,EAAQ,QAAQ,cAC/B,wBAAyB,EAAQ,QAAQ,uBAC3C,CACF,CCvOA,SAAgB,GAAU,CAAE,QAAO,WAAU,WAAU,WAAU,aAA6B,CAC7F,IAAM,GAAA,EAAA,EAAA,QAAoC,IAAI,EAQ9C,OANA,EAAA,EAAA,eAAgB,CACX,GAAa,CAAC,GACjB,EAAS,SAAS,MAAM,CAE1B,EAAG,CAAC,EAAW,CAAQ,CAAC,GAGvB,EAAA,EAAA,MAAC,OAAD,CAAgB,WAAU,UAAU,sBAApC,EACC,EAAA,EAAA,KAAC,QAAD,CACC,IAAK,EACL,MAAO,EACP,SAAW,GAAM,EAAS,EAAE,OAAO,KAAK,EACxC,YAAY,oBACF,UACV,CAAA,GACD,EAAA,EAAA,KAAC,SAAD,CAAQ,KAAK,SAAS,SAAU,GAAY,CAAC,EAAM,KAAK,YACvD,EAAA,EAAA,KAAC,GAAD,CAAM,KAAM,EAAK,CAAA,CACV,CAAA,CACH,GAER,CCjCA,SAAgB,IAAe,CAC9B,OACC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,yBAAf,EACC,EAAA,EAAA,KAAC,GAAD,CAAW,UAAU,eAAe,KAAM,EAAK,CAAA,GAC/C,EAAA,EAAA,KAAC,IAAD,CAAA,SAAG,yBAA0B,CAAA,CACzB,GAEP,CEPA,IAAaK,GAAe,CACxB,KAAM,kBACN,YAAa,+MAEb,YDLuBH,EAAS,CAChC,gBAAiBC,EACL,EACP,SAAS,gEAAgE,EAC9E,gBAAiBC,EAAS,EAAE,SAAS,uDAAuD,EAC5F,MAAOD,EACK,EACP,SAAS,+GAA+G,CACjI,CCHI,CACJ,ECFA,eAAsB,GACrB,CAAE,MAAO,CAAE,kBAAiB,kBAAiB,UAC3B,CAClB,IAAM,EAAQ,EACR,EAAO,GAAG,EAAgB,MAAM,IAMtC,MAAO,CACN,QAAS,GACT,IAAA,4FAPoB,mBAAmB,CAGqD,EAAa,QAFtF,mBAAmB,CAE2E,IAKjH,QAAS,4IAEV,CACD,CCbA,IAAa,GAAuE,CACnF,GAAG,GACH,KAAM,GACN,QAAA,EACD,EEVaO,GAAe,CACxB,KAAM,YACN,YAAa,qEACb,YDJuBH,EAAS,CAChC,KAAMC,EAAS,EAAE,KAAK,EAEtB,KAAMC,EAAO,CAAC,aAAc,YAAY,CAAC,CAC7C,CCAI,CACJ,ECMA,eAAsB,GACrB,CAAE,MAAO,CAAE,KAAM,EAAS,QAAQ,uBAAsB,WACtC,CAClB,IAAM,EAAO,GAAY,CAAO,EAC1B,EAAW,GAAO,GAAW,KAAM,CAAI,EAC7C,GAAI,CAAC,EACJ,MAAO,CACN,QAAS,GACT,QAAS,iCAAiC,EAAK,wBAAwB,GAAU,IAAI,GAAK,EAAE,EAAE,EAAE,KAAK,IAAI,GAC1G,EAMD,IAAM,EAAU,EAAM,QAAQ,4BAA6B,CAC1D,YAAa,uBACb,SAAU,GACX,CAAC,EAED,GAAI,CACH,MAAM,GAAa,CAClB,GAAG,EACH,QAAS,EACT,SAAU,EAAS,KAAO,EAAS,SACpC,CAAC,CACF,OAAS,EAAK,CACb,MAAO,CACN,QAAS,GACT,QAAS,UAAU,GACpB,CACD,CAEA,GAAgB,+BAAgC,EAAI,EAEpD,EAAM,QAAQ,wBAAyB,CACtC,YAAa,GAAG,EAAK,0CACrB,GAAI,EACJ,SAAU,GACX,CAAC,EAED,GAAI,CACH,MAAM,GAAgB,CACrB,GAAG,EACH,UAAW,kBACX,WAAY,EAAqB,aAAe,SACjD,CAAC,CACF,OAAS,EAAK,CACb,MAAO,CACN,QAAS,GACT,QAAS,UAAU,GACpB,CACD,CAQA,OANA,EAAM,QAAQ,wBAAyB,CACtC,YAAa,GAAG,EAAK,WACrB,GAAI,EACJ,SAAU,GACX,CAAC,EAEM,CACN,QAAS,GACT,QAAS,QAAQ,EAAK,yBACtB,OAAQ,CACT,CACD,CCrEA,IAAa,GAAiE,CAC7E,GAAG,GACH,KAAM,GACN,QAAA,GACA,iBAAkB,EACnB,EEXaM,GAAe,CACxB,KAAM,qBACN,YAAa,sGAEb,YDLuBH,EAAS,CAChC,SAAUC,EAAS,EAAE,KAAK,EAC1B,MAAOA,EAAS,EAAE,KAAK,EACvB,YAAaC,EAAQD,EAAS,CAAC,CACnC,CCCI,CACJ,ECAA,eAAsB,GACrB,CAAE,MAAO,CAAE,WAAU,QAAO,eAAe,uBAAsB,UAC/C,CAClB,GAAI,CACH,IAAM,EAAO,MAAM,GAAmB,CACrC,GAAG,EACH,aAAc,EACd,UAAW,EACX,WAAY,CACb,CAAC,EACK,CAAE,eAAc,aAAc,EAEpC,OADA,MAAM,GAAY,kBAAkB,CAAE,SAAU,CAAC,EAAqB,SAAU,EAAc,CAAS,CAAE,CAAC,EACnG,CACN,QAAS,GACT,MACD,CACD,OAAS,EAAK,CACb,MAAO,CACN,QAAS,GACT,QAAS,UAAU,GACpB,CACD,CACD,CCrBA,IAAa,GAA0E,CACtF,GAAG,GACH,KAAM,GACN,QAAA,GACA,iBAAkB,EACnB,EEXaM,GAAe,CACxB,KAAM,oBACN,YAAa,gFACb,YDJuBF,EAAS,CAChC,KAAMC,EAAS,EAAE,KAAK,CAC1B,CCEI,CACJ,ECAA,eAAsB,GACrB,CAAE,MAAO,CAAE,QAAQ,wBACD,CAClB,GAAI,CACH,IAAM,EAAQ,EAAK,MAAM,GAAG,EACtB,EAAU,EAAM,MAAM,EACtB,EAAO,EAAM,KAAK,GAAG,EAE3B,MAAO,CACN,QAAS,GACT,KAAA,MAHkB,GAAc,CAAE,GAAG,EAAsB,OAAM,SAAQ,CAAC,CAI3E,CACD,OAAS,EAAK,CACb,MAAO,CACN,QAAS,GACT,QAAS,UAAU,GACpB,CACD,CACD,CChBA,IAAa,GAAyE,CACrF,GAAG,GACH,KAAM,GACN,QAAA,GACA,iBAAkB,EACnB,EEXaM,GAAe,CACxB,KAAM,eACN,YAAa,kHAEb,YDLuBH,EAAS,CAChC,WAAYC,EAAS,EAAE,SAAS,qCAAqC,EACrE,UAAWC,EACC,EACP,SAAS,mFAAmF,EACjG,QAASA,EACG,EACP,SAAS,iFAAiF,CACnG,CCHI,CACJ,ECDA,eAAsB,GACrB,CAAE,QAAO,wBACS,CAClB,GAAI,CACH,GAAM,CAAE,aAAY,YAAW,WAAY,EAS3C,MAAO,CACN,QAAS,GACT,KAAA,MATkB,GAAgB,CAClC,OAAQ,EACR,YACA,UACA,eAAgB,CACjB,CAAC,CAKD,CACD,OAAS,EAAK,CACb,MAAO,CACN,QAAS,GACT,QAAS,+BAA+B,GACzC,CACD,CACD,CCrBA,IAAa,GAAoE,CAChF,GAAG,GACH,KAAM,GACN,QAAA,EACD,EEVaK,GAAe,CACxB,KAAM,mBACN,YAAa,kGACb,YDJuBF,EAAS,CAChC,KAAMC,EAAS,EAAE,KAAK,CAC1B,CCEI,CACJ,ECAA,eAAsB,GACrB,CAAE,MAAO,CAAE,QAAQ,wBACD,CAClB,GAAI,CACH,IAAM,EAAQ,EAAK,MAAM,GAAG,EACtB,EAAU,EAAM,MAAM,EACtB,EAAO,EAAM,KAAK,GAAG,EAE3B,MAAO,CACN,QAAS,GACT,KAAA,MAHkB,GAAiB,CAAE,GAAG,EAAsB,OAAM,SAAQ,CAAC,CAI9E,CACD,OAAS,EAAK,CACb,MAAO,CACN,QAAS,GACT,QAAS,UAAU,GACpB,CACD,CACD,CChBA,IAAa,GAAwE,CACpF,GAAG,GACH,KAAM,GACN,QAAA,EACD,EEVaI,GAAe,CACxB,KAAM,gBACN,YAAa,kGACb,YDJuBD,EAAS,CAAC,CCIjC,CACJ,ECIA,eAAsB,GACrB,CAAE,wBACgB,CAClB,GAAI,CAEH,GAAM,CAAE,eAAgB,IAAqB,MAD1B,GAAc,CAAoB,GACH,OAAO,EACzD,MAAO,CACN,QAAS,GACT,MAAO,GAAW,CAAW,EAAE,KAChC,CACD,OAAS,EAAK,CACb,MAAO,CACN,QAAS,GACT,QAAS,UAAU,GACpB,CACD,CACD,CClBA,IAAa,GAAqE,CACjF,GAAG,GACH,KAAM,GACN,QAAA,EACD,EEVaI,GAAe,CACxB,KAAM,iBACN,YAAa,mFACb,YDJuBD,EAAS,CAAC,CCIjC,CACJ,ECAA,eAAsB,GACrB,CAAE,wBACgB,CAClB,GAAI,CAEH,MAAO,CACN,QAAS,GACT,IAAK,MAHa,GAAe,CAAoB,CAItD,CACD,OAAS,EAAK,CACb,MAAO,CACN,QAAS,GACT,QAAS,UAAU,GACpB,CACD,CACD,CCbA,IAAa,GAAsE,CAClF,GAAG,GACH,KAAM,GACN,QAAA,EACD,EEVaK,GAAe,CACxB,KAAM,mBACN,YAAa,oGACb,YDJuBF,EAAS,CAChC,SAAUC,EAAS,EAAE,KAAK,EAC1B,MAAOA,EAAS,EAAE,KAAK,CAC3B,CCCI,CACJ,ECAA,eAAsB,GACrB,CAAE,MAAO,CAAE,WAAU,SAAS,wBACZ,CAClB,GAAI,CAEH,MAAO,CACN,QAAS,GACT,KAAA,MAHkB,GAAiB,CAAE,GAAG,EAAsB,aAAc,EAAU,UAAW,CAAM,CAAC,CAIzG,CACD,OAAS,EAAK,CACb,MAAO,CACN,QAAS,GACT,QAAS,UAAU,GACpB,CACD,CACD,CCbA,IAAa,GAAwE,CACpF,GAAG,GACH,KAAM,GACN,QAAA,EACD,EEVaI,GAAe,CACxB,KAAM,iBACN,YAAa,yLAEb,YDLuBD,EAAS,CAAC,CCKjC,CACJ,ECAA,eAAsB,GACrB,CAAE,uBAAsB,UACN,CAClB,IAAM,EAAM,GAAoB,EAEhC,GAAI,EAAI,SAAS,YAAY,EAAG,CAC/B,GAAM,CAAE,eAAc,aAAc,EACpC,MAAO,CACN,QAAS,GACT,YAAa,uBACb,KAAM,CACL,eACA,WACD,CACD,CACD,CAEA,GAAI,EAAI,SAAS,OAAO,EACvB,MAAO,CACN,QAAS,GACT,YAAa,kBACd,EAGD,GAAI,EAAI,SAAS,SAAS,EACzB,MAAO,CACN,QAAS,GACT,YAAa,2BACd,EAGD,GAAI,EAAI,SAAS,OAAO,EACvB,MAAO,CACN,QAAS,GACT,YAAa,kBACd,EAGD,GAAI,EAAI,SAAS,UAAU,EAC1B,MAAO,CACN,QAAS,GACT,YAAa,iCACd,EAGD,IAAM,EAAc,GACnB,eAAe,EAAqB,WACpC,IAAA,EACD,EACM,EAAgB,GACrB,gBAAgB,EAAqB,WACrC,CAAC,CACF,EACM,EAAgB,GACrB,gBAAgB,EAAqB,WACrC,CAAC,CACF,EAcA,OAZI,EACI,CACN,QAAS,GACT,YAAa,4BACb,KAAM,CACL,WAAY,EACZ,gBACA,eACD,CACD,EAGM,CACN,QAAS,GACT,YAAa,CACd,CACD,CCzEA,IAAa,GAAsE,CAClF,GAAG,GACH,KAAM,GACN,QAAA,EACD,EEVaO,GAAe,CACxB,KAAM,qBACN,YAAa,8FACb,YDJuBJ,EAAS,CAChC,SAAUC,EAAS,EAAE,KAAK,EAC1B,MAAOA,EAAS,EAAE,KAAK,EACvB,QAASC,EAAQC,EAAM,CAAC,CAC5B,CCAI,CACJ,ECCA,eAAsB,GACrB,CAAE,MAAO,CAAE,WAAU,QAAO,WAAW,uBAAsB,UAC3C,CAClB,GAAI,CACH,IAAM,EAAO,MAAM,GAAmB,CACrC,GAAG,EACH,aAAc,EACd,UAAW,EACX,SACD,CAAC,EACK,CAAE,eAAc,aAAc,EAEpC,OADA,MAAM,GAAY,kBAAkB,CAAE,SAAU,CAAC,EAAqB,SAAU,EAAc,CAAS,CAAE,CAAC,EACnG,CACN,QAAS,GACT,MACD,CACD,OAAS,EAAK,CACb,MAAO,CACN,QAAS,GACT,QAAS,UAAU,GACpB,CACD,CACD,CCrBA,IAAa,GAA0E,CACtF,GAAG,GACH,KAAM,GACN,QAAA,GACA,iBAAkB,EACnB,EEXaM,GAAe,CACxB,KAAM,uBACN,YAAa,sFACb,YDJuBH,EAAS,CAChC,YAAaC,EAAO,CAAC,UAAW,QAAQ,CAAC,EACzC,eAAgBC,EACJ,EACP,SAAS,EACT,SAAS,6DAA6D,CAC/E,CCFI,CACJ,ECNA,eAAsB,GAAqB,CAC1C,cACA,iBACA,kBACO,CACP,GAAM,CAAE,QAAS,MAAM,EAAe,eAAe,KAAK,IAAK,CAC9D,UAAW,yBACX,cACA,gBACD,CAAC,EACD,OAAO,CACR,CCLA,eAAsB,GACrB,CAAE,QAAO,wBACS,CAClB,GAAI,CACH,GAAM,CAAE,cAAa,kBAAmB,EAQxC,MAAO,CACN,QAAS,GACT,YAAa,MARK,GAAqB,CACvC,cACA,iBACA,eAAgB,CACjB,CAAC,CAKD,CACD,OAAS,EAAK,CACb,MAAO,CACN,QAAS,GACT,QAAS,+BAA+B,GACzC,CACD,CACD,CCpBA,IAAa,GAA4E,CACxF,GAAG,GACH,KAAM,GACN,QAAA,EACD,ECTa,GAAY,CACxB,6BACA,iBACA,UACA,0BACA,wCACA,uBACA,mBACA,yBACA,6BACA,mBACA,uBACA,WACA,UACA,8BACA,qBACA,iBACA,wBACA,sBACA,4BACA,sBACA,iBACD,EAKa,GAAQ,CACpB,6BAA8B,w+EAC9B,iBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAClB,QAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EACX,0BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAC3B,wCAAyC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EACzC,uBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EACxB,mBAAoB,wmEACpB,yBAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAC1B,6BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAC9B,mBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EACpB,uBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EACxB,WAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EACZ,QAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EACX,8BAA+B,q8LAC/B,qBAAsB,2wOACtB,iBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAClB,wBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EACzB,sBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EACvB,4BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAC7B,sBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EACvB,kBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACpB,EElDaK,GAAe,CACxB,KAAM,kBACN,YAAa,wHAEb,YDJuBF,EAAS,CAChC,MAAOC,EAAO,EAAS,CAC3B,CCEI,CACJ,ECDA,eAAsB,GACrB,CAAE,MAAO,CAAE,UACO,CAClB,MAAO,CACN,QAAS,CAAC,CAAC,GAAM,GACjB,QAAS,GAAM,IAAU,gCAAgC,GAC1D,CACD,CCLA,IAAa,GAAuE,CACnF,GAAG,GACH,KAAM,GACN,QAAA,EACD,EEVaQ,GAAe,CACxB,KAAM,WACN,YAAa,6CACb,YDJuBL,EAAS,CAChC,SAAUC,EAAO,CAAC,UAAW,YAAY,CAAC,EAAE,QAAQ,SAAS,EAC7D,MAAOC,EAAS,EAAE,GAAGC,EAAO,CAAC,EAAE,SAAS,EACxC,MAAOC,EACG,CAAC,SAAU,QAAS,OAAQ,OAAQ,QAAS,QAAS,WAAW,CAAC,EACvE,GAAGD,EAAO,CAAC,EACX,SAAS,EACd,KAAMD,EAAS,EAAE,GAAGC,EAAO,CAAC,EAAE,SAAS,EACvC,MAAOD,EAAS,EAAE,GAAGC,EAAO,CAAC,EAAE,SAAS,CAC5C,CCLI,CACJ,ECAA,eAAsB,GACrB,CAAE,QAAO,wBACS,CAClB,GAAI,CAMH,MAAO,CACN,QAAS,GACT,KAAA,MAPkB,GAAW,CAC7B,GAAG,EACH,WAAY,EACZ,WAAY,EAAqB,aAAe,SACjD,CAAC,CAID,CACD,OAAS,EAAK,CACb,MAAO,CACN,QAAS,GACT,QAAS,UAAU,GACpB,CACD,CACD,CCjBA,IAAa,GAAgE,CAC5E,GAAG,GACH,KAAM,GACN,QAAA,EACD,EEVaW,GAAe,CACxB,KAAM,mBACN,YAAa,qEACb,YDJuBP,EAAS,CAChC,SAAUC,EAAS,EAAE,KAAK,EAC1B,MAAOA,EAAS,EAAE,KAAK,EACvB,UAAWC,EAAS,EAAE,QAAQ,CAAC,EAC/B,SAAUA,EAAS,EAAE,QAAQ,EAAE,EAC/B,WAAYD,EAAS,EACrB,WAAYE,EAAQH,EAAS,CACzB,iBAAkBC,EAAS,EAC3B,YAAaG,EAAO,CAChB,UACA,KACA,SACA,eACA,qBACA,YACA,kBACA,KACA,YACA,aACJ,CAAC,EACD,aAAcC,EAAM,CACxB,CAAC,CAAC,EACF,KAAML,EAAS,CACX,UAAWC,EAAS,EACpB,WAAYK,EAAU,CAC1B,CAAC,CACL,CCtBI,CACJ,ECCA,eAAsB,GACrB,CAAE,MAAO,CAAE,WAAU,QAAO,aAAY,aAAY,GAAG,GAAe,wBAGpD,CAClB,GAAI,CACH,GAAI,CAAC,EAAW,OAAQ,CACvB,GAAM,CAAE,QAAS,MAAM,GAAiB,CACvC,GAAG,EACH,aAAc,EACd,UAAW,EACX,aAAc,GACd,gBAAiB,EACjB,GAAG,CACJ,CAAC,EACD,MAAO,CACN,QAAS,GACT,MACD,CACD,CACA,GAAM,CAAE,QAAS,MAAM,GAAsB,CAC5C,GAAG,EACH,aAAc,EACd,UAAW,EACX,aAAc,GACd,aACA,GAAG,CACJ,CAAC,EACD,MAAO,CACN,QAAS,GACT,MACD,CACD,OAAS,EAAK,CACb,MAAO,CACN,QAAS,GACT,QAAS,UAAU,GACpB,CACD,CACD,CCrCA,IAAa,GAAwE,CACpF,GAAG,GACH,KAAM,GACN,QAAA,EACD,EEVaI,GAAe,CACxB,KAAM,qBACN,YAAa,8FACb,YDJuBD,EAAS,CAAC,CCIjC,CACJ,ECCA,eAAsB,GACrB,CAAE,uBAAsB,WACN,CAClB,IAAM,EAAU,EAAM,QAAQ,6BAA8B,CAC3D,YAAa,uBACb,SAAU,GACX,CAAC,EAED,GAAI,CACH,MAAM,GAAgB,CACrB,GAAG,EACH,UAAW,kBACX,WAAY,EAAqB,aAAe,SACjD,CAAC,CACF,OAAS,EAAK,CACb,MAAO,CACN,QAAS,GACT,QAAS,UAAU,GACpB,CACD,CAQA,OANA,EAAM,QAAQ,QAAS,CACtB,YAAa,0BACb,GAAI,EACJ,SAAU,GACX,CAAC,EAEM,CACN,QAAS,GACT,QAAS,0BACT,OAAQ,CACT,CACD,CC/BA,IAAa,GAA0E,CACtF,GAAG,GACH,KAAM,GACN,QAAA,GACA,iBAAkB,EACnB,EEXaM,GAAe,CACxB,KAAM,mBACN,YAAa,kGACb,YDJuBH,EAAS,CAChC,KAAMC,EAAS,EAAE,KAAK,EACtB,QAASA,EAAS,EAClB,SAAUC,EAAO,CAAC,OAAQ,QAAS,SAAU,MAAO,SAAU,UAAW,SAAU,MAAM,CAAC,CAC9F,CCAI,CACJ,ECEA,eAAsB,GACrB,CAAE,MAAO,CAAE,OAAM,WAAU,WAAW,wBACpB,CAClB,GAAI,CACH,IAAM,EAAQ,EAAK,MAAM,GAAG,EACtB,EAAU,EAAM,MAAM,EACtB,EAAO,EAAM,KAAK,GAAG,EACrB,EAAO,MAAM,GAAiB,CAAE,GAAG,EAAsB,OAAM,UAAS,UAAS,UAAS,CAAC,EAOjG,OALA,MAAM,GAAY,kBAAkB,CACnC,SAAU,CAAC,EAAqB,SAAU,qBAAsB,EAAS,CAAI,CAC9E,CAAC,EACD,GAAgB,+BAAgC,EAAI,EAE7C,CACN,QAAS,GACT,MACD,CACD,OAAS,EAAK,CACb,MAAO,CACN,QAAS,GACT,QAAS,UAAU,GACpB,CACD,CACD,CCxBA,IAAa,GAAwE,CACpF,GAAG,GACH,KAAM,GACN,QAAA,GACA,iBAAkB,EACnB,EEXa,GAAe,CACxB,KAAM,qBACN,YAAa,gFACb,YDJuBE,EAAS,CAChC,SAAUC,EAAS,EAAE,KAAK,EAC1B,MAAOA,EAAS,EAAE,KAAK,EACvB,QAASC,EAAQC,EAAM,CAAC,CAC5B,CCAI,CACJ,ECCA,eAAsB,GACrB,CAAE,MAAO,CAAE,WAAU,QAAO,WAAW,uBAAsB,UAC3C,CAClB,GAAI,CACH,IAAM,EAAO,MAAM,GAAmB,CACrC,GAAG,EACH,aAAc,EACd,UAAW,EACX,SACD,CAAC,EACK,CAAE,eAAc,aAAc,EAEpC,OADA,MAAM,GAAY,kBAAkB,CAAE,SAAU,CAAC,EAAqB,SAAU,EAAc,CAAS,CAAE,CAAC,EACnG,CACN,QAAS,GACT,MACD,CACD,OAAS,EAAK,CACb,MAAO,CACN,QAAS,GACT,QAAS,UAAU,GACpB,CACD,CACD,CERA,IAAM,GAAiD,CAEtD,mBACA,aACA,YACA,gBACA,wBACA,sBACA,mBACA,kBAEA,oBACA,iBACA,oBACA,qBAEA,kBACA,oBACA,sBACA,oBACA,oBDhCA,GAAG,GACH,KAAM,GACN,WACA,iBAAkB,EC6BlB,EACA,qBACD,EAEA,SAAgB,GAAQ,EAAsD,CAC7E,OAAO,GAAY,EACpB,CChCA,SAAgB,GAAe,CAAE,OAAM,YAAW,SAAQ,kBAAiB,eAAoC,CAC9G,GAAM,CAAC,EAAiB,IAAA,EAAA,EAAA,UAA+B,EAAK,EACtD,CAAC,EAAkB,IAAA,EAAA,EAAA,UAAgC,EAAK,EACxD,EAAW,GAAY,CAAI,EAC3B,EAAO,GAAQ,CAAQ,EACvB,EAAO,GAAM,MAAQ,GACrB,EAAmB,GAAM,iBACzB,GAAA,EAAA,EAAA,aACA,EAAK,MACN,OAAO,EAAK,OAAU,SACnB,OAAO,KAAK,EAAK,KAAK,EAAE,SAAW,EADG,GADnB,GAGxB,CAAC,EAAK,KAAK,CAAC,EACT,GAAA,EAAA,EAAA,aAAsB,CAC3B,IAAM,EAAO,KAAK,UAAU,EAAK,MAAO,KAAM,GAAI,EAClD,MAAO,CAAE,OAAM,MAAO,EAAO,EAAK,MAAM;CAAI,EAAE,OAAS,CAAE,CAC1D,EAAG,CAAC,EAAK,KAAK,CAAC,EACT,GAAA,EAAA,EAAA,aAAuB,CAC5B,IAAM,EAAO,KAAK,UAAU,EAAK,OAAQ,KAAM,GAAI,EACnD,MAAO,CAAE,OAAM,MAAO,EAAO,EAAK,MAAM;CAAI,EAAE,OAAS,CAAE,CAC1D,EAAG,CAAC,EAAK,MAAM,CAAC,EAEhB,OACC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,mBAAmB,EAAK,iBAAxC,EACC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qBAAf,EACC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qBAAf,EACC,EAAA,EAAA,KAAC,EAAD,CAAM,KAAM,EAAK,CAAA,GACjB,EAAA,EAAA,KAAC,OAAD,CAAA,SAAO,CAAe,CAAA,CAClB,KACL,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,uBAAf,CACE,EAAK,QAAU,mBAAqB,cACpC,EAAK,QAAU,oBACX,EAAc,eAAkB,EAAmB,uBAAyB,gBAChF,EAAK,QAAU,qBACV,EAAK,QAAgB,OAAQ,EAAA,EAAA,KAAC,GAAD,CAAS,KAAM,GAAI,UAAU,kBAAoB,CAAA,GAAI,EAAA,EAAA,KAAC,GAAD,CAAO,KAAM,EAAK,CAAA,EACtG,GACD,IAEJ,EAAK,QAAU,oBACf,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,mBAAf,CACE,CAAC,IACD,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qBAAf,EACC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,wDAAf,EACC,EAAA,EAAA,KAAC,SAAD,CAAA,SAAQ,QAAc,CAAA,EACrB,EAAM,MAAQ,IACd,EAAA,EAAA,KAAC,EAAD,CACC,KAAK,SACL,QAAQ,QACR,KAAK,KACL,UAAU,4FACV,YAAe,EAAmB,CAAC,CAAe,WAEjD,GAEC,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACC,EAAA,EAAA,KAAC,GAAD,CAAW,KAAM,EAAK,CAAA,EAAC,MAEtB,CAAA,CAAA,GAGF,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACC,EAAA,EAAA,KAAC,GAAD,CAAa,KAAM,EAAK,CAAA,EAAC,MAExB,CAAA,CAAA,CAEG,CAAA,CAEL,KACL,EAAA,EAAA,KAAC,MAAD,CACC,UAAW,EAAkB,sBAAwB,4DAEpD,EAAM,IACH,CAAA,CACD,IAGL,EAAK,QAAU,mBAAqB,IACpC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,yCAAf,EACC,EAAA,EAAA,MAAC,EAAD,CACC,KAAK,KACL,UAAU,yDACV,YAAe,IAAY,EAAK,UAAU,EAC1C,SAAU,WAJX,CAME,GAAc,EAAA,EAAA,KAAC,GAAD,CAAS,UAAU,2BAA6B,CAAA,EAAI,KAAK,SAEjE,KACR,EAAA,EAAA,KAAC,EAAD,CACC,KAAK,SACL,KAAK,KACL,QAAQ,UACR,UAAU,cACV,YAAe,IAAkB,EAAK,UAAU,EAChD,SAAU,WACV,gBAEO,CAAA,GACR,EAAA,EAAA,KAAC,EAAD,CACC,KAAK,SACL,KAAK,KACL,QAAQ,UACR,UAAU,cACV,YAAe,IAAS,EAAK,UAAU,EACvC,SAAU,WACV,MAEO,CAAA,CACJ,IAGL,EAAK,QAAU,qBACf,EAAA,EAAA,KAAA,EAAA,SAAA,CAAA,SACE,GAAM,OAEL,EAAK,OAAO,CAAW,GAGvB,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,uBAAf,EACC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,wDAAf,EACC,EAAA,EAAA,KAAC,SAAD,CAAA,SAAQ,SAAe,CAAA,EACtB,EAAO,MAAQ,IACf,EAAA,EAAA,KAAC,EAAD,CACC,KAAK,SACL,QAAQ,QACR,KAAK,KACL,UAAU,4FACV,YAAe,EAAoB,CAAC,CAAgB,WAEnD,GAEC,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACC,EAAA,EAAA,KAAC,GAAD,CAAW,KAAM,EAAK,CAAA,EAAC,MAEtB,CAAA,CAAA,GAGF,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACC,EAAA,EAAA,KAAC,GAAD,CAAa,KAAM,EAAK,CAAA,EAAC,MAExB,CAAA,CAAA,CAEG,CAAA,CAEL,KACL,EAAA,EAAA,KAAC,MAAD,CACC,UAAW,EACR,sBACA,4DAEF,EAAO,IACJ,CAAA,CACD,GAEN,CAAA,CAEC,GAEF,GAEP,CChKA,SAAgB,GACf,CAAE,QAAS,EAAG,YAAW,SAAQ,kBAAiB,wBACjD,CACD,OACC,EAAA,EAAA,MAAC,GAAO,IAAR,CAEC,QAAS,CAAE,QAAS,EAAG,EAAG,EAAG,EAC7B,QAAS,CAAE,QAAS,EAAG,EAAG,CAAE,EAC5B,UAAW,kBAAkB,EAAE,OAAS,OAAS,OAAS,uBAJ3D,EAMC,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,kBACb,EAAE,OAAS,QAAS,EAAA,EAAA,KAAC,GAAD,CAAM,KAAM,EAAK,CAAA,GAAI,EAAA,EAAA,KAAC,GAAD,CAAK,KAAM,EAAK,CAAA,CACtD,CAAA,GACL,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,mBACb,EAAE,OAAO,KAAK,EAAM,IAChB,GAAa,CAAI,GACb,EAAA,EAAA,KAAC,MAAD,CAAa,UAAU,sBAAc,EAAK,IAAU,EAA1C,CAA0C,EAGxD,EAAa,CAAI,GAEnB,EAAA,EAAA,KAAC,GAAD,CAEO,OACK,YACH,SACS,kBACjB,YAAa,GAAsB,IAAI,EAAK,UAAU,CACtD,EANK,CAML,EAGI,IACP,CACG,CAAA,CACM,GA7BN,EAAE,EA6BI,CAEd,CCrCA,SAAS,GAAyB,EAAe,CAChD,OAAO,GAAa,CACnB,SAAU,CAAC,aAAc,CAAK,EAC9B,QAAS,SAAgC,CACxC,GAAM,CAAE,QAAS,MAAM,EAAU,IAAI,eAAe,GAAc,EAClE,OAAO,CACR,CACD,CAAC,CACF,CAEA,SAAgB,IAAe,CAC9B,GAAM,CAAE,kBAA+C,GAAU,CAAE,OAAQ,EAAM,CAAC,EAClF,OAAO,GAAS,GAAyB,CAAc,CAAC,CACzD,CCvBA,SAAgB,IAAW,CAC1B,GAAM,CAAE,OAAM,YAAW,SAAU,GAAa,EAEhD,GAAI,GAAa,GAAS,CAAC,EAC1B,OAAO,KAGR,GAAM,CAAE,WAAU,kBAAiB,mBAAoB,EAEjD,EAAa,GAClB,IAAI,KAAK,aAAa,QAAS,CAC9B,MAAO,WACP,SAAU,KACX,CAAC,EAAE,OAAO,CAAM,EAEjB,OACC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,2BAAf,EACC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,sBAAf,EACC,EAAA,EAAA,KAAC,OAAD,CAAA,SAAM,mBAAuB,CAAA,GAC7B,EAAA,EAAA,MAAC,OAAD,CAAA,SAAA,CAAO,EAAU,CAAQ,EAAE,MAAI,EAAU,CAAe,CAAQ,CAAA,CAAA,GAChE,EAAA,EAAA,MAAC,OAAD,CAAA,SAAA,CAAO,KAAK,MAAM,CAAe,EAAE,GAAO,CAAA,CAAA,CACtC,KACL,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,yBACd,EAAA,EAAA,KAAC,MAAD,CACC,UAAU,iBACV,MAAO,CAAE,MAAO,GAAG,EAAgB,EAAG,CACtC,CAAA,CACG,CAAA,CACD,GAEP,CCVA,SAAgB,GAAK,CAAE,YAAW,aAA4D,CAC7F,IAAM,EAAS,GAAU,CAAE,OAAQ,EAAM,CAAC,EACpC,CAAE,kBAA+C,EACjD,CAAC,EAAO,GAAY,GAAkB,kBAAmB,EAAE,EAC3D,CAAC,EAAkB,IAAA,EAAA,EAAA,UAAgC,EAAI,EACvD,CAAC,EAAkB,IAAA,EAAA,EAAA,UAA8D,CAAC,CAAC,EACnF,CAAC,EAAsB,IAAA,EAAA,EAAA,UAAiD,IAAI,GAAK,EACjF,CAAC,EAAyB,GAA8B,GAC7D,GAAiB,wBACjB,CAAC,CACF,EACM,EAAsB,IAAI,IAAI,CAAuB,EACrD,EAAU,GAAiB,EAC3B,EAAuB,GAA0B,EACjD,EAAc,GAAe,EAC7B,CAAE,WAAU,eAAa,SAAQ,gBAAe,eAAgB,GAAQ,CAC7E,UAAW,GAAiB,CAAc,EAC1C,WAAY,EAAkB,EAC9B,sBAAuB,GACvB,UAAW,CACV,EAAiB,kBAAkB,CAAE,SAAU,CAAC,YAAY,CAAE,CAAC,CAChE,EACA,MAAM,WAAW,CAAE,YAAY,CAE9B,GAAI,EAAS,QACZ,OAGD,IAAM,EAAO,GAAQ,EAAS,QAAQ,EACtC,GAAI,EAAM,CACT,GAAI,EAAK,kBAAoB,CAAC,EAAoB,IAAI,EAAS,QAAQ,EAAG,CACzE,IAAM,EAA6B,CAClC,KAAM,YACN,WAAY,EAAS,WACrB,SAAU,EAAS,SACnB,MAAO,EAAS,KACjB,EACA,EAAoB,IAAS,CAAE,GAAG,GAAO,EAAS,YAAa,CAAa,EAAE,EAC9E,MACD,CAEA,IAAM,EAAS,MAAM,EAAK,QAAQ,CAAE,MAAO,EAAS,MAAO,uBAAsB,UAAS,QAAO,CAAC,EAClG,EAAc,CACb,KAAM,EAAS,SACf,WAAY,EAAS,WACrB,QACD,CAAC,CACF,CACD,CACD,CAAC,EAEK,GAAA,EAAA,EAAA,aACL,KAAO,IAAuB,CAC7B,IAAM,EAAW,EAAiB,GAC7B,KAIL,GAAwB,GAAQ,CAC/B,IAAM,EAAO,IAAI,IAAI,CAAI,EAEzB,OADA,EAAK,IAAI,CAAU,EACZ,CACR,CAAC,EAED,GAAI,CACH,IAAM,EAAO,GAAQ,EAAS,QAAQ,EACtC,GAAI,EAAM,CACT,IAAM,EAAS,MAAM,EAAK,QAAQ,CAAE,MAAO,EAAS,MAAO,uBAAsB,UAAS,QAAO,CAAC,EAClG,EAAc,CACb,KAAM,EAAS,SACf,WAAY,EAAS,WACrB,QACD,CAAC,EACD,EAAoB,GAAQ,CAC3B,IAAM,EAAO,CAAE,GAAG,CAAK,EAEvB,OADA,OAAO,EAAK,GACL,CACR,CAAC,CACF,CACD,QAAU,CACT,EAAwB,GAAQ,CAC/B,IAAM,EAAO,IAAI,IAAI,CAAI,EAEzB,OADA,EAAK,OAAO,CAAU,EACf,CACR,CAAC,CACF,CAvBC,CAwBF,EACA,CAAC,EAAkB,EAAsB,EAAS,EAAe,CAAM,CACxE,EAEM,IAAA,EAAA,EAAA,aACJ,GAAuB,CACvB,IAAM,EAAW,EAAiB,GAC7B,IAIL,EAAc,CACb,KAAM,EAAS,SACf,WAAY,EAAS,WACrB,OAAQ,CAAE,MAAO,iCAAkC,CACpD,CAAC,EACD,EAAoB,GAAQ,CAC3B,IAAM,EAAO,CAAE,GAAG,CAAK,EAEvB,OADA,OAAO,EAAK,GACL,CACR,CAAC,EACF,EACA,CAAC,EAAkB,CAAa,CACjC,EAEM,IAAA,EAAA,EAAA,aACL,KAAO,IAAuB,CAC7B,IAAM,EAAW,EAAiB,GAC7B,IAIL,EAA2B,GAAQ,GAAO,CAAC,GAAG,EAAM,EAAS,QAAQ,CAAC,CAAC,EACvE,MAAM,EAAc,CAAU,EAC/B,EACA,CAAC,EAAkB,EAA4B,CAAa,CAC7D,GAEA,EAAA,EAAA,eAAgB,EAcf,SAbyC,CACxC,GAAI,CACH,IAAM,EAAO,MAAM,GAAgB,EAC/B,MAAM,QAAQ,CAAI,GACrB,EAAY,CAAI,CAElB,OAAS,EAAO,CACf,QAAQ,MAAM,oCAAqC,CAAK,CACzD,QAAU,CACT,EAAoB,EAAK,CAC1B,CACD,GAE0B,CAC3B,EAAG,CAAC,CAAW,CAAC,EAEhB,IAAM,GAAc,IAAW,aAAe,IAAW,YAEnD,IAAA,EAAA,EAAA,QAAwC,IAAI,EAalD,OAZA,EAAA,EAAA,eAAgB,CACf,GAAe,SAAS,eAAe,CAAE,SAAU,QAAS,CAAC,CAC9D,EAAG,CAAC,CAAQ,CAAC,GAWZ,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,gCAAf,EACC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,6FAAf,EACC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,8CAAf,EACC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,mCAAf,EACC,EAAA,EAAA,KAAC,GAAD,CAAK,UAAU,eAAe,KAAM,EAAK,CAAA,GACzC,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,yCAAgC,cAAkB,CAAA,CAC9D,KACL,EAAA,EAAA,KAAC,GAAD,CAAW,CAAA,CACP,KACL,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,4CAAf,EACC,EAAA,EAAA,KAAC,GAAD,CAAwB,aAAc,CAAA,GACtC,EAAA,EAAA,KAAC,SAAD,CACC,QAAS,EACT,UAAU,+FACV,MAAM,uBAEN,EAAA,EAAA,KAAC,GAAD,CAAG,KAAM,EAAK,CAAA,CACP,CAAA,CACJ,GACD,KACL,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,mCACd,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,wCAAf,EACC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,yBAAf,CACE,IAAoB,EAAA,EAAA,KAAC,GAAD,CAAe,CAAA,EACnC,CAAC,GAAoB,EAAS,SAAW,IACzC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,uBAAf,EACC,EAAA,EAAA,KAAC,GAAD,CAAK,KAAM,EAAK,CAAA,GAChB,EAAA,EAAA,KAAC,IAAD,CAAA,SAAG,gCAAiC,CAAA,CAChC,IAEL,EAAS,IAAI,IACb,EAAA,EAAA,KAAC,GAAD,CAEC,QAAS,EACT,UAAW,EACX,OAAQ,GACR,gBAAiB,GACK,sBACtB,EANK,EAAE,EAMP,CACD,GACD,EAAA,EAAA,KAAC,MAAD,CAAK,IAAK,EAAiB,CAAA,CACvB,KAEL,EAAA,EAAA,KAAC,GAAD,CACQ,QACG,WACV,SAvDqB,GAAmB,CAC5C,EAAE,eAAe,EACb,EAAM,KAAK,GAAK,CAAC,IAAe,CAAC,IACpC,GAAiB,CAAE,KAAM,CAAM,CAAC,EAChC,EAAS,EAAE,EAEb,EAkDK,SAAU,EACC,WACX,CAAA,CACG,GACD,CAAA,CACD,GAEP"}
|
|
1
|
+
{"version":3,"file":"Chat-DMBW4pI2.js","names":["__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","marker","symbol","_a","_b","name","marker2","symbol2","_a2","name2","marker3","symbol3","_a3","name3","marker4","symbol4","_a4","name4","marker5","symbol5","_a5","name5","marker6","symbol6","_a6","name6","marker7","symbol7","_a7","name7","marker8","symbol8","_a8","name8","marker9","symbol9","_a9","name9","marker10","symbol10","_a10","name10","marker11","symbol11","_a11","name11","marker12","symbol12","_a12","name12","marker13","symbol13","_a13","name13","marker14","symbol14","_a14","name","marker","symbol","_a","ZodFirstPartyTypeKind2","ZodFirstPartyTypeKind3","z4.toJSONSchema","z4.safeParseAsync","TypeValidationError2","AISDKError8","AISDKError16","DownloadError2","z.union","z.string","z.instanceof","z.custom","z2.lazy","z2.union","z2.null","z2.string","z2.number","z2.boolean","z2.record","z2.array","z3.record","z3.string","z4.object","z4.literal","z4.string","z4.union","z4.instanceof","z4.unknown","z4.boolean","z4.discriminatedUnion","z4.array","z4.record","z5.object","z5.literal","z5.string","z5.union","z5.array","asSchema2","safeParseJSON2","safeValidateTypes2","TypeValidationError2","z7.record","z7.string","z7.union","z7.strictObject","z7.literal","z7.boolean","z7.unknown","z7.custom","z7.enum","createIdGenerator2","z8.record","z8.string","lazySchema2","zodSchema2","z8.array","z8.object","z8.enum","z8.unknown","z8.union","z8.literal","z8.boolean","z8.never","createIdGenerator3","createIdGenerator4","resolve2","parseJsonEventStream2","generateIdFunc2","Chat","inputSchema","z.object","z\n .string","z.string","serverSchema","inputSchema","z.object","z.string","z.enum","serverSchema","inputSchema","z.object","z.string","z.array","serverSchema","inputSchema","z.object","z.string","serverSchema","inputSchema","z.object","z.string","z\n .number","serverSchema","inputSchema","z.object","z.string","serverSchema","inputSchema","z.object","serverSchema","inputSchema","z.object","serverSchema","inputSchema","z.object","z.string","serverSchema","inputSchema","z.object","serverSchema","inputSchema","z.object","z.string","z.array","z.any","serverSchema","inputSchema","z.object","z.enum","z\n .number","serverSchema","inputSchema","z.object","z.enum","serverSchema","inputSchema","z.object","z.enum","z.string","z.null","z\n .enum","serverSchema","inputSchema","z.object","z.string","z.number","z.array","z.enum","z.any","z.boolean","serverSchema","inputSchema","z.object","serverSchema","inputSchema","z.object","z.string","z.enum","serverSchema","z.object","z.string","z.array","z.any"],"sources":["../../node_modules/.pnpm/lucide-react@1.17.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/between-horizontal-start.mjs","../../node_modules/.pnpm/lucide-react@1.17.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/book.mjs","../../node_modules/.pnpm/lucide-react@1.17.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/chart-area.mjs","../../node_modules/.pnpm/lucide-react@1.17.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/circle-x.mjs","../../node_modules/.pnpm/lucide-react@1.17.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/file-pen.mjs","../../node_modules/.pnpm/lucide-react@1.17.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/logs.mjs","../../node_modules/.pnpm/lucide-react@1.17.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/message-square-heart.mjs","../../node_modules/.pnpm/lucide-react@1.17.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/send.mjs","../../src/integrations/api/chat/clearChatMessages.ts","../../src/features/instance/applications/components/Chat/components/ClearChat.tsx","../../src/integrations/api/chat/getChatMessages.ts","../../node_modules/.pnpm/@ai-sdk+provider@3.0.10/node_modules/@ai-sdk/provider/dist/index.mjs","../../node_modules/.pnpm/eventsource-parser@3.1.0/node_modules/eventsource-parser/dist/index.js","../../node_modules/.pnpm/eventsource-parser@3.1.0/node_modules/eventsource-parser/dist/stream.js","../../node_modules/.pnpm/@ai-sdk+provider-utils@4.0.27_zod@4.4.3/node_modules/@ai-sdk/provider-utils/dist/index.mjs","../../node_modules/.pnpm/ai@6.0.197_zod@4.4.3/node_modules/ai/dist/index.mjs","../../src/integrations/api/chat/getChatTransport.ts","../../node_modules/.pnpm/throttleit@2.1.0/node_modules/throttleit/index.js","../../node_modules/.pnpm/@ai-sdk+react@3.0.199_react@19.2.7_zod@4.4.3/node_modules/@ai-sdk/react/dist/index.mjs","../../src/features/instance/applications/components/Chat/components/ChatInput.tsx","../../src/features/instance/applications/components/Chat/components/LoadingState.tsx","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/collectFeedback/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/collectFeedback/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/collectFeedback/execute.ts","../../src/features/instance/applications/components/Chat/tools/collectFeedback/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/createApp/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/createApp/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/createApp/execute.ts","../../src/features/instance/applications/components/Chat/tools/createApp/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/deleteTableRecords/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/deleteTableRecords/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/deleteTableRecords/execute.ts","../../src/features/instance/applications/components/Chat/tools/deleteTableRecords/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/dropComponentFile/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/dropComponentFile/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/dropComponentFile/execute.ts","../../src/features/instance/applications/components/Chat/tools/dropComponentFile/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getAnalytics/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getAnalytics/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/getAnalytics/execute.ts","../../src/features/instance/applications/components/Chat/tools/getAnalytics/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getComponentFile/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getComponentFile/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/getComponentFile/execute.ts","../../src/features/instance/applications/components/Chat/tools/getComponentFile/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getComponents/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getComponents/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/getComponents/execute.ts","../../src/features/instance/applications/components/Chat/tools/getComponents/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getDescribeAll/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getDescribeAll/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/getDescribeAll/execute.ts","../../src/features/instance/applications/components/Chat/tools/getDescribeAll/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getDescribeTable/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getDescribeTable/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/getDescribeTable/execute.ts","../../src/features/instance/applications/components/Chat/tools/getDescribeTable/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getUserContext/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/getUserContext/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/getUserContext/execute.ts","../../src/features/instance/applications/components/Chat/tools/getUserContext/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/insertTableRecords/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/insertTableRecords/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/insertTableRecords/execute.ts","../../src/features/instance/applications/components/Chat/tools/insertTableRecords/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/listAnalyticsMetrics/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/listAnalyticsMetrics/serverSchema.js","../../src/integrations/api/instance/status/listAnalyticsMetrics.ts","../../src/features/instance/applications/components/Chat/tools/listAnalyticsMetrics/execute.ts","../../src/features/instance/applications/components/Chat/tools/listAnalyticsMetrics/clientTool.ts","../../node_modules/.pnpm/@harperfast+skills@1.9.1/node_modules/@harperfast/skills/dist/index.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/readHarperSkill/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/readHarperSkill/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/readHarperSkill/execute.ts","../../src/features/instance/applications/components/Chat/tools/readHarperSkill/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/readLogs/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/readLogs/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/readLogs/execute.ts","../../src/features/instance/applications/components/Chat/tools/readLogs/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/readTableRecords/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/readTableRecords/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/readTableRecords/execute.ts","../../src/features/instance/applications/components/Chat/tools/readTableRecords/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/restartHTTPService/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/restartHTTPService/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/restartHTTPService/execute.ts","../../src/features/instance/applications/components/Chat/tools/restartHTTPService/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/setComponentFile/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/setComponentFile/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/setComponentFile/execute.ts","../../src/features/instance/applications/components/Chat/tools/setComponentFile/clientTool.ts","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/updateTableRecords/inputSchema.js","../../node_modules/.pnpm/@harperfast+agent-tools@1.1.7_@harperfast+skills@1.9.1/node_modules/@harperfast/agent-tools/dist/tools/updateTableRecords/serverSchema.js","../../src/features/instance/applications/components/Chat/tools/updateTableRecords/execute.ts","../../src/features/instance/applications/components/Chat/tools/updateTableRecords/clientTool.ts","../../src/features/instance/applications/components/Chat/tools/clientTools.ts","../../src/features/instance/applications/components/Chat/components/ToolInvocation.tsx","../../src/features/instance/applications/components/Chat/components/MessageBubble.tsx","../../src/integrations/api/chat/getChatUsage.ts","../../src/features/instance/applications/components/Chat/components/UsageBar.tsx","../../src/features/instance/applications/components/Chat/index.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"13\", height: \"7\", x: \"8\", y: \"3\", rx: \"1\", key: \"pkso9a\" }],\n [\"path\", { d: \"m2 9 3 3-3 3\", key: \"1agib5\" }],\n [\"rect\", { width: \"13\", height: \"7\", x: \"8\", y: \"14\", rx: \"1\", key: \"1q5fc1\" }]\n];\nconst BetweenHorizontalStart = createLucideIcon(\"between-horizontal-start\", __iconNode);\n\nexport { __iconNode, BetweenHorizontalStart as default };\n//# sourceMappingURL=between-horizontal-start.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20\",\n key: \"k3hazp\"\n }\n ]\n];\nconst Book = createLucideIcon(\"book\", __iconNode);\n\nexport { __iconNode, Book as default };\n//# sourceMappingURL=book.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 3v16a2 2 0 0 0 2 2h16\", key: \"c24i48\" }],\n [\n \"path\",\n {\n d: \"M7 11.207a.5.5 0 0 1 .146-.353l2-2a.5.5 0 0 1 .708 0l3.292 3.292a.5.5 0 0 0 .708 0l4.292-4.292a.5.5 0 0 1 .854.353V16a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z\",\n key: \"q0gr47\"\n }\n ]\n];\nconst ChartArea = createLucideIcon(\"chart-area\", __iconNode);\n\nexport { __iconNode, ChartArea as default };\n//# sourceMappingURL=chart-area.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m15 9-6 6\", key: \"1uzhvr\" }],\n [\"path\", { d: \"m9 9 6 6\", key: \"z0biqf\" }]\n];\nconst CircleX = createLucideIcon(\"circle-x\", __iconNode);\n\nexport { __iconNode, CircleX as default };\n//# sourceMappingURL=circle-x.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M12.659 22H18a2 2 0 0 0 2-2V8a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v9.34\",\n key: \"o6klzx\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\n \"path\",\n {\n d: \"M10.378 12.622a1 1 0 0 1 3 3.003L8.36 20.637a2 2 0 0 1-.854.506l-2.867.837a.5.5 0 0 1-.62-.62l.836-2.869a2 2 0 0 1 .506-.853z\",\n key: \"zhnas1\"\n }\n ]\n];\nconst FilePen = createLucideIcon(\"file-pen\", __iconNode);\n\nexport { __iconNode, FilePen as default };\n//# sourceMappingURL=file-pen.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 5h1\", key: \"1mv5vm\" }],\n [\"path\", { d: \"M3 12h1\", key: \"lp3yf2\" }],\n [\"path\", { d: \"M3 19h1\", key: \"w6f3n9\" }],\n [\"path\", { d: \"M8 5h1\", key: \"1nxr5w\" }],\n [\"path\", { d: \"M8 12h1\", key: \"1con00\" }],\n [\"path\", { d: \"M8 19h1\", key: \"k7p10e\" }],\n [\"path\", { d: \"M13 5h8\", key: \"a7qcls\" }],\n [\"path\", { d: \"M13 12h8\", key: \"h98zly\" }],\n [\"path\", { d: \"M13 19h8\", key: \"c3s6r1\" }]\n];\nconst Logs = createLucideIcon(\"logs\", __iconNode);\n\nexport { __iconNode, Logs as default };\n//# sourceMappingURL=logs.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z\",\n key: \"18887p\"\n }\n ],\n [\n \"path\",\n {\n d: \"M7.5 9.5c0 .687.265 1.383.697 1.844l3.009 3.264a1.14 1.14 0 0 0 .407.314 1 1 0 0 0 .783-.004 1.14 1.14 0 0 0 .398-.31l3.008-3.264A2.77 2.77 0 0 0 16.5 9.5 2.5 2.5 0 0 0 12 8a2.5 2.5 0 0 0-4.5 1.5\",\n key: \"1faxuh\"\n }\n ]\n];\nconst MessageSquareHeart = createLucideIcon(\"message-square-heart\", __iconNode);\n\nexport { __iconNode, MessageSquareHeart as default };\n//# sourceMappingURL=message-square-heart.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z\",\n key: \"1ffxy3\"\n }\n ],\n [\"path\", { d: \"m21.854 2.147-10.94 10.939\", key: \"12cjpa\" }]\n];\nconst Send = createLucideIcon(\"send\", __iconNode);\n\nexport { __iconNode, Send as default };\n//# sourceMappingURL=send.mjs.map\n","import { apiClient } from '@/config/apiClient';\n\nexport async function clearChatMessages() {\n\tawait apiClient.delete('/Chat/Messages/' as any);\n}\n","import { clearChatMessages } from '@/integrations/api/chat/clearChatMessages';\nimport { RefreshCw, Trash2 } from 'lucide-react';\nimport { useCallback, useState } from 'react';\n\nexport function ClearChat({ setMessages }: { setMessages: (messages: []) => void }) {\n\tconst [isClearing, setIsClearing] = useState(false);\n\n\tconst handleClearChat = useCallback(async () => {\n\t\tif (isClearing) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetIsClearing(true);\n\t\ttry {\n\t\t\tawait clearChatMessages();\n\t\t\tsetMessages([]);\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to clear chat:', error);\n\t\t} finally {\n\t\t\tsetIsClearing(false);\n\t\t}\n\t}, [isClearing, setMessages]);\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclassName=\"clear-chat-button gap-1\"\n\t\t\tonClick={handleClearChat}\n\t\t\tdisabled={isClearing}\n\t\t\ttitle=\"Clear chat\"\n\t\t>\n\t\t\t{isClearing ? <RefreshCw className=\"animate-spin\" size={18} /> : <Trash2 size={18} />}\n\t\t\tClear\n\t\t</button>\n\t);\n}\n","import { apiClient } from '@/config/apiClient';\n\nexport async function getChatMessages() {\n\tconst { data } = await apiClient.get('/Chat/Messages/' as any);\n\treturn data;\n}\n","// src/errors/ai-sdk-error.ts\nvar marker = \"vercel.ai.error\";\nvar symbol = Symbol.for(marker);\nvar _a, _b;\nvar AISDKError = class _AISDKError extends (_b = Error, _a = symbol, _b) {\n /**\n * Creates an AI SDK Error.\n *\n * @param {Object} params - The parameters for creating the error.\n * @param {string} params.name - The name of the error.\n * @param {string} params.message - The error message.\n * @param {unknown} [params.cause] - The underlying cause of the error.\n */\n constructor({\n name: name14,\n message,\n cause\n }) {\n super(message);\n this[_a] = true;\n this.name = name14;\n this.cause = cause;\n }\n /**\n * Checks if the given error is an AI SDK Error.\n * @param {unknown} error - The error to check.\n * @returns {boolean} True if the error is an AI SDK Error, false otherwise.\n */\n static isInstance(error) {\n return _AISDKError.hasMarker(error, marker);\n }\n static hasMarker(error, marker15) {\n const markerSymbol = Symbol.for(marker15);\n return error != null && typeof error === \"object\" && markerSymbol in error && typeof error[markerSymbol] === \"boolean\" && error[markerSymbol] === true;\n }\n};\n\n// src/errors/api-call-error.ts\nvar name = \"AI_APICallError\";\nvar marker2 = `vercel.ai.error.${name}`;\nvar symbol2 = Symbol.for(marker2);\nvar _a2, _b2;\nvar APICallError = class extends (_b2 = AISDKError, _a2 = symbol2, _b2) {\n constructor({\n message,\n url,\n requestBodyValues,\n statusCode,\n responseHeaders,\n responseBody,\n cause,\n isRetryable = statusCode != null && (statusCode === 408 || // request timeout\n statusCode === 409 || // conflict\n statusCode === 429 || // too many requests\n statusCode >= 500),\n // server error\n data\n }) {\n super({ name, message, cause });\n this[_a2] = true;\n this.url = url;\n this.requestBodyValues = requestBodyValues;\n this.statusCode = statusCode;\n this.responseHeaders = responseHeaders;\n this.responseBody = responseBody;\n this.isRetryable = isRetryable;\n this.data = data;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker2);\n }\n};\n\n// src/errors/empty-response-body-error.ts\nvar name2 = \"AI_EmptyResponseBodyError\";\nvar marker3 = `vercel.ai.error.${name2}`;\nvar symbol3 = Symbol.for(marker3);\nvar _a3, _b3;\nvar EmptyResponseBodyError = class extends (_b3 = AISDKError, _a3 = symbol3, _b3) {\n // used in isInstance\n constructor({ message = \"Empty response body\" } = {}) {\n super({ name: name2, message });\n this[_a3] = true;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker3);\n }\n};\n\n// src/errors/get-error-message.ts\nfunction getErrorMessage(error) {\n if (error == null) {\n return \"unknown error\";\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return JSON.stringify(error);\n}\n\n// src/errors/invalid-argument-error.ts\nvar name3 = \"AI_InvalidArgumentError\";\nvar marker4 = `vercel.ai.error.${name3}`;\nvar symbol4 = Symbol.for(marker4);\nvar _a4, _b4;\nvar InvalidArgumentError = class extends (_b4 = AISDKError, _a4 = symbol4, _b4) {\n constructor({\n message,\n cause,\n argument\n }) {\n super({ name: name3, message, cause });\n this[_a4] = true;\n this.argument = argument;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker4);\n }\n};\n\n// src/errors/invalid-prompt-error.ts\nvar name4 = \"AI_InvalidPromptError\";\nvar marker5 = `vercel.ai.error.${name4}`;\nvar symbol5 = Symbol.for(marker5);\nvar _a5, _b5;\nvar InvalidPromptError = class extends (_b5 = AISDKError, _a5 = symbol5, _b5) {\n constructor({\n prompt,\n message,\n cause\n }) {\n super({ name: name4, message: `Invalid prompt: ${message}`, cause });\n this[_a5] = true;\n this.prompt = prompt;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker5);\n }\n};\n\n// src/errors/invalid-response-data-error.ts\nvar name5 = \"AI_InvalidResponseDataError\";\nvar marker6 = `vercel.ai.error.${name5}`;\nvar symbol6 = Symbol.for(marker6);\nvar _a6, _b6;\nvar InvalidResponseDataError = class extends (_b6 = AISDKError, _a6 = symbol6, _b6) {\n constructor({\n data,\n message = `Invalid response data: ${JSON.stringify(data)}.`\n }) {\n super({ name: name5, message });\n this[_a6] = true;\n this.data = data;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker6);\n }\n};\n\n// src/errors/json-parse-error.ts\nvar name6 = \"AI_JSONParseError\";\nvar marker7 = `vercel.ai.error.${name6}`;\nvar symbol7 = Symbol.for(marker7);\nvar _a7, _b7;\nvar JSONParseError = class extends (_b7 = AISDKError, _a7 = symbol7, _b7) {\n constructor({ text, cause }) {\n super({\n name: name6,\n message: `JSON parsing failed: Text: ${text}.\nError message: ${getErrorMessage(cause)}`,\n cause\n });\n this[_a7] = true;\n this.text = text;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker7);\n }\n};\n\n// src/errors/load-api-key-error.ts\nvar name7 = \"AI_LoadAPIKeyError\";\nvar marker8 = `vercel.ai.error.${name7}`;\nvar symbol8 = Symbol.for(marker8);\nvar _a8, _b8;\nvar LoadAPIKeyError = class extends (_b8 = AISDKError, _a8 = symbol8, _b8) {\n // used in isInstance\n constructor({ message }) {\n super({ name: name7, message });\n this[_a8] = true;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker8);\n }\n};\n\n// src/errors/load-setting-error.ts\nvar name8 = \"AI_LoadSettingError\";\nvar marker9 = `vercel.ai.error.${name8}`;\nvar symbol9 = Symbol.for(marker9);\nvar _a9, _b9;\nvar LoadSettingError = class extends (_b9 = AISDKError, _a9 = symbol9, _b9) {\n // used in isInstance\n constructor({ message }) {\n super({ name: name8, message });\n this[_a9] = true;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker9);\n }\n};\n\n// src/errors/no-content-generated-error.ts\nvar name9 = \"AI_NoContentGeneratedError\";\nvar marker10 = `vercel.ai.error.${name9}`;\nvar symbol10 = Symbol.for(marker10);\nvar _a10, _b10;\nvar NoContentGeneratedError = class extends (_b10 = AISDKError, _a10 = symbol10, _b10) {\n // used in isInstance\n constructor({\n message = \"No content generated.\"\n } = {}) {\n super({ name: name9, message });\n this[_a10] = true;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker10);\n }\n};\n\n// src/errors/no-such-model-error.ts\nvar name10 = \"AI_NoSuchModelError\";\nvar marker11 = `vercel.ai.error.${name10}`;\nvar symbol11 = Symbol.for(marker11);\nvar _a11, _b11;\nvar NoSuchModelError = class extends (_b11 = AISDKError, _a11 = symbol11, _b11) {\n constructor({\n errorName = name10,\n modelId,\n modelType,\n message = `No such ${modelType}: ${modelId}`\n }) {\n super({ name: errorName, message });\n this[_a11] = true;\n this.modelId = modelId;\n this.modelType = modelType;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker11);\n }\n};\n\n// src/errors/too-many-embedding-values-for-call-error.ts\nvar name11 = \"AI_TooManyEmbeddingValuesForCallError\";\nvar marker12 = `vercel.ai.error.${name11}`;\nvar symbol12 = Symbol.for(marker12);\nvar _a12, _b12;\nvar TooManyEmbeddingValuesForCallError = class extends (_b12 = AISDKError, _a12 = symbol12, _b12) {\n constructor(options) {\n super({\n name: name11,\n message: `Too many values for a single embedding call. The ${options.provider} model \"${options.modelId}\" can only embed up to ${options.maxEmbeddingsPerCall} values per call, but ${options.values.length} values were provided.`\n });\n this[_a12] = true;\n this.provider = options.provider;\n this.modelId = options.modelId;\n this.maxEmbeddingsPerCall = options.maxEmbeddingsPerCall;\n this.values = options.values;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker12);\n }\n};\n\n// src/errors/type-validation-error.ts\nvar name12 = \"AI_TypeValidationError\";\nvar marker13 = `vercel.ai.error.${name12}`;\nvar symbol13 = Symbol.for(marker13);\nvar _a13, _b13;\nvar TypeValidationError = class _TypeValidationError extends (_b13 = AISDKError, _a13 = symbol13, _b13) {\n constructor({\n value,\n cause,\n context\n }) {\n let contextPrefix = \"Type validation failed\";\n if (context == null ? void 0 : context.field) {\n contextPrefix += ` for ${context.field}`;\n }\n if ((context == null ? void 0 : context.entityName) || (context == null ? void 0 : context.entityId)) {\n contextPrefix += \" (\";\n const parts = [];\n if (context.entityName) {\n parts.push(context.entityName);\n }\n if (context.entityId) {\n parts.push(`id: \"${context.entityId}\"`);\n }\n contextPrefix += parts.join(\", \");\n contextPrefix += \")\";\n }\n super({\n name: name12,\n message: `${contextPrefix}: Value: ${JSON.stringify(value)}.\nError message: ${getErrorMessage(cause)}`,\n cause\n });\n this[_a13] = true;\n this.value = value;\n this.context = context;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker13);\n }\n /**\n * Wraps an error into a TypeValidationError.\n * If the cause is already a TypeValidationError with the same value and context, it returns the cause.\n * Otherwise, it creates a new TypeValidationError.\n *\n * @param {Object} params - The parameters for wrapping the error.\n * @param {unknown} params.value - The value that failed validation.\n * @param {unknown} params.cause - The original error or cause of the validation failure.\n * @param {TypeValidationContext} params.context - Optional context about what is being validated.\n * @returns {TypeValidationError} A TypeValidationError instance.\n */\n static wrap({\n value,\n cause,\n context\n }) {\n var _a15, _b15, _c;\n if (_TypeValidationError.isInstance(cause) && cause.value === value && ((_a15 = cause.context) == null ? void 0 : _a15.field) === (context == null ? void 0 : context.field) && ((_b15 = cause.context) == null ? void 0 : _b15.entityName) === (context == null ? void 0 : context.entityName) && ((_c = cause.context) == null ? void 0 : _c.entityId) === (context == null ? void 0 : context.entityId)) {\n return cause;\n }\n return new _TypeValidationError({ value, cause, context });\n }\n};\n\n// src/errors/unsupported-functionality-error.ts\nvar name13 = \"AI_UnsupportedFunctionalityError\";\nvar marker14 = `vercel.ai.error.${name13}`;\nvar symbol14 = Symbol.for(marker14);\nvar _a14, _b14;\nvar UnsupportedFunctionalityError = class extends (_b14 = AISDKError, _a14 = symbol14, _b14) {\n constructor({\n functionality,\n message = `'${functionality}' functionality not supported.`\n }) {\n super({ name: name13, message });\n this[_a14] = true;\n this.functionality = functionality;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker14);\n }\n};\n\n// src/json-value/is-json.ts\nfunction isJSONValue(value) {\n if (value === null || typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return true;\n }\n if (Array.isArray(value)) {\n return value.every(isJSONValue);\n }\n if (typeof value === \"object\") {\n return Object.entries(value).every(\n ([key, val]) => typeof key === \"string\" && (val === void 0 || isJSONValue(val))\n );\n }\n return false;\n}\nfunction isJSONArray(value) {\n return Array.isArray(value) && value.every(isJSONValue);\n}\nfunction isJSONObject(value) {\n return value != null && typeof value === \"object\" && Object.entries(value).every(\n ([key, val]) => typeof key === \"string\" && (val === void 0 || isJSONValue(val))\n );\n}\nexport {\n AISDKError,\n APICallError,\n EmptyResponseBodyError,\n InvalidArgumentError,\n InvalidPromptError,\n InvalidResponseDataError,\n JSONParseError,\n LoadAPIKeyError,\n LoadSettingError,\n NoContentGeneratedError,\n NoSuchModelError,\n TooManyEmbeddingValuesForCallError,\n TypeValidationError,\n UnsupportedFunctionalityError,\n getErrorMessage,\n isJSONArray,\n isJSONObject,\n isJSONValue\n};\n//# sourceMappingURL=index.mjs.map","class ParseError extends Error {\n constructor(message, options) {\n super(message), this.name = \"ParseError\", this.type = options.type, this.field = options.field, this.value = options.value, this.line = options.line;\n }\n}\nconst LF = 10, CR = 13, SPACE = 32;\nfunction noop(_arg) {\n}\nfunction createParser(config) {\n if (typeof config == \"function\")\n throw new TypeError(\n \"`config` must be an object, got a function instead. Did you mean `createParser({onEvent: fn})`?\"\n );\n const { onEvent = noop, onError = noop, onRetry = noop, onComment, maxBufferSize } = config, pendingFragments = [];\n let pendingFragmentsLength = 0, isFirstChunk = !0, id, data = \"\", dataLines = 0, eventType, terminated = !1;\n function feed(chunk) {\n if (terminated)\n throw new Error(\n \"Cannot feed parser: it was terminated after exceeding the configured max buffer size. Call `reset()` to resume parsing.\"\n );\n if (isFirstChunk && (isFirstChunk = !1, chunk.charCodeAt(0) === 239 && chunk.charCodeAt(1) === 187 && chunk.charCodeAt(2) === 191 && (chunk = chunk.slice(3))), pendingFragments.length === 0) {\n const trailing2 = processLines(chunk);\n trailing2 !== \"\" && (pendingFragments.push(trailing2), pendingFragmentsLength = trailing2.length), checkBufferSize();\n return;\n }\n if (chunk.indexOf(`\n`) === -1 && chunk.indexOf(\"\\r\") === -1) {\n pendingFragments.push(chunk), pendingFragmentsLength += chunk.length, checkBufferSize();\n return;\n }\n pendingFragments.push(chunk);\n const input = pendingFragments.join(\"\");\n pendingFragments.length = 0, pendingFragmentsLength = 0;\n const trailing = processLines(input);\n trailing !== \"\" && (pendingFragments.push(trailing), pendingFragmentsLength = trailing.length), checkBufferSize();\n }\n function checkBufferSize() {\n maxBufferSize !== void 0 && (pendingFragmentsLength + data.length <= maxBufferSize || (terminated = !0, pendingFragments.length = 0, pendingFragmentsLength = 0, id = void 0, data = \"\", dataLines = 0, eventType = void 0, onError(\n new ParseError(`Buffered data exceeded max buffer size of ${maxBufferSize} characters`, {\n type: \"max-buffer-size-exceeded\"\n })\n )));\n }\n function processLines(chunk) {\n let searchIndex = 0;\n if (chunk.indexOf(\"\\r\") === -1) {\n let lfIndex = chunk.indexOf(`\n`, searchIndex);\n for (; lfIndex !== -1; ) {\n if (searchIndex === lfIndex) {\n dataLines > 0 && onEvent({ id, event: eventType, data }), id = void 0, data = \"\", dataLines = 0, eventType = void 0, searchIndex = lfIndex + 1, lfIndex = chunk.indexOf(`\n`, searchIndex);\n continue;\n }\n const firstCharCode = chunk.charCodeAt(searchIndex);\n if (isDataPrefix(chunk, searchIndex, firstCharCode)) {\n const valueStart = chunk.charCodeAt(searchIndex + 5) === SPACE ? searchIndex + 6 : searchIndex + 5, value = chunk.slice(valueStart, lfIndex);\n if (dataLines === 0 && chunk.charCodeAt(lfIndex + 1) === LF) {\n onEvent({ id, event: eventType, data: value }), id = void 0, data = \"\", eventType = void 0, searchIndex = lfIndex + 2, lfIndex = chunk.indexOf(`\n`, searchIndex);\n continue;\n }\n data = dataLines === 0 ? value : `${data}\n${value}`, dataLines++;\n } else isEventPrefix(chunk, searchIndex, firstCharCode) ? eventType = chunk.slice(\n chunk.charCodeAt(searchIndex + 6) === SPACE ? searchIndex + 7 : searchIndex + 6,\n lfIndex\n ) || void 0 : parseLine(chunk, searchIndex, lfIndex);\n searchIndex = lfIndex + 1, lfIndex = chunk.indexOf(`\n`, searchIndex);\n }\n return chunk.slice(searchIndex);\n }\n for (; searchIndex < chunk.length; ) {\n const crIndex = chunk.indexOf(\"\\r\", searchIndex), lfIndex = chunk.indexOf(`\n`, searchIndex);\n let lineEnd = -1;\n if (crIndex !== -1 && lfIndex !== -1 ? lineEnd = crIndex < lfIndex ? crIndex : lfIndex : crIndex !== -1 ? crIndex === chunk.length - 1 ? lineEnd = -1 : lineEnd = crIndex : lfIndex !== -1 && (lineEnd = lfIndex), lineEnd === -1)\n break;\n parseLine(chunk, searchIndex, lineEnd), searchIndex = lineEnd + 1, chunk.charCodeAt(searchIndex - 1) === CR && chunk.charCodeAt(searchIndex) === LF && searchIndex++;\n }\n return chunk.slice(searchIndex);\n }\n function parseLine(chunk, start, end) {\n if (start === end) {\n dispatchEvent();\n return;\n }\n const firstCharCode = chunk.charCodeAt(start);\n if (isDataPrefix(chunk, start, firstCharCode)) {\n const valueStart = chunk.charCodeAt(start + 5) === SPACE ? start + 6 : start + 5, value2 = chunk.slice(valueStart, end);\n data = dataLines === 0 ? value2 : `${data}\n${value2}`, dataLines++;\n return;\n }\n if (isEventPrefix(chunk, start, firstCharCode)) {\n eventType = chunk.slice(chunk.charCodeAt(start + 6) === SPACE ? start + 7 : start + 6, end) || void 0;\n return;\n }\n if (firstCharCode === 105 && chunk.charCodeAt(start + 1) === 100 && chunk.charCodeAt(start + 2) === 58) {\n const value2 = chunk.slice(chunk.charCodeAt(start + 3) === SPACE ? start + 4 : start + 3, end);\n id = value2.includes(\"\\0\") ? void 0 : value2;\n return;\n }\n if (firstCharCode === 58) {\n if (onComment) {\n const line2 = chunk.slice(start, end);\n onComment(line2.slice(chunk.charCodeAt(start + 1) === SPACE ? 2 : 1));\n }\n return;\n }\n const line = chunk.slice(start, end), fieldSeparatorIndex = line.indexOf(\":\");\n if (fieldSeparatorIndex === -1) {\n processField(line, \"\", line);\n return;\n }\n const field = line.slice(0, fieldSeparatorIndex), offset = line.charCodeAt(fieldSeparatorIndex + 1) === SPACE ? 2 : 1, value = line.slice(fieldSeparatorIndex + offset);\n processField(field, value, line);\n }\n function processField(field, value, line) {\n switch (field) {\n case \"event\":\n eventType = value || void 0;\n break;\n case \"data\":\n data = dataLines === 0 ? value : `${data}\n${value}`, dataLines++;\n break;\n case \"id\":\n id = value.includes(\"\\0\") ? void 0 : value;\n break;\n case \"retry\":\n /^\\d+$/.test(value) ? onRetry(parseInt(value, 10)) : onError(\n new ParseError(`Invalid \\`retry\\` value: \"${value}\"`, {\n type: \"invalid-retry\",\n value,\n line\n })\n );\n break;\n default:\n onError(\n new ParseError(\n `Unknown field \"${field.length > 20 ? `${field.slice(0, 20)}\\u2026` : field}\"`,\n { type: \"unknown-field\", field, value, line }\n )\n );\n break;\n }\n }\n function dispatchEvent() {\n dataLines > 0 && onEvent({\n id,\n event: eventType,\n data\n }), id = void 0, data = \"\", dataLines = 0, eventType = void 0;\n }\n function reset(options = {}) {\n if (options.consume && pendingFragments.length > 0) {\n const incompleteLine = pendingFragments.join(\"\");\n parseLine(incompleteLine, 0, incompleteLine.length);\n }\n isFirstChunk = !0, id = void 0, data = \"\", dataLines = 0, eventType = void 0, pendingFragments.length = 0, pendingFragmentsLength = 0, terminated = !1;\n }\n return { feed, reset };\n}\nfunction isDataPrefix(chunk, i, firstCharCode) {\n return firstCharCode === 100 && chunk.charCodeAt(i + 1) === 97 && chunk.charCodeAt(i + 2) === 116 && chunk.charCodeAt(i + 3) === 97 && chunk.charCodeAt(i + 4) === 58;\n}\nfunction isEventPrefix(chunk, i, firstCharCode) {\n return firstCharCode === 101 && chunk.charCodeAt(i + 1) === 118 && chunk.charCodeAt(i + 2) === 101 && chunk.charCodeAt(i + 3) === 110 && chunk.charCodeAt(i + 4) === 116 && chunk.charCodeAt(i + 5) === 58;\n}\nexport {\n ParseError,\n createParser\n};\n//# sourceMappingURL=index.js.map\n","import { createParser } from \"./index.js\";\nimport { ParseError } from \"./index.js\";\nclass EventSourceParserStream extends TransformStream {\n constructor({ onError, onRetry, onComment, maxBufferSize } = {}) {\n let parser;\n super({\n start(controller) {\n parser = createParser({\n onEvent: (event) => {\n controller.enqueue(event);\n },\n onError(error) {\n typeof onError == \"function\" && onError(error), (onError === \"terminate\" || error.type === \"max-buffer-size-exceeded\") && controller.error(error);\n },\n onRetry,\n onComment,\n maxBufferSize\n });\n },\n transform(chunk) {\n parser.feed(chunk);\n }\n });\n }\n}\nexport {\n EventSourceParserStream,\n ParseError\n};\n//# sourceMappingURL=stream.js.map\n","// src/combine-headers.ts\nfunction combineHeaders(...headers) {\n return headers.reduce(\n (combinedHeaders, currentHeaders) => ({\n ...combinedHeaders,\n ...currentHeaders != null ? currentHeaders : {}\n }),\n {}\n );\n}\n\n// src/convert-async-iterator-to-readable-stream.ts\nfunction convertAsyncIteratorToReadableStream(iterator) {\n let cancelled = false;\n return new ReadableStream({\n /**\n * Called when the consumer wants to pull more data from the stream.\n *\n * @param {ReadableStreamDefaultController<T>} controller - The controller to enqueue data into the stream.\n * @returns {Promise<void>}\n */\n async pull(controller) {\n if (cancelled) return;\n try {\n const { value, done } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n } catch (error) {\n controller.error(error);\n }\n },\n /**\n * Called when the consumer cancels the stream.\n */\n async cancel(reason) {\n cancelled = true;\n if (iterator.return) {\n try {\n await iterator.return(reason);\n } catch (e) {\n }\n }\n }\n });\n}\n\n// src/create-tool-name-mapping.ts\nfunction createToolNameMapping({\n tools = [],\n providerToolNames,\n resolveProviderToolName\n}) {\n var _a2;\n const customToolNameToProviderToolName = {};\n const providerToolNameToCustomToolName = {};\n for (const tool2 of tools) {\n if (tool2.type === \"provider\") {\n const providerToolName = (_a2 = resolveProviderToolName == null ? void 0 : resolveProviderToolName(tool2)) != null ? _a2 : tool2.id in providerToolNames ? providerToolNames[tool2.id] : void 0;\n if (providerToolName == null) {\n continue;\n }\n customToolNameToProviderToolName[tool2.name] = providerToolName;\n providerToolNameToCustomToolName[providerToolName] = tool2.name;\n }\n }\n return {\n toProviderToolName: (customToolName) => {\n var _a3;\n return (_a3 = customToolNameToProviderToolName[customToolName]) != null ? _a3 : customToolName;\n },\n toCustomToolName: (providerToolName) => {\n var _a3;\n return (_a3 = providerToolNameToCustomToolName[providerToolName]) != null ? _a3 : providerToolName;\n }\n };\n}\n\n// src/delay.ts\nasync function delay(delayInMs, options) {\n if (delayInMs == null) {\n return Promise.resolve();\n }\n const signal = options == null ? void 0 : options.abortSignal;\n return new Promise((resolve2, reject) => {\n if (signal == null ? void 0 : signal.aborted) {\n reject(createAbortError());\n return;\n }\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve2();\n }, delayInMs);\n const cleanup = () => {\n clearTimeout(timeoutId);\n signal == null ? void 0 : signal.removeEventListener(\"abort\", onAbort);\n };\n const onAbort = () => {\n cleanup();\n reject(createAbortError());\n };\n signal == null ? void 0 : signal.addEventListener(\"abort\", onAbort);\n });\n}\nfunction createAbortError() {\n return new DOMException(\"Delay was aborted\", \"AbortError\");\n}\n\n// src/delayed-promise.ts\nvar DelayedPromise = class {\n constructor() {\n this.status = { type: \"pending\" };\n this._resolve = void 0;\n this._reject = void 0;\n }\n get promise() {\n if (this._promise) {\n return this._promise;\n }\n this._promise = new Promise((resolve2, reject) => {\n if (this.status.type === \"resolved\") {\n resolve2(this.status.value);\n } else if (this.status.type === \"rejected\") {\n reject(this.status.error);\n }\n this._resolve = resolve2;\n this._reject = reject;\n });\n return this._promise;\n }\n resolve(value) {\n var _a2;\n this.status = { type: \"resolved\", value };\n if (this._promise) {\n (_a2 = this._resolve) == null ? void 0 : _a2.call(this, value);\n }\n }\n reject(error) {\n var _a2;\n this.status = { type: \"rejected\", error };\n if (this._promise) {\n (_a2 = this._reject) == null ? void 0 : _a2.call(this, error);\n }\n }\n isResolved() {\n return this.status.type === \"resolved\";\n }\n isRejected() {\n return this.status.type === \"rejected\";\n }\n isPending() {\n return this.status.type === \"pending\";\n }\n};\n\n// src/extract-response-headers.ts\nfunction extractResponseHeaders(response) {\n return Object.fromEntries([...response.headers]);\n}\n\n// src/uint8-utils.ts\nvar { btoa, atob } = globalThis;\nfunction convertBase64ToUint8Array(base64String) {\n const base64Url = base64String.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const latin1string = atob(base64Url);\n return Uint8Array.from(latin1string, (byte) => byte.codePointAt(0));\n}\nfunction convertUint8ArrayToBase64(array) {\n let latin1string = \"\";\n for (let i = 0; i < array.length; i++) {\n latin1string += String.fromCodePoint(array[i]);\n }\n return btoa(latin1string);\n}\nfunction convertToBase64(value) {\n return value instanceof Uint8Array ? convertUint8ArrayToBase64(value) : value;\n}\n\n// src/convert-image-model-file-to-data-uri.ts\nfunction convertImageModelFileToDataUri(file) {\n if (file.type === \"url\") return file.url;\n return `data:${file.mediaType};base64,${typeof file.data === \"string\" ? file.data : convertUint8ArrayToBase64(file.data)}`;\n}\n\n// src/convert-to-form-data.ts\nfunction convertToFormData(input, options = {}) {\n const { useArrayBrackets = true } = options;\n const formData = new FormData();\n for (const [key, value] of Object.entries(input)) {\n if (value == null) {\n continue;\n }\n if (Array.isArray(value)) {\n if (value.length === 1) {\n formData.append(key, value[0]);\n continue;\n }\n const arrayKey = useArrayBrackets ? `${key}[]` : key;\n for (const item of value) {\n formData.append(arrayKey, item);\n }\n continue;\n }\n formData.append(key, value);\n }\n return formData;\n}\n\n// src/download-error.ts\nimport { AISDKError } from \"@ai-sdk/provider\";\nvar name = \"AI_DownloadError\";\nvar marker = `vercel.ai.error.${name}`;\nvar symbol = Symbol.for(marker);\nvar _a, _b;\nvar DownloadError = class extends (_b = AISDKError, _a = symbol, _b) {\n constructor({\n url,\n statusCode,\n statusText,\n cause,\n message = cause == null ? `Failed to download ${url}: ${statusCode} ${statusText}` : `Failed to download ${url}: ${cause}`\n }) {\n super({ name, message, cause });\n this[_a] = true;\n this.url = url;\n this.statusCode = statusCode;\n this.statusText = statusText;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker);\n }\n};\n\n// src/read-response-with-size-limit.ts\nvar DEFAULT_MAX_DOWNLOAD_SIZE = 2 * 1024 * 1024 * 1024;\nasync function readResponseWithSizeLimit({\n response,\n url,\n maxBytes = DEFAULT_MAX_DOWNLOAD_SIZE\n}) {\n const contentLength = response.headers.get(\"content-length\");\n if (contentLength != null) {\n const length = parseInt(contentLength, 10);\n if (!isNaN(length) && length > maxBytes) {\n throw new DownloadError({\n url,\n message: `Download of ${url} exceeded maximum size of ${maxBytes} bytes (Content-Length: ${length}).`\n });\n }\n }\n const body = response.body;\n if (body == null) {\n return new Uint8Array(0);\n }\n const reader = body.getReader();\n const chunks = [];\n let totalBytes = 0;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n totalBytes += value.length;\n if (totalBytes > maxBytes) {\n throw new DownloadError({\n url,\n message: `Download of ${url} exceeded maximum size of ${maxBytes} bytes.`\n });\n }\n chunks.push(value);\n }\n } finally {\n try {\n await reader.cancel();\n } finally {\n reader.releaseLock();\n }\n }\n const result = new Uint8Array(totalBytes);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n}\n\n// src/validate-download-url.ts\nfunction validateDownloadUrl(url) {\n let parsed;\n try {\n parsed = new URL(url);\n } catch (e) {\n throw new DownloadError({\n url,\n message: `Invalid URL: ${url}`\n });\n }\n if (parsed.protocol === \"data:\") {\n return;\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new DownloadError({\n url,\n message: `URL scheme must be http, https, or data, got ${parsed.protocol}`\n });\n }\n const hostname = parsed.hostname;\n if (!hostname) {\n throw new DownloadError({\n url,\n message: `URL must have a hostname`\n });\n }\n if (hostname === \"localhost\" || hostname.endsWith(\".local\") || hostname.endsWith(\".localhost\")) {\n throw new DownloadError({\n url,\n message: `URL with hostname ${hostname} is not allowed`\n });\n }\n if (hostname.startsWith(\"[\") && hostname.endsWith(\"]\")) {\n const ipv6 = hostname.slice(1, -1);\n if (isPrivateIPv6(ipv6)) {\n throw new DownloadError({\n url,\n message: `URL with IPv6 address ${hostname} is not allowed`\n });\n }\n return;\n }\n if (isIPv4(hostname)) {\n if (isPrivateIPv4(hostname)) {\n throw new DownloadError({\n url,\n message: `URL with IP address ${hostname} is not allowed`\n });\n }\n return;\n }\n}\nfunction isIPv4(hostname) {\n const parts = hostname.split(\".\");\n if (parts.length !== 4) return false;\n return parts.every((part) => {\n const num = Number(part);\n return Number.isInteger(num) && num >= 0 && num <= 255 && String(num) === part;\n });\n}\nfunction isPrivateIPv4(ip) {\n const parts = ip.split(\".\").map(Number);\n const [a, b] = parts;\n if (a === 0) return true;\n if (a === 10) return true;\n if (a === 127) return true;\n if (a === 169 && b === 254) return true;\n if (a === 172 && b >= 16 && b <= 31) return true;\n if (a === 192 && b === 168) return true;\n return false;\n}\nfunction isPrivateIPv6(ip) {\n const normalized = ip.toLowerCase();\n if (normalized === \"::1\") return true;\n if (normalized === \"::\") return true;\n if (normalized.startsWith(\"::ffff:\")) {\n const mappedPart = normalized.slice(7);\n if (isIPv4(mappedPart)) {\n return isPrivateIPv4(mappedPart);\n }\n const hexParts = mappedPart.split(\":\");\n if (hexParts.length === 2) {\n const high = parseInt(hexParts[0], 16);\n const low = parseInt(hexParts[1], 16);\n if (!isNaN(high) && !isNaN(low)) {\n const a = high >> 8 & 255;\n const b = high & 255;\n const c = low >> 8 & 255;\n const d = low & 255;\n return isPrivateIPv4(`${a}.${b}.${c}.${d}`);\n }\n }\n }\n if (normalized.startsWith(\"fc\") || normalized.startsWith(\"fd\")) return true;\n if (normalized.startsWith(\"fe80\")) return true;\n return false;\n}\n\n// src/download-blob.ts\nasync function downloadBlob(url, options) {\n var _a2, _b2;\n validateDownloadUrl(url);\n try {\n const response = await fetch(url, {\n signal: options == null ? void 0 : options.abortSignal\n });\n if (response.redirected) {\n validateDownloadUrl(response.url);\n }\n if (!response.ok) {\n throw new DownloadError({\n url,\n statusCode: response.status,\n statusText: response.statusText\n });\n }\n const data = await readResponseWithSizeLimit({\n response,\n url,\n maxBytes: (_a2 = options == null ? void 0 : options.maxBytes) != null ? _a2 : DEFAULT_MAX_DOWNLOAD_SIZE\n });\n const contentType = (_b2 = response.headers.get(\"content-type\")) != null ? _b2 : void 0;\n return new Blob([data], contentType ? { type: contentType } : void 0);\n } catch (error) {\n if (DownloadError.isInstance(error)) {\n throw error;\n }\n throw new DownloadError({ url, cause: error });\n }\n}\n\n// src/generate-id.ts\nimport { InvalidArgumentError } from \"@ai-sdk/provider\";\nvar createIdGenerator = ({\n prefix,\n size = 16,\n alphabet = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\",\n separator = \"-\"\n} = {}) => {\n const generator = () => {\n const alphabetLength = alphabet.length;\n const chars = new Array(size);\n for (let i = 0; i < size; i++) {\n chars[i] = alphabet[Math.random() * alphabetLength | 0];\n }\n return chars.join(\"\");\n };\n if (prefix == null) {\n return generator;\n }\n if (alphabet.includes(separator)) {\n throw new InvalidArgumentError({\n argument: \"separator\",\n message: `The separator \"${separator}\" must not be part of the alphabet \"${alphabet}\".`\n });\n }\n return () => `${prefix}${separator}${generator()}`;\n};\nvar generateId = createIdGenerator();\n\n// src/get-error-message.ts\nfunction getErrorMessage(error) {\n if (error == null) {\n return \"unknown error\";\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return JSON.stringify(error);\n}\n\n// src/get-from-api.ts\nimport { APICallError as APICallError2 } from \"@ai-sdk/provider\";\n\n// src/handle-fetch-error.ts\nimport { APICallError } from \"@ai-sdk/provider\";\n\n// src/is-abort-error.ts\nfunction isAbortError(error) {\n return (error instanceof Error || error instanceof DOMException) && (error.name === \"AbortError\" || error.name === \"ResponseAborted\" || // Next.js\n error.name === \"TimeoutError\");\n}\n\n// src/handle-fetch-error.ts\nvar FETCH_FAILED_ERROR_MESSAGES = [\"fetch failed\", \"failed to fetch\"];\nvar BUN_ERROR_CODES = [\n \"ConnectionRefused\",\n \"ConnectionClosed\",\n \"FailedToOpenSocket\",\n \"ECONNRESET\",\n \"ECONNREFUSED\",\n \"ETIMEDOUT\",\n \"EPIPE\"\n];\nfunction isBunNetworkError(error) {\n if (!(error instanceof Error)) {\n return false;\n }\n const code = error.code;\n if (typeof code === \"string\" && BUN_ERROR_CODES.includes(code)) {\n return true;\n }\n return false;\n}\nfunction handleFetchError({\n error,\n url,\n requestBodyValues\n}) {\n if (isAbortError(error)) {\n return error;\n }\n if (error instanceof TypeError && FETCH_FAILED_ERROR_MESSAGES.includes(error.message.toLowerCase())) {\n const cause = error.cause;\n if (cause != null) {\n return new APICallError({\n message: `Cannot connect to API: ${cause.message}`,\n cause,\n url,\n requestBodyValues,\n isRetryable: true\n // retry when network error\n });\n }\n }\n if (isBunNetworkError(error)) {\n return new APICallError({\n message: `Cannot connect to API: ${error.message}`,\n cause: error,\n url,\n requestBodyValues,\n isRetryable: true\n });\n }\n return error;\n}\n\n// src/get-runtime-environment-user-agent.ts\nfunction getRuntimeEnvironmentUserAgent(globalThisAny = globalThis) {\n var _a2, _b2, _c;\n if (globalThisAny.window) {\n return `runtime/browser`;\n }\n if ((_a2 = globalThisAny.navigator) == null ? void 0 : _a2.userAgent) {\n return `runtime/${globalThisAny.navigator.userAgent.toLowerCase()}`;\n }\n if ((_c = (_b2 = globalThisAny.process) == null ? void 0 : _b2.versions) == null ? void 0 : _c.node) {\n return `runtime/node.js/${globalThisAny.process.version.substring(0)}`;\n }\n if (globalThisAny.EdgeRuntime) {\n return `runtime/vercel-edge`;\n }\n return \"runtime/unknown\";\n}\n\n// src/normalize-headers.ts\nfunction normalizeHeaders(headers) {\n if (headers == null) {\n return {};\n }\n const normalized = {};\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n normalized[key.toLowerCase()] = value;\n });\n } else {\n if (!Array.isArray(headers)) {\n headers = Object.entries(headers);\n }\n for (const [key, value] of headers) {\n if (value != null) {\n normalized[key.toLowerCase()] = value;\n }\n }\n }\n return normalized;\n}\n\n// src/with-user-agent-suffix.ts\nfunction withUserAgentSuffix(headers, ...userAgentSuffixParts) {\n const normalizedHeaders = new Headers(normalizeHeaders(headers));\n const currentUserAgentHeader = normalizedHeaders.get(\"user-agent\") || \"\";\n normalizedHeaders.set(\n \"user-agent\",\n [currentUserAgentHeader, ...userAgentSuffixParts].filter(Boolean).join(\" \")\n );\n return Object.fromEntries(normalizedHeaders.entries());\n}\n\n// src/version.ts\nvar VERSION = true ? \"4.0.27\" : \"0.0.0-test\";\n\n// src/get-from-api.ts\nvar getOriginalFetch = () => globalThis.fetch;\nvar getFromApi = async ({\n url,\n headers = {},\n successfulResponseHandler,\n failedResponseHandler,\n abortSignal,\n fetch: fetch2 = getOriginalFetch()\n}) => {\n try {\n const response = await fetch2(url, {\n method: \"GET\",\n headers: withUserAgentSuffix(\n headers,\n `ai-sdk/provider-utils/${VERSION}`,\n getRuntimeEnvironmentUserAgent()\n ),\n signal: abortSignal\n });\n const responseHeaders = extractResponseHeaders(response);\n if (!response.ok) {\n let errorInformation;\n try {\n errorInformation = await failedResponseHandler({\n response,\n url,\n requestBodyValues: {}\n });\n } catch (error) {\n if (isAbortError(error) || APICallError2.isInstance(error)) {\n throw error;\n }\n throw new APICallError2({\n message: \"Failed to process error response\",\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: {}\n });\n }\n throw errorInformation.value;\n }\n try {\n return await successfulResponseHandler({\n response,\n url,\n requestBodyValues: {}\n });\n } catch (error) {\n if (error instanceof Error) {\n if (isAbortError(error) || APICallError2.isInstance(error)) {\n throw error;\n }\n }\n throw new APICallError2({\n message: \"Failed to process successful response\",\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: {}\n });\n }\n } catch (error) {\n throw handleFetchError({ error, url, requestBodyValues: {} });\n }\n};\n\n// src/inject-json-instruction.ts\nvar DEFAULT_SCHEMA_PREFIX = \"JSON schema:\";\nvar DEFAULT_SCHEMA_SUFFIX = \"You MUST answer with a JSON object that matches the JSON schema above.\";\nvar DEFAULT_GENERIC_SUFFIX = \"You MUST answer with JSON.\";\nfunction injectJsonInstruction({\n prompt,\n schema,\n schemaPrefix = schema != null ? DEFAULT_SCHEMA_PREFIX : void 0,\n schemaSuffix = schema != null ? DEFAULT_SCHEMA_SUFFIX : DEFAULT_GENERIC_SUFFIX\n}) {\n return [\n prompt != null && prompt.length > 0 ? prompt : void 0,\n prompt != null && prompt.length > 0 ? \"\" : void 0,\n // add a newline if prompt is not null\n schemaPrefix,\n schema != null ? JSON.stringify(schema) : void 0,\n schemaSuffix\n ].filter((line) => line != null).join(\"\\n\");\n}\nfunction injectJsonInstructionIntoMessages({\n messages,\n schema,\n schemaPrefix,\n schemaSuffix\n}) {\n var _a2, _b2;\n const systemMessage = ((_a2 = messages[0]) == null ? void 0 : _a2.role) === \"system\" ? { ...messages[0] } : { role: \"system\", content: \"\" };\n systemMessage.content = injectJsonInstruction({\n prompt: systemMessage.content,\n schema,\n schemaPrefix,\n schemaSuffix\n });\n return [\n systemMessage,\n ...((_b2 = messages[0]) == null ? void 0 : _b2.role) === \"system\" ? messages.slice(1) : messages\n ];\n}\n\n// src/is-non-nullable.ts\nfunction isNonNullable(value) {\n return value != null;\n}\n\n// src/is-url-supported.ts\nfunction isUrlSupported({\n mediaType,\n url,\n supportedUrls\n}) {\n url = url.toLowerCase();\n mediaType = mediaType.toLowerCase();\n return Object.entries(supportedUrls).map(([key, value]) => {\n const mediaType2 = key.toLowerCase();\n return mediaType2 === \"*\" || mediaType2 === \"*/*\" ? { mediaTypePrefix: \"\", regexes: value } : { mediaTypePrefix: mediaType2.replace(/\\*/, \"\"), regexes: value };\n }).filter(({ mediaTypePrefix }) => mediaType.startsWith(mediaTypePrefix)).flatMap(({ regexes }) => regexes).some((pattern) => pattern.test(url));\n}\n\n// src/load-api-key.ts\nimport { LoadAPIKeyError } from \"@ai-sdk/provider\";\nfunction loadApiKey({\n apiKey,\n environmentVariableName,\n apiKeyParameterName = \"apiKey\",\n description\n}) {\n if (typeof apiKey === \"string\") {\n return apiKey;\n }\n if (apiKey != null) {\n throw new LoadAPIKeyError({\n message: `${description} API key must be a string.`\n });\n }\n if (typeof process === \"undefined\") {\n throw new LoadAPIKeyError({\n message: `${description} API key is missing. Pass it using the '${apiKeyParameterName}' parameter. Environment variables are not supported in this environment.`\n });\n }\n apiKey = process.env[environmentVariableName];\n if (apiKey == null) {\n throw new LoadAPIKeyError({\n message: `${description} API key is missing. Pass it using the '${apiKeyParameterName}' parameter or the ${environmentVariableName} environment variable.`\n });\n }\n if (typeof apiKey !== \"string\") {\n throw new LoadAPIKeyError({\n message: `${description} API key must be a string. The value of the ${environmentVariableName} environment variable is not a string.`\n });\n }\n return apiKey;\n}\n\n// src/load-optional-setting.ts\nfunction loadOptionalSetting({\n settingValue,\n environmentVariableName\n}) {\n if (typeof settingValue === \"string\") {\n return settingValue;\n }\n if (settingValue != null || typeof process === \"undefined\") {\n return void 0;\n }\n settingValue = process.env[environmentVariableName];\n if (settingValue == null || typeof settingValue !== \"string\") {\n return void 0;\n }\n return settingValue;\n}\n\n// src/load-setting.ts\nimport { LoadSettingError } from \"@ai-sdk/provider\";\nfunction loadSetting({\n settingValue,\n environmentVariableName,\n settingName,\n description\n}) {\n if (typeof settingValue === \"string\") {\n return settingValue;\n }\n if (settingValue != null) {\n throw new LoadSettingError({\n message: `${description} setting must be a string.`\n });\n }\n if (typeof process === \"undefined\") {\n throw new LoadSettingError({\n message: `${description} setting is missing. Pass it using the '${settingName}' parameter. Environment variables are not supported in this environment.`\n });\n }\n settingValue = process.env[environmentVariableName];\n if (settingValue == null) {\n throw new LoadSettingError({\n message: `${description} setting is missing. Pass it using the '${settingName}' parameter or the ${environmentVariableName} environment variable.`\n });\n }\n if (typeof settingValue !== \"string\") {\n throw new LoadSettingError({\n message: `${description} setting must be a string. The value of the ${environmentVariableName} environment variable is not a string.`\n });\n }\n return settingValue;\n}\n\n// src/media-type-to-extension.ts\nfunction mediaTypeToExtension(mediaType) {\n var _a2;\n const [_type, subtype = \"\"] = mediaType.toLowerCase().split(\"/\");\n return (_a2 = {\n mpeg: \"mp3\",\n \"x-wav\": \"wav\",\n opus: \"ogg\",\n mp4: \"m4a\",\n \"x-m4a\": \"m4a\"\n }[subtype]) != null ? _a2 : subtype;\n}\n\n// src/parse-json.ts\nimport {\n JSONParseError,\n TypeValidationError as TypeValidationError3\n} from \"@ai-sdk/provider\";\n\n// src/secure-json-parse.ts\nvar suspectProtoRx = /\"(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])(?:p|\\\\u0070)(?:r|\\\\u0072)(?:o|\\\\u006[Ff])(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])\"\\s*:/;\nvar suspectConstructorRx = /\"(?:c|\\\\u0063)(?:o|\\\\u006[Ff])(?:n|\\\\u006[Ee])(?:s|\\\\u0073)(?:t|\\\\u0074)(?:r|\\\\u0072)(?:u|\\\\u0075)(?:c|\\\\u0063)(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:r|\\\\u0072)\"\\s*:/;\nfunction _parse(text) {\n const obj = JSON.parse(text);\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n if (suspectProtoRx.test(text) === false && suspectConstructorRx.test(text) === false) {\n return obj;\n }\n return filter(obj);\n}\nfunction filter(obj) {\n let next = [obj];\n while (next.length) {\n const nodes = next;\n next = [];\n for (const node of nodes) {\n if (Object.prototype.hasOwnProperty.call(node, \"__proto__\")) {\n throw new SyntaxError(\"Object contains forbidden prototype property\");\n }\n if (Object.prototype.hasOwnProperty.call(node, \"constructor\") && node.constructor !== null && typeof node.constructor === \"object\" && Object.prototype.hasOwnProperty.call(node.constructor, \"prototype\")) {\n throw new SyntaxError(\"Object contains forbidden prototype property\");\n }\n for (const key in node) {\n const value = node[key];\n if (value && typeof value === \"object\") {\n next.push(value);\n }\n }\n }\n }\n return obj;\n}\nfunction secureJsonParse(text) {\n const { stackTraceLimit } = Error;\n try {\n Error.stackTraceLimit = 0;\n } catch (e) {\n return _parse(text);\n }\n try {\n return _parse(text);\n } finally {\n Error.stackTraceLimit = stackTraceLimit;\n }\n}\n\n// src/validate-types.ts\nimport {\n TypeValidationError as TypeValidationError2\n} from \"@ai-sdk/provider\";\n\n// src/schema.ts\nimport { TypeValidationError } from \"@ai-sdk/provider\";\nimport * as z4 from \"zod/v4\";\n\n// src/add-additional-properties-to-json-schema.ts\nfunction addAdditionalPropertiesToJsonSchema(jsonSchema2) {\n if (jsonSchema2.type === \"object\" || Array.isArray(jsonSchema2.type) && jsonSchema2.type.includes(\"object\")) {\n jsonSchema2.additionalProperties = false;\n const { properties } = jsonSchema2;\n if (properties != null) {\n for (const key of Object.keys(properties)) {\n properties[key] = visit(properties[key]);\n }\n }\n }\n if (jsonSchema2.items != null) {\n jsonSchema2.items = Array.isArray(jsonSchema2.items) ? jsonSchema2.items.map(visit) : visit(jsonSchema2.items);\n }\n if (jsonSchema2.anyOf != null) {\n jsonSchema2.anyOf = jsonSchema2.anyOf.map(visit);\n }\n if (jsonSchema2.allOf != null) {\n jsonSchema2.allOf = jsonSchema2.allOf.map(visit);\n }\n if (jsonSchema2.oneOf != null) {\n jsonSchema2.oneOf = jsonSchema2.oneOf.map(visit);\n }\n const { definitions } = jsonSchema2;\n if (definitions != null) {\n for (const key of Object.keys(definitions)) {\n definitions[key] = visit(definitions[key]);\n }\n }\n return jsonSchema2;\n}\nfunction visit(def) {\n if (typeof def === \"boolean\") return def;\n return addAdditionalPropertiesToJsonSchema(def);\n}\n\n// src/to-json-schema/zod3-to-json-schema/options.ts\nvar ignoreOverride = /* @__PURE__ */ Symbol(\n \"Let zodToJsonSchema decide on which parser to use\"\n);\nvar defaultOptions = {\n name: void 0,\n $refStrategy: \"root\",\n basePath: [\"#\"],\n effectStrategy: \"input\",\n pipeStrategy: \"all\",\n dateStrategy: \"format:date-time\",\n mapStrategy: \"entries\",\n removeAdditionalStrategy: \"passthrough\",\n allowedAdditionalProperties: true,\n rejectedAdditionalProperties: false,\n definitionPath: \"definitions\",\n strictUnions: false,\n definitions: {},\n errorMessages: false,\n patternStrategy: \"escape\",\n applyRegexFlags: false,\n emailStrategy: \"format:email\",\n base64Strategy: \"contentEncoding:base64\",\n nameStrategy: \"ref\"\n};\nvar getDefaultOptions = (options) => typeof options === \"string\" ? {\n ...defaultOptions,\n name: options\n} : {\n ...defaultOptions,\n ...options\n};\n\n// src/to-json-schema/zod3-to-json-schema/select-parser.ts\nimport { ZodFirstPartyTypeKind as ZodFirstPartyTypeKind3 } from \"zod/v3\";\n\n// src/to-json-schema/zod3-to-json-schema/parsers/any.ts\nfunction parseAnyDef() {\n return {};\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/array.ts\nimport { ZodFirstPartyTypeKind } from \"zod/v3\";\nfunction parseArrayDef(def, refs) {\n var _a2, _b2, _c;\n const res = {\n type: \"array\"\n };\n if (((_a2 = def.type) == null ? void 0 : _a2._def) && ((_c = (_b2 = def.type) == null ? void 0 : _b2._def) == null ? void 0 : _c.typeName) !== ZodFirstPartyTypeKind.ZodAny) {\n res.items = parseDef(def.type._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\"]\n });\n }\n if (def.minLength) {\n res.minItems = def.minLength.value;\n }\n if (def.maxLength) {\n res.maxItems = def.maxLength.value;\n }\n if (def.exactLength) {\n res.minItems = def.exactLength.value;\n res.maxItems = def.exactLength.value;\n }\n return res;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/bigint.ts\nfunction parseBigintDef(def) {\n const res = {\n type: \"integer\",\n format: \"int64\"\n };\n if (!def.checks) return res;\n for (const check of def.checks) {\n switch (check.kind) {\n case \"min\":\n if (check.inclusive) {\n res.minimum = check.value;\n } else {\n res.exclusiveMinimum = check.value;\n }\n break;\n case \"max\":\n if (check.inclusive) {\n res.maximum = check.value;\n } else {\n res.exclusiveMaximum = check.value;\n }\n break;\n case \"multipleOf\":\n res.multipleOf = check.value;\n break;\n }\n }\n return res;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/boolean.ts\nfunction parseBooleanDef() {\n return { type: \"boolean\" };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/branded.ts\nfunction parseBrandedDef(_def, refs) {\n return parseDef(_def.type._def, refs);\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/catch.ts\nvar parseCatchDef = (def, refs) => {\n return parseDef(def.innerType._def, refs);\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/date.ts\nfunction parseDateDef(def, refs, overrideDateStrategy) {\n const strategy = overrideDateStrategy != null ? overrideDateStrategy : refs.dateStrategy;\n if (Array.isArray(strategy)) {\n return {\n anyOf: strategy.map((item, i) => parseDateDef(def, refs, item))\n };\n }\n switch (strategy) {\n case \"string\":\n case \"format:date-time\":\n return {\n type: \"string\",\n format: \"date-time\"\n };\n case \"format:date\":\n return {\n type: \"string\",\n format: \"date\"\n };\n case \"integer\":\n return integerDateParser(def);\n }\n}\nvar integerDateParser = (def) => {\n const res = {\n type: \"integer\",\n format: \"unix-time\"\n };\n for (const check of def.checks) {\n switch (check.kind) {\n case \"min\":\n res.minimum = check.value;\n break;\n case \"max\":\n res.maximum = check.value;\n break;\n }\n }\n return res;\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/default.ts\nfunction parseDefaultDef(_def, refs) {\n return {\n ...parseDef(_def.innerType._def, refs),\n default: _def.defaultValue()\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/effects.ts\nfunction parseEffectsDef(_def, refs) {\n return refs.effectStrategy === \"input\" ? parseDef(_def.schema._def, refs) : parseAnyDef();\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/enum.ts\nfunction parseEnumDef(def) {\n return {\n type: \"string\",\n enum: Array.from(def.values)\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/intersection.ts\nvar isJsonSchema7AllOfType = (type) => {\n if (\"type\" in type && type.type === \"string\") return false;\n return \"allOf\" in type;\n};\nfunction parseIntersectionDef(def, refs) {\n const allOf = [\n parseDef(def.left._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", \"0\"]\n }),\n parseDef(def.right._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", \"1\"]\n })\n ].filter((x) => !!x);\n const mergedAllOf = [];\n allOf.forEach((schema) => {\n if (isJsonSchema7AllOfType(schema)) {\n mergedAllOf.push(...schema.allOf);\n } else {\n let nestedSchema = schema;\n if (\"additionalProperties\" in schema && schema.additionalProperties === false) {\n const { additionalProperties, ...rest } = schema;\n nestedSchema = rest;\n }\n mergedAllOf.push(nestedSchema);\n }\n });\n return mergedAllOf.length ? { allOf: mergedAllOf } : void 0;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/literal.ts\nfunction parseLiteralDef(def) {\n const parsedType = typeof def.value;\n if (parsedType !== \"bigint\" && parsedType !== \"number\" && parsedType !== \"boolean\" && parsedType !== \"string\") {\n return {\n type: Array.isArray(def.value) ? \"array\" : \"object\"\n };\n }\n return {\n type: parsedType === \"bigint\" ? \"integer\" : parsedType,\n const: def.value\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/record.ts\nimport {\n ZodFirstPartyTypeKind as ZodFirstPartyTypeKind2\n} from \"zod/v3\";\n\n// src/to-json-schema/zod3-to-json-schema/parsers/string.ts\nvar emojiRegex = void 0;\nvar zodPatterns = {\n /**\n * `c` was changed to `[cC]` to replicate /i flag\n */\n cuid: /^[cC][^\\s-]{8,}$/,\n cuid2: /^[0-9a-z]+$/,\n ulid: /^[0-9A-HJKMNP-TV-Z]{26}$/,\n /**\n * `a-z` was added to replicate /i flag\n */\n email: /^(?!\\.)(?!.*\\.\\.)([a-zA-Z0-9_'+\\-\\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\\-]*\\.)+[a-zA-Z]{2,}$/,\n /**\n * Constructed a valid Unicode RegExp\n *\n * Lazily instantiate since this type of regex isn't supported\n * in all envs (e.g. React Native).\n *\n * See:\n * https://github.com/colinhacks/zod/issues/2433\n * Fix in Zod:\n * https://github.com/colinhacks/zod/commit/9340fd51e48576a75adc919bff65dbc4a5d4c99b\n */\n emoji: () => {\n if (emojiRegex === void 0) {\n emojiRegex = RegExp(\n \"^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$\",\n \"u\"\n );\n }\n return emojiRegex;\n },\n /**\n * Unused\n */\n uuid: /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/,\n /**\n * Unused\n */\n ipv4: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,\n ipv4Cidr: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/,\n /**\n * Unused\n */\n ipv6: /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,\n ipv6Cidr: /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,\n base64: /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,\n base64url: /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,\n nanoid: /^[a-zA-Z0-9_-]{21}$/,\n jwt: /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/\n};\nfunction parseStringDef(def, refs) {\n const res = {\n type: \"string\"\n };\n if (def.checks) {\n for (const check of def.checks) {\n switch (check.kind) {\n case \"min\":\n res.minLength = typeof res.minLength === \"number\" ? Math.max(res.minLength, check.value) : check.value;\n break;\n case \"max\":\n res.maxLength = typeof res.maxLength === \"number\" ? Math.min(res.maxLength, check.value) : check.value;\n break;\n case \"email\":\n switch (refs.emailStrategy) {\n case \"format:email\":\n addFormat(res, \"email\", check.message, refs);\n break;\n case \"format:idn-email\":\n addFormat(res, \"idn-email\", check.message, refs);\n break;\n case \"pattern:zod\":\n addPattern(res, zodPatterns.email, check.message, refs);\n break;\n }\n break;\n case \"url\":\n addFormat(res, \"uri\", check.message, refs);\n break;\n case \"uuid\":\n addFormat(res, \"uuid\", check.message, refs);\n break;\n case \"regex\":\n addPattern(res, check.regex, check.message, refs);\n break;\n case \"cuid\":\n addPattern(res, zodPatterns.cuid, check.message, refs);\n break;\n case \"cuid2\":\n addPattern(res, zodPatterns.cuid2, check.message, refs);\n break;\n case \"startsWith\":\n addPattern(\n res,\n RegExp(`^${escapeLiteralCheckValue(check.value, refs)}`),\n check.message,\n refs\n );\n break;\n case \"endsWith\":\n addPattern(\n res,\n RegExp(`${escapeLiteralCheckValue(check.value, refs)}$`),\n check.message,\n refs\n );\n break;\n case \"datetime\":\n addFormat(res, \"date-time\", check.message, refs);\n break;\n case \"date\":\n addFormat(res, \"date\", check.message, refs);\n break;\n case \"time\":\n addFormat(res, \"time\", check.message, refs);\n break;\n case \"duration\":\n addFormat(res, \"duration\", check.message, refs);\n break;\n case \"length\":\n res.minLength = typeof res.minLength === \"number\" ? Math.max(res.minLength, check.value) : check.value;\n res.maxLength = typeof res.maxLength === \"number\" ? Math.min(res.maxLength, check.value) : check.value;\n break;\n case \"includes\": {\n addPattern(\n res,\n RegExp(escapeLiteralCheckValue(check.value, refs)),\n check.message,\n refs\n );\n break;\n }\n case \"ip\": {\n if (check.version !== \"v6\") {\n addFormat(res, \"ipv4\", check.message, refs);\n }\n if (check.version !== \"v4\") {\n addFormat(res, \"ipv6\", check.message, refs);\n }\n break;\n }\n case \"base64url\":\n addPattern(res, zodPatterns.base64url, check.message, refs);\n break;\n case \"jwt\":\n addPattern(res, zodPatterns.jwt, check.message, refs);\n break;\n case \"cidr\": {\n if (check.version !== \"v6\") {\n addPattern(res, zodPatterns.ipv4Cidr, check.message, refs);\n }\n if (check.version !== \"v4\") {\n addPattern(res, zodPatterns.ipv6Cidr, check.message, refs);\n }\n break;\n }\n case \"emoji\":\n addPattern(res, zodPatterns.emoji(), check.message, refs);\n break;\n case \"ulid\": {\n addPattern(res, zodPatterns.ulid, check.message, refs);\n break;\n }\n case \"base64\": {\n switch (refs.base64Strategy) {\n case \"format:binary\": {\n addFormat(res, \"binary\", check.message, refs);\n break;\n }\n case \"contentEncoding:base64\": {\n res.contentEncoding = \"base64\";\n break;\n }\n case \"pattern:zod\": {\n addPattern(res, zodPatterns.base64, check.message, refs);\n break;\n }\n }\n break;\n }\n case \"nanoid\": {\n addPattern(res, zodPatterns.nanoid, check.message, refs);\n }\n case \"toLowerCase\":\n case \"toUpperCase\":\n case \"trim\":\n break;\n default:\n /* @__PURE__ */ ((_) => {\n })(check);\n }\n }\n }\n return res;\n}\nfunction escapeLiteralCheckValue(literal, refs) {\n return refs.patternStrategy === \"escape\" ? escapeNonAlphaNumeric(literal) : literal;\n}\nvar ALPHA_NUMERIC = new Set(\n \"ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789\"\n);\nfunction escapeNonAlphaNumeric(source) {\n let result = \"\";\n for (let i = 0; i < source.length; i++) {\n if (!ALPHA_NUMERIC.has(source[i])) {\n result += \"\\\\\";\n }\n result += source[i];\n }\n return result;\n}\nfunction addFormat(schema, value, message, refs) {\n var _a2;\n if (schema.format || ((_a2 = schema.anyOf) == null ? void 0 : _a2.some((x) => x.format))) {\n if (!schema.anyOf) {\n schema.anyOf = [];\n }\n if (schema.format) {\n schema.anyOf.push({\n format: schema.format\n });\n delete schema.format;\n }\n schema.anyOf.push({\n format: value,\n ...message && refs.errorMessages && { errorMessage: { format: message } }\n });\n } else {\n schema.format = value;\n }\n}\nfunction addPattern(schema, regex, message, refs) {\n var _a2;\n if (schema.pattern || ((_a2 = schema.allOf) == null ? void 0 : _a2.some((x) => x.pattern))) {\n if (!schema.allOf) {\n schema.allOf = [];\n }\n if (schema.pattern) {\n schema.allOf.push({\n pattern: schema.pattern\n });\n delete schema.pattern;\n }\n schema.allOf.push({\n pattern: stringifyRegExpWithFlags(regex, refs),\n ...message && refs.errorMessages && { errorMessage: { pattern: message } }\n });\n } else {\n schema.pattern = stringifyRegExpWithFlags(regex, refs);\n }\n}\nfunction stringifyRegExpWithFlags(regex, refs) {\n var _a2;\n if (!refs.applyRegexFlags || !regex.flags) {\n return regex.source;\n }\n const flags = {\n i: regex.flags.includes(\"i\"),\n // Case-insensitive\n m: regex.flags.includes(\"m\"),\n // `^` and `$` matches adjacent to newline characters\n s: regex.flags.includes(\"s\")\n // `.` matches newlines\n };\n const source = flags.i ? regex.source.toLowerCase() : regex.source;\n let pattern = \"\";\n let isEscaped = false;\n let inCharGroup = false;\n let inCharRange = false;\n for (let i = 0; i < source.length; i++) {\n if (isEscaped) {\n pattern += source[i];\n isEscaped = false;\n continue;\n }\n if (flags.i) {\n if (inCharGroup) {\n if (source[i].match(/[a-z]/)) {\n if (inCharRange) {\n pattern += source[i];\n pattern += `${source[i - 2]}-${source[i]}`.toUpperCase();\n inCharRange = false;\n } else if (source[i + 1] === \"-\" && ((_a2 = source[i + 2]) == null ? void 0 : _a2.match(/[a-z]/))) {\n pattern += source[i];\n inCharRange = true;\n } else {\n pattern += `${source[i]}${source[i].toUpperCase()}`;\n }\n continue;\n }\n } else if (source[i].match(/[a-z]/)) {\n pattern += `[${source[i]}${source[i].toUpperCase()}]`;\n continue;\n }\n }\n if (flags.m) {\n if (source[i] === \"^\") {\n pattern += `(^|(?<=[\\r\n]))`;\n continue;\n } else if (source[i] === \"$\") {\n pattern += `($|(?=[\\r\n]))`;\n continue;\n }\n }\n if (flags.s && source[i] === \".\") {\n pattern += inCharGroup ? `${source[i]}\\r\n` : `[${source[i]}\\r\n]`;\n continue;\n }\n pattern += source[i];\n if (source[i] === \"\\\\\") {\n isEscaped = true;\n } else if (inCharGroup && source[i] === \"]\") {\n inCharGroup = false;\n } else if (!inCharGroup && source[i] === \"[\") {\n inCharGroup = true;\n }\n }\n try {\n new RegExp(pattern);\n } catch (e) {\n console.warn(\n `Could not convert regex pattern at ${refs.currentPath.join(\n \"/\"\n )} to a flag-independent form! Falling back to the flag-ignorant source`\n );\n return regex.source;\n }\n return pattern;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/record.ts\nfunction parseRecordDef(def, refs) {\n var _a2, _b2, _c, _d, _e, _f;\n const schema = {\n type: \"object\",\n additionalProperties: (_a2 = parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"additionalProperties\"]\n })) != null ? _a2 : refs.allowedAdditionalProperties\n };\n if (((_b2 = def.keyType) == null ? void 0 : _b2._def.typeName) === ZodFirstPartyTypeKind2.ZodString && ((_c = def.keyType._def.checks) == null ? void 0 : _c.length)) {\n const { type, ...keyType } = parseStringDef(def.keyType._def, refs);\n return {\n ...schema,\n propertyNames: keyType\n };\n } else if (((_d = def.keyType) == null ? void 0 : _d._def.typeName) === ZodFirstPartyTypeKind2.ZodEnum) {\n return {\n ...schema,\n propertyNames: {\n enum: def.keyType._def.values\n }\n };\n } else if (((_e = def.keyType) == null ? void 0 : _e._def.typeName) === ZodFirstPartyTypeKind2.ZodBranded && def.keyType._def.type._def.typeName === ZodFirstPartyTypeKind2.ZodString && ((_f = def.keyType._def.type._def.checks) == null ? void 0 : _f.length)) {\n const { type, ...keyType } = parseBrandedDef(\n def.keyType._def,\n refs\n );\n return {\n ...schema,\n propertyNames: keyType\n };\n }\n return schema;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/map.ts\nfunction parseMapDef(def, refs) {\n if (refs.mapStrategy === \"record\") {\n return parseRecordDef(def, refs);\n }\n const keys = parseDef(def.keyType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", \"items\", \"0\"]\n }) || parseAnyDef();\n const values = parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", \"items\", \"1\"]\n }) || parseAnyDef();\n return {\n type: \"array\",\n maxItems: 125,\n items: {\n type: \"array\",\n items: [keys, values],\n minItems: 2,\n maxItems: 2\n }\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/native-enum.ts\nfunction parseNativeEnumDef(def) {\n const object = def.values;\n const actualKeys = Object.keys(def.values).filter((key) => {\n return typeof object[object[key]] !== \"number\";\n });\n const actualValues = actualKeys.map((key) => object[key]);\n const parsedTypes = Array.from(\n new Set(actualValues.map((values) => typeof values))\n );\n return {\n type: parsedTypes.length === 1 ? parsedTypes[0] === \"string\" ? \"string\" : \"number\" : [\"string\", \"number\"],\n enum: actualValues\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/never.ts\nfunction parseNeverDef() {\n return { not: parseAnyDef() };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/null.ts\nfunction parseNullDef() {\n return {\n type: \"null\"\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/union.ts\nvar primitiveMappings = {\n ZodString: \"string\",\n ZodNumber: \"number\",\n ZodBigInt: \"integer\",\n ZodBoolean: \"boolean\",\n ZodNull: \"null\"\n};\nfunction parseUnionDef(def, refs) {\n const options = def.options instanceof Map ? Array.from(def.options.values()) : def.options;\n if (options.every(\n (x) => x._def.typeName in primitiveMappings && (!x._def.checks || !x._def.checks.length)\n )) {\n const types = options.reduce((types2, x) => {\n const type = primitiveMappings[x._def.typeName];\n return type && !types2.includes(type) ? [...types2, type] : types2;\n }, []);\n return {\n type: types.length > 1 ? types : types[0]\n };\n } else if (options.every((x) => x._def.typeName === \"ZodLiteral\" && !x.description)) {\n const types = options.reduce(\n (acc, x) => {\n const type = typeof x._def.value;\n switch (type) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n return [...acc, type];\n case \"bigint\":\n return [...acc, \"integer\"];\n case \"object\":\n if (x._def.value === null) return [...acc, \"null\"];\n case \"symbol\":\n case \"undefined\":\n case \"function\":\n default:\n return acc;\n }\n },\n []\n );\n if (types.length === options.length) {\n const uniqueTypes = types.filter((x, i, a) => a.indexOf(x) === i);\n return {\n type: uniqueTypes.length > 1 ? uniqueTypes : uniqueTypes[0],\n enum: options.reduce(\n (acc, x) => {\n return acc.includes(x._def.value) ? acc : [...acc, x._def.value];\n },\n []\n )\n };\n }\n } else if (options.every((x) => x._def.typeName === \"ZodEnum\")) {\n return {\n type: \"string\",\n enum: options.reduce(\n (acc, x) => [\n ...acc,\n ...x._def.values.filter((x2) => !acc.includes(x2))\n ],\n []\n )\n };\n }\n return asAnyOf(def, refs);\n}\nvar asAnyOf = (def, refs) => {\n const anyOf = (def.options instanceof Map ? Array.from(def.options.values()) : def.options).map(\n (x, i) => parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"anyOf\", `${i}`]\n })\n ).filter(\n (x) => !!x && (!refs.strictUnions || typeof x === \"object\" && Object.keys(x).length > 0)\n );\n return anyOf.length ? { anyOf } : void 0;\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/nullable.ts\nfunction parseNullableDef(def, refs) {\n if ([\"ZodString\", \"ZodNumber\", \"ZodBigInt\", \"ZodBoolean\", \"ZodNull\"].includes(\n def.innerType._def.typeName\n ) && (!def.innerType._def.checks || !def.innerType._def.checks.length)) {\n return {\n type: [\n primitiveMappings[def.innerType._def.typeName],\n \"null\"\n ]\n };\n }\n const base = parseDef(def.innerType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"anyOf\", \"0\"]\n });\n return base && { anyOf: [base, { type: \"null\" }] };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/number.ts\nfunction parseNumberDef(def) {\n const res = {\n type: \"number\"\n };\n if (!def.checks) return res;\n for (const check of def.checks) {\n switch (check.kind) {\n case \"int\":\n res.type = \"integer\";\n break;\n case \"min\":\n if (check.inclusive) {\n res.minimum = check.value;\n } else {\n res.exclusiveMinimum = check.value;\n }\n break;\n case \"max\":\n if (check.inclusive) {\n res.maximum = check.value;\n } else {\n res.exclusiveMaximum = check.value;\n }\n break;\n case \"multipleOf\":\n res.multipleOf = check.value;\n break;\n }\n }\n return res;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/object.ts\nfunction parseObjectDef(def, refs) {\n const result = {\n type: \"object\",\n properties: {}\n };\n const required = [];\n const shape = def.shape();\n for (const propName in shape) {\n let propDef = shape[propName];\n if (propDef === void 0 || propDef._def === void 0) {\n continue;\n }\n const propOptional = safeIsOptional(propDef);\n const parsedDef = parseDef(propDef._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"properties\", propName],\n propertyPath: [...refs.currentPath, \"properties\", propName]\n });\n if (parsedDef === void 0) {\n continue;\n }\n result.properties[propName] = parsedDef;\n if (!propOptional) {\n required.push(propName);\n }\n }\n if (required.length) {\n result.required = required;\n }\n const additionalProperties = decideAdditionalProperties(def, refs);\n if (additionalProperties !== void 0) {\n result.additionalProperties = additionalProperties;\n }\n return result;\n}\nfunction decideAdditionalProperties(def, refs) {\n if (def.catchall._def.typeName !== \"ZodNever\") {\n return parseDef(def.catchall._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"additionalProperties\"]\n });\n }\n switch (def.unknownKeys) {\n case \"passthrough\":\n return refs.allowedAdditionalProperties;\n case \"strict\":\n return refs.rejectedAdditionalProperties;\n case \"strip\":\n return refs.removeAdditionalStrategy === \"strict\" ? refs.allowedAdditionalProperties : refs.rejectedAdditionalProperties;\n }\n}\nfunction safeIsOptional(schema) {\n try {\n return schema.isOptional();\n } catch (e) {\n return true;\n }\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/optional.ts\nvar parseOptionalDef = (def, refs) => {\n var _a2;\n if (refs.currentPath.toString() === ((_a2 = refs.propertyPath) == null ? void 0 : _a2.toString())) {\n return parseDef(def.innerType._def, refs);\n }\n const innerSchema = parseDef(def.innerType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"anyOf\", \"1\"]\n });\n return innerSchema ? { anyOf: [{ not: parseAnyDef() }, innerSchema] } : parseAnyDef();\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/pipeline.ts\nvar parsePipelineDef = (def, refs) => {\n if (refs.pipeStrategy === \"input\") {\n return parseDef(def.in._def, refs);\n } else if (refs.pipeStrategy === \"output\") {\n return parseDef(def.out._def, refs);\n }\n const a = parseDef(def.in._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", \"0\"]\n });\n const b = parseDef(def.out._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", a ? \"1\" : \"0\"]\n });\n return {\n allOf: [a, b].filter((x) => x !== void 0)\n };\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/promise.ts\nfunction parsePromiseDef(def, refs) {\n return parseDef(def.type._def, refs);\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/set.ts\nfunction parseSetDef(def, refs) {\n const items = parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\"]\n });\n const schema = {\n type: \"array\",\n uniqueItems: true,\n items\n };\n if (def.minSize) {\n schema.minItems = def.minSize.value;\n }\n if (def.maxSize) {\n schema.maxItems = def.maxSize.value;\n }\n return schema;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/tuple.ts\nfunction parseTupleDef(def, refs) {\n if (def.rest) {\n return {\n type: \"array\",\n minItems: def.items.length,\n items: def.items.map(\n (x, i) => parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", `${i}`]\n })\n ).reduce(\n (acc, x) => x === void 0 ? acc : [...acc, x],\n []\n ),\n additionalItems: parseDef(def.rest._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"additionalItems\"]\n })\n };\n } else {\n return {\n type: \"array\",\n minItems: def.items.length,\n maxItems: def.items.length,\n items: def.items.map(\n (x, i) => parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", `${i}`]\n })\n ).reduce(\n (acc, x) => x === void 0 ? acc : [...acc, x],\n []\n )\n };\n }\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/undefined.ts\nfunction parseUndefinedDef() {\n return {\n not: parseAnyDef()\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/unknown.ts\nfunction parseUnknownDef() {\n return parseAnyDef();\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/readonly.ts\nvar parseReadonlyDef = (def, refs) => {\n return parseDef(def.innerType._def, refs);\n};\n\n// src/to-json-schema/zod3-to-json-schema/select-parser.ts\nvar selectParser = (def, typeName, refs) => {\n switch (typeName) {\n case ZodFirstPartyTypeKind3.ZodString:\n return parseStringDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodNumber:\n return parseNumberDef(def);\n case ZodFirstPartyTypeKind3.ZodObject:\n return parseObjectDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodBigInt:\n return parseBigintDef(def);\n case ZodFirstPartyTypeKind3.ZodBoolean:\n return parseBooleanDef();\n case ZodFirstPartyTypeKind3.ZodDate:\n return parseDateDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodUndefined:\n return parseUndefinedDef();\n case ZodFirstPartyTypeKind3.ZodNull:\n return parseNullDef();\n case ZodFirstPartyTypeKind3.ZodArray:\n return parseArrayDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodUnion:\n case ZodFirstPartyTypeKind3.ZodDiscriminatedUnion:\n return parseUnionDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodIntersection:\n return parseIntersectionDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodTuple:\n return parseTupleDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodRecord:\n return parseRecordDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodLiteral:\n return parseLiteralDef(def);\n case ZodFirstPartyTypeKind3.ZodEnum:\n return parseEnumDef(def);\n case ZodFirstPartyTypeKind3.ZodNativeEnum:\n return parseNativeEnumDef(def);\n case ZodFirstPartyTypeKind3.ZodNullable:\n return parseNullableDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodOptional:\n return parseOptionalDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodMap:\n return parseMapDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodSet:\n return parseSetDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodLazy:\n return () => def.getter()._def;\n case ZodFirstPartyTypeKind3.ZodPromise:\n return parsePromiseDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodNaN:\n case ZodFirstPartyTypeKind3.ZodNever:\n return parseNeverDef();\n case ZodFirstPartyTypeKind3.ZodEffects:\n return parseEffectsDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodAny:\n return parseAnyDef();\n case ZodFirstPartyTypeKind3.ZodUnknown:\n return parseUnknownDef();\n case ZodFirstPartyTypeKind3.ZodDefault:\n return parseDefaultDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodBranded:\n return parseBrandedDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodReadonly:\n return parseReadonlyDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodCatch:\n return parseCatchDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodPipeline:\n return parsePipelineDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodFunction:\n case ZodFirstPartyTypeKind3.ZodVoid:\n case ZodFirstPartyTypeKind3.ZodSymbol:\n return void 0;\n default:\n return /* @__PURE__ */ ((_) => void 0)(typeName);\n }\n};\n\n// src/to-json-schema/zod3-to-json-schema/get-relative-path.ts\nvar getRelativePath = (pathA, pathB) => {\n let i = 0;\n for (; i < pathA.length && i < pathB.length; i++) {\n if (pathA[i] !== pathB[i]) break;\n }\n return [(pathA.length - i).toString(), ...pathB.slice(i)].join(\"/\");\n};\n\n// src/to-json-schema/zod3-to-json-schema/parse-def.ts\nfunction parseDef(def, refs, forceResolution = false) {\n var _a2;\n const seenItem = refs.seen.get(def);\n if (refs.override) {\n const overrideResult = (_a2 = refs.override) == null ? void 0 : _a2.call(\n refs,\n def,\n refs,\n seenItem,\n forceResolution\n );\n if (overrideResult !== ignoreOverride) {\n return overrideResult;\n }\n }\n if (seenItem && !forceResolution) {\n const seenSchema = get$ref(seenItem, refs);\n if (seenSchema !== void 0) {\n return seenSchema;\n }\n }\n const newItem = { def, path: refs.currentPath, jsonSchema: void 0 };\n refs.seen.set(def, newItem);\n const jsonSchemaOrGetter = selectParser(def, def.typeName, refs);\n const jsonSchema2 = typeof jsonSchemaOrGetter === \"function\" ? parseDef(jsonSchemaOrGetter(), refs) : jsonSchemaOrGetter;\n if (jsonSchema2) {\n addMeta(def, refs, jsonSchema2);\n }\n if (refs.postProcess) {\n const postProcessResult = refs.postProcess(jsonSchema2, def, refs);\n newItem.jsonSchema = jsonSchema2;\n return postProcessResult;\n }\n newItem.jsonSchema = jsonSchema2;\n return jsonSchema2;\n}\nvar get$ref = (item, refs) => {\n switch (refs.$refStrategy) {\n case \"root\":\n return { $ref: item.path.join(\"/\") };\n case \"relative\":\n return { $ref: getRelativePath(refs.currentPath, item.path) };\n case \"none\":\n case \"seen\": {\n if (item.path.length < refs.currentPath.length && item.path.every((value, index) => refs.currentPath[index] === value)) {\n console.warn(\n `Recursive reference detected at ${refs.currentPath.join(\n \"/\"\n )}! Defaulting to any`\n );\n return parseAnyDef();\n }\n return refs.$refStrategy === \"seen\" ? parseAnyDef() : void 0;\n }\n }\n};\nvar addMeta = (def, refs, jsonSchema2) => {\n if (def.description) {\n jsonSchema2.description = def.description;\n }\n return jsonSchema2;\n};\n\n// src/to-json-schema/zod3-to-json-schema/refs.ts\nvar getRefs = (options) => {\n const _options = getDefaultOptions(options);\n const currentPath = _options.name !== void 0 ? [..._options.basePath, _options.definitionPath, _options.name] : _options.basePath;\n return {\n ..._options,\n currentPath,\n propertyPath: void 0,\n seen: new Map(\n Object.entries(_options.definitions).map(([name2, def]) => [\n def._def,\n {\n def: def._def,\n path: [..._options.basePath, _options.definitionPath, name2],\n // Resolution of references will be forced even though seen, so it's ok that the schema is undefined here for now.\n jsonSchema: void 0\n }\n ])\n )\n };\n};\n\n// src/to-json-schema/zod3-to-json-schema/zod3-to-json-schema.ts\nvar zod3ToJsonSchema = (schema, options) => {\n var _a2;\n const refs = getRefs(options);\n let definitions = typeof options === \"object\" && options.definitions ? Object.entries(options.definitions).reduce(\n (acc, [name3, schema2]) => {\n var _a3;\n return {\n ...acc,\n [name3]: (_a3 = parseDef(\n schema2._def,\n {\n ...refs,\n currentPath: [...refs.basePath, refs.definitionPath, name3]\n },\n true\n )) != null ? _a3 : parseAnyDef()\n };\n },\n {}\n ) : void 0;\n const name2 = typeof options === \"string\" ? options : (options == null ? void 0 : options.nameStrategy) === \"title\" ? void 0 : options == null ? void 0 : options.name;\n const main = (_a2 = parseDef(\n schema._def,\n name2 === void 0 ? refs : {\n ...refs,\n currentPath: [...refs.basePath, refs.definitionPath, name2]\n },\n false\n )) != null ? _a2 : parseAnyDef();\n const title = typeof options === \"object\" && options.name !== void 0 && options.nameStrategy === \"title\" ? options.name : void 0;\n if (title !== void 0) {\n main.title = title;\n }\n const combined = name2 === void 0 ? definitions ? {\n ...main,\n [refs.definitionPath]: definitions\n } : main : {\n $ref: [\n ...refs.$refStrategy === \"relative\" ? [] : refs.basePath,\n refs.definitionPath,\n name2\n ].join(\"/\"),\n [refs.definitionPath]: {\n ...definitions,\n [name2]: main\n }\n };\n combined.$schema = \"http://json-schema.org/draft-07/schema#\";\n return combined;\n};\n\n// src/schema.ts\nvar schemaSymbol = /* @__PURE__ */ Symbol.for(\"vercel.ai.schema\");\nfunction lazySchema(createSchema) {\n let schema;\n return () => {\n if (schema == null) {\n schema = createSchema();\n }\n return schema;\n };\n}\nfunction jsonSchema(jsonSchema2, {\n validate\n} = {}) {\n return {\n [schemaSymbol]: true,\n _type: void 0,\n // should never be used directly\n get jsonSchema() {\n if (typeof jsonSchema2 === \"function\") {\n jsonSchema2 = jsonSchema2();\n }\n return jsonSchema2;\n },\n validate\n };\n}\nfunction isSchema(value) {\n return typeof value === \"object\" && value !== null && schemaSymbol in value && value[schemaSymbol] === true && \"jsonSchema\" in value && \"validate\" in value;\n}\nfunction asSchema(schema) {\n return schema == null ? jsonSchema({ properties: {}, additionalProperties: false }) : isSchema(schema) ? schema : \"~standard\" in schema ? schema[\"~standard\"].vendor === \"zod\" ? zodSchema(schema) : standardSchema(schema) : schema();\n}\nfunction standardSchema(standardSchema2) {\n return jsonSchema(\n () => addAdditionalPropertiesToJsonSchema(\n standardSchema2[\"~standard\"].jsonSchema.input({\n target: \"draft-07\"\n })\n ),\n {\n validate: async (value) => {\n const result = await standardSchema2[\"~standard\"].validate(value);\n return \"value\" in result ? { success: true, value: result.value } : {\n success: false,\n error: new TypeValidationError({\n value,\n cause: result.issues\n })\n };\n }\n }\n );\n}\nfunction zod3Schema(zodSchema2, options) {\n var _a2;\n const useReferences = (_a2 = options == null ? void 0 : options.useReferences) != null ? _a2 : false;\n return jsonSchema(\n // defer json schema creation to avoid unnecessary computation when only validation is needed\n () => zod3ToJsonSchema(zodSchema2, {\n $refStrategy: useReferences ? \"root\" : \"none\"\n }),\n {\n validate: async (value) => {\n const result = await zodSchema2.safeParseAsync(value);\n return result.success ? { success: true, value: result.data } : { success: false, error: result.error };\n }\n }\n );\n}\nfunction zod4Schema(zodSchema2, options) {\n var _a2;\n const useReferences = (_a2 = options == null ? void 0 : options.useReferences) != null ? _a2 : false;\n return jsonSchema(\n // defer json schema creation to avoid unnecessary computation when only validation is needed\n () => addAdditionalPropertiesToJsonSchema(\n z4.toJSONSchema(zodSchema2, {\n target: \"draft-7\",\n io: \"input\",\n reused: useReferences ? \"ref\" : \"inline\"\n })\n ),\n {\n validate: async (value) => {\n const result = await z4.safeParseAsync(zodSchema2, value);\n return result.success ? { success: true, value: result.data } : { success: false, error: result.error };\n }\n }\n );\n}\nfunction isZod4Schema(zodSchema2) {\n return \"_zod\" in zodSchema2;\n}\nfunction zodSchema(zodSchema2, options) {\n if (isZod4Schema(zodSchema2)) {\n return zod4Schema(zodSchema2, options);\n } else {\n return zod3Schema(zodSchema2, options);\n }\n}\n\n// src/validate-types.ts\nasync function validateTypes({\n value,\n schema,\n context\n}) {\n const result = await safeValidateTypes({ value, schema, context });\n if (!result.success) {\n throw TypeValidationError2.wrap({ value, cause: result.error, context });\n }\n return result.value;\n}\nasync function safeValidateTypes({\n value,\n schema,\n context\n}) {\n const actualSchema = asSchema(schema);\n try {\n if (actualSchema.validate == null) {\n return { success: true, value, rawValue: value };\n }\n const result = await actualSchema.validate(value);\n if (result.success) {\n return { success: true, value: result.value, rawValue: value };\n }\n return {\n success: false,\n error: TypeValidationError2.wrap({ value, cause: result.error, context }),\n rawValue: value\n };\n } catch (error) {\n return {\n success: false,\n error: TypeValidationError2.wrap({ value, cause: error, context }),\n rawValue: value\n };\n }\n}\n\n// src/parse-json.ts\nasync function parseJSON({\n text,\n schema\n}) {\n try {\n const value = secureJsonParse(text);\n if (schema == null) {\n return value;\n }\n return validateTypes({ value, schema });\n } catch (error) {\n if (JSONParseError.isInstance(error) || TypeValidationError3.isInstance(error)) {\n throw error;\n }\n throw new JSONParseError({ text, cause: error });\n }\n}\nasync function safeParseJSON({\n text,\n schema\n}) {\n try {\n const value = secureJsonParse(text);\n if (schema == null) {\n return { success: true, value, rawValue: value };\n }\n return await safeValidateTypes({ value, schema });\n } catch (error) {\n return {\n success: false,\n error: JSONParseError.isInstance(error) ? error : new JSONParseError({ text, cause: error }),\n rawValue: void 0\n };\n }\n}\nfunction isParsableJson(input) {\n try {\n secureJsonParse(input);\n return true;\n } catch (e) {\n return false;\n }\n}\n\n// src/parse-json-event-stream.ts\nimport {\n EventSourceParserStream\n} from \"eventsource-parser/stream\";\nfunction parseJsonEventStream({\n stream,\n schema\n}) {\n return stream.pipeThrough(new TextDecoderStream()).pipeThrough(new EventSourceParserStream()).pipeThrough(\n new TransformStream({\n async transform({ data }, controller) {\n if (data === \"[DONE]\") {\n return;\n }\n controller.enqueue(await safeParseJSON({ text: data, schema }));\n }\n })\n );\n}\n\n// src/parse-provider-options.ts\nimport { InvalidArgumentError as InvalidArgumentError2 } from \"@ai-sdk/provider\";\nasync function parseProviderOptions({\n provider,\n providerOptions,\n schema\n}) {\n if ((providerOptions == null ? void 0 : providerOptions[provider]) == null) {\n return void 0;\n }\n const parsedProviderOptions = await safeValidateTypes({\n value: providerOptions[provider],\n schema\n });\n if (!parsedProviderOptions.success) {\n throw new InvalidArgumentError2({\n argument: \"providerOptions\",\n message: `invalid ${provider} provider options`,\n cause: parsedProviderOptions.error\n });\n }\n return parsedProviderOptions.value;\n}\n\n// src/post-to-api.ts\nimport { APICallError as APICallError3 } from \"@ai-sdk/provider\";\nvar getOriginalFetch2 = () => globalThis.fetch;\nvar postJsonToApi = async ({\n url,\n headers,\n body,\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch: fetch2\n}) => postToApi({\n url,\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n body: {\n content: JSON.stringify(body),\n values: body\n },\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch: fetch2\n});\nvar postFormDataToApi = async ({\n url,\n headers,\n formData,\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch: fetch2\n}) => postToApi({\n url,\n headers,\n body: {\n content: formData,\n values: Object.fromEntries(formData.entries())\n },\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch: fetch2\n});\nvar postToApi = async ({\n url,\n headers = {},\n body,\n successfulResponseHandler,\n failedResponseHandler,\n abortSignal,\n fetch: fetch2 = getOriginalFetch2()\n}) => {\n try {\n const response = await fetch2(url, {\n method: \"POST\",\n headers: withUserAgentSuffix(\n headers,\n `ai-sdk/provider-utils/${VERSION}`,\n getRuntimeEnvironmentUserAgent()\n ),\n body: body.content,\n signal: abortSignal\n });\n const responseHeaders = extractResponseHeaders(response);\n if (!response.ok) {\n let errorInformation;\n try {\n errorInformation = await failedResponseHandler({\n response,\n url,\n requestBodyValues: body.values\n });\n } catch (error) {\n if (isAbortError(error) || APICallError3.isInstance(error)) {\n throw error;\n }\n throw new APICallError3({\n message: \"Failed to process error response\",\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: body.values\n });\n }\n throw errorInformation.value;\n }\n try {\n return await successfulResponseHandler({\n response,\n url,\n requestBodyValues: body.values\n });\n } catch (error) {\n if (error instanceof Error) {\n if (isAbortError(error) || APICallError3.isInstance(error)) {\n throw error;\n }\n }\n throw new APICallError3({\n message: \"Failed to process successful response\",\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: body.values\n });\n }\n } catch (error) {\n throw handleFetchError({ error, url, requestBodyValues: body.values });\n }\n};\n\n// src/types/tool.ts\nfunction tool(tool2) {\n return tool2;\n}\nfunction dynamicTool(tool2) {\n return { ...tool2, type: \"dynamic\" };\n}\n\n// src/provider-tool-factory.ts\nfunction createProviderToolFactory({\n id,\n inputSchema\n}) {\n return ({\n execute,\n outputSchema,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n ...args\n }) => tool({\n type: \"provider\",\n id,\n args,\n inputSchema,\n outputSchema,\n execute,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable\n });\n}\nfunction createProviderToolFactoryWithOutputSchema({\n id,\n inputSchema,\n outputSchema,\n supportsDeferredResults\n}) {\n return ({\n execute,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n ...args\n }) => tool({\n type: \"provider\",\n id,\n args,\n inputSchema,\n outputSchema,\n execute,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n supportsDeferredResults\n });\n}\n\n// src/remove-undefined-entries.ts\nfunction removeUndefinedEntries(record) {\n return Object.fromEntries(\n Object.entries(record).filter(([_key, value]) => value != null)\n );\n}\n\n// src/resolve.ts\nasync function resolve(value) {\n if (typeof value === \"function\") {\n value = value();\n }\n return Promise.resolve(value);\n}\n\n// src/response-handler.ts\nimport { APICallError as APICallError4, EmptyResponseBodyError } from \"@ai-sdk/provider\";\nvar createJsonErrorResponseHandler = ({\n errorSchema,\n errorToMessage,\n isRetryable\n}) => async ({ response, url, requestBodyValues }) => {\n const responseBody = await response.text();\n const responseHeaders = extractResponseHeaders(response);\n if (responseBody.trim() === \"\") {\n return {\n responseHeaders,\n value: new APICallError4({\n message: response.statusText,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n isRetryable: isRetryable == null ? void 0 : isRetryable(response)\n })\n };\n }\n try {\n const parsedError = await parseJSON({\n text: responseBody,\n schema: errorSchema\n });\n return {\n responseHeaders,\n value: new APICallError4({\n message: errorToMessage(parsedError),\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n data: parsedError,\n isRetryable: isRetryable == null ? void 0 : isRetryable(response, parsedError)\n })\n };\n } catch (parseError) {\n return {\n responseHeaders,\n value: new APICallError4({\n message: response.statusText,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n isRetryable: isRetryable == null ? void 0 : isRetryable(response)\n })\n };\n }\n};\nvar createEventSourceResponseHandler = (chunkSchema) => async ({ response }) => {\n const responseHeaders = extractResponseHeaders(response);\n if (response.body == null) {\n throw new EmptyResponseBodyError({});\n }\n return {\n responseHeaders,\n value: parseJsonEventStream({\n stream: response.body,\n schema: chunkSchema\n })\n };\n};\nvar createJsonResponseHandler = (responseSchema) => async ({ response, url, requestBodyValues }) => {\n const responseBody = await response.text();\n const parsedResult = await safeParseJSON({\n text: responseBody,\n schema: responseSchema\n });\n const responseHeaders = extractResponseHeaders(response);\n if (!parsedResult.success) {\n throw new APICallError4({\n message: \"Invalid JSON response\",\n cause: parsedResult.error,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n url,\n requestBodyValues\n });\n }\n return {\n responseHeaders,\n value: parsedResult.value,\n rawValue: parsedResult.rawValue\n };\n};\nvar createBinaryResponseHandler = () => async ({ response, url, requestBodyValues }) => {\n const responseHeaders = extractResponseHeaders(response);\n if (!response.body) {\n throw new APICallError4({\n message: \"Response body is empty\",\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody: void 0\n });\n }\n try {\n const buffer = await response.arrayBuffer();\n return {\n responseHeaders,\n value: new Uint8Array(buffer)\n };\n } catch (error) {\n throw new APICallError4({\n message: \"Failed to read response as array buffer\",\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody: void 0,\n cause: error\n });\n }\n};\nvar createStatusCodeErrorResponseHandler = () => async ({ response, url, requestBodyValues }) => {\n const responseHeaders = extractResponseHeaders(response);\n const responseBody = await response.text();\n return {\n responseHeaders,\n value: new APICallError4({\n message: response.statusText,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody\n })\n };\n};\n\n// src/strip-file-extension.ts\nfunction stripFileExtension(filename) {\n const firstDotIndex = filename.indexOf(\".\");\n return firstDotIndex === -1 ? filename : filename.slice(0, firstDotIndex);\n}\n\n// src/without-trailing-slash.ts\nfunction withoutTrailingSlash(url) {\n return url == null ? void 0 : url.replace(/\\/$/, \"\");\n}\n\n// src/is-async-iterable.ts\nfunction isAsyncIterable(obj) {\n return obj != null && typeof obj[Symbol.asyncIterator] === \"function\";\n}\n\n// src/types/execute-tool.ts\nasync function* executeTool({\n execute,\n input,\n options\n}) {\n const result = execute(input, options);\n if (isAsyncIterable(result)) {\n let lastOutput;\n for await (const output of result) {\n lastOutput = output;\n yield { type: \"preliminary\", output };\n }\n yield { type: \"final\", output: lastOutput };\n } else {\n yield { type: \"final\", output: await result };\n }\n}\n\n// src/index.ts\nimport {\n EventSourceParserStream as EventSourceParserStream2\n} from \"eventsource-parser/stream\";\nexport {\n DEFAULT_MAX_DOWNLOAD_SIZE,\n DelayedPromise,\n DownloadError,\n EventSourceParserStream2 as EventSourceParserStream,\n VERSION,\n asSchema,\n combineHeaders,\n convertAsyncIteratorToReadableStream,\n convertBase64ToUint8Array,\n convertImageModelFileToDataUri,\n convertToBase64,\n convertToFormData,\n convertUint8ArrayToBase64,\n createBinaryResponseHandler,\n createEventSourceResponseHandler,\n createIdGenerator,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n createProviderToolFactory,\n createProviderToolFactoryWithOutputSchema,\n createStatusCodeErrorResponseHandler,\n createToolNameMapping,\n delay,\n downloadBlob,\n dynamicTool,\n executeTool,\n extractResponseHeaders,\n generateId,\n getErrorMessage,\n getFromApi,\n getRuntimeEnvironmentUserAgent,\n injectJsonInstructionIntoMessages,\n isAbortError,\n isNonNullable,\n isParsableJson,\n isUrlSupported,\n jsonSchema,\n lazySchema,\n loadApiKey,\n loadOptionalSetting,\n loadSetting,\n mediaTypeToExtension,\n normalizeHeaders,\n parseJSON,\n parseJsonEventStream,\n parseProviderOptions,\n postFormDataToApi,\n postJsonToApi,\n postToApi,\n readResponseWithSizeLimit,\n removeUndefinedEntries,\n resolve,\n safeParseJSON,\n safeValidateTypes,\n stripFileExtension,\n tool,\n validateDownloadUrl,\n validateTypes,\n withUserAgentSuffix,\n withoutTrailingSlash,\n zodSchema\n};\n//# sourceMappingURL=index.mjs.map","var __defProp = Object.defineProperty;\nvar __export = (target, all) => {\n for (var name21 in all)\n __defProp(target, name21, { get: all[name21], enumerable: true });\n};\n\n// src/index.ts\nimport { createGateway, gateway as gateway2 } from \"@ai-sdk/gateway\";\nimport {\n asSchema as asSchema5,\n createIdGenerator as createIdGenerator5,\n dynamicTool,\n generateId,\n jsonSchema,\n parseJsonEventStream as parseJsonEventStream3,\n tool,\n zodSchema as zodSchema3\n} from \"@ai-sdk/provider-utils\";\n\n// src/agent/tool-loop-agent.ts\nimport { validateTypes as validateTypes2 } from \"@ai-sdk/provider-utils\";\n\n// src/generate-text/generate-text.ts\nimport {\n createIdGenerator,\n getErrorMessage as getErrorMessage5,\n withUserAgentSuffix as withUserAgentSuffix2\n} from \"@ai-sdk/provider-utils\";\n\n// src/error/index.ts\nimport {\n AISDKError as AISDKError21,\n APICallError,\n EmptyResponseBodyError,\n InvalidPromptError,\n InvalidResponseDataError,\n JSONParseError,\n LoadAPIKeyError,\n LoadSettingError,\n NoContentGeneratedError,\n NoSuchModelError,\n TooManyEmbeddingValuesForCallError,\n TypeValidationError,\n UnsupportedFunctionalityError\n} from \"@ai-sdk/provider\";\n\n// src/error/invalid-argument-error.ts\nimport { AISDKError } from \"@ai-sdk/provider\";\nvar name = \"AI_InvalidArgumentError\";\nvar marker = `vercel.ai.error.${name}`;\nvar symbol = Symbol.for(marker);\nvar _a;\nvar InvalidArgumentError = class extends AISDKError {\n constructor({\n parameter,\n value,\n message\n }) {\n super({\n name,\n message: `Invalid argument for parameter ${parameter}: ${message}`\n });\n this[_a] = true;\n this.parameter = parameter;\n this.value = value;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker);\n }\n};\n_a = symbol;\n\n// src/error/invalid-stream-part-error.ts\nimport { AISDKError as AISDKError2 } from \"@ai-sdk/provider\";\nvar name2 = \"AI_InvalidStreamPartError\";\nvar marker2 = `vercel.ai.error.${name2}`;\nvar symbol2 = Symbol.for(marker2);\nvar _a2;\nvar InvalidStreamPartError = class extends AISDKError2 {\n constructor({\n chunk,\n message\n }) {\n super({ name: name2, message });\n this[_a2] = true;\n this.chunk = chunk;\n }\n static isInstance(error) {\n return AISDKError2.hasMarker(error, marker2);\n }\n};\n_a2 = symbol2;\n\n// src/error/invalid-tool-approval-error.ts\nimport { AISDKError as AISDKError3 } from \"@ai-sdk/provider\";\nvar name3 = \"AI_InvalidToolApprovalError\";\nvar marker3 = `vercel.ai.error.${name3}`;\nvar symbol3 = Symbol.for(marker3);\nvar _a3;\nvar InvalidToolApprovalError = class extends AISDKError3 {\n constructor({ approvalId }) {\n super({\n name: name3,\n message: `Tool approval response references unknown approvalId: \"${approvalId}\". No matching tool-approval-request found in message history.`\n });\n this[_a3] = true;\n this.approvalId = approvalId;\n }\n static isInstance(error) {\n return AISDKError3.hasMarker(error, marker3);\n }\n};\n_a3 = symbol3;\n\n// src/error/invalid-tool-input-error.ts\nimport { AISDKError as AISDKError4, getErrorMessage } from \"@ai-sdk/provider\";\nvar name4 = \"AI_InvalidToolInputError\";\nvar marker4 = `vercel.ai.error.${name4}`;\nvar symbol4 = Symbol.for(marker4);\nvar _a4;\nvar InvalidToolInputError = class extends AISDKError4 {\n constructor({\n toolInput,\n toolName,\n cause,\n message = `Invalid input for tool ${toolName}: ${getErrorMessage(cause)}`\n }) {\n super({ name: name4, message, cause });\n this[_a4] = true;\n this.toolInput = toolInput;\n this.toolName = toolName;\n }\n static isInstance(error) {\n return AISDKError4.hasMarker(error, marker4);\n }\n};\n_a4 = symbol4;\n\n// src/error/tool-call-not-found-for-approval-error.ts\nimport { AISDKError as AISDKError5 } from \"@ai-sdk/provider\";\nvar name5 = \"AI_ToolCallNotFoundForApprovalError\";\nvar marker5 = `vercel.ai.error.${name5}`;\nvar symbol5 = Symbol.for(marker5);\nvar _a5;\nvar ToolCallNotFoundForApprovalError = class extends AISDKError5 {\n constructor({\n toolCallId,\n approvalId\n }) {\n super({\n name: name5,\n message: `Tool call \"${toolCallId}\" not found for approval request \"${approvalId}\".`\n });\n this[_a5] = true;\n this.toolCallId = toolCallId;\n this.approvalId = approvalId;\n }\n static isInstance(error) {\n return AISDKError5.hasMarker(error, marker5);\n }\n};\n_a5 = symbol5;\n\n// src/error/missing-tool-result-error.ts\nimport { AISDKError as AISDKError6 } from \"@ai-sdk/provider\";\nvar name6 = \"AI_MissingToolResultsError\";\nvar marker6 = `vercel.ai.error.${name6}`;\nvar symbol6 = Symbol.for(marker6);\nvar _a6;\nvar MissingToolResultsError = class extends AISDKError6 {\n constructor({ toolCallIds }) {\n super({\n name: name6,\n message: `Tool result${toolCallIds.length > 1 ? \"s are\" : \" is\"} missing for tool call${toolCallIds.length > 1 ? \"s\" : \"\"} ${toolCallIds.join(\n \", \"\n )}.`\n });\n this[_a6] = true;\n this.toolCallIds = toolCallIds;\n }\n static isInstance(error) {\n return AISDKError6.hasMarker(error, marker6);\n }\n};\n_a6 = symbol6;\n\n// src/error/no-image-generated-error.ts\nimport { AISDKError as AISDKError7 } from \"@ai-sdk/provider\";\nvar name7 = \"AI_NoImageGeneratedError\";\nvar marker7 = `vercel.ai.error.${name7}`;\nvar symbol7 = Symbol.for(marker7);\nvar _a7;\nvar NoImageGeneratedError = class extends AISDKError7 {\n constructor({\n message = \"No image generated.\",\n cause,\n responses\n }) {\n super({ name: name7, message, cause });\n this[_a7] = true;\n this.responses = responses;\n }\n static isInstance(error) {\n return AISDKError7.hasMarker(error, marker7);\n }\n};\n_a7 = symbol7;\n\n// src/error/no-object-generated-error.ts\nimport { AISDKError as AISDKError8 } from \"@ai-sdk/provider\";\nvar name8 = \"AI_NoObjectGeneratedError\";\nvar marker8 = `vercel.ai.error.${name8}`;\nvar symbol8 = Symbol.for(marker8);\nvar _a8;\nvar NoObjectGeneratedError = class extends AISDKError8 {\n constructor({\n message = \"No object generated.\",\n cause,\n text: text2,\n response,\n usage,\n finishReason\n }) {\n super({ name: name8, message, cause });\n this[_a8] = true;\n this.text = text2;\n this.response = response;\n this.usage = usage;\n this.finishReason = finishReason;\n }\n static isInstance(error) {\n return AISDKError8.hasMarker(error, marker8);\n }\n};\n_a8 = symbol8;\n\n// src/error/no-output-generated-error.ts\nimport { AISDKError as AISDKError9 } from \"@ai-sdk/provider\";\nvar name9 = \"AI_NoOutputGeneratedError\";\nvar marker9 = `vercel.ai.error.${name9}`;\nvar symbol9 = Symbol.for(marker9);\nvar _a9;\nvar NoOutputGeneratedError = class extends AISDKError9 {\n // used in isInstance\n constructor({\n message = \"No output generated.\",\n cause\n } = {}) {\n super({ name: name9, message, cause });\n this[_a9] = true;\n }\n static isInstance(error) {\n return AISDKError9.hasMarker(error, marker9);\n }\n};\n_a9 = symbol9;\n\n// src/error/no-speech-generated-error.ts\nimport { AISDKError as AISDKError10 } from \"@ai-sdk/provider\";\nvar name10 = \"AI_NoSpeechGeneratedError\";\nvar marker10 = `vercel.ai.error.${name10}`;\nvar symbol10 = Symbol.for(marker10);\nvar _a10;\nvar NoSpeechGeneratedError = class extends AISDKError10 {\n constructor(options) {\n super({\n name: name10,\n message: \"No speech audio generated.\"\n });\n this[_a10] = true;\n this.responses = options.responses;\n }\n static isInstance(error) {\n return AISDKError10.hasMarker(error, marker10);\n }\n};\n_a10 = symbol10;\n\n// src/error/no-transcript-generated-error.ts\nimport { AISDKError as AISDKError11 } from \"@ai-sdk/provider\";\nvar name11 = \"AI_NoTranscriptGeneratedError\";\nvar marker11 = `vercel.ai.error.${name11}`;\nvar symbol11 = Symbol.for(marker11);\nvar _a11;\nvar NoTranscriptGeneratedError = class extends AISDKError11 {\n constructor(options) {\n super({\n name: name11,\n message: \"No transcript generated.\"\n });\n this[_a11] = true;\n this.responses = options.responses;\n }\n static isInstance(error) {\n return AISDKError11.hasMarker(error, marker11);\n }\n};\n_a11 = symbol11;\n\n// src/error/no-video-generated-error.ts\nimport { AISDKError as AISDKError12 } from \"@ai-sdk/provider\";\nvar name12 = \"AI_NoVideoGeneratedError\";\nvar marker12 = `vercel.ai.error.${name12}`;\nvar symbol12 = Symbol.for(marker12);\nvar _a12;\nvar NoVideoGeneratedError = class extends AISDKError12 {\n constructor({\n message = \"No video generated.\",\n cause,\n responses\n }) {\n super({ name: name12, message, cause });\n this[_a12] = true;\n this.responses = responses;\n }\n static isInstance(error) {\n return AISDKError12.hasMarker(error, marker12);\n }\n /**\n * @deprecated use `isInstance` instead\n */\n static isNoVideoGeneratedError(error) {\n return error instanceof Error && error.name === name12 && typeof error.responses !== \"undefined\" ? true : false;\n }\n /**\n * @deprecated Do not use this method. It will be removed in the next major version.\n */\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n cause: this.cause,\n responses: this.responses\n };\n }\n};\n_a12 = symbol12;\n\n// src/error/no-such-tool-error.ts\nimport { AISDKError as AISDKError13 } from \"@ai-sdk/provider\";\nvar name13 = \"AI_NoSuchToolError\";\nvar marker13 = `vercel.ai.error.${name13}`;\nvar symbol13 = Symbol.for(marker13);\nvar _a13;\nvar NoSuchToolError = class extends AISDKError13 {\n constructor({\n toolName,\n availableTools = void 0,\n message = `Model tried to call unavailable tool '${toolName}'. ${availableTools === void 0 ? \"No tools are available.\" : `Available tools: ${availableTools.join(\", \")}.`}`\n }) {\n super({ name: name13, message });\n this[_a13] = true;\n this.toolName = toolName;\n this.availableTools = availableTools;\n }\n static isInstance(error) {\n return AISDKError13.hasMarker(error, marker13);\n }\n};\n_a13 = symbol13;\n\n// src/error/tool-call-repair-error.ts\nimport { AISDKError as AISDKError14, getErrorMessage as getErrorMessage2 } from \"@ai-sdk/provider\";\nvar name14 = \"AI_ToolCallRepairError\";\nvar marker14 = `vercel.ai.error.${name14}`;\nvar symbol14 = Symbol.for(marker14);\nvar _a14;\nvar ToolCallRepairError = class extends AISDKError14 {\n constructor({\n cause,\n originalError,\n message = `Error repairing tool call: ${getErrorMessage2(cause)}`\n }) {\n super({ name: name14, message, cause });\n this[_a14] = true;\n this.originalError = originalError;\n }\n static isInstance(error) {\n return AISDKError14.hasMarker(error, marker14);\n }\n};\n_a14 = symbol14;\n\n// src/error/unsupported-model-version-error.ts\nimport { AISDKError as AISDKError15 } from \"@ai-sdk/provider\";\nvar UnsupportedModelVersionError = class extends AISDKError15 {\n constructor(options) {\n super({\n name: \"AI_UnsupportedModelVersionError\",\n message: `Unsupported model version ${options.version} for provider \"${options.provider}\" and model \"${options.modelId}\". AI SDK 5 only supports models that implement specification version \"v2\".`\n });\n this.version = options.version;\n this.provider = options.provider;\n this.modelId = options.modelId;\n }\n};\n\n// src/error/ui-message-stream-error.ts\nimport { AISDKError as AISDKError16 } from \"@ai-sdk/provider\";\nvar name15 = \"AI_UIMessageStreamError\";\nvar marker15 = `vercel.ai.error.${name15}`;\nvar symbol15 = Symbol.for(marker15);\nvar _a15;\nvar UIMessageStreamError = class extends AISDKError16 {\n constructor({\n chunkType,\n chunkId,\n message\n }) {\n super({ name: name15, message });\n this[_a15] = true;\n this.chunkType = chunkType;\n this.chunkId = chunkId;\n }\n static isInstance(error) {\n return AISDKError16.hasMarker(error, marker15);\n }\n};\n_a15 = symbol15;\n\n// src/prompt/invalid-data-content-error.ts\nimport { AISDKError as AISDKError17 } from \"@ai-sdk/provider\";\nvar name16 = \"AI_InvalidDataContentError\";\nvar marker16 = `vercel.ai.error.${name16}`;\nvar symbol16 = Symbol.for(marker16);\nvar _a16;\nvar InvalidDataContentError = class extends AISDKError17 {\n constructor({\n content,\n cause,\n message = `Invalid data content. Expected a base64 string, Uint8Array, ArrayBuffer, or Buffer, but got ${typeof content}.`\n }) {\n super({ name: name16, message, cause });\n this[_a16] = true;\n this.content = content;\n }\n static isInstance(error) {\n return AISDKError17.hasMarker(error, marker16);\n }\n};\n_a16 = symbol16;\n\n// src/prompt/invalid-message-role-error.ts\nimport { AISDKError as AISDKError18 } from \"@ai-sdk/provider\";\nvar name17 = \"AI_InvalidMessageRoleError\";\nvar marker17 = `vercel.ai.error.${name17}`;\nvar symbol17 = Symbol.for(marker17);\nvar _a17;\nvar InvalidMessageRoleError = class extends AISDKError18 {\n constructor({\n role,\n message = `Invalid message role: '${role}'. Must be one of: \"system\", \"user\", \"assistant\", \"tool\".`\n }) {\n super({ name: name17, message });\n this[_a17] = true;\n this.role = role;\n }\n static isInstance(error) {\n return AISDKError18.hasMarker(error, marker17);\n }\n};\n_a17 = symbol17;\n\n// src/prompt/message-conversion-error.ts\nimport { AISDKError as AISDKError19 } from \"@ai-sdk/provider\";\nvar name18 = \"AI_MessageConversionError\";\nvar marker18 = `vercel.ai.error.${name18}`;\nvar symbol18 = Symbol.for(marker18);\nvar _a18;\nvar MessageConversionError = class extends AISDKError19 {\n constructor({\n originalMessage,\n message\n }) {\n super({ name: name18, message });\n this[_a18] = true;\n this.originalMessage = originalMessage;\n }\n static isInstance(error) {\n return AISDKError19.hasMarker(error, marker18);\n }\n};\n_a18 = symbol18;\n\n// src/error/index.ts\nimport { DownloadError } from \"@ai-sdk/provider-utils\";\n\n// src/util/retry-error.ts\nimport { AISDKError as AISDKError20 } from \"@ai-sdk/provider\";\nvar name19 = \"AI_RetryError\";\nvar marker19 = `vercel.ai.error.${name19}`;\nvar symbol19 = Symbol.for(marker19);\nvar _a19;\nvar RetryError = class extends AISDKError20 {\n constructor({\n message,\n reason,\n errors\n }) {\n super({ name: name19, message });\n this[_a19] = true;\n this.reason = reason;\n this.errors = errors;\n this.lastError = errors[errors.length - 1];\n }\n static isInstance(error) {\n return AISDKError20.hasMarker(error, marker19);\n }\n};\n_a19 = symbol19;\n\n// src/util/as-array.ts\nfunction asArray(value) {\n return value === void 0 ? [] : Array.isArray(value) ? value : [value];\n}\n\n// src/util/notify.ts\nasync function notify(options) {\n for (const callback of asArray(options.callbacks)) {\n if (callback == null)\n continue;\n try {\n await callback(options.event);\n } catch (_ignored) {\n }\n }\n}\n\n// src/logger/log-warnings.ts\nfunction formatWarning({\n warning,\n provider,\n model\n}) {\n const prefix = `AI SDK Warning (${provider} / ${model}):`;\n switch (warning.type) {\n case \"unsupported\": {\n let message = `${prefix} The feature \"${warning.feature}\" is not supported.`;\n if (warning.details) {\n message += ` ${warning.details}`;\n }\n return message;\n }\n case \"compatibility\": {\n let message = `${prefix} The feature \"${warning.feature}\" is used in a compatibility mode.`;\n if (warning.details) {\n message += ` ${warning.details}`;\n }\n return message;\n }\n case \"other\": {\n return `${prefix} ${warning.message}`;\n }\n default: {\n return `${prefix} ${JSON.stringify(warning, null, 2)}`;\n }\n }\n}\nvar FIRST_WARNING_INFO_MESSAGE = \"AI SDK Warning System: To turn off warning logging, set the AI_SDK_LOG_WARNINGS global to false.\";\nvar hasLoggedBefore = false;\nvar logWarnings = (options) => {\n if (options.warnings.length === 0) {\n return;\n }\n const logger = globalThis.AI_SDK_LOG_WARNINGS;\n if (logger === false) {\n return;\n }\n if (typeof logger === \"function\") {\n logger(options);\n return;\n }\n if (!hasLoggedBefore) {\n hasLoggedBefore = true;\n console.info(FIRST_WARNING_INFO_MESSAGE);\n }\n for (const warning of options.warnings) {\n console.warn(\n formatWarning({\n warning,\n provider: options.provider,\n model: options.model\n })\n );\n }\n};\n\n// src/model/resolve-model.ts\nimport { gateway } from \"@ai-sdk/gateway\";\n\n// src/util/log-v2-compatibility-warning.ts\nfunction logV2CompatibilityWarning({\n provider,\n modelId\n}) {\n logWarnings({\n warnings: [\n {\n type: \"compatibility\",\n feature: \"specificationVersion\",\n details: `Using v2 specification compatibility mode. Some features may not be available.`\n }\n ],\n provider,\n model: modelId\n });\n}\n\n// src/model/as-embedding-model-v3.ts\nfunction asEmbeddingModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v3\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-image-model-v3.ts\nfunction asImageModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v3\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-language-model-v3.ts\nfunction asLanguageModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n switch (prop) {\n case \"specificationVersion\":\n return \"v3\";\n case \"doGenerate\":\n return async (...args) => {\n const result = await target.doGenerate(...args);\n return {\n ...result,\n finishReason: convertV2FinishReasonToV3(result.finishReason),\n usage: convertV2UsageToV3(result.usage)\n };\n };\n case \"doStream\":\n return async (...args) => {\n const result = await target.doStream(...args);\n return {\n ...result,\n stream: convertV2StreamToV3(result.stream)\n };\n };\n default:\n return target[prop];\n }\n }\n });\n}\nfunction convertV2StreamToV3(stream) {\n return stream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"finish\":\n controller.enqueue({\n ...chunk,\n finishReason: convertV2FinishReasonToV3(chunk.finishReason),\n usage: convertV2UsageToV3(chunk.usage)\n });\n break;\n default:\n controller.enqueue(chunk);\n break;\n }\n }\n })\n );\n}\nfunction convertV2FinishReasonToV3(finishReason) {\n return {\n unified: finishReason === \"unknown\" ? \"other\" : finishReason,\n raw: void 0\n };\n}\nfunction convertV2UsageToV3(usage) {\n return {\n inputTokens: {\n total: usage.inputTokens,\n noCache: void 0,\n cacheRead: usage.cachedInputTokens,\n cacheWrite: void 0\n },\n outputTokens: {\n total: usage.outputTokens,\n text: void 0,\n reasoning: usage.reasoningTokens\n }\n };\n}\n\n// src/model/as-speech-model-v3.ts\nfunction asSpeechModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v3\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-transcription-model-v3.ts\nfunction asTranscriptionModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v3\";\n return target[prop];\n }\n });\n}\n\n// src/model/resolve-model.ts\nfunction resolveLanguageModel(model) {\n if (typeof model !== \"string\") {\n if (model.specificationVersion !== \"v3\" && model.specificationVersion !== \"v2\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asLanguageModelV3(model);\n }\n return getGlobalProvider().languageModel(model);\n}\nfunction resolveEmbeddingModel(model) {\n if (typeof model !== \"string\") {\n if (model.specificationVersion !== \"v3\" && model.specificationVersion !== \"v2\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asEmbeddingModelV3(model);\n }\n return getGlobalProvider().embeddingModel(model);\n}\nfunction resolveTranscriptionModel(model) {\n var _a21, _b;\n if (typeof model !== \"string\") {\n if (model.specificationVersion !== \"v3\" && model.specificationVersion !== \"v2\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asTranscriptionModelV3(model);\n }\n return (_b = (_a21 = getGlobalProvider()).transcriptionModel) == null ? void 0 : _b.call(_a21, model);\n}\nfunction resolveSpeechModel(model) {\n var _a21, _b;\n if (typeof model !== \"string\") {\n if (model.specificationVersion !== \"v3\" && model.specificationVersion !== \"v2\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asSpeechModelV3(model);\n }\n return (_b = (_a21 = getGlobalProvider()).speechModel) == null ? void 0 : _b.call(_a21, model);\n}\nfunction resolveImageModel(model) {\n if (typeof model !== \"string\") {\n if (model.specificationVersion !== \"v3\" && model.specificationVersion !== \"v2\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asImageModelV3(model);\n }\n return getGlobalProvider().imageModel(model);\n}\nfunction resolveVideoModel(model) {\n if (typeof model === \"string\") {\n const provider = getGlobalProvider();\n const videoModel = provider.videoModel;\n if (!videoModel) {\n throw new Error(\n 'The default provider does not support video models. Please use a Experimental_VideoModelV3 object from a provider (e.g., vertex.video(\"model-id\")).'\n );\n }\n return videoModel(model);\n }\n if (model.specificationVersion !== \"v3\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return model;\n}\nfunction resolveRerankingModel(model) {\n if (typeof model === \"string\") {\n const provider = getGlobalProvider();\n const rerankingModel = provider.rerankingModel;\n if (!rerankingModel) {\n throw new Error(\n 'The default provider does not support reranking models. Please use a RerankingModel object from a provider (e.g., gateway.rerankingModel(\"model-id\")).'\n );\n }\n return rerankingModel(model);\n }\n if (model.specificationVersion !== \"v3\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return model;\n}\nfunction getGlobalProvider() {\n var _a21;\n return (_a21 = globalThis.AI_SDK_DEFAULT_PROVIDER) != null ? _a21 : gateway;\n}\n\n// src/prompt/call-settings.ts\nfunction getTotalTimeoutMs(timeout) {\n if (timeout == null) {\n return void 0;\n }\n if (typeof timeout === \"number\") {\n return timeout;\n }\n return timeout.totalMs;\n}\nfunction getStepTimeoutMs(timeout) {\n if (timeout == null || typeof timeout === \"number\") {\n return void 0;\n }\n return timeout.stepMs;\n}\nfunction getChunkTimeoutMs(timeout) {\n if (timeout == null || typeof timeout === \"number\") {\n return void 0;\n }\n return timeout.chunkMs;\n}\n\n// src/prompt/convert-to-language-model-prompt.ts\nimport {\n isUrlSupported\n} from \"@ai-sdk/provider-utils\";\n\n// src/util/detect-media-type.ts\nimport { convertBase64ToUint8Array } from \"@ai-sdk/provider-utils\";\nvar imageMediaTypeSignatures = [\n {\n mediaType: \"image/gif\",\n bytesPrefix: [71, 73, 70]\n // GIF\n },\n {\n mediaType: \"image/png\",\n bytesPrefix: [137, 80, 78, 71]\n // PNG\n },\n {\n mediaType: \"image/jpeg\",\n bytesPrefix: [255, 216]\n // JPEG\n },\n {\n mediaType: \"image/webp\",\n bytesPrefix: [\n 82,\n 73,\n 70,\n 70,\n // \"RIFF\"\n null,\n null,\n null,\n null,\n // file size (variable)\n 87,\n 69,\n 66,\n 80\n // \"WEBP\"\n ]\n },\n {\n mediaType: \"image/bmp\",\n bytesPrefix: [66, 77]\n },\n {\n mediaType: \"image/tiff\",\n bytesPrefix: [73, 73, 42, 0]\n },\n {\n mediaType: \"image/tiff\",\n bytesPrefix: [77, 77, 0, 42]\n },\n {\n mediaType: \"image/avif\",\n bytesPrefix: [\n 0,\n 0,\n 0,\n 32,\n 102,\n 116,\n 121,\n 112,\n 97,\n 118,\n 105,\n 102\n ]\n },\n {\n mediaType: \"image/heic\",\n bytesPrefix: [\n 0,\n 0,\n 0,\n 32,\n 102,\n 116,\n 121,\n 112,\n 104,\n 101,\n 105,\n 99\n ]\n }\n];\nvar audioMediaTypeSignatures = [\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 251]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 250]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 243]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 242]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 227]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 226]\n },\n {\n mediaType: \"audio/wav\",\n bytesPrefix: [\n 82,\n // R\n 73,\n // I\n 70,\n // F\n 70,\n // F\n null,\n null,\n null,\n null,\n 87,\n // W\n 65,\n // A\n 86,\n // V\n 69\n // E\n ]\n },\n {\n mediaType: \"audio/ogg\",\n bytesPrefix: [79, 103, 103, 83]\n },\n {\n mediaType: \"audio/flac\",\n bytesPrefix: [102, 76, 97, 67]\n },\n {\n mediaType: \"audio/aac\",\n bytesPrefix: [64, 21, 0, 0]\n },\n {\n mediaType: \"audio/mp4\",\n bytesPrefix: [102, 116, 121, 112]\n },\n {\n mediaType: \"audio/webm\",\n bytesPrefix: [26, 69, 223, 163]\n }\n];\nvar videoMediaTypeSignatures = [\n {\n mediaType: \"video/mp4\",\n bytesPrefix: [\n 0,\n 0,\n 0,\n null,\n 102,\n 116,\n 121,\n 112\n // ftyp\n ]\n },\n {\n mediaType: \"video/webm\",\n bytesPrefix: [26, 69, 223, 163]\n // EBML\n },\n {\n mediaType: \"video/quicktime\",\n bytesPrefix: [\n 0,\n 0,\n 0,\n 20,\n 102,\n 116,\n 121,\n 112,\n 113,\n 116\n // ftypqt\n ]\n },\n {\n mediaType: \"video/x-msvideo\",\n bytesPrefix: [82, 73, 70, 70]\n // RIFF (AVI)\n }\n];\nvar stripID3 = (data) => {\n const bytes = typeof data === \"string\" ? convertBase64ToUint8Array(data) : data;\n const id3Size = (bytes[6] & 127) << 21 | (bytes[7] & 127) << 14 | (bytes[8] & 127) << 7 | bytes[9] & 127;\n return bytes.slice(id3Size + 10);\n};\nfunction stripID3TagsIfPresent(data) {\n const hasId3 = typeof data === \"string\" && data.startsWith(\"SUQz\") || typeof data !== \"string\" && data.length > 10 && data[0] === 73 && // 'I'\n data[1] === 68 && // 'D'\n data[2] === 51;\n return hasId3 ? stripID3(data) : data;\n}\nfunction detectMediaType({\n data,\n signatures\n}) {\n const processedData = stripID3TagsIfPresent(data);\n const bytes = typeof processedData === \"string\" ? convertBase64ToUint8Array(\n processedData.substring(0, Math.min(processedData.length, 24))\n ) : processedData;\n for (const signature of signatures) {\n if (bytes.length >= signature.bytesPrefix.length && signature.bytesPrefix.every(\n (byte, index) => byte === null || bytes[index] === byte\n )) {\n return signature.mediaType;\n }\n }\n return void 0;\n}\n\n// src/util/download/download.ts\nimport {\n DownloadError as DownloadError2,\n readResponseWithSizeLimit,\n DEFAULT_MAX_DOWNLOAD_SIZE,\n validateDownloadUrl,\n withUserAgentSuffix,\n getRuntimeEnvironmentUserAgent\n} from \"@ai-sdk/provider-utils\";\n\n// src/version.ts\nvar VERSION = true ? \"6.0.197\" : \"0.0.0-test\";\n\n// src/util/download/download.ts\nvar download = async ({\n url,\n maxBytes,\n abortSignal\n}) => {\n var _a21;\n const urlText = url.toString();\n validateDownloadUrl(urlText);\n try {\n const response = await fetch(urlText, {\n headers: withUserAgentSuffix(\n {},\n `ai-sdk/${VERSION}`,\n getRuntimeEnvironmentUserAgent()\n ),\n signal: abortSignal\n });\n if (response.redirected) {\n validateDownloadUrl(response.url);\n }\n if (!response.ok) {\n throw new DownloadError2({\n url: urlText,\n statusCode: response.status,\n statusText: response.statusText\n });\n }\n const data = await readResponseWithSizeLimit({\n response,\n url: urlText,\n maxBytes: maxBytes != null ? maxBytes : DEFAULT_MAX_DOWNLOAD_SIZE\n });\n return {\n data,\n mediaType: (_a21 = response.headers.get(\"content-type\")) != null ? _a21 : void 0\n };\n } catch (error) {\n if (DownloadError2.isInstance(error)) {\n throw error;\n }\n throw new DownloadError2({ url: urlText, cause: error });\n }\n};\n\n// src/util/download/download-function.ts\nvar createDefaultDownloadFunction = (download2 = download) => (requestedDownloads) => Promise.all(\n requestedDownloads.map(\n async (requestedDownload) => requestedDownload.isUrlSupportedByModel ? null : download2(requestedDownload)\n )\n);\n\n// src/prompt/data-content.ts\nimport { AISDKError as AISDKError22 } from \"@ai-sdk/provider\";\nimport {\n convertBase64ToUint8Array as convertBase64ToUint8Array2,\n convertUint8ArrayToBase64\n} from \"@ai-sdk/provider-utils\";\nimport { z } from \"zod/v4\";\n\n// src/prompt/split-data-url.ts\nfunction splitDataUrl(dataUrl) {\n try {\n const [header, base64Content] = dataUrl.split(\",\");\n return {\n mediaType: header.split(\";\")[0].split(\":\")[1],\n base64Content\n };\n } catch (error) {\n return {\n mediaType: void 0,\n base64Content: void 0\n };\n }\n}\n\n// src/prompt/data-content.ts\nvar dataContentSchema = z.union([\n z.string(),\n z.instanceof(Uint8Array),\n z.instanceof(ArrayBuffer),\n z.custom(\n // Buffer might not be available in some environments such as CloudFlare:\n (value) => {\n var _a21, _b;\n return (_b = (_a21 = globalThis.Buffer) == null ? void 0 : _a21.isBuffer(value)) != null ? _b : false;\n },\n { message: \"Must be a Buffer\" }\n )\n]);\nfunction convertToLanguageModelV3DataContent(content) {\n if (content instanceof Uint8Array) {\n return { data: content, mediaType: void 0 };\n }\n if (content instanceof ArrayBuffer) {\n return { data: new Uint8Array(content), mediaType: void 0 };\n }\n if (typeof content === \"string\") {\n try {\n content = new URL(content);\n } catch (error) {\n }\n }\n if (content instanceof URL && content.protocol === \"data:\") {\n const { mediaType: dataUrlMediaType, base64Content } = splitDataUrl(\n content.toString()\n );\n if (dataUrlMediaType == null || base64Content == null) {\n throw new AISDKError22({\n name: \"InvalidDataContentError\",\n message: `Invalid data URL format in content ${content.toString()}`\n });\n }\n return { data: base64Content, mediaType: dataUrlMediaType };\n }\n return { data: content, mediaType: void 0 };\n}\nfunction convertDataContentToBase64String(content) {\n if (typeof content === \"string\") {\n return content;\n }\n if (content instanceof ArrayBuffer) {\n return convertUint8ArrayToBase64(new Uint8Array(content));\n }\n return convertUint8ArrayToBase64(content);\n}\nfunction convertDataContentToUint8Array(content) {\n if (content instanceof Uint8Array) {\n return content;\n }\n if (typeof content === \"string\") {\n try {\n return convertBase64ToUint8Array2(content);\n } catch (error) {\n throw new InvalidDataContentError({\n message: \"Invalid data content. Content string is not a base64-encoded media.\",\n content,\n cause: error\n });\n }\n }\n if (content instanceof ArrayBuffer) {\n return new Uint8Array(content);\n }\n throw new InvalidDataContentError({ content });\n}\n\n// src/prompt/convert-to-language-model-prompt.ts\nasync function convertToLanguageModelPrompt({\n prompt,\n supportedUrls,\n download: download2 = createDefaultDownloadFunction()\n}) {\n const downloadedAssets = await downloadAssets(\n prompt.messages,\n download2,\n supportedUrls\n );\n const approvalIdToToolCallId = /* @__PURE__ */ new Map();\n for (const message of prompt.messages) {\n if (message.role === \"assistant\" && Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part.type === \"tool-approval-request\" && \"approvalId\" in part && \"toolCallId\" in part) {\n approvalIdToToolCallId.set(\n part.approvalId,\n part.toolCallId\n );\n }\n }\n }\n }\n const approvedToolCallIds = /* @__PURE__ */ new Set();\n for (const message of prompt.messages) {\n if (message.role === \"tool\") {\n for (const part of message.content) {\n if (part.type === \"tool-approval-response\") {\n const toolCallId = approvalIdToToolCallId.get(part.approvalId);\n if (toolCallId) {\n approvedToolCallIds.add(toolCallId);\n }\n }\n }\n }\n }\n const messages = [\n ...prompt.system != null ? typeof prompt.system === \"string\" ? [{ role: \"system\", content: prompt.system }] : asArray(prompt.system).map((message) => ({\n role: \"system\",\n content: message.content,\n providerOptions: message.providerOptions\n })) : [],\n ...prompt.messages.map(\n (message) => convertToLanguageModelMessage({ message, downloadedAssets })\n )\n ];\n const combinedMessages = [];\n for (const message of messages) {\n if (message.role !== \"tool\") {\n combinedMessages.push(message);\n continue;\n }\n const lastCombinedMessage = combinedMessages.at(-1);\n if ((lastCombinedMessage == null ? void 0 : lastCombinedMessage.role) === \"tool\") {\n lastCombinedMessage.content.push(...message.content);\n } else {\n combinedMessages.push(message);\n }\n }\n const toolCallIds = /* @__PURE__ */ new Set();\n for (const message of combinedMessages) {\n switch (message.role) {\n case \"assistant\": {\n for (const content of message.content) {\n if (content.type === \"tool-call\" && !content.providerExecuted) {\n toolCallIds.add(content.toolCallId);\n }\n }\n break;\n }\n case \"tool\": {\n for (const content of message.content) {\n if (content.type === \"tool-result\") {\n toolCallIds.delete(content.toolCallId);\n }\n }\n break;\n }\n case \"user\":\n case \"system\":\n for (const id of approvedToolCallIds) {\n toolCallIds.delete(id);\n }\n if (toolCallIds.size > 0) {\n throw new MissingToolResultsError({\n toolCallIds: Array.from(toolCallIds)\n });\n }\n break;\n }\n }\n for (const id of approvedToolCallIds) {\n toolCallIds.delete(id);\n }\n if (toolCallIds.size > 0) {\n throw new MissingToolResultsError({ toolCallIds: Array.from(toolCallIds) });\n }\n return combinedMessages.filter(\n // Filter out empty tool messages (e.g. if they only contained\n // tool-approval-response parts that were removed).\n // This prevents sending invalid empty messages to the provider.\n // Note: provider-executed tool-approval-response parts are preserved.\n (message) => message.role !== \"tool\" || message.content.length > 0\n );\n}\nfunction convertToLanguageModelMessage({\n message,\n downloadedAssets\n}) {\n const role = message.role;\n switch (role) {\n case \"system\": {\n return {\n role: \"system\",\n content: message.content,\n providerOptions: message.providerOptions\n };\n }\n case \"user\": {\n if (typeof message.content === \"string\") {\n return {\n role: \"user\",\n content: [{ type: \"text\", text: message.content }],\n providerOptions: message.providerOptions\n };\n }\n return {\n role: \"user\",\n content: message.content.map((part) => convertPartToLanguageModelPart(part, downloadedAssets)).filter((part) => part.type !== \"text\" || part.text !== \"\"),\n providerOptions: message.providerOptions\n };\n }\n case \"assistant\": {\n if (typeof message.content === \"string\") {\n return {\n role: \"assistant\",\n content: [{ type: \"text\", text: message.content }],\n providerOptions: message.providerOptions\n };\n }\n return {\n role: \"assistant\",\n content: message.content.filter(\n // remove empty text parts (no text, and no provider options):\n (part) => part.type !== \"text\" || part.text !== \"\" || part.providerOptions != null\n ).filter(\n (part) => part.type !== \"tool-approval-request\"\n ).map((part) => {\n const providerOptions = part.providerOptions;\n switch (part.type) {\n case \"file\": {\n const { data, mediaType } = convertToLanguageModelV3DataContent(\n part.data\n );\n return {\n type: \"file\",\n data,\n filename: part.filename,\n mediaType: mediaType != null ? mediaType : part.mediaType,\n providerOptions\n };\n }\n case \"reasoning\": {\n return {\n type: \"reasoning\",\n text: part.text,\n providerOptions\n };\n }\n case \"text\": {\n return {\n type: \"text\",\n text: part.text,\n providerOptions\n };\n }\n case \"tool-call\": {\n return {\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n providerExecuted: part.providerExecuted,\n providerOptions\n };\n }\n case \"tool-result\": {\n return {\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output: mapToolResultOutput({\n output: part.output,\n downloadedAssets\n }),\n providerOptions\n };\n }\n }\n }),\n providerOptions: message.providerOptions\n };\n }\n case \"tool\": {\n return {\n role: \"tool\",\n content: message.content.filter(\n // Only include tool-approval-response for provider-executed tools\n (part) => part.type !== \"tool-approval-response\" || part.providerExecuted\n ).map((part) => {\n switch (part.type) {\n case \"tool-result\": {\n return {\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output: mapToolResultOutput({\n output: part.output,\n downloadedAssets\n }),\n providerOptions: part.providerOptions\n };\n }\n case \"tool-approval-response\": {\n return {\n type: \"tool-approval-response\",\n approvalId: part.approvalId,\n approved: part.approved,\n reason: part.reason\n };\n }\n }\n }),\n providerOptions: message.providerOptions\n };\n }\n default: {\n const _exhaustiveCheck = role;\n throw new InvalidMessageRoleError({ role: _exhaustiveCheck });\n }\n }\n}\nasync function downloadAssets(messages, download2, supportedUrls) {\n var _a21;\n const downloadableFiles = [];\n for (const message of messages) {\n if (message.role === \"user\" && Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part.type === \"image\" || part.type === \"file\") {\n downloadableFiles.push({\n data: part.type === \"image\" ? part.image : part.data,\n mediaType: (_a21 = part.mediaType) != null ? _a21 : part.type === \"image\" ? \"image/*\" : void 0\n });\n }\n }\n }\n if (message.role === \"tool\" || message.role === \"assistant\") {\n if (!Array.isArray(message.content)) {\n continue;\n }\n for (const part of message.content) {\n if (part.type !== \"tool-result\") {\n continue;\n }\n if (part.output.type !== \"content\") {\n continue;\n }\n for (const contentPart of part.output.value) {\n if (contentPart.type === \"image-url\" || contentPart.type === \"file-url\") {\n downloadableFiles.push({\n data: new URL(contentPart.url),\n mediaType: contentPart.type === \"image-url\" ? \"image/*\" : void 0\n });\n }\n }\n }\n }\n }\n const plannedDownloads = downloadableFiles.map((part) => {\n const mediaType = part.mediaType;\n const { data } = convertToLanguageModelV3DataContent(part.data);\n return { mediaType, data };\n }).filter(\n (part) => part.data instanceof URL\n ).map((part) => ({\n url: part.data,\n isUrlSupportedByModel: part.mediaType != null && isUrlSupported({\n url: part.data.toString(),\n mediaType: part.mediaType,\n supportedUrls\n })\n }));\n const downloadedFiles = await download2(plannedDownloads);\n return Object.fromEntries(\n downloadedFiles.map(\n (file, index) => file == null ? null : [\n plannedDownloads[index].url.toString(),\n { data: file.data, mediaType: file.mediaType }\n ]\n ).filter((file) => file != null)\n );\n}\nfunction convertPartToLanguageModelPart(part, downloadedAssets) {\n var _a21;\n if (part.type === \"text\") {\n return {\n type: \"text\",\n text: part.text,\n providerOptions: part.providerOptions\n };\n }\n let originalData;\n const type = part.type;\n switch (type) {\n case \"image\":\n originalData = part.image;\n break;\n case \"file\":\n originalData = part.data;\n break;\n default:\n throw new Error(`Unsupported part type: ${type}`);\n }\n const { data: convertedData, mediaType: convertedMediaType } = convertToLanguageModelV3DataContent(originalData);\n let mediaType = convertedMediaType != null ? convertedMediaType : part.mediaType;\n let data = convertedData;\n if (data instanceof URL) {\n const downloadedFile = downloadedAssets[data.toString()];\n if (downloadedFile) {\n data = downloadedFile.data;\n mediaType != null ? mediaType : mediaType = downloadedFile.mediaType;\n }\n }\n switch (type) {\n case \"image\": {\n if (data instanceof Uint8Array || typeof data === \"string\") {\n mediaType = (_a21 = detectMediaType({ data, signatures: imageMediaTypeSignatures })) != null ? _a21 : mediaType;\n }\n return {\n type: \"file\",\n mediaType: mediaType != null ? mediaType : \"image/*\",\n // any image\n filename: void 0,\n data,\n providerOptions: part.providerOptions\n };\n }\n case \"file\": {\n if (mediaType == null) {\n throw new Error(`Media type is missing for file part`);\n }\n return {\n type: \"file\",\n mediaType,\n filename: part.filename,\n data,\n providerOptions: part.providerOptions\n };\n }\n }\n}\nfunction mapToolResultOutput({\n output,\n downloadedAssets\n}) {\n if (output.type !== \"content\") {\n return output;\n }\n return {\n type: \"content\",\n value: output.value.map((item) => {\n var _a21, _b;\n if (item.type === \"image-url\") {\n const downloadedFile = downloadedAssets[new URL(item.url).toString()];\n if (downloadedFile) {\n return {\n type: \"image-data\",\n data: convertDataContentToBase64String(downloadedFile.data),\n mediaType: (_a21 = downloadedFile.mediaType) != null ? _a21 : \"image/*\",\n providerOptions: item.providerOptions\n };\n }\n return item;\n }\n if (item.type === \"file-url\") {\n const downloadedFile = downloadedAssets[new URL(item.url).toString()];\n if (downloadedFile) {\n return {\n type: \"file-data\",\n data: convertDataContentToBase64String(downloadedFile.data),\n mediaType: (_b = downloadedFile.mediaType) != null ? _b : \"application/octet-stream\",\n providerOptions: item.providerOptions\n };\n }\n return item;\n }\n if (item.type !== \"media\") {\n return item;\n }\n if (item.mediaType.startsWith(\"image/\")) {\n return {\n type: \"image-data\",\n data: item.data,\n mediaType: item.mediaType\n };\n }\n return {\n type: \"file-data\",\n data: item.data,\n mediaType: item.mediaType\n };\n })\n };\n}\n\n// src/prompt/create-tool-model-output.ts\nimport { getErrorMessage as getErrorMessage3 } from \"@ai-sdk/provider\";\nasync function createToolModelOutput({\n toolCallId,\n input,\n output,\n tool: tool2,\n errorMode\n}) {\n if (errorMode === \"text\") {\n return { type: \"error-text\", value: getErrorMessage3(output) };\n } else if (errorMode === \"json\") {\n return { type: \"error-json\", value: toJSONValue(output) };\n }\n if (tool2 == null ? void 0 : tool2.toModelOutput) {\n return await tool2.toModelOutput({ toolCallId, input, output });\n }\n return typeof output === \"string\" ? { type: \"text\", value: output } : { type: \"json\", value: toJSONValue(output) };\n}\nfunction toJSONValue(value) {\n return value === void 0 ? null : value;\n}\n\n// src/prompt/prepare-call-settings.ts\nfunction prepareCallSettings({\n maxOutputTokens,\n temperature,\n topP,\n topK,\n presencePenalty,\n frequencyPenalty,\n seed,\n stopSequences\n}) {\n if (maxOutputTokens != null) {\n if (!Number.isInteger(maxOutputTokens)) {\n throw new InvalidArgumentError({\n parameter: \"maxOutputTokens\",\n value: maxOutputTokens,\n message: \"maxOutputTokens must be an integer\"\n });\n }\n if (maxOutputTokens < 1) {\n throw new InvalidArgumentError({\n parameter: \"maxOutputTokens\",\n value: maxOutputTokens,\n message: \"maxOutputTokens must be >= 1\"\n });\n }\n }\n if (temperature != null) {\n if (typeof temperature !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"temperature\",\n value: temperature,\n message: \"temperature must be a number\"\n });\n }\n }\n if (topP != null) {\n if (typeof topP !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"topP\",\n value: topP,\n message: \"topP must be a number\"\n });\n }\n }\n if (topK != null) {\n if (typeof topK !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"topK\",\n value: topK,\n message: \"topK must be a number\"\n });\n }\n }\n if (presencePenalty != null) {\n if (typeof presencePenalty !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"presencePenalty\",\n value: presencePenalty,\n message: \"presencePenalty must be a number\"\n });\n }\n }\n if (frequencyPenalty != null) {\n if (typeof frequencyPenalty !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"frequencyPenalty\",\n value: frequencyPenalty,\n message: \"frequencyPenalty must be a number\"\n });\n }\n }\n if (seed != null) {\n if (!Number.isInteger(seed)) {\n throw new InvalidArgumentError({\n parameter: \"seed\",\n value: seed,\n message: \"seed must be an integer\"\n });\n }\n }\n return {\n maxOutputTokens,\n temperature,\n topP,\n topK,\n presencePenalty,\n frequencyPenalty,\n stopSequences,\n seed\n };\n}\n\n// src/prompt/prepare-tools-and-tool-choice.ts\nimport { asSchema } from \"@ai-sdk/provider-utils\";\n\n// src/util/is-non-empty-object.ts\nfunction isNonEmptyObject(object2) {\n return object2 != null && Object.keys(object2).length > 0;\n}\n\n// src/prompt/prepare-tools-and-tool-choice.ts\nasync function prepareToolsAndToolChoice({\n tools,\n toolChoice,\n activeTools\n}) {\n if (!isNonEmptyObject(tools)) {\n return {\n tools: void 0,\n toolChoice: void 0\n };\n }\n const filteredTools = activeTools != null ? Object.entries(tools).filter(\n ([name21]) => activeTools.includes(name21)\n ) : Object.entries(tools);\n const languageModelTools = [];\n for (const [name21, tool2] of filteredTools) {\n const toolType = tool2.type;\n switch (toolType) {\n case void 0:\n case \"dynamic\":\n case \"function\":\n languageModelTools.push({\n type: \"function\",\n name: name21,\n description: tool2.description,\n inputSchema: await asSchema(tool2.inputSchema).jsonSchema,\n ...tool2.inputExamples != null ? { inputExamples: tool2.inputExamples } : {},\n providerOptions: tool2.providerOptions,\n ...tool2.strict != null ? { strict: tool2.strict } : {}\n });\n break;\n case \"provider\":\n languageModelTools.push({\n type: \"provider\",\n name: name21,\n id: tool2.id,\n args: tool2.args\n });\n break;\n default: {\n const exhaustiveCheck = toolType;\n throw new Error(`Unsupported tool type: ${exhaustiveCheck}`);\n }\n }\n }\n return {\n tools: languageModelTools,\n toolChoice: toolChoice == null ? { type: \"auto\" } : typeof toolChoice === \"string\" ? { type: toolChoice } : { type: \"tool\", toolName: toolChoice.toolName }\n };\n}\n\n// src/prompt/standardize-prompt.ts\nimport { InvalidPromptError as InvalidPromptError2 } from \"@ai-sdk/provider\";\nimport {\n safeValidateTypes\n} from \"@ai-sdk/provider-utils\";\nimport { z as z6 } from \"zod/v4\";\n\n// src/prompt/message.ts\nimport { z as z5 } from \"zod/v4\";\n\n// src/types/provider-metadata.ts\nimport { z as z3 } from \"zod/v4\";\n\n// src/types/json-value.ts\nimport { z as z2 } from \"zod/v4\";\nvar jsonValueSchema = z2.lazy(\n () => z2.union([\n z2.null(),\n z2.string(),\n z2.number(),\n z2.boolean(),\n z2.record(z2.string(), jsonValueSchema.optional()),\n z2.array(jsonValueSchema)\n ])\n);\n\n// src/types/provider-metadata.ts\nvar providerMetadataSchema = z3.record(\n z3.string(),\n z3.record(z3.string(), jsonValueSchema.optional())\n);\n\n// src/prompt/content-part.ts\nimport { z as z4 } from \"zod/v4\";\nvar textPartSchema = z4.object({\n type: z4.literal(\"text\"),\n text: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n});\nvar imagePartSchema = z4.object({\n type: z4.literal(\"image\"),\n image: z4.union([dataContentSchema, z4.instanceof(URL)]),\n mediaType: z4.string().optional(),\n providerOptions: providerMetadataSchema.optional()\n});\nvar filePartSchema = z4.object({\n type: z4.literal(\"file\"),\n data: z4.union([dataContentSchema, z4.instanceof(URL)]),\n filename: z4.string().optional(),\n mediaType: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n});\nvar reasoningPartSchema = z4.object({\n type: z4.literal(\"reasoning\"),\n text: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n});\nvar toolCallPartSchema = z4.object({\n type: z4.literal(\"tool-call\"),\n toolCallId: z4.string(),\n toolName: z4.string(),\n input: z4.unknown(),\n providerOptions: providerMetadataSchema.optional(),\n providerExecuted: z4.boolean().optional()\n});\nvar outputSchema = z4.discriminatedUnion(\n \"type\",\n [\n z4.object({\n type: z4.literal(\"text\"),\n value: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"json\"),\n value: jsonValueSchema,\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"execution-denied\"),\n reason: z4.string().optional(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"error-text\"),\n value: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"error-json\"),\n value: jsonValueSchema,\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"content\"),\n value: z4.array(\n z4.union([\n z4.object({\n type: z4.literal(\"text\"),\n text: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"media\"),\n data: z4.string(),\n mediaType: z4.string()\n }),\n z4.object({\n type: z4.literal(\"file-data\"),\n data: z4.string(),\n mediaType: z4.string(),\n filename: z4.string().optional(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"file-url\"),\n url: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"file-id\"),\n fileId: z4.union([z4.string(), z4.record(z4.string(), z4.string())]),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"image-data\"),\n data: z4.string(),\n mediaType: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"image-url\"),\n url: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"image-file-id\"),\n fileId: z4.union([z4.string(), z4.record(z4.string(), z4.string())]),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"custom\"),\n providerOptions: providerMetadataSchema.optional()\n })\n ])\n )\n })\n ]\n);\nvar toolResultPartSchema = z4.object({\n type: z4.literal(\"tool-result\"),\n toolCallId: z4.string(),\n toolName: z4.string(),\n output: outputSchema,\n providerOptions: providerMetadataSchema.optional()\n});\nvar toolApprovalRequestSchema = z4.object({\n type: z4.literal(\"tool-approval-request\"),\n approvalId: z4.string(),\n toolCallId: z4.string()\n});\nvar toolApprovalResponseSchema = z4.object({\n type: z4.literal(\"tool-approval-response\"),\n approvalId: z4.string(),\n approved: z4.boolean(),\n reason: z4.string().optional()\n});\n\n// src/prompt/message.ts\nvar systemModelMessageSchema = z5.object(\n {\n role: z5.literal(\"system\"),\n content: z5.string(),\n providerOptions: providerMetadataSchema.optional()\n }\n);\nvar userModelMessageSchema = z5.object({\n role: z5.literal(\"user\"),\n content: z5.union([\n z5.string(),\n z5.array(z5.union([textPartSchema, imagePartSchema, filePartSchema]))\n ]),\n providerOptions: providerMetadataSchema.optional()\n});\nvar assistantModelMessageSchema = z5.object({\n role: z5.literal(\"assistant\"),\n content: z5.union([\n z5.string(),\n z5.array(\n z5.union([\n textPartSchema,\n filePartSchema,\n reasoningPartSchema,\n toolCallPartSchema,\n toolResultPartSchema,\n toolApprovalRequestSchema\n ])\n )\n ]),\n providerOptions: providerMetadataSchema.optional()\n});\nvar toolModelMessageSchema = z5.object({\n role: z5.literal(\"tool\"),\n content: z5.array(z5.union([toolResultPartSchema, toolApprovalResponseSchema])),\n providerOptions: providerMetadataSchema.optional()\n});\nvar modelMessageSchema = z5.union([\n systemModelMessageSchema,\n userModelMessageSchema,\n assistantModelMessageSchema,\n toolModelMessageSchema\n]);\n\n// src/prompt/standardize-prompt.ts\nasync function standardizePrompt({\n allowSystemInMessages,\n system,\n prompt,\n messages\n}) {\n if (prompt == null && messages == null) {\n throw new InvalidPromptError2({\n prompt,\n message: \"prompt or messages must be defined\"\n });\n }\n if (prompt != null && messages != null) {\n throw new InvalidPromptError2({\n prompt,\n message: \"prompt and messages cannot be defined at the same time\"\n });\n }\n if (typeof system !== \"string\" && !asArray(system).every((message) => message.role === \"system\")) {\n throw new InvalidPromptError2({\n prompt,\n message: \"system must be a string, SystemModelMessage, or array of SystemModelMessage\"\n });\n }\n if (prompt != null && typeof prompt === \"string\") {\n messages = [{ role: \"user\", content: prompt }];\n } else if (prompt != null && Array.isArray(prompt)) {\n messages = prompt;\n } else if (messages == null) {\n throw new InvalidPromptError2({\n prompt,\n message: \"prompt or messages must be defined\"\n });\n }\n if (messages.length === 0) {\n throw new InvalidPromptError2({\n prompt,\n message: \"messages must not be empty\"\n });\n }\n if (messages.some((message) => message.role === \"system\")) {\n if (allowSystemInMessages === false) {\n throw new InvalidPromptError2({\n prompt,\n message: \"System messages are not allowed in the prompt or messages fields. Use the system option instead.\"\n });\n }\n if (allowSystemInMessages === void 0) {\n console.warn(\n \"AI SDK Warning: System messages in the prompt or messages fields can be a security risk because they may enable prompt injection attacks. Use the system option instead when possible. Set allowSystemInMessages to true to suppress this warning, or false to throw an error.\"\n );\n }\n }\n const validationResult = await safeValidateTypes({\n value: messages,\n schema: z6.array(modelMessageSchema)\n });\n if (!validationResult.success) {\n throw new InvalidPromptError2({\n prompt,\n message: \"The messages do not match the ModelMessage[] schema.\",\n cause: validationResult.error\n });\n }\n return { messages, system };\n}\n\n// src/prompt/wrap-gateway-error.ts\nimport { GatewayAuthenticationError } from \"@ai-sdk/gateway\";\nimport { AISDKError as AISDKError23 } from \"@ai-sdk/provider\";\nfunction wrapGatewayError(error) {\n if (!GatewayAuthenticationError.isInstance(error))\n return error;\n const isProductionEnv = (process == null ? void 0 : process.env.NODE_ENV) === \"production\";\n const moreInfoURL = \"https://ai-sdk.dev/unauthenticated-ai-gateway\";\n if (isProductionEnv) {\n return new AISDKError23({\n name: \"GatewayError\",\n message: `Unauthenticated. Configure AI_GATEWAY_API_KEY or use a provider module. Learn more: ${moreInfoURL}`\n });\n }\n return Object.assign(\n new Error(`\\x1B[1m\\x1B[31mUnauthenticated request to AI Gateway.\\x1B[0m\n\nTo authenticate, set the \\x1B[33mAI_GATEWAY_API_KEY\\x1B[0m environment variable with your API key.\n\nAlternatively, you can use a provider module instead of the AI Gateway.\n\nLearn more: \\x1B[34m${moreInfoURL}\\x1B[0m\n\n`),\n { name: \"GatewayAuthenticationError\" }\n );\n}\n\n// src/telemetry/assemble-operation-name.ts\nfunction assembleOperationName({\n operationId,\n telemetry\n}) {\n return {\n // standardized operation and resource name:\n \"operation.name\": `${operationId}${(telemetry == null ? void 0 : telemetry.functionId) != null ? ` ${telemetry.functionId}` : \"\"}`,\n \"resource.name\": telemetry == null ? void 0 : telemetry.functionId,\n // detailed, AI SDK specific data:\n \"ai.operationId\": operationId,\n \"ai.telemetry.functionId\": telemetry == null ? void 0 : telemetry.functionId\n };\n}\n\n// src/telemetry/get-base-telemetry-attributes.ts\nfunction getBaseTelemetryAttributes({\n model,\n settings,\n telemetry,\n headers\n}) {\n var _a21;\n return {\n \"ai.model.provider\": model.provider,\n \"ai.model.id\": model.modelId,\n // settings:\n ...Object.entries(settings).reduce((attributes, [key, value]) => {\n if (key === \"timeout\") {\n const totalTimeoutMs = getTotalTimeoutMs(\n value\n );\n if (totalTimeoutMs != null) {\n attributes[`ai.settings.${key}`] = totalTimeoutMs;\n }\n } else {\n attributes[`ai.settings.${key}`] = value;\n }\n return attributes;\n }, {}),\n // add metadata as attributes:\n ...Object.entries((_a21 = telemetry == null ? void 0 : telemetry.metadata) != null ? _a21 : {}).reduce(\n (attributes, [key, value]) => {\n attributes[`ai.telemetry.metadata.${key}`] = value;\n return attributes;\n },\n {}\n ),\n // request headers\n ...Object.entries(headers != null ? headers : {}).reduce((attributes, [key, value]) => {\n if (value !== void 0) {\n attributes[`ai.request.headers.${key}`] = value;\n }\n return attributes;\n }, {})\n };\n}\n\n// src/telemetry/get-tracer.ts\nimport { trace } from \"@opentelemetry/api\";\n\n// src/telemetry/noop-tracer.ts\nvar noopTracer = {\n startSpan() {\n return noopSpan;\n },\n startActiveSpan(name21, arg1, arg2, arg3) {\n if (typeof arg1 === \"function\") {\n return arg1(noopSpan);\n }\n if (typeof arg2 === \"function\") {\n return arg2(noopSpan);\n }\n if (typeof arg3 === \"function\") {\n return arg3(noopSpan);\n }\n }\n};\nvar noopSpan = {\n spanContext() {\n return noopSpanContext;\n },\n setAttribute() {\n return this;\n },\n setAttributes() {\n return this;\n },\n addEvent() {\n return this;\n },\n addLink() {\n return this;\n },\n addLinks() {\n return this;\n },\n setStatus() {\n return this;\n },\n updateName() {\n return this;\n },\n end() {\n return this;\n },\n isRecording() {\n return false;\n },\n recordException() {\n return this;\n }\n};\nvar noopSpanContext = {\n traceId: \"\",\n spanId: \"\",\n traceFlags: 0\n};\n\n// src/telemetry/get-tracer.ts\nfunction getTracer({\n isEnabled = false,\n tracer\n} = {}) {\n if (!isEnabled) {\n return noopTracer;\n }\n if (tracer) {\n return tracer;\n }\n return trace.getTracer(\"ai\");\n}\n\n// src/telemetry/record-span.ts\nimport {\n SpanStatusCode,\n context\n} from \"@opentelemetry/api\";\nasync function recordSpan({\n name: name21,\n tracer,\n attributes,\n fn,\n endWhenDone = true\n}) {\n return tracer.startActiveSpan(\n name21,\n { attributes: await attributes },\n async (span) => {\n const ctx = context.active();\n try {\n const result = await context.with(ctx, () => fn(span));\n if (endWhenDone) {\n span.end();\n }\n return result;\n } catch (error) {\n try {\n recordErrorOnSpan(span, error);\n } finally {\n span.end();\n }\n throw error;\n }\n }\n );\n}\nfunction recordErrorOnSpan(span, error) {\n if (error instanceof Error) {\n span.recordException({\n name: error.name,\n message: error.message,\n stack: error.stack\n });\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message\n });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n}\n\n// src/telemetry/select-telemetry-attributes.ts\nasync function selectTelemetryAttributes({\n telemetry,\n attributes\n}) {\n if ((telemetry == null ? void 0 : telemetry.isEnabled) !== true) {\n return {};\n }\n const resultAttributes = {};\n for (const [key, value] of Object.entries(attributes)) {\n if (value == null) {\n continue;\n }\n if (typeof value === \"object\" && \"input\" in value && typeof value.input === \"function\") {\n if ((telemetry == null ? void 0 : telemetry.recordInputs) === false) {\n continue;\n }\n const result = await value.input();\n if (result != null) {\n resultAttributes[key] = result;\n }\n continue;\n }\n if (typeof value === \"object\" && \"output\" in value && typeof value.output === \"function\") {\n if ((telemetry == null ? void 0 : telemetry.recordOutputs) === false) {\n continue;\n }\n const result = await value.output();\n if (result != null) {\n resultAttributes[key] = result;\n }\n continue;\n }\n resultAttributes[key] = value;\n }\n return resultAttributes;\n}\n\n// src/telemetry/stringify-for-telemetry.ts\nfunction stringifyForTelemetry(prompt) {\n return JSON.stringify(\n prompt.map((message) => ({\n ...message,\n content: typeof message.content === \"string\" ? message.content : message.content.map(\n (part) => part.type === \"file\" ? {\n ...part,\n data: part.data instanceof Uint8Array ? convertDataContentToBase64String(part.data) : part.data\n } : part\n )\n }))\n );\n}\n\n// src/telemetry/telemetry-integration-registry.ts\nfunction registerTelemetryIntegration(integration) {\n if (!globalThis.AI_SDK_TELEMETRY_INTEGRATIONS) {\n globalThis.AI_SDK_TELEMETRY_INTEGRATIONS = [];\n }\n globalThis.AI_SDK_TELEMETRY_INTEGRATIONS.push(integration);\n}\nfunction getGlobalTelemetryIntegrations() {\n var _a21;\n return (_a21 = globalThis.AI_SDK_TELEMETRY_INTEGRATIONS) != null ? _a21 : [];\n}\n\n// src/telemetry/get-global-telemetry-integration.ts\nfunction bindTelemetryIntegration(integration) {\n var _a21, _b, _c, _d, _e, _f;\n return {\n onStart: (_a21 = integration.onStart) == null ? void 0 : _a21.bind(integration),\n onStepStart: (_b = integration.onStepStart) == null ? void 0 : _b.bind(integration),\n onToolCallStart: (_c = integration.onToolCallStart) == null ? void 0 : _c.bind(integration),\n onToolCallFinish: (_d = integration.onToolCallFinish) == null ? void 0 : _d.bind(integration),\n onStepFinish: (_e = integration.onStepFinish) == null ? void 0 : _e.bind(integration),\n onFinish: (_f = integration.onFinish) == null ? void 0 : _f.bind(integration)\n };\n}\nfunction getGlobalTelemetryIntegration() {\n const globalIntegrations = getGlobalTelemetryIntegrations();\n return (integrations) => {\n const localIntegrations = asArray(integrations);\n const allIntegrations = [...globalIntegrations, ...localIntegrations];\n function createTelemetryComposite(getListenerFromIntegration) {\n const listeners = allIntegrations.map(getListenerFromIntegration).filter(Boolean);\n return async (event) => {\n for (const listener of listeners) {\n try {\n await listener(event);\n } catch (_ignored) {\n }\n }\n };\n }\n return {\n onStart: createTelemetryComposite((integration) => integration.onStart),\n onStepStart: createTelemetryComposite(\n (integration) => integration.onStepStart\n ),\n onToolCallStart: createTelemetryComposite(\n (integration) => integration.onToolCallStart\n ),\n onToolCallFinish: createTelemetryComposite(\n (integration) => integration.onToolCallFinish\n ),\n onStepFinish: createTelemetryComposite(\n (integration) => integration.onStepFinish\n ),\n onFinish: createTelemetryComposite((integration) => integration.onFinish)\n };\n };\n}\n\n// src/types/usage.ts\nfunction asLanguageModelUsage(usage) {\n return {\n inputTokens: usage.inputTokens.total,\n inputTokenDetails: {\n noCacheTokens: usage.inputTokens.noCache,\n cacheReadTokens: usage.inputTokens.cacheRead,\n cacheWriteTokens: usage.inputTokens.cacheWrite\n },\n outputTokens: usage.outputTokens.total,\n outputTokenDetails: {\n textTokens: usage.outputTokens.text,\n reasoningTokens: usage.outputTokens.reasoning\n },\n totalTokens: addTokenCounts(\n usage.inputTokens.total,\n usage.outputTokens.total\n ),\n raw: usage.raw,\n reasoningTokens: usage.outputTokens.reasoning,\n cachedInputTokens: usage.inputTokens.cacheRead\n };\n}\nfunction createNullLanguageModelUsage() {\n return {\n inputTokens: void 0,\n inputTokenDetails: {\n noCacheTokens: void 0,\n cacheReadTokens: void 0,\n cacheWriteTokens: void 0\n },\n outputTokens: void 0,\n outputTokenDetails: {\n textTokens: void 0,\n reasoningTokens: void 0\n },\n totalTokens: void 0,\n raw: void 0\n };\n}\nfunction addLanguageModelUsage(usage1, usage2) {\n var _a21, _b, _c, _d, _e, _f, _g, _h, _i, _j;\n return {\n inputTokens: addTokenCounts(usage1.inputTokens, usage2.inputTokens),\n inputTokenDetails: {\n noCacheTokens: addTokenCounts(\n (_a21 = usage1.inputTokenDetails) == null ? void 0 : _a21.noCacheTokens,\n (_b = usage2.inputTokenDetails) == null ? void 0 : _b.noCacheTokens\n ),\n cacheReadTokens: addTokenCounts(\n (_c = usage1.inputTokenDetails) == null ? void 0 : _c.cacheReadTokens,\n (_d = usage2.inputTokenDetails) == null ? void 0 : _d.cacheReadTokens\n ),\n cacheWriteTokens: addTokenCounts(\n (_e = usage1.inputTokenDetails) == null ? void 0 : _e.cacheWriteTokens,\n (_f = usage2.inputTokenDetails) == null ? void 0 : _f.cacheWriteTokens\n )\n },\n outputTokens: addTokenCounts(usage1.outputTokens, usage2.outputTokens),\n outputTokenDetails: {\n textTokens: addTokenCounts(\n (_g = usage1.outputTokenDetails) == null ? void 0 : _g.textTokens,\n (_h = usage2.outputTokenDetails) == null ? void 0 : _h.textTokens\n ),\n reasoningTokens: addTokenCounts(\n (_i = usage1.outputTokenDetails) == null ? void 0 : _i.reasoningTokens,\n (_j = usage2.outputTokenDetails) == null ? void 0 : _j.reasoningTokens\n )\n },\n totalTokens: addTokenCounts(usage1.totalTokens, usage2.totalTokens),\n reasoningTokens: addTokenCounts(\n usage1.reasoningTokens,\n usage2.reasoningTokens\n ),\n cachedInputTokens: addTokenCounts(\n usage1.cachedInputTokens,\n usage2.cachedInputTokens\n )\n };\n}\nfunction addTokenCounts(tokenCount1, tokenCount2) {\n return tokenCount1 == null && tokenCount2 == null ? void 0 : (tokenCount1 != null ? tokenCount1 : 0) + (tokenCount2 != null ? tokenCount2 : 0);\n}\nfunction addImageModelUsage(usage1, usage2) {\n return {\n inputTokens: addTokenCounts(usage1.inputTokens, usage2.inputTokens),\n outputTokens: addTokenCounts(usage1.outputTokens, usage2.outputTokens),\n totalTokens: addTokenCounts(usage1.totalTokens, usage2.totalTokens)\n };\n}\n\n// src/util/merge-objects.ts\nfunction mergeObjects(base, overrides) {\n if (base === void 0 && overrides === void 0) {\n return void 0;\n }\n if (base === void 0) {\n return overrides;\n }\n if (overrides === void 0) {\n return base;\n }\n const result = { ...base };\n for (const key in overrides) {\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") {\n continue;\n }\n if (Object.prototype.hasOwnProperty.call(overrides, key)) {\n const overridesValue = overrides[key];\n if (overridesValue === void 0)\n continue;\n const baseValue = key in base ? base[key] : void 0;\n const isSourceObject = overridesValue !== null && typeof overridesValue === \"object\" && !Array.isArray(overridesValue) && !(overridesValue instanceof Date) && !(overridesValue instanceof RegExp);\n const isTargetObject = baseValue !== null && baseValue !== void 0 && typeof baseValue === \"object\" && !Array.isArray(baseValue) && !(baseValue instanceof Date) && !(baseValue instanceof RegExp);\n if (isSourceObject && isTargetObject) {\n result[key] = mergeObjects(\n baseValue,\n overridesValue\n );\n } else {\n result[key] = overridesValue;\n }\n }\n }\n return result;\n}\n\n// src/util/retry-with-exponential-backoff.ts\nimport { APICallError as APICallError2 } from \"@ai-sdk/provider\";\nimport { GatewayError } from \"@ai-sdk/gateway\";\nimport { delay, getErrorMessage as getErrorMessage4, isAbortError } from \"@ai-sdk/provider-utils\";\nfunction getRetryDelayInMs({\n error,\n exponentialBackoffDelay\n}) {\n const headers = APICallError2.isInstance(error) ? error.responseHeaders : APICallError2.isInstance(error.cause) ? error.cause.responseHeaders : void 0;\n if (!headers)\n return exponentialBackoffDelay;\n let ms;\n const retryAfterMs = headers[\"retry-after-ms\"];\n if (retryAfterMs) {\n const timeoutMs = parseFloat(retryAfterMs);\n if (!Number.isNaN(timeoutMs)) {\n ms = timeoutMs;\n }\n }\n const retryAfter = headers[\"retry-after\"];\n if (retryAfter && ms === void 0) {\n const timeoutSeconds = parseFloat(retryAfter);\n if (!Number.isNaN(timeoutSeconds)) {\n ms = timeoutSeconds * 1e3;\n } else {\n ms = Date.parse(retryAfter) - Date.now();\n }\n }\n if (ms != null && !Number.isNaN(ms) && 0 <= ms && (ms < 60 * 1e3 || ms < exponentialBackoffDelay)) {\n return ms;\n }\n return exponentialBackoffDelay;\n}\nvar retryWithExponentialBackoffRespectingRetryHeaders = ({\n maxRetries = 2,\n initialDelayInMs = 2e3,\n backoffFactor = 2,\n abortSignal\n} = {}) => async (f) => _retryWithExponentialBackoff(f, {\n maxRetries,\n delayInMs: initialDelayInMs,\n backoffFactor,\n abortSignal\n});\nasync function _retryWithExponentialBackoff(f, {\n maxRetries,\n delayInMs,\n backoffFactor,\n abortSignal\n}, errors = []) {\n try {\n return await f();\n } catch (error) {\n if (isAbortError(error)) {\n throw error;\n }\n if (maxRetries === 0) {\n throw error;\n }\n const errorMessage = getErrorMessage4(error);\n const newErrors = [...errors, error];\n const tryNumber = newErrors.length;\n if (tryNumber > maxRetries) {\n throw new RetryError({\n message: `Failed after ${tryNumber} attempts. Last error: ${errorMessage}`,\n reason: \"maxRetriesExceeded\",\n errors: newErrors\n });\n }\n if (error instanceof Error && (APICallError2.isInstance(error) && error.isRetryable === true || GatewayError.isInstance(error) && error.isRetryable === true) && tryNumber <= maxRetries) {\n await delay(\n getRetryDelayInMs({\n error,\n exponentialBackoffDelay: delayInMs\n }),\n { abortSignal }\n );\n return _retryWithExponentialBackoff(\n f,\n {\n maxRetries,\n delayInMs: backoffFactor * delayInMs,\n backoffFactor,\n abortSignal\n },\n newErrors\n );\n }\n if (tryNumber === 1) {\n throw error;\n }\n throw new RetryError({\n message: `Failed after ${tryNumber} attempts with non-retryable error: '${errorMessage}'`,\n reason: \"errorNotRetryable\",\n errors: newErrors\n });\n }\n}\n\n// src/util/prepare-retries.ts\nfunction prepareRetries({\n maxRetries,\n abortSignal\n}) {\n if (maxRetries != null) {\n if (!Number.isInteger(maxRetries)) {\n throw new InvalidArgumentError({\n parameter: \"maxRetries\",\n value: maxRetries,\n message: \"maxRetries must be an integer\"\n });\n }\n if (maxRetries < 0) {\n throw new InvalidArgumentError({\n parameter: \"maxRetries\",\n value: maxRetries,\n message: \"maxRetries must be >= 0\"\n });\n }\n }\n const maxRetriesResult = maxRetries != null ? maxRetries : 2;\n return {\n maxRetries: maxRetriesResult,\n retry: retryWithExponentialBackoffRespectingRetryHeaders({\n maxRetries: maxRetriesResult,\n abortSignal\n })\n };\n}\n\n// src/generate-text/collect-tool-approvals.ts\nfunction collectToolApprovals({\n messages\n}) {\n const lastMessage = messages.at(-1);\n if ((lastMessage == null ? void 0 : lastMessage.role) != \"tool\") {\n return {\n approvedToolApprovals: [],\n deniedToolApprovals: []\n };\n }\n const toolCallsByToolCallId = {};\n for (const message of messages) {\n if (message.role === \"assistant\" && typeof message.content !== \"string\") {\n const content = message.content;\n for (const part of content) {\n if (part.type === \"tool-call\") {\n toolCallsByToolCallId[part.toolCallId] = part;\n }\n }\n }\n }\n const toolApprovalRequestsByApprovalId = {};\n for (const message of messages) {\n if (message.role === \"assistant\" && typeof message.content !== \"string\") {\n const content = message.content;\n for (const part of content) {\n if (part.type === \"tool-approval-request\") {\n toolApprovalRequestsByApprovalId[part.approvalId] = part;\n }\n }\n }\n }\n const toolResults = {};\n for (const part of lastMessage.content) {\n if (part.type === \"tool-result\") {\n toolResults[part.toolCallId] = part;\n }\n }\n const approvedToolApprovals = [];\n const deniedToolApprovals = [];\n const approvalResponses = lastMessage.content.filter(\n (part) => part.type === \"tool-approval-response\"\n );\n for (const approvalResponse of approvalResponses) {\n const approvalRequest = toolApprovalRequestsByApprovalId[approvalResponse.approvalId];\n if (approvalRequest == null) {\n throw new InvalidToolApprovalError({\n approvalId: approvalResponse.approvalId\n });\n }\n if (toolResults[approvalRequest.toolCallId] != null) {\n continue;\n }\n const toolCall = toolCallsByToolCallId[approvalRequest.toolCallId];\n if (toolCall == null) {\n throw new ToolCallNotFoundForApprovalError({\n toolCallId: approvalRequest.toolCallId,\n approvalId: approvalRequest.approvalId\n });\n }\n const approval = {\n approvalRequest,\n approvalResponse,\n toolCall\n };\n if (approvalResponse.approved) {\n approvedToolApprovals.push(approval);\n } else {\n deniedToolApprovals.push(approval);\n }\n }\n return { approvedToolApprovals, deniedToolApprovals };\n}\n\n// src/generate-text/execute-tool-call.ts\nimport { executeTool } from \"@ai-sdk/provider-utils\";\n\n// src/util/now.ts\nfunction now() {\n var _a21, _b;\n return (_b = (_a21 = globalThis == null ? void 0 : globalThis.performance) == null ? void 0 : _a21.now()) != null ? _b : Date.now();\n}\n\n// src/generate-text/execute-tool-call.ts\nasync function executeToolCall({\n toolCall,\n tools,\n tracer,\n telemetry,\n messages,\n abortSignal,\n experimental_context,\n stepNumber,\n model,\n onPreliminaryToolResult,\n onToolCallStart,\n onToolCallFinish\n}) {\n const { toolName, toolCallId, input } = toolCall;\n const tool2 = tools == null ? void 0 : tools[toolName];\n if ((tool2 == null ? void 0 : tool2.execute) == null) {\n return void 0;\n }\n const baseCallbackEvent = {\n stepNumber,\n model,\n toolCall,\n messages,\n abortSignal,\n functionId: telemetry == null ? void 0 : telemetry.functionId,\n metadata: telemetry == null ? void 0 : telemetry.metadata,\n experimental_context\n };\n return recordSpan({\n name: \"ai.toolCall\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.toolCall\",\n telemetry\n }),\n \"ai.toolCall.name\": toolName,\n \"ai.toolCall.id\": toolCallId,\n \"ai.toolCall.args\": {\n output: () => JSON.stringify(input)\n }\n }\n }),\n tracer,\n fn: async (span) => {\n let output;\n await notify({ event: baseCallbackEvent, callbacks: onToolCallStart });\n const startTime = now();\n try {\n const stream = executeTool({\n execute: tool2.execute.bind(tool2),\n input,\n options: {\n toolCallId,\n messages,\n abortSignal,\n experimental_context\n }\n });\n for await (const part of stream) {\n if (part.type === \"preliminary\") {\n onPreliminaryToolResult == null ? void 0 : onPreliminaryToolResult({\n ...toolCall,\n type: \"tool-result\",\n output: part.output,\n preliminary: true\n });\n } else {\n output = part.output;\n }\n }\n } catch (error) {\n const durationMs2 = now() - startTime;\n await notify({\n event: {\n ...baseCallbackEvent,\n success: false,\n error,\n durationMs: durationMs2\n },\n callbacks: onToolCallFinish\n });\n recordErrorOnSpan(span, error);\n return {\n type: \"tool-error\",\n toolCallId,\n toolName,\n input,\n error,\n dynamic: tool2.type === \"dynamic\",\n ...toolCall.providerMetadata != null ? { providerMetadata: toolCall.providerMetadata } : {},\n ...toolCall.toolMetadata != null ? { toolMetadata: toolCall.toolMetadata } : {}\n };\n }\n const durationMs = now() - startTime;\n await notify({\n event: {\n ...baseCallbackEvent,\n success: true,\n output,\n durationMs\n },\n callbacks: onToolCallFinish\n });\n try {\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.toolCall.result\": {\n output: () => JSON.stringify(output)\n }\n }\n })\n );\n } catch (ignored) {\n }\n return {\n type: \"tool-result\",\n toolCallId,\n toolName,\n input,\n output,\n dynamic: tool2.type === \"dynamic\",\n ...toolCall.providerMetadata != null ? { providerMetadata: toolCall.providerMetadata } : {},\n ...toolCall.toolMetadata != null ? { toolMetadata: toolCall.toolMetadata } : {}\n };\n }\n });\n}\n\n// src/generate-text/extract-reasoning-content.ts\nfunction extractReasoningContent(content) {\n const parts = content.filter(\n (content2) => content2.type === \"reasoning\"\n );\n return parts.length === 0 ? void 0 : parts.map((content2) => content2.text).join(\"\\n\");\n}\n\n// src/generate-text/extract-text-content.ts\nfunction extractTextContent(content) {\n const parts = content.filter(\n (content2) => content2.type === \"text\"\n );\n if (parts.length === 0) {\n return void 0;\n }\n return parts.map((content2) => content2.text).join(\"\");\n}\n\n// src/generate-text/generated-file.ts\nimport {\n convertBase64ToUint8Array as convertBase64ToUint8Array3,\n convertUint8ArrayToBase64 as convertUint8ArrayToBase642\n} from \"@ai-sdk/provider-utils\";\nvar DefaultGeneratedFile = class {\n constructor({\n data,\n mediaType\n }) {\n const isUint8Array = data instanceof Uint8Array;\n this.base64Data = isUint8Array ? void 0 : data;\n this.uint8ArrayData = isUint8Array ? data : void 0;\n this.mediaType = mediaType;\n }\n // lazy conversion with caching to avoid unnecessary conversion overhead:\n get base64() {\n if (this.base64Data == null) {\n this.base64Data = convertUint8ArrayToBase642(this.uint8ArrayData);\n }\n return this.base64Data;\n }\n // lazy conversion with caching to avoid unnecessary conversion overhead:\n get uint8Array() {\n if (this.uint8ArrayData == null) {\n this.uint8ArrayData = convertBase64ToUint8Array3(this.base64Data);\n }\n return this.uint8ArrayData;\n }\n};\nvar DefaultGeneratedFileWithType = class extends DefaultGeneratedFile {\n constructor(options) {\n super(options);\n this.type = \"file\";\n }\n};\n\n// src/generate-text/is-approval-needed.ts\nasync function isApprovalNeeded({\n tool: tool2,\n toolCall,\n messages,\n experimental_context\n}) {\n if (tool2.needsApproval == null) {\n return false;\n }\n if (typeof tool2.needsApproval === \"boolean\") {\n return tool2.needsApproval;\n }\n return await tool2.needsApproval(toolCall.input, {\n toolCallId: toolCall.toolCallId,\n messages,\n experimental_context\n });\n}\n\n// src/generate-text/output.ts\nvar output_exports = {};\n__export(output_exports, {\n array: () => array,\n choice: () => choice,\n json: () => json,\n object: () => object,\n text: () => text\n});\nimport {\n TypeValidationError as TypeValidationError2\n} from \"@ai-sdk/provider\";\nimport {\n asSchema as asSchema2,\n resolve,\n safeParseJSON as safeParseJSON2,\n safeValidateTypes as safeValidateTypes2\n} from \"@ai-sdk/provider-utils\";\n\n// src/util/parse-partial-json.ts\nimport { safeParseJSON } from \"@ai-sdk/provider-utils\";\n\n// src/util/fix-json.ts\nfunction fixJson(input) {\n const stack = [\"ROOT\"];\n let lastValidIndex = -1;\n let literalStart = null;\n function processValueStart(char, i, swapState) {\n {\n switch (char) {\n case '\"': {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_STRING\");\n break;\n }\n case \"f\":\n case \"t\":\n case \"n\": {\n lastValidIndex = i;\n literalStart = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_LITERAL\");\n break;\n }\n case \"-\": {\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_NUMBER\");\n break;\n }\n case \"0\":\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\": {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_NUMBER\");\n break;\n }\n case \"{\": {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_OBJECT_START\");\n break;\n }\n case \"[\": {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_ARRAY_START\");\n break;\n }\n }\n }\n }\n function processAfterObjectValue(char, i) {\n switch (char) {\n case \",\": {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_AFTER_COMMA\");\n break;\n }\n case \"}\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n }\n }\n function processAfterArrayValue(char, i) {\n switch (char) {\n case \",\": {\n stack.pop();\n stack.push(\"INSIDE_ARRAY_AFTER_COMMA\");\n break;\n }\n case \"]\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n }\n }\n for (let i = 0; i < input.length; i++) {\n const char = input[i];\n const currentState = stack[stack.length - 1];\n switch (currentState) {\n case \"ROOT\":\n processValueStart(char, i, \"FINISH\");\n break;\n case \"INSIDE_OBJECT_START\": {\n switch (char) {\n case '\"': {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_KEY\");\n break;\n }\n case \"}\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n }\n break;\n }\n case \"INSIDE_OBJECT_AFTER_COMMA\": {\n switch (char) {\n case '\"': {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_KEY\");\n break;\n }\n }\n break;\n }\n case \"INSIDE_OBJECT_KEY\": {\n switch (char) {\n case '\"': {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_AFTER_KEY\");\n break;\n }\n }\n break;\n }\n case \"INSIDE_OBJECT_AFTER_KEY\": {\n switch (char) {\n case \":\": {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_BEFORE_VALUE\");\n break;\n }\n }\n break;\n }\n case \"INSIDE_OBJECT_BEFORE_VALUE\": {\n processValueStart(char, i, \"INSIDE_OBJECT_AFTER_VALUE\");\n break;\n }\n case \"INSIDE_OBJECT_AFTER_VALUE\": {\n processAfterObjectValue(char, i);\n break;\n }\n case \"INSIDE_STRING\": {\n switch (char) {\n case '\"': {\n stack.pop();\n lastValidIndex = i;\n break;\n }\n case \"\\\\\": {\n stack.push(\"INSIDE_STRING_ESCAPE\");\n break;\n }\n default: {\n lastValidIndex = i;\n }\n }\n break;\n }\n case \"INSIDE_ARRAY_START\": {\n switch (char) {\n case \"]\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n default: {\n lastValidIndex = i;\n processValueStart(char, i, \"INSIDE_ARRAY_AFTER_VALUE\");\n break;\n }\n }\n break;\n }\n case \"INSIDE_ARRAY_AFTER_VALUE\": {\n switch (char) {\n case \",\": {\n stack.pop();\n stack.push(\"INSIDE_ARRAY_AFTER_COMMA\");\n break;\n }\n case \"]\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n default: {\n lastValidIndex = i;\n break;\n }\n }\n break;\n }\n case \"INSIDE_ARRAY_AFTER_COMMA\": {\n processValueStart(char, i, \"INSIDE_ARRAY_AFTER_VALUE\");\n break;\n }\n case \"INSIDE_STRING_ESCAPE\": {\n stack.pop();\n lastValidIndex = i;\n break;\n }\n case \"INSIDE_NUMBER\": {\n switch (char) {\n case \"0\":\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\": {\n lastValidIndex = i;\n break;\n }\n case \"e\":\n case \"E\":\n case \"-\":\n case \".\": {\n break;\n }\n case \",\": {\n stack.pop();\n if (stack[stack.length - 1] === \"INSIDE_ARRAY_AFTER_VALUE\") {\n processAfterArrayValue(char, i);\n }\n if (stack[stack.length - 1] === \"INSIDE_OBJECT_AFTER_VALUE\") {\n processAfterObjectValue(char, i);\n }\n break;\n }\n case \"}\": {\n stack.pop();\n if (stack[stack.length - 1] === \"INSIDE_OBJECT_AFTER_VALUE\") {\n processAfterObjectValue(char, i);\n }\n break;\n }\n case \"]\": {\n stack.pop();\n if (stack[stack.length - 1] === \"INSIDE_ARRAY_AFTER_VALUE\") {\n processAfterArrayValue(char, i);\n }\n break;\n }\n default: {\n stack.pop();\n break;\n }\n }\n break;\n }\n case \"INSIDE_LITERAL\": {\n const partialLiteral = input.substring(literalStart, i + 1);\n if (!\"false\".startsWith(partialLiteral) && !\"true\".startsWith(partialLiteral) && !\"null\".startsWith(partialLiteral)) {\n stack.pop();\n if (stack[stack.length - 1] === \"INSIDE_OBJECT_AFTER_VALUE\") {\n processAfterObjectValue(char, i);\n } else if (stack[stack.length - 1] === \"INSIDE_ARRAY_AFTER_VALUE\") {\n processAfterArrayValue(char, i);\n }\n } else {\n lastValidIndex = i;\n }\n break;\n }\n }\n }\n let result = input.slice(0, lastValidIndex + 1);\n for (let i = stack.length - 1; i >= 0; i--) {\n const state = stack[i];\n switch (state) {\n case \"INSIDE_STRING\": {\n result += '\"';\n break;\n }\n case \"INSIDE_OBJECT_KEY\":\n case \"INSIDE_OBJECT_AFTER_KEY\":\n case \"INSIDE_OBJECT_AFTER_COMMA\":\n case \"INSIDE_OBJECT_START\":\n case \"INSIDE_OBJECT_BEFORE_VALUE\":\n case \"INSIDE_OBJECT_AFTER_VALUE\": {\n result += \"}\";\n break;\n }\n case \"INSIDE_ARRAY_START\":\n case \"INSIDE_ARRAY_AFTER_COMMA\":\n case \"INSIDE_ARRAY_AFTER_VALUE\": {\n result += \"]\";\n break;\n }\n case \"INSIDE_LITERAL\": {\n const partialLiteral = input.substring(literalStart, input.length);\n if (\"true\".startsWith(partialLiteral)) {\n result += \"true\".slice(partialLiteral.length);\n } else if (\"false\".startsWith(partialLiteral)) {\n result += \"false\".slice(partialLiteral.length);\n } else if (\"null\".startsWith(partialLiteral)) {\n result += \"null\".slice(partialLiteral.length);\n }\n }\n }\n }\n return result;\n}\n\n// src/util/parse-partial-json.ts\nasync function parsePartialJson(jsonText) {\n if (jsonText === void 0) {\n return { value: void 0, state: \"undefined-input\" };\n }\n let result = await safeParseJSON({ text: jsonText });\n if (result.success) {\n return { value: result.value, state: \"successful-parse\" };\n }\n result = await safeParseJSON({ text: fixJson(jsonText) });\n if (result.success) {\n return { value: result.value, state: \"repaired-parse\" };\n }\n return { value: void 0, state: \"failed-parse\" };\n}\n\n// src/generate-text/output.ts\nvar text = () => ({\n name: \"text\",\n responseFormat: Promise.resolve({ type: \"text\" }),\n async parseCompleteOutput({ text: text2 }) {\n return text2;\n },\n async parsePartialOutput({ text: text2 }) {\n return { partial: text2 };\n },\n createElementStreamTransform() {\n return void 0;\n }\n});\nvar object = ({\n schema: inputSchema,\n name: name21,\n description\n}) => {\n const schema = asSchema2(inputSchema);\n return {\n name: \"object\",\n responseFormat: resolve(schema.jsonSchema).then((jsonSchema2) => ({\n type: \"json\",\n schema: jsonSchema2,\n ...name21 != null && { name: name21 },\n ...description != null && { description }\n })),\n async parseCompleteOutput({ text: text2 }, context2) {\n const parseResult = await safeParseJSON2({ text: text2 });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n const validationResult = await safeValidateTypes2({\n value: parseResult.value,\n schema\n });\n if (!validationResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: validationResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n return validationResult.value;\n },\n async parsePartialOutput({ text: text2 }) {\n const result = await parsePartialJson(text2);\n switch (result.state) {\n case \"failed-parse\":\n case \"undefined-input\": {\n return void 0;\n }\n case \"repaired-parse\":\n case \"successful-parse\": {\n return {\n // Note: currently no validation of partial results:\n partial: result.value\n };\n }\n }\n },\n createElementStreamTransform() {\n return void 0;\n }\n };\n};\nvar array = ({\n element: inputElementSchema,\n name: name21,\n description\n}) => {\n const elementSchema = asSchema2(inputElementSchema);\n return {\n name: \"array\",\n // JSON schema that describes an array of elements:\n responseFormat: resolve(elementSchema.jsonSchema).then((jsonSchema2) => {\n const { $schema, ...itemSchema } = jsonSchema2;\n return {\n type: \"json\",\n schema: {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n properties: {\n elements: { type: \"array\", items: itemSchema }\n },\n required: [\"elements\"],\n additionalProperties: false\n },\n ...name21 != null && { name: name21 },\n ...description != null && { description }\n };\n }),\n async parseCompleteOutput({ text: text2 }, context2) {\n const parseResult = await safeParseJSON2({ text: text2 });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n const outerValue = parseResult.value;\n if (outerValue == null || typeof outerValue !== \"object\" || !(\"elements\" in outerValue) || !Array.isArray(outerValue.elements)) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: new TypeValidationError2({\n value: outerValue,\n cause: \"response must be an object with an elements array\"\n }),\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n for (const element of outerValue.elements) {\n const validationResult = await safeValidateTypes2({\n value: element,\n schema: elementSchema\n });\n if (!validationResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: validationResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n }\n return outerValue.elements;\n },\n async parsePartialOutput({ text: text2 }) {\n const result = await parsePartialJson(text2);\n switch (result.state) {\n case \"failed-parse\":\n case \"undefined-input\": {\n return void 0;\n }\n case \"repaired-parse\":\n case \"successful-parse\": {\n const outerValue = result.value;\n if (outerValue == null || typeof outerValue !== \"object\" || !(\"elements\" in outerValue) || !Array.isArray(outerValue.elements)) {\n return void 0;\n }\n const rawElements = result.state === \"repaired-parse\" && outerValue.elements.length > 0 ? outerValue.elements.slice(0, -1) : outerValue.elements;\n const parsedElements = [];\n for (const rawElement of rawElements) {\n const validationResult = await safeValidateTypes2({\n value: rawElement,\n schema: elementSchema\n });\n if (validationResult.success) {\n parsedElements.push(validationResult.value);\n }\n }\n return { partial: parsedElements };\n }\n }\n },\n createElementStreamTransform() {\n let publishedElements = 0;\n return new TransformStream({\n transform({ partialOutput }, controller) {\n if (partialOutput != null) {\n for (; publishedElements < partialOutput.length; publishedElements++) {\n controller.enqueue(partialOutput[publishedElements]);\n }\n }\n }\n });\n }\n };\n};\nvar choice = ({\n options: choiceOptions,\n name: name21,\n description\n}) => {\n return {\n name: \"choice\",\n // JSON schema that describes an enumeration:\n responseFormat: Promise.resolve({\n type: \"json\",\n schema: {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n properties: {\n result: { type: \"string\", enum: choiceOptions }\n },\n required: [\"result\"],\n additionalProperties: false\n },\n ...name21 != null && { name: name21 },\n ...description != null && { description }\n }),\n async parseCompleteOutput({ text: text2 }, context2) {\n const parseResult = await safeParseJSON2({ text: text2 });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n const outerValue = parseResult.value;\n if (outerValue == null || typeof outerValue !== \"object\" || !(\"result\" in outerValue) || typeof outerValue.result !== \"string\" || !choiceOptions.includes(outerValue.result)) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: new TypeValidationError2({\n value: outerValue,\n cause: \"response must be an object that contains a choice value.\"\n }),\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n return outerValue.result;\n },\n async parsePartialOutput({ text: text2 }) {\n const result = await parsePartialJson(text2);\n switch (result.state) {\n case \"failed-parse\":\n case \"undefined-input\": {\n return void 0;\n }\n case \"repaired-parse\":\n case \"successful-parse\": {\n const outerValue = result.value;\n if (outerValue == null || typeof outerValue !== \"object\" || !(\"result\" in outerValue) || typeof outerValue.result !== \"string\") {\n return void 0;\n }\n const potentialMatches = choiceOptions.filter(\n (choiceOption) => choiceOption.startsWith(outerValue.result)\n );\n if (result.state === \"successful-parse\") {\n return potentialMatches.includes(outerValue.result) ? { partial: outerValue.result } : void 0;\n } else {\n return potentialMatches.length === 1 ? { partial: potentialMatches[0] } : void 0;\n }\n }\n }\n },\n createElementStreamTransform() {\n return void 0;\n }\n };\n};\nvar json = ({\n name: name21,\n description\n} = {}) => {\n return {\n name: \"json\",\n responseFormat: Promise.resolve({\n type: \"json\",\n ...name21 != null && { name: name21 },\n ...description != null && { description }\n }),\n async parseCompleteOutput({ text: text2 }, context2) {\n const parseResult = await safeParseJSON2({ text: text2 });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n return parseResult.value;\n },\n async parsePartialOutput({ text: text2 }) {\n const result = await parsePartialJson(text2);\n switch (result.state) {\n case \"failed-parse\":\n case \"undefined-input\": {\n return void 0;\n }\n case \"repaired-parse\":\n case \"successful-parse\": {\n return result.value === void 0 ? void 0 : { partial: result.value };\n }\n }\n },\n createElementStreamTransform() {\n return void 0;\n }\n };\n};\n\n// src/generate-text/parse-tool-call.ts\nimport {\n asSchema as asSchema3,\n safeParseJSON as safeParseJSON3,\n safeValidateTypes as safeValidateTypes3\n} from \"@ai-sdk/provider-utils\";\nasync function parseToolCall({\n toolCall,\n tools,\n repairToolCall,\n system,\n messages\n}) {\n try {\n if (tools == null) {\n if (toolCall.providerExecuted && toolCall.dynamic) {\n return await parseProviderExecutedDynamicToolCall(toolCall);\n }\n throw new NoSuchToolError({ toolName: toolCall.toolName });\n }\n try {\n return await doParseToolCall({ toolCall, tools });\n } catch (error) {\n if (repairToolCall == null || !(NoSuchToolError.isInstance(error) || InvalidToolInputError.isInstance(error))) {\n throw error;\n }\n let repairedToolCall = null;\n try {\n repairedToolCall = await repairToolCall({\n toolCall,\n tools,\n inputSchema: async ({ toolName }) => {\n const { inputSchema } = tools[toolName];\n return await asSchema3(inputSchema).jsonSchema;\n },\n system,\n messages,\n error\n });\n } catch (repairError) {\n throw new ToolCallRepairError({\n cause: repairError,\n originalError: error\n });\n }\n if (repairedToolCall == null) {\n throw error;\n }\n return await doParseToolCall({ toolCall: repairedToolCall, tools });\n }\n } catch (error) {\n const parsedInput = await safeParseJSON3({ text: toolCall.input });\n const input = parsedInput.success ? parsedInput.value : toolCall.input;\n const tool2 = tools == null ? void 0 : tools[toolCall.toolName];\n return {\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input,\n dynamic: true,\n invalid: true,\n error,\n title: tool2 == null ? void 0 : tool2.title,\n providerExecuted: toolCall.providerExecuted,\n providerMetadata: toolCall.providerMetadata,\n ...(tool2 == null ? void 0 : tool2.metadata) != null ? { toolMetadata: tool2.metadata } : {}\n };\n }\n}\nasync function parseProviderExecutedDynamicToolCall(toolCall) {\n const parseResult = toolCall.input.trim() === \"\" ? { success: true, value: {} } : await safeParseJSON3({ text: toolCall.input });\n if (parseResult.success === false) {\n throw new InvalidToolInputError({\n toolName: toolCall.toolName,\n toolInput: toolCall.input,\n cause: parseResult.error\n });\n }\n return {\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: parseResult.value,\n providerExecuted: true,\n dynamic: true,\n providerMetadata: toolCall.providerMetadata\n };\n}\nasync function doParseToolCall({\n toolCall,\n tools\n}) {\n const toolName = toolCall.toolName;\n const tool2 = tools[toolName];\n if (tool2 == null) {\n if (toolCall.providerExecuted && toolCall.dynamic) {\n return await parseProviderExecutedDynamicToolCall(toolCall);\n }\n throw new NoSuchToolError({\n toolName: toolCall.toolName,\n availableTools: Object.keys(tools)\n });\n }\n const schema = asSchema3(tool2.inputSchema);\n const parseResult = toolCall.input.trim() === \"\" ? await safeValidateTypes3({ value: {}, schema }) : await safeParseJSON3({ text: toolCall.input, schema });\n if (parseResult.success === false) {\n throw new InvalidToolInputError({\n toolName,\n toolInput: toolCall.input,\n cause: parseResult.error\n });\n }\n return tool2.type === \"dynamic\" ? {\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: parseResult.value,\n providerExecuted: toolCall.providerExecuted,\n providerMetadata: toolCall.providerMetadata,\n ...tool2.metadata != null ? { toolMetadata: tool2.metadata } : {},\n dynamic: true,\n title: tool2.title\n } : {\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName,\n input: parseResult.value,\n providerExecuted: toolCall.providerExecuted,\n providerMetadata: toolCall.providerMetadata,\n ...tool2.metadata != null ? { toolMetadata: tool2.metadata } : {},\n title: tool2.title\n };\n}\n\n// src/generate-text/step-result.ts\nvar DefaultStepResult = class {\n constructor({\n stepNumber,\n model,\n functionId,\n metadata,\n experimental_context,\n content,\n finishReason,\n rawFinishReason,\n usage,\n warnings,\n request,\n response,\n providerMetadata\n }) {\n this.stepNumber = stepNumber;\n this.model = model;\n this.functionId = functionId;\n this.metadata = metadata;\n this.experimental_context = experimental_context;\n this.content = content;\n this.finishReason = finishReason;\n this.rawFinishReason = rawFinishReason;\n this.usage = usage;\n this.warnings = warnings;\n this.request = request;\n this.response = response;\n this.providerMetadata = providerMetadata;\n }\n get text() {\n return this.content.filter((part) => part.type === \"text\").map((part) => part.text).join(\"\");\n }\n get reasoning() {\n return this.content.filter((part) => part.type === \"reasoning\");\n }\n get reasoningText() {\n return this.reasoning.length === 0 ? void 0 : this.reasoning.map((part) => part.text).join(\"\");\n }\n get files() {\n return this.content.filter((part) => part.type === \"file\").map((part) => part.file);\n }\n get sources() {\n return this.content.filter((part) => part.type === \"source\");\n }\n get toolCalls() {\n return this.content.filter((part) => part.type === \"tool-call\");\n }\n get staticToolCalls() {\n return this.toolCalls.filter(\n (toolCall) => toolCall.dynamic !== true\n );\n }\n get dynamicToolCalls() {\n return this.toolCalls.filter(\n (toolCall) => toolCall.dynamic === true\n );\n }\n get toolResults() {\n return this.content.filter((part) => part.type === \"tool-result\");\n }\n get staticToolResults() {\n return this.toolResults.filter(\n (toolResult) => toolResult.dynamic !== true\n );\n }\n get dynamicToolResults() {\n return this.toolResults.filter(\n (toolResult) => toolResult.dynamic === true\n );\n }\n};\n\n// src/generate-text/stop-condition.ts\nfunction stepCountIs(stepCount) {\n return ({ steps }) => steps.length === stepCount;\n}\nfunction isLoopFinished() {\n return () => false;\n}\nfunction hasToolCall(toolName) {\n return ({ steps }) => {\n var _a21, _b, _c;\n return (_c = (_b = (_a21 = steps[steps.length - 1]) == null ? void 0 : _a21.toolCalls) == null ? void 0 : _b.some(\n (toolCall) => toolCall.toolName === toolName\n )) != null ? _c : false;\n };\n}\nasync function isStopConditionMet({\n stopConditions,\n steps\n}) {\n return (await Promise.all(stopConditions.map((condition) => condition({ steps })))).some((result) => result);\n}\n\n// src/generate-text/to-response-messages.ts\nasync function toResponseMessages({\n content: inputContent,\n tools\n}) {\n const responseMessages = [];\n const content = [];\n for (const part of inputContent) {\n if (part.type === \"source\") {\n continue;\n }\n if ((part.type === \"tool-result\" || part.type === \"tool-error\") && !part.providerExecuted) {\n continue;\n }\n if (part.type === \"text\" && part.text.length === 0) {\n continue;\n }\n switch (part.type) {\n case \"text\":\n content.push({\n type: \"text\",\n text: part.text,\n providerOptions: part.providerMetadata\n });\n break;\n case \"reasoning\":\n content.push({\n type: \"reasoning\",\n text: part.text,\n providerOptions: part.providerMetadata\n });\n break;\n case \"file\":\n content.push({\n type: \"file\",\n data: part.file.base64,\n mediaType: part.file.mediaType,\n providerOptions: part.providerMetadata\n });\n break;\n case \"tool-call\":\n content.push({\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.invalid && typeof part.input !== \"object\" ? {} : part.input,\n providerExecuted: part.providerExecuted,\n providerOptions: part.providerMetadata\n });\n break;\n case \"tool-result\": {\n const output = await createToolModelOutput({\n toolCallId: part.toolCallId,\n input: part.input,\n tool: tools == null ? void 0 : tools[part.toolName],\n output: part.output,\n errorMode: \"none\"\n });\n content.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output,\n providerOptions: part.providerMetadata\n });\n break;\n }\n case \"tool-error\": {\n const output = await createToolModelOutput({\n toolCallId: part.toolCallId,\n input: part.input,\n tool: tools == null ? void 0 : tools[part.toolName],\n output: part.error,\n errorMode: \"json\"\n });\n content.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output,\n providerOptions: part.providerMetadata\n });\n break;\n }\n case \"tool-approval-request\":\n content.push({\n type: \"tool-approval-request\",\n approvalId: part.approvalId,\n toolCallId: part.toolCall.toolCallId\n });\n break;\n }\n }\n if (content.length > 0) {\n responseMessages.push({\n role: \"assistant\",\n content\n });\n }\n const toolResultContent = [];\n for (const part of inputContent) {\n if (!(part.type === \"tool-result\" || part.type === \"tool-error\") || part.providerExecuted) {\n continue;\n }\n const output = await createToolModelOutput({\n toolCallId: part.toolCallId,\n input: part.input,\n tool: tools == null ? void 0 : tools[part.toolName],\n output: part.type === \"tool-result\" ? part.output : part.error,\n errorMode: part.type === \"tool-error\" ? \"text\" : \"none\"\n });\n toolResultContent.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n });\n }\n if (toolResultContent.length > 0) {\n responseMessages.push({\n role: \"tool\",\n content: toolResultContent\n });\n }\n return responseMessages;\n}\n\n// src/util/merge-abort-signals.ts\nfunction mergeAbortSignals(...signals) {\n const validSignals = signals.filter(\n (signal) => signal != null\n );\n if (validSignals.length === 0) {\n return void 0;\n }\n if (validSignals.length === 1) {\n return validSignals[0];\n }\n const controller = new AbortController();\n for (const signal of validSignals) {\n if (signal.aborted) {\n controller.abort(signal.reason);\n return controller.signal;\n }\n signal.addEventListener(\n \"abort\",\n () => {\n controller.abort(signal.reason);\n },\n { once: true }\n );\n }\n return controller.signal;\n}\n\n// src/generate-text/generate-text.ts\nvar originalGenerateId = createIdGenerator({\n prefix: \"aitxt\",\n size: 24\n});\nasync function generateText({\n model: modelArg,\n tools,\n toolChoice,\n system,\n prompt,\n messages,\n allowSystemInMessages,\n maxRetries: maxRetriesArg,\n abortSignal,\n timeout,\n headers,\n stopWhen = stepCountIs(1),\n experimental_output,\n output = experimental_output,\n experimental_telemetry: telemetry,\n providerOptions,\n experimental_activeTools,\n activeTools = experimental_activeTools,\n experimental_prepareStep,\n prepareStep = experimental_prepareStep,\n experimental_repairToolCall: repairToolCall,\n experimental_download: download2,\n experimental_context,\n experimental_include: include,\n _internal: { generateId: generateId2 = originalGenerateId } = {},\n experimental_onStart: onStart,\n experimental_onStepStart: onStepStart,\n experimental_onToolCallStart: onToolCallStart,\n experimental_onToolCallFinish: onToolCallFinish,\n onStepFinish,\n onFinish,\n ...settings\n}) {\n const model = resolveLanguageModel(modelArg);\n const createGlobalTelemetry = getGlobalTelemetryIntegration();\n const stopConditions = asArray(stopWhen);\n const totalTimeoutMs = getTotalTimeoutMs(timeout);\n const stepTimeoutMs = getStepTimeoutMs(timeout);\n const stepAbortController = stepTimeoutMs != null ? new AbortController() : void 0;\n const mergedAbortSignal = mergeAbortSignals(\n abortSignal,\n totalTimeoutMs != null ? AbortSignal.timeout(totalTimeoutMs) : void 0,\n stepAbortController == null ? void 0 : stepAbortController.signal\n );\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal: mergedAbortSignal\n });\n const callSettings = prepareCallSettings(settings);\n const headersWithUserAgent = withUserAgentSuffix2(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers: headersWithUserAgent,\n settings: { ...callSettings, maxRetries }\n });\n const modelInfo = { provider: model.provider, modelId: model.modelId };\n const initialPrompt = await standardizePrompt({\n system,\n prompt,\n messages,\n allowSystemInMessages\n });\n const globalTelemetry = createGlobalTelemetry(telemetry == null ? void 0 : telemetry.integrations);\n await notify({\n event: {\n model: modelInfo,\n system,\n prompt,\n messages,\n tools,\n toolChoice,\n activeTools,\n maxOutputTokens: callSettings.maxOutputTokens,\n temperature: callSettings.temperature,\n topP: callSettings.topP,\n topK: callSettings.topK,\n presencePenalty: callSettings.presencePenalty,\n frequencyPenalty: callSettings.frequencyPenalty,\n stopSequences: callSettings.stopSequences,\n seed: callSettings.seed,\n maxRetries,\n timeout,\n headers,\n providerOptions,\n stopWhen,\n output,\n abortSignal,\n include,\n functionId: telemetry == null ? void 0 : telemetry.functionId,\n metadata: telemetry == null ? void 0 : telemetry.metadata,\n experimental_context\n },\n callbacks: [\n onStart,\n globalTelemetry.onStart\n ]\n });\n const tracer = getTracer(telemetry);\n try {\n return await recordSpan({\n name: \"ai.generateText\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.generateText\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // model:\n \"ai.model.provider\": model.provider,\n \"ai.model.id\": model.modelId,\n // specific settings that only make sense on the outer level:\n \"ai.prompt\": {\n input: () => JSON.stringify({ system, prompt, messages })\n }\n }\n }),\n tracer,\n fn: async (span) => {\n var _a21, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t;\n const initialMessages = initialPrompt.messages;\n const responseMessages = [];\n const { approvedToolApprovals, deniedToolApprovals } = collectToolApprovals({ messages: initialMessages });\n const localApprovedToolApprovals = approvedToolApprovals.filter(\n (toolApproval) => !toolApproval.toolCall.providerExecuted\n );\n if (deniedToolApprovals.length > 0 || localApprovedToolApprovals.length > 0) {\n const toolOutputs = await executeTools({\n toolCalls: localApprovedToolApprovals.map(\n (toolApproval) => toolApproval.toolCall\n ),\n tools,\n tracer,\n telemetry,\n messages: initialMessages,\n abortSignal: mergedAbortSignal,\n experimental_context,\n stepNumber: 0,\n model: modelInfo,\n onToolCallStart: [\n onToolCallStart,\n globalTelemetry.onToolCallStart\n ],\n onToolCallFinish: [\n onToolCallFinish,\n globalTelemetry.onToolCallFinish\n ]\n });\n const toolContent = [];\n for (const output2 of toolOutputs) {\n const modelOutput = await createToolModelOutput({\n toolCallId: output2.toolCallId,\n input: output2.input,\n tool: tools == null ? void 0 : tools[output2.toolName],\n output: output2.type === \"tool-result\" ? output2.output : output2.error,\n errorMode: output2.type === \"tool-error\" ? \"text\" : \"none\"\n });\n toolContent.push({\n type: \"tool-result\",\n toolCallId: output2.toolCallId,\n toolName: output2.toolName,\n output: modelOutput\n });\n }\n for (const toolApproval of deniedToolApprovals) {\n toolContent.push({\n type: \"tool-result\",\n toolCallId: toolApproval.toolCall.toolCallId,\n toolName: toolApproval.toolCall.toolName,\n output: {\n type: \"execution-denied\",\n reason: toolApproval.approvalResponse.reason,\n // For provider-executed tools, include approvalId so provider can correlate\n ...toolApproval.toolCall.providerExecuted && {\n providerOptions: {\n openai: {\n approvalId: toolApproval.approvalResponse.approvalId\n }\n }\n }\n }\n });\n }\n responseMessages.push({\n role: \"tool\",\n content: toolContent\n });\n }\n const callSettings2 = prepareCallSettings(settings);\n let currentModelResponse;\n let clientToolCalls = [];\n let clientToolOutputs = [];\n const steps = [];\n const pendingDeferredToolCalls = /* @__PURE__ */ new Map();\n do {\n const stepTimeoutId = stepTimeoutMs != null ? setTimeout(() => stepAbortController.abort(), stepTimeoutMs) : void 0;\n try {\n const stepInputMessages = [...initialMessages, ...responseMessages];\n const prepareStepResult = await (prepareStep == null ? void 0 : prepareStep({\n model,\n steps,\n stepNumber: steps.length,\n messages: stepInputMessages,\n experimental_context\n }));\n const stepModel = resolveLanguageModel(\n (_a21 = prepareStepResult == null ? void 0 : prepareStepResult.model) != null ? _a21 : model\n );\n const stepModelInfo = {\n provider: stepModel.provider,\n modelId: stepModel.modelId\n };\n const promptMessages = await convertToLanguageModelPrompt({\n prompt: {\n system: (_b = prepareStepResult == null ? void 0 : prepareStepResult.system) != null ? _b : initialPrompt.system,\n messages: (_c = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _c : stepInputMessages\n },\n supportedUrls: await stepModel.supportedUrls,\n download: download2\n });\n experimental_context = (_d = prepareStepResult == null ? void 0 : prepareStepResult.experimental_context) != null ? _d : experimental_context;\n const stepActiveTools = (_e = prepareStepResult == null ? void 0 : prepareStepResult.activeTools) != null ? _e : activeTools;\n const { toolChoice: stepToolChoice, tools: stepTools } = await prepareToolsAndToolChoice({\n tools,\n toolChoice: (_f = prepareStepResult == null ? void 0 : prepareStepResult.toolChoice) != null ? _f : toolChoice,\n activeTools: stepActiveTools\n });\n const stepMessages = (_g = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _g : stepInputMessages;\n const stepSystem = (_h = prepareStepResult == null ? void 0 : prepareStepResult.system) != null ? _h : initialPrompt.system;\n const stepProviderOptions = mergeObjects(\n providerOptions,\n prepareStepResult == null ? void 0 : prepareStepResult.providerOptions\n );\n await notify({\n event: {\n stepNumber: steps.length,\n model: stepModelInfo,\n system: stepSystem,\n messages: stepMessages,\n tools,\n toolChoice: stepToolChoice,\n activeTools: stepActiveTools,\n steps: [...steps],\n providerOptions: stepProviderOptions,\n timeout,\n headers,\n stopWhen,\n output,\n abortSignal,\n include,\n functionId: telemetry == null ? void 0 : telemetry.functionId,\n metadata: telemetry == null ? void 0 : telemetry.metadata,\n experimental_context\n },\n callbacks: [\n onStepStart,\n globalTelemetry.onStepStart\n ]\n });\n currentModelResponse = await retry(\n () => {\n var _a22;\n return recordSpan({\n name: \"ai.generateText.doGenerate\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.generateText.doGenerate\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // model:\n \"ai.model.provider\": stepModel.provider,\n \"ai.model.id\": stepModel.modelId,\n // prompt:\n \"ai.prompt.messages\": {\n input: () => stringifyForTelemetry(promptMessages)\n },\n \"ai.prompt.tools\": {\n // convert the language model level tools:\n input: () => stepTools == null ? void 0 : stepTools.map((tool2) => JSON.stringify(tool2))\n },\n \"ai.prompt.toolChoice\": {\n input: () => stepToolChoice != null ? JSON.stringify(stepToolChoice) : void 0\n },\n // standardized gen-ai llm span attributes:\n \"gen_ai.system\": stepModel.provider,\n \"gen_ai.request.model\": stepModel.modelId,\n \"gen_ai.request.frequency_penalty\": settings.frequencyPenalty,\n \"gen_ai.request.max_tokens\": settings.maxOutputTokens,\n \"gen_ai.request.presence_penalty\": settings.presencePenalty,\n \"gen_ai.request.stop_sequences\": settings.stopSequences,\n \"gen_ai.request.temperature\": (_a22 = settings.temperature) != null ? _a22 : void 0,\n \"gen_ai.request.top_k\": settings.topK,\n \"gen_ai.request.top_p\": settings.topP\n }\n }),\n tracer,\n fn: async (span2) => {\n var _a23, _b2, _c2, _d2, _e2, _f2, _g2, _h2;\n const result = await stepModel.doGenerate({\n ...callSettings2,\n tools: stepTools,\n toolChoice: stepToolChoice,\n responseFormat: await (output == null ? void 0 : output.responseFormat),\n prompt: promptMessages,\n providerOptions: stepProviderOptions,\n abortSignal: mergedAbortSignal,\n headers: headersWithUserAgent\n });\n const responseData = {\n id: (_b2 = (_a23 = result.response) == null ? void 0 : _a23.id) != null ? _b2 : generateId2(),\n timestamp: (_d2 = (_c2 = result.response) == null ? void 0 : _c2.timestamp) != null ? _d2 : /* @__PURE__ */ new Date(),\n modelId: (_f2 = (_e2 = result.response) == null ? void 0 : _e2.modelId) != null ? _f2 : stepModel.modelId,\n headers: (_g2 = result.response) == null ? void 0 : _g2.headers,\n body: (_h2 = result.response) == null ? void 0 : _h2.body\n };\n const usage = asLanguageModelUsage(result.usage);\n span2.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": result.finishReason.unified,\n \"ai.response.text\": {\n output: () => extractTextContent(result.content)\n },\n \"ai.response.reasoning\": {\n output: () => extractReasoningContent(result.content)\n },\n \"ai.response.toolCalls\": {\n output: () => {\n const toolCalls = asToolCalls(result.content);\n return toolCalls == null ? void 0 : JSON.stringify(toolCalls);\n }\n },\n \"ai.response.id\": responseData.id,\n \"ai.response.model\": responseData.modelId,\n \"ai.response.timestamp\": responseData.timestamp.toISOString(),\n \"ai.response.providerMetadata\": JSON.stringify(\n result.providerMetadata\n ),\n \"ai.usage.inputTokens\": result.usage.inputTokens.total,\n \"ai.usage.inputTokenDetails.noCacheTokens\": result.usage.inputTokens.noCache,\n \"ai.usage.inputTokenDetails.cacheReadTokens\": result.usage.inputTokens.cacheRead,\n \"ai.usage.inputTokenDetails.cacheWriteTokens\": result.usage.inputTokens.cacheWrite,\n \"ai.usage.outputTokens\": result.usage.outputTokens.total,\n \"ai.usage.outputTokenDetails.textTokens\": result.usage.outputTokens.text,\n \"ai.usage.outputTokenDetails.reasoningTokens\": result.usage.outputTokens.reasoning,\n \"ai.usage.totalTokens\": usage.totalTokens,\n \"ai.usage.reasoningTokens\": result.usage.outputTokens.reasoning,\n \"ai.usage.cachedInputTokens\": result.usage.inputTokens.cacheRead,\n // standardized gen-ai llm span attributes:\n \"gen_ai.response.finish_reasons\": [\n result.finishReason.unified\n ],\n \"gen_ai.response.id\": responseData.id,\n \"gen_ai.response.model\": responseData.modelId,\n \"gen_ai.usage.input_tokens\": result.usage.inputTokens.total,\n \"gen_ai.usage.output_tokens\": result.usage.outputTokens.total\n }\n })\n );\n return { ...result, response: responseData };\n }\n });\n }\n );\n const stepToolCalls = await Promise.all(\n currentModelResponse.content.filter(\n (part) => part.type === \"tool-call\"\n ).map(\n (toolCall) => parseToolCall({\n toolCall,\n tools,\n repairToolCall,\n system,\n messages: stepInputMessages\n })\n )\n );\n const toolApprovalRequests = {};\n for (const toolCall of stepToolCalls) {\n if (toolCall.invalid) {\n continue;\n }\n const tool2 = tools == null ? void 0 : tools[toolCall.toolName];\n if (tool2 == null) {\n continue;\n }\n if ((tool2 == null ? void 0 : tool2.onInputAvailable) != null) {\n await tool2.onInputAvailable({\n input: toolCall.input,\n toolCallId: toolCall.toolCallId,\n messages: stepInputMessages,\n abortSignal: mergedAbortSignal,\n experimental_context\n });\n }\n if (await isApprovalNeeded({\n tool: tool2,\n toolCall,\n messages: stepInputMessages,\n experimental_context\n })) {\n toolApprovalRequests[toolCall.toolCallId] = {\n type: \"tool-approval-request\",\n approvalId: generateId2(),\n toolCall\n };\n }\n }\n const invalidToolCalls = stepToolCalls.filter(\n (toolCall) => toolCall.invalid && toolCall.dynamic\n );\n clientToolOutputs = [];\n for (const toolCall of invalidToolCalls) {\n clientToolOutputs.push({\n type: \"tool-error\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n error: getErrorMessage5(toolCall.error),\n dynamic: true\n });\n }\n clientToolCalls = stepToolCalls.filter(\n (toolCall) => !toolCall.providerExecuted\n );\n if (tools != null) {\n clientToolOutputs.push(\n ...await executeTools({\n toolCalls: clientToolCalls.filter(\n (toolCall) => !toolCall.invalid && toolApprovalRequests[toolCall.toolCallId] == null\n ),\n tools,\n tracer,\n telemetry,\n messages: stepInputMessages,\n abortSignal: mergedAbortSignal,\n experimental_context,\n stepNumber: steps.length,\n model: stepModelInfo,\n onToolCallStart: [\n onToolCallStart,\n globalTelemetry.onToolCallStart\n ],\n onToolCallFinish: [\n onToolCallFinish,\n globalTelemetry.onToolCallFinish\n ]\n })\n );\n }\n for (const toolCall of stepToolCalls) {\n if (!toolCall.providerExecuted)\n continue;\n const tool2 = tools == null ? void 0 : tools[toolCall.toolName];\n if ((tool2 == null ? void 0 : tool2.type) === \"provider\" && tool2.supportsDeferredResults) {\n const hasResultInResponse = currentModelResponse.content.some(\n (part) => part.type === \"tool-result\" && part.toolCallId === toolCall.toolCallId\n );\n if (!hasResultInResponse) {\n pendingDeferredToolCalls.set(toolCall.toolCallId, {\n toolName: toolCall.toolName\n });\n }\n }\n }\n for (const part of currentModelResponse.content) {\n if (part.type === \"tool-result\") {\n pendingDeferredToolCalls.delete(part.toolCallId);\n }\n }\n const stepContent = asContent({\n content: currentModelResponse.content,\n toolCalls: stepToolCalls,\n toolOutputs: clientToolOutputs,\n toolApprovalRequests: Object.values(toolApprovalRequests),\n tools\n });\n responseMessages.push(\n ...await toResponseMessages({\n content: stepContent,\n tools\n })\n );\n const stepRequest = ((_i = include == null ? void 0 : include.requestBody) != null ? _i : true) ? (_j = currentModelResponse.request) != null ? _j : {} : { ...currentModelResponse.request, body: void 0 };\n const stepResponse = {\n ...currentModelResponse.response,\n // deep clone msgs to avoid mutating past messages in multi-step:\n messages: structuredClone(responseMessages),\n // Conditionally include response body:\n body: ((_k = include == null ? void 0 : include.responseBody) != null ? _k : true) ? (_l = currentModelResponse.response) == null ? void 0 : _l.body : void 0\n };\n const stepNumber = steps.length;\n const currentStepResult = new DefaultStepResult({\n stepNumber,\n model: stepModelInfo,\n functionId: telemetry == null ? void 0 : telemetry.functionId,\n metadata: telemetry == null ? void 0 : telemetry.metadata,\n experimental_context,\n content: stepContent,\n finishReason: currentModelResponse.finishReason.unified,\n rawFinishReason: currentModelResponse.finishReason.raw,\n usage: asLanguageModelUsage(currentModelResponse.usage),\n warnings: currentModelResponse.warnings,\n providerMetadata: currentModelResponse.providerMetadata,\n request: stepRequest,\n response: stepResponse\n });\n logWarnings({\n warnings: (_m = currentModelResponse.warnings) != null ? _m : [],\n provider: stepModelInfo.provider,\n model: stepModelInfo.modelId\n });\n steps.push(currentStepResult);\n await notify({\n event: currentStepResult,\n callbacks: [onStepFinish, globalTelemetry.onStepFinish]\n });\n } finally {\n if (stepTimeoutId != null) {\n clearTimeout(stepTimeoutId);\n }\n }\n } while (\n // Continue if:\n // 1. There are client tool calls that have all been executed, OR\n // 2. There are pending deferred results from provider-executed tools\n (clientToolCalls.length > 0 && clientToolOutputs.length === clientToolCalls.length || pendingDeferredToolCalls.size > 0) && // continue until a stop condition is met:\n !await isStopConditionMet({ stopConditions, steps })\n );\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": currentModelResponse.finishReason.unified,\n \"ai.response.text\": {\n output: () => extractTextContent(currentModelResponse.content)\n },\n \"ai.response.reasoning\": {\n output: () => extractReasoningContent(currentModelResponse.content)\n },\n \"ai.response.toolCalls\": {\n output: () => {\n const toolCalls = asToolCalls(currentModelResponse.content);\n return toolCalls == null ? void 0 : JSON.stringify(toolCalls);\n }\n },\n \"ai.response.providerMetadata\": JSON.stringify(\n currentModelResponse.providerMetadata\n )\n }\n })\n );\n const lastStep = steps[steps.length - 1];\n const totalUsage = steps.reduce(\n (totalUsage2, step) => {\n return addLanguageModelUsage(totalUsage2, step.usage);\n },\n {\n inputTokens: void 0,\n outputTokens: void 0,\n totalTokens: void 0,\n reasoningTokens: void 0,\n cachedInputTokens: void 0\n }\n );\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.usage.inputTokens\": totalUsage.inputTokens,\n \"ai.usage.inputTokenDetails.noCacheTokens\": (_n = totalUsage.inputTokenDetails) == null ? void 0 : _n.noCacheTokens,\n \"ai.usage.inputTokenDetails.cacheReadTokens\": (_o = totalUsage.inputTokenDetails) == null ? void 0 : _o.cacheReadTokens,\n \"ai.usage.inputTokenDetails.cacheWriteTokens\": (_p = totalUsage.inputTokenDetails) == null ? void 0 : _p.cacheWriteTokens,\n \"ai.usage.outputTokens\": totalUsage.outputTokens,\n \"ai.usage.outputTokenDetails.textTokens\": (_q = totalUsage.outputTokenDetails) == null ? void 0 : _q.textTokens,\n \"ai.usage.outputTokenDetails.reasoningTokens\": (_r = totalUsage.outputTokenDetails) == null ? void 0 : _r.reasoningTokens,\n \"ai.usage.totalTokens\": totalUsage.totalTokens,\n \"ai.usage.reasoningTokens\": (_s = totalUsage.outputTokenDetails) == null ? void 0 : _s.reasoningTokens,\n \"ai.usage.cachedInputTokens\": (_t = totalUsage.inputTokenDetails) == null ? void 0 : _t.cacheReadTokens\n }\n })\n );\n await notify({\n event: {\n stepNumber: lastStep.stepNumber,\n model: lastStep.model,\n functionId: lastStep.functionId,\n metadata: lastStep.metadata,\n experimental_context: lastStep.experimental_context,\n finishReason: lastStep.finishReason,\n rawFinishReason: lastStep.rawFinishReason,\n usage: lastStep.usage,\n content: lastStep.content,\n text: lastStep.text,\n reasoningText: lastStep.reasoningText,\n reasoning: lastStep.reasoning,\n files: lastStep.files,\n sources: lastStep.sources,\n toolCalls: lastStep.toolCalls,\n staticToolCalls: lastStep.staticToolCalls,\n dynamicToolCalls: lastStep.dynamicToolCalls,\n toolResults: lastStep.toolResults,\n staticToolResults: lastStep.staticToolResults,\n dynamicToolResults: lastStep.dynamicToolResults,\n request: lastStep.request,\n response: lastStep.response,\n warnings: lastStep.warnings,\n providerMetadata: lastStep.providerMetadata,\n steps,\n totalUsage\n },\n callbacks: [\n onFinish,\n globalTelemetry.onFinish\n ]\n });\n let resolvedOutput;\n if (lastStep.finishReason === \"stop\") {\n const outputSpecification = output != null ? output : text();\n resolvedOutput = await outputSpecification.parseCompleteOutput(\n { text: lastStep.text },\n {\n response: lastStep.response,\n usage: lastStep.usage,\n finishReason: lastStep.finishReason\n }\n );\n }\n return new DefaultGenerateTextResult({\n steps,\n totalUsage,\n output: resolvedOutput\n });\n }\n });\n } catch (error) {\n throw wrapGatewayError(error);\n }\n}\nasync function executeTools({\n toolCalls,\n tools,\n tracer,\n telemetry,\n messages,\n abortSignal,\n experimental_context,\n stepNumber,\n model,\n onToolCallStart,\n onToolCallFinish\n}) {\n const toolOutputs = await Promise.all(\n toolCalls.map(\n async (toolCall) => executeToolCall({\n toolCall,\n tools,\n tracer,\n telemetry,\n messages,\n abortSignal,\n experimental_context,\n stepNumber,\n model,\n onToolCallStart,\n onToolCallFinish\n })\n )\n );\n return toolOutputs.filter(\n (output) => output != null\n );\n}\nvar DefaultGenerateTextResult = class {\n constructor(options) {\n this.steps = options.steps;\n this._output = options.output;\n this.totalUsage = options.totalUsage;\n }\n get finalStep() {\n return this.steps[this.steps.length - 1];\n }\n get content() {\n return this.finalStep.content;\n }\n get text() {\n return this.finalStep.text;\n }\n get files() {\n return this.finalStep.files;\n }\n get reasoningText() {\n return this.finalStep.reasoningText;\n }\n get reasoning() {\n return this.finalStep.reasoning;\n }\n get toolCalls() {\n return this.finalStep.toolCalls;\n }\n get staticToolCalls() {\n return this.finalStep.staticToolCalls;\n }\n get dynamicToolCalls() {\n return this.finalStep.dynamicToolCalls;\n }\n get toolResults() {\n return this.finalStep.toolResults;\n }\n get staticToolResults() {\n return this.finalStep.staticToolResults;\n }\n get dynamicToolResults() {\n return this.finalStep.dynamicToolResults;\n }\n get sources() {\n return this.finalStep.sources;\n }\n get finishReason() {\n return this.finalStep.finishReason;\n }\n get rawFinishReason() {\n return this.finalStep.rawFinishReason;\n }\n get warnings() {\n return this.finalStep.warnings;\n }\n get providerMetadata() {\n return this.finalStep.providerMetadata;\n }\n get response() {\n return this.finalStep.response;\n }\n get request() {\n return this.finalStep.request;\n }\n get usage() {\n return this.finalStep.usage;\n }\n get experimental_output() {\n return this.output;\n }\n get output() {\n if (this._output == null) {\n throw new NoOutputGeneratedError();\n }\n return this._output;\n }\n};\nfunction asToolCalls(content) {\n const parts = content.filter(\n (part) => part.type === \"tool-call\"\n );\n if (parts.length === 0) {\n return void 0;\n }\n return parts.map((toolCall) => ({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input\n }));\n}\nfunction asContent({\n content,\n toolCalls,\n toolOutputs,\n toolApprovalRequests,\n tools\n}) {\n const contentParts = [];\n for (const part of content) {\n switch (part.type) {\n case \"text\":\n case \"reasoning\":\n case \"source\":\n contentParts.push(part);\n break;\n case \"file\": {\n contentParts.push({\n type: \"file\",\n file: new DefaultGeneratedFile(part),\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"tool-call\": {\n contentParts.push(\n toolCalls.find((toolCall) => toolCall.toolCallId === part.toolCallId)\n );\n break;\n }\n case \"tool-result\": {\n const toolCall = toolCalls.find(\n (toolCall2) => toolCall2.toolCallId === part.toolCallId\n );\n if (toolCall == null) {\n const tool2 = tools == null ? void 0 : tools[part.toolName];\n const supportsDeferredResults = (tool2 == null ? void 0 : tool2.type) === \"provider\" && tool2.supportsDeferredResults;\n if (!supportsDeferredResults) {\n throw new Error(`Tool call ${part.toolCallId} not found.`);\n }\n if (part.isError) {\n contentParts.push({\n type: \"tool-error\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: void 0,\n error: part.result,\n providerExecuted: true,\n dynamic: part.dynamic,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...(tool2 == null ? void 0 : tool2.metadata) != null ? { toolMetadata: tool2.metadata } : {}\n });\n } else {\n contentParts.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: void 0,\n output: part.result,\n providerExecuted: true,\n dynamic: part.dynamic,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...(tool2 == null ? void 0 : tool2.metadata) != null ? { toolMetadata: tool2.metadata } : {}\n });\n }\n break;\n }\n if (part.isError) {\n contentParts.push({\n type: \"tool-error\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: toolCall.input,\n error: part.result,\n providerExecuted: true,\n dynamic: toolCall.dynamic,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...toolCall.toolMetadata != null ? { toolMetadata: toolCall.toolMetadata } : {}\n });\n } else {\n contentParts.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: toolCall.input,\n output: part.result,\n providerExecuted: true,\n dynamic: toolCall.dynamic,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...toolCall.toolMetadata != null ? { toolMetadata: toolCall.toolMetadata } : {}\n });\n }\n break;\n }\n case \"tool-approval-request\": {\n const toolCall = toolCalls.find(\n (toolCall2) => toolCall2.toolCallId === part.toolCallId\n );\n if (toolCall == null) {\n throw new ToolCallNotFoundForApprovalError({\n toolCallId: part.toolCallId,\n approvalId: part.approvalId\n });\n }\n contentParts.push({\n type: \"tool-approval-request\",\n approvalId: part.approvalId,\n toolCall\n });\n break;\n }\n }\n }\n return [...contentParts, ...toolOutputs, ...toolApprovalRequests];\n}\n\n// src/generate-text/stream-text.ts\nimport {\n getErrorMessage as getErrorMessage7,\n UnsupportedFunctionalityError as UnsupportedFunctionalityError2\n} from \"@ai-sdk/provider\";\nimport {\n createIdGenerator as createIdGenerator2,\n DelayedPromise,\n isAbortError as isAbortError2\n} from \"@ai-sdk/provider-utils\";\n\n// src/util/prepare-headers.ts\nfunction prepareHeaders(headers, defaultHeaders) {\n const responseHeaders = new Headers(headers != null ? headers : {});\n for (const [key, value] of Object.entries(defaultHeaders)) {\n if (!responseHeaders.has(key)) {\n responseHeaders.set(key, value);\n }\n }\n return responseHeaders;\n}\n\n// src/text-stream/create-text-stream-response.ts\nfunction createTextStreamResponse({\n status,\n statusText,\n headers,\n textStream\n}) {\n return new Response(textStream.pipeThrough(new TextEncoderStream()), {\n status: status != null ? status : 200,\n statusText,\n headers: prepareHeaders(headers, {\n \"content-type\": \"text/plain; charset=utf-8\"\n })\n });\n}\n\n// src/util/write-to-server-response.ts\nfunction writeToServerResponse({\n response,\n status,\n statusText,\n headers,\n stream\n}) {\n const statusCode = status != null ? status : 200;\n if (statusText !== void 0) {\n response.writeHead(statusCode, statusText, headers);\n } else {\n response.writeHead(statusCode, headers);\n }\n const reader = stream.getReader();\n const read = async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done)\n break;\n const canContinue = response.write(value);\n if (!canContinue) {\n await new Promise((resolve3) => {\n response.once(\"drain\", resolve3);\n });\n }\n }\n } catch (error) {\n throw error;\n } finally {\n response.end();\n }\n };\n read();\n}\n\n// src/text-stream/pipe-text-stream-to-response.ts\nfunction pipeTextStreamToResponse({\n response,\n status,\n statusText,\n headers,\n textStream\n}) {\n writeToServerResponse({\n response,\n status,\n statusText,\n headers: Object.fromEntries(\n prepareHeaders(headers, {\n \"content-type\": \"text/plain; charset=utf-8\"\n }).entries()\n ),\n stream: textStream.pipeThrough(new TextEncoderStream())\n });\n}\n\n// src/ui-message-stream/json-to-sse-transform-stream.ts\nvar JsonToSseTransformStream = class extends TransformStream {\n constructor() {\n super({\n transform(part, controller) {\n controller.enqueue(`data: ${JSON.stringify(part)}\n\n`);\n },\n flush(controller) {\n controller.enqueue(\"data: [DONE]\\n\\n\");\n }\n });\n }\n};\n\n// src/ui-message-stream/ui-message-stream-headers.ts\nvar UI_MESSAGE_STREAM_HEADERS = {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n \"x-vercel-ai-ui-message-stream\": \"v1\",\n \"x-accel-buffering\": \"no\"\n // disable nginx buffering\n};\n\n// src/ui-message-stream/create-ui-message-stream-response.ts\nfunction createUIMessageStreamResponse({\n status,\n statusText,\n headers,\n stream,\n consumeSseStream\n}) {\n let sseStream = stream.pipeThrough(new JsonToSseTransformStream());\n if (consumeSseStream) {\n const [stream1, stream2] = sseStream.tee();\n sseStream = stream1;\n consumeSseStream({ stream: stream2 });\n }\n return new Response(sseStream.pipeThrough(new TextEncoderStream()), {\n status,\n statusText,\n headers: prepareHeaders(headers, UI_MESSAGE_STREAM_HEADERS)\n });\n}\n\n// src/ui-message-stream/get-response-ui-message-id.ts\nfunction getResponseUIMessageId({\n originalMessages,\n responseMessageId\n}) {\n if (originalMessages == null) {\n return void 0;\n }\n const lastMessage = originalMessages[originalMessages.length - 1];\n return (lastMessage == null ? void 0 : lastMessage.role) === \"assistant\" ? lastMessage.id : typeof responseMessageId === \"function\" ? responseMessageId() : responseMessageId;\n}\n\n// src/ui/process-ui-message-stream.ts\nimport { validateTypes } from \"@ai-sdk/provider-utils\";\n\n// src/ui-message-stream/ui-message-chunks.ts\nimport { z as z7 } from \"zod/v4\";\nimport { lazySchema, zodSchema } from \"@ai-sdk/provider-utils\";\nvar toolMetadataSchema = z7.record(\n z7.string(),\n jsonValueSchema.optional()\n);\nvar uiMessageChunkSchema = lazySchema(\n () => zodSchema(\n z7.union([\n z7.strictObject({\n type: z7.literal(\"text-start\"),\n id: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"text-delta\"),\n id: z7.string(),\n delta: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"text-end\"),\n id: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"error\"),\n errorText: z7.string()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-input-start\"),\n toolCallId: z7.string(),\n toolName: z7.string(),\n providerExecuted: z7.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n toolMetadata: toolMetadataSchema.optional(),\n dynamic: z7.boolean().optional(),\n title: z7.string().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-input-delta\"),\n toolCallId: z7.string(),\n inputTextDelta: z7.string()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-input-available\"),\n toolCallId: z7.string(),\n toolName: z7.string(),\n input: z7.unknown(),\n providerExecuted: z7.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n toolMetadata: toolMetadataSchema.optional(),\n dynamic: z7.boolean().optional(),\n title: z7.string().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-input-error\"),\n toolCallId: z7.string(),\n toolName: z7.string(),\n input: z7.unknown(),\n providerExecuted: z7.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n toolMetadata: toolMetadataSchema.optional(),\n dynamic: z7.boolean().optional(),\n errorText: z7.string(),\n title: z7.string().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-approval-request\"),\n approvalId: z7.string(),\n toolCallId: z7.string()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-output-available\"),\n toolCallId: z7.string(),\n output: z7.unknown(),\n providerExecuted: z7.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n toolMetadata: toolMetadataSchema.optional(),\n dynamic: z7.boolean().optional(),\n preliminary: z7.boolean().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-output-error\"),\n toolCallId: z7.string(),\n errorText: z7.string(),\n providerExecuted: z7.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n toolMetadata: toolMetadataSchema.optional(),\n dynamic: z7.boolean().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-output-denied\"),\n toolCallId: z7.string()\n }),\n z7.strictObject({\n type: z7.literal(\"reasoning-start\"),\n id: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"reasoning-delta\"),\n id: z7.string(),\n delta: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"reasoning-end\"),\n id: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"source-url\"),\n sourceId: z7.string(),\n url: z7.string(),\n title: z7.string().optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"source-document\"),\n sourceId: z7.string(),\n mediaType: z7.string(),\n title: z7.string(),\n filename: z7.string().optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"file\"),\n url: z7.string(),\n mediaType: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.custom(\n (value) => typeof value === \"string\" && value.startsWith(\"data-\"),\n { message: 'Type must start with \"data-\"' }\n ),\n id: z7.string().optional(),\n data: z7.unknown(),\n transient: z7.boolean().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"start-step\")\n }),\n z7.strictObject({\n type: z7.literal(\"finish-step\")\n }),\n z7.strictObject({\n type: z7.literal(\"start\"),\n messageId: z7.string().optional(),\n messageMetadata: z7.unknown().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"finish\"),\n finishReason: z7.enum([\n \"stop\",\n \"length\",\n \"content-filter\",\n \"tool-calls\",\n \"error\",\n \"other\"\n ]).optional(),\n messageMetadata: z7.unknown().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"abort\"),\n reason: z7.string().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"message-metadata\"),\n messageMetadata: z7.unknown()\n })\n ])\n )\n);\nfunction isDataUIMessageChunk(chunk) {\n return chunk.type.startsWith(\"data-\");\n}\n\n// src/ui/ui-messages.ts\nfunction isDataUIPart(part) {\n return part.type.startsWith(\"data-\");\n}\nfunction isTextUIPart(part) {\n return part.type === \"text\";\n}\nfunction isFileUIPart(part) {\n return part.type === \"file\";\n}\nfunction isReasoningUIPart(part) {\n return part.type === \"reasoning\";\n}\nfunction isStaticToolUIPart(part) {\n return part.type.startsWith(\"tool-\");\n}\nfunction isDynamicToolUIPart(part) {\n return part.type === \"dynamic-tool\";\n}\nfunction isToolUIPart(part) {\n return isStaticToolUIPart(part) || isDynamicToolUIPart(part);\n}\nvar isToolOrDynamicToolUIPart = isToolUIPart;\nfunction getStaticToolName(part) {\n return part.type.split(\"-\").slice(1).join(\"-\");\n}\nfunction getToolName(part) {\n return isDynamicToolUIPart(part) ? part.toolName : getStaticToolName(part);\n}\nvar getToolOrDynamicToolName = getToolName;\n\n// src/ui/process-ui-message-stream.ts\nfunction createStreamingUIMessageState({\n lastMessage,\n messageId\n}) {\n return {\n message: (lastMessage == null ? void 0 : lastMessage.role) === \"assistant\" ? lastMessage : {\n id: messageId,\n metadata: void 0,\n role: \"assistant\",\n parts: []\n },\n activeTextParts: {},\n activeReasoningParts: {},\n partialToolCalls: {}\n };\n}\nfunction processUIMessageStream({\n stream,\n messageMetadataSchema,\n dataPartSchemas,\n runUpdateMessageJob,\n onError,\n onToolCall,\n onData\n}) {\n return stream.pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n await runUpdateMessageJob(async ({ state, write }) => {\n var _a21, _b, _c, _d;\n function getToolInvocation(toolCallId) {\n const toolInvocations = state.message.parts.filter(isToolUIPart);\n const toolInvocation = toolInvocations.find(\n (invocation) => invocation.toolCallId === toolCallId\n );\n if (toolInvocation == null) {\n throw new UIMessageStreamError({\n chunkType: \"tool-invocation\",\n chunkId: toolCallId,\n message: `No tool invocation found for tool call ID \"${toolCallId}\".`\n });\n }\n return toolInvocation;\n }\n function updateToolPart(options) {\n var _a22;\n const part = state.message.parts.find(\n (part2) => isStaticToolUIPart(part2) && part2.toolCallId === options.toolCallId\n );\n const anyOptions = options;\n const anyPart = part;\n if (part != null) {\n part.state = options.state;\n anyPart.input = anyOptions.input;\n anyPart.output = anyOptions.output;\n anyPart.errorText = anyOptions.errorText;\n anyPart.rawInput = anyOptions.rawInput;\n anyPart.preliminary = anyOptions.preliminary;\n if (options.title !== void 0) {\n anyPart.title = options.title;\n }\n if (options.toolMetadata !== void 0) {\n anyPart.toolMetadata = options.toolMetadata;\n }\n anyPart.providerExecuted = (_a22 = anyOptions.providerExecuted) != null ? _a22 : part.providerExecuted;\n const providerMetadata = anyOptions.providerMetadata;\n if (providerMetadata != null) {\n if (options.state === \"output-available\" || options.state === \"output-error\") {\n const resultPart = part;\n resultPart.resultProviderMetadata = providerMetadata;\n } else {\n part.callProviderMetadata = providerMetadata;\n }\n }\n } else {\n state.message.parts.push({\n type: `tool-${options.toolName}`,\n toolCallId: options.toolCallId,\n state: options.state,\n title: options.title,\n ...options.toolMetadata !== void 0 ? { toolMetadata: options.toolMetadata } : {},\n input: anyOptions.input,\n output: anyOptions.output,\n rawInput: anyOptions.rawInput,\n errorText: anyOptions.errorText,\n providerExecuted: anyOptions.providerExecuted,\n preliminary: anyOptions.preliminary,\n ...anyOptions.providerMetadata != null && (options.state === \"output-available\" || options.state === \"output-error\") ? { resultProviderMetadata: anyOptions.providerMetadata } : {},\n ...anyOptions.providerMetadata != null && !(options.state === \"output-available\" || options.state === \"output-error\") ? { callProviderMetadata: anyOptions.providerMetadata } : {}\n });\n }\n }\n function updateDynamicToolPart(options) {\n var _a22, _b2;\n const part = state.message.parts.find(\n (part2) => part2.type === \"dynamic-tool\" && part2.toolCallId === options.toolCallId\n );\n const anyOptions = options;\n const anyPart = part;\n if (part != null) {\n part.state = options.state;\n anyPart.toolName = options.toolName;\n anyPart.input = anyOptions.input;\n anyPart.output = anyOptions.output;\n anyPart.errorText = anyOptions.errorText;\n anyPart.rawInput = (_a22 = anyOptions.rawInput) != null ? _a22 : anyPart.rawInput;\n anyPart.preliminary = anyOptions.preliminary;\n if (options.title !== void 0) {\n anyPart.title = options.title;\n }\n if (options.toolMetadata !== void 0) {\n anyPart.toolMetadata = options.toolMetadata;\n }\n anyPart.providerExecuted = (_b2 = anyOptions.providerExecuted) != null ? _b2 : part.providerExecuted;\n const providerMetadata = anyOptions.providerMetadata;\n if (providerMetadata != null) {\n if (options.state === \"output-available\" || options.state === \"output-error\") {\n const resultPart = part;\n resultPart.resultProviderMetadata = providerMetadata;\n } else {\n part.callProviderMetadata = providerMetadata;\n }\n }\n } else {\n state.message.parts.push({\n type: \"dynamic-tool\",\n toolName: options.toolName,\n toolCallId: options.toolCallId,\n state: options.state,\n input: anyOptions.input,\n output: anyOptions.output,\n errorText: anyOptions.errorText,\n preliminary: anyOptions.preliminary,\n providerExecuted: anyOptions.providerExecuted,\n title: options.title,\n ...options.toolMetadata !== void 0 ? { toolMetadata: options.toolMetadata } : {},\n ...anyOptions.providerMetadata != null && (options.state === \"output-available\" || options.state === \"output-error\") ? { resultProviderMetadata: anyOptions.providerMetadata } : {},\n ...anyOptions.providerMetadata != null && !(options.state === \"output-available\" || options.state === \"output-error\") ? { callProviderMetadata: anyOptions.providerMetadata } : {}\n });\n }\n }\n async function updateMessageMetadata(metadata) {\n if (metadata != null) {\n const mergedMetadata = state.message.metadata != null ? mergeObjects(state.message.metadata, metadata) : metadata;\n if (messageMetadataSchema != null) {\n await validateTypes({\n value: mergedMetadata,\n schema: messageMetadataSchema,\n context: {\n field: \"message.metadata\",\n entityId: state.message.id\n }\n });\n }\n state.message.metadata = mergedMetadata;\n }\n }\n switch (chunk.type) {\n case \"text-start\": {\n const textPart = {\n type: \"text\",\n text: \"\",\n providerMetadata: chunk.providerMetadata,\n state: \"streaming\"\n };\n state.activeTextParts[chunk.id] = textPart;\n state.message.parts.push(textPart);\n write();\n break;\n }\n case \"text-delta\": {\n const textPart = state.activeTextParts[chunk.id];\n if (textPart == null) {\n throw new UIMessageStreamError({\n chunkType: \"text-delta\",\n chunkId: chunk.id,\n message: `Received text-delta for missing text part with ID \"${chunk.id}\". Ensure a \"text-start\" chunk is sent before any \"text-delta\" chunks.`\n });\n }\n textPart.text += chunk.delta;\n textPart.providerMetadata = (_a21 = chunk.providerMetadata) != null ? _a21 : textPart.providerMetadata;\n write();\n break;\n }\n case \"text-end\": {\n const textPart = state.activeTextParts[chunk.id];\n if (textPart == null) {\n throw new UIMessageStreamError({\n chunkType: \"text-end\",\n chunkId: chunk.id,\n message: `Received text-end for missing text part with ID \"${chunk.id}\". Ensure a \"text-start\" chunk is sent before any \"text-end\" chunks.`\n });\n }\n textPart.state = \"done\";\n textPart.providerMetadata = (_b = chunk.providerMetadata) != null ? _b : textPart.providerMetadata;\n delete state.activeTextParts[chunk.id];\n write();\n break;\n }\n case \"reasoning-start\": {\n const reasoningPart = {\n type: \"reasoning\",\n text: \"\",\n providerMetadata: chunk.providerMetadata,\n state: \"streaming\"\n };\n state.activeReasoningParts[chunk.id] = reasoningPart;\n state.message.parts.push(reasoningPart);\n write();\n break;\n }\n case \"reasoning-delta\": {\n const reasoningPart = state.activeReasoningParts[chunk.id];\n if (reasoningPart == null) {\n throw new UIMessageStreamError({\n chunkType: \"reasoning-delta\",\n chunkId: chunk.id,\n message: `Received reasoning-delta for missing reasoning part with ID \"${chunk.id}\". Ensure a \"reasoning-start\" chunk is sent before any \"reasoning-delta\" chunks.`\n });\n }\n reasoningPart.text += chunk.delta;\n reasoningPart.providerMetadata = (_c = chunk.providerMetadata) != null ? _c : reasoningPart.providerMetadata;\n write();\n break;\n }\n case \"reasoning-end\": {\n const reasoningPart = state.activeReasoningParts[chunk.id];\n if (reasoningPart == null) {\n throw new UIMessageStreamError({\n chunkType: \"reasoning-end\",\n chunkId: chunk.id,\n message: `Received reasoning-end for missing reasoning part with ID \"${chunk.id}\". Ensure a \"reasoning-start\" chunk is sent before any \"reasoning-end\" chunks.`\n });\n }\n reasoningPart.providerMetadata = (_d = chunk.providerMetadata) != null ? _d : reasoningPart.providerMetadata;\n reasoningPart.state = \"done\";\n delete state.activeReasoningParts[chunk.id];\n write();\n break;\n }\n case \"file\": {\n state.message.parts.push({\n type: \"file\",\n mediaType: chunk.mediaType,\n url: chunk.url,\n ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {}\n });\n write();\n break;\n }\n case \"source-url\": {\n state.message.parts.push({\n type: \"source-url\",\n sourceId: chunk.sourceId,\n url: chunk.url,\n title: chunk.title,\n providerMetadata: chunk.providerMetadata\n });\n write();\n break;\n }\n case \"source-document\": {\n state.message.parts.push({\n type: \"source-document\",\n sourceId: chunk.sourceId,\n mediaType: chunk.mediaType,\n title: chunk.title,\n filename: chunk.filename,\n providerMetadata: chunk.providerMetadata\n });\n write();\n break;\n }\n case \"tool-input-start\": {\n const toolInvocations = state.message.parts.filter(isStaticToolUIPart);\n state.partialToolCalls[chunk.toolCallId] = {\n text: \"\",\n toolName: chunk.toolName,\n index: toolInvocations.length,\n dynamic: chunk.dynamic,\n title: chunk.title,\n toolMetadata: chunk.toolMetadata\n };\n if (chunk.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-streaming\",\n input: void 0,\n providerExecuted: chunk.providerExecuted,\n title: chunk.title,\n toolMetadata: chunk.toolMetadata,\n providerMetadata: chunk.providerMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-streaming\",\n input: void 0,\n providerExecuted: chunk.providerExecuted,\n title: chunk.title,\n toolMetadata: chunk.toolMetadata,\n providerMetadata: chunk.providerMetadata\n });\n }\n write();\n break;\n }\n case \"tool-input-delta\": {\n const partialToolCall = state.partialToolCalls[chunk.toolCallId];\n if (partialToolCall == null) {\n throw new UIMessageStreamError({\n chunkType: \"tool-input-delta\",\n chunkId: chunk.toolCallId,\n message: `Received tool-input-delta for missing tool call with ID \"${chunk.toolCallId}\". Ensure a \"tool-input-start\" chunk is sent before any \"tool-input-delta\" chunks.`\n });\n }\n partialToolCall.text += chunk.inputTextDelta;\n const { value: partialArgs } = await parsePartialJson(\n partialToolCall.text\n );\n if (partialToolCall.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: partialToolCall.toolName,\n state: \"input-streaming\",\n input: partialArgs,\n title: partialToolCall.title,\n toolMetadata: partialToolCall.toolMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: partialToolCall.toolName,\n state: \"input-streaming\",\n input: partialArgs,\n title: partialToolCall.title,\n toolMetadata: partialToolCall.toolMetadata\n });\n }\n write();\n break;\n }\n case \"tool-input-available\": {\n if (chunk.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-available\",\n input: chunk.input,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: chunk.title,\n toolMetadata: chunk.toolMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-available\",\n input: chunk.input,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: chunk.title,\n toolMetadata: chunk.toolMetadata\n });\n }\n write();\n if (onToolCall && !chunk.providerExecuted) {\n await onToolCall({\n toolCall: chunk\n });\n }\n break;\n }\n case \"tool-input-error\": {\n const existingPart = state.message.parts.filter(isToolUIPart).find((p) => p.toolCallId === chunk.toolCallId);\n const isDynamic = existingPart != null ? existingPart.type === \"dynamic-tool\" : !!chunk.dynamic;\n if (isDynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"output-error\",\n input: chunk.input,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"output-error\",\n input: void 0,\n rawInput: chunk.input,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata\n });\n }\n write();\n break;\n }\n case \"tool-approval-request\": {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n toolInvocation.state = \"approval-requested\";\n toolInvocation.approval = { id: chunk.approvalId };\n write();\n break;\n }\n case \"tool-output-denied\": {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n toolInvocation.state = \"output-denied\";\n write();\n break;\n }\n case \"tool-output-available\": {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n if (toolInvocation.type === \"dynamic-tool\") {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: toolInvocation.toolName,\n state: \"output-available\",\n input: toolInvocation.input,\n output: chunk.output,\n preliminary: chunk.preliminary,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: toolInvocation.title,\n toolMetadata: toolInvocation.toolMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: getStaticToolName(toolInvocation),\n state: \"output-available\",\n input: toolInvocation.input,\n output: chunk.output,\n providerExecuted: chunk.providerExecuted,\n preliminary: chunk.preliminary,\n providerMetadata: chunk.providerMetadata,\n title: toolInvocation.title,\n toolMetadata: toolInvocation.toolMetadata\n });\n }\n write();\n break;\n }\n case \"tool-output-error\": {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n if (toolInvocation.type === \"dynamic-tool\") {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: toolInvocation.toolName,\n state: \"output-error\",\n input: toolInvocation.input,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: toolInvocation.title,\n toolMetadata: toolInvocation.toolMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: getStaticToolName(toolInvocation),\n state: \"output-error\",\n input: toolInvocation.input,\n rawInput: toolInvocation.rawInput,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: toolInvocation.title,\n toolMetadata: toolInvocation.toolMetadata\n });\n }\n write();\n break;\n }\n case \"start-step\": {\n state.message.parts.push({ type: \"step-start\" });\n break;\n }\n case \"finish-step\": {\n state.activeTextParts = {};\n state.activeReasoningParts = {};\n break;\n }\n case \"start\": {\n if (chunk.messageId != null) {\n state.message.id = chunk.messageId;\n }\n await updateMessageMetadata(chunk.messageMetadata);\n if (chunk.messageId != null || chunk.messageMetadata != null) {\n write();\n }\n break;\n }\n case \"finish\": {\n if (chunk.finishReason != null) {\n state.finishReason = chunk.finishReason;\n }\n await updateMessageMetadata(chunk.messageMetadata);\n if (chunk.messageMetadata != null) {\n write();\n }\n break;\n }\n case \"message-metadata\": {\n await updateMessageMetadata(chunk.messageMetadata);\n if (chunk.messageMetadata != null) {\n write();\n }\n break;\n }\n case \"error\": {\n onError == null ? void 0 : onError(new Error(chunk.errorText));\n break;\n }\n default: {\n if (isDataUIMessageChunk(chunk)) {\n if ((dataPartSchemas == null ? void 0 : dataPartSchemas[chunk.type]) != null) {\n const partIdx = state.message.parts.findIndex(\n (p) => \"id\" in p && \"data\" in p && p.id === chunk.id && p.type === chunk.type\n );\n const actualPartIdx = partIdx >= 0 ? partIdx : state.message.parts.length;\n await validateTypes({\n value: chunk.data,\n schema: dataPartSchemas[chunk.type],\n context: {\n field: `message.parts[${actualPartIdx}].data`,\n entityName: chunk.type,\n entityId: chunk.id\n }\n });\n }\n const dataChunk = chunk;\n if (dataChunk.transient) {\n onData == null ? void 0 : onData(dataChunk);\n break;\n }\n const existingUIPart = dataChunk.id != null ? state.message.parts.find(\n (chunkArg) => dataChunk.type === chunkArg.type && dataChunk.id === chunkArg.id\n ) : void 0;\n if (existingUIPart != null) {\n existingUIPart.data = dataChunk.data;\n } else {\n state.message.parts.push(dataChunk);\n }\n onData == null ? void 0 : onData(dataChunk);\n write();\n }\n }\n }\n controller.enqueue(chunk);\n });\n }\n })\n );\n}\n\n// src/ui-message-stream/handle-ui-message-stream-finish.ts\nfunction handleUIMessageStreamFinish({\n messageId,\n originalMessages = [],\n onStepFinish,\n onFinish,\n onError,\n stream\n}) {\n let lastMessage = originalMessages == null ? void 0 : originalMessages[originalMessages.length - 1];\n if ((lastMessage == null ? void 0 : lastMessage.role) !== \"assistant\") {\n lastMessage = void 0;\n } else {\n messageId = lastMessage.id;\n }\n let isAborted = false;\n const idInjectedStream = stream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n if (chunk.type === \"start\") {\n const startChunk = chunk;\n if (startChunk.messageId == null && messageId != null) {\n startChunk.messageId = messageId;\n }\n }\n if (chunk.type === \"abort\") {\n isAborted = true;\n }\n controller.enqueue(chunk);\n }\n })\n );\n if (onFinish == null && onStepFinish == null) {\n return idInjectedStream;\n }\n const state = createStreamingUIMessageState({\n lastMessage: lastMessage ? structuredClone(lastMessage) : void 0,\n messageId: messageId != null ? messageId : \"\"\n // will be overridden by the stream\n });\n const runUpdateMessageJob = async (job) => {\n await job({ state, write: () => {\n } });\n };\n let finishCalled = false;\n const callOnFinish = async () => {\n if (finishCalled || !onFinish) {\n return;\n }\n finishCalled = true;\n const isContinuation = state.message.id === (lastMessage == null ? void 0 : lastMessage.id);\n await onFinish({\n isAborted,\n isContinuation,\n responseMessage: state.message,\n messages: [\n ...isContinuation ? originalMessages.slice(0, -1) : originalMessages,\n state.message\n ],\n finishReason: state.finishReason\n });\n };\n const callOnStepFinish = async () => {\n if (!onStepFinish) {\n return;\n }\n const isContinuation = state.message.id === (lastMessage == null ? void 0 : lastMessage.id);\n try {\n await onStepFinish({\n isContinuation,\n responseMessage: structuredClone(state.message),\n messages: [\n ...isContinuation ? originalMessages.slice(0, -1) : originalMessages,\n structuredClone(state.message)\n ]\n });\n } catch (error) {\n onError(error);\n }\n };\n return processUIMessageStream({\n stream: idInjectedStream,\n runUpdateMessageJob,\n onError\n }).pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n if (chunk.type === \"finish-step\") {\n await callOnStepFinish();\n }\n controller.enqueue(chunk);\n },\n // @ts-expect-error cancel is still new and missing from types https://developer.mozilla.org/en-US/docs/Web/API/TransformStream#browser_compatibility\n async cancel() {\n await callOnFinish();\n },\n async flush() {\n await callOnFinish();\n }\n })\n );\n}\n\n// src/ui-message-stream/pipe-ui-message-stream-to-response.ts\nfunction pipeUIMessageStreamToResponse({\n response,\n status,\n statusText,\n headers,\n stream,\n consumeSseStream\n}) {\n let sseStream = stream.pipeThrough(new JsonToSseTransformStream());\n if (consumeSseStream) {\n const [stream1, stream2] = sseStream.tee();\n sseStream = stream1;\n consumeSseStream({ stream: stream2 });\n }\n writeToServerResponse({\n response,\n status,\n statusText,\n headers: Object.fromEntries(\n prepareHeaders(headers, UI_MESSAGE_STREAM_HEADERS).entries()\n ),\n stream: sseStream.pipeThrough(new TextEncoderStream())\n });\n}\n\n// src/util/async-iterable-stream.ts\nfunction createAsyncIterableStream(source) {\n const stream = source.pipeThrough(new TransformStream());\n stream[Symbol.asyncIterator] = function() {\n const reader = this.getReader();\n let finished = false;\n async function cleanup(cancelStream) {\n var _a21;\n if (finished)\n return;\n finished = true;\n try {\n if (cancelStream) {\n await ((_a21 = reader.cancel) == null ? void 0 : _a21.call(reader));\n }\n } finally {\n try {\n reader.releaseLock();\n } catch (e) {\n }\n }\n }\n return {\n /**\n * Reads the next chunk from the stream.\n * @returns A promise resolving to the next IteratorResult.\n */\n async next() {\n if (finished) {\n return { done: true, value: void 0 };\n }\n const { done, value } = await reader.read();\n if (done) {\n await cleanup(true);\n return { done: true, value: void 0 };\n }\n return { done: false, value };\n },\n /**\n * May be called on early exit (e.g., break from for-await) or after completion.\n * Ensures the stream is cancelled and resources are released.\n * @returns A promise resolving to a completed IteratorResult.\n */\n async return() {\n await cleanup(true);\n return { done: true, value: void 0 };\n },\n /**\n * Called on early exit with error.\n * Ensures the stream is cancelled and resources are released, then rethrows the error.\n * @param err The error to throw.\n * @returns A promise that rejects with the provided error.\n */\n async throw(err) {\n await cleanup(true);\n throw err;\n }\n };\n };\n return stream;\n}\n\n// src/util/consume-stream.ts\nasync function consumeStream({\n stream,\n onError\n}) {\n const reader = stream.getReader();\n try {\n while (true) {\n const { done } = await reader.read();\n if (done)\n break;\n }\n } catch (error) {\n onError == null ? void 0 : onError(error);\n } finally {\n reader.releaseLock();\n }\n}\n\n// src/util/create-resolvable-promise.ts\nfunction createResolvablePromise() {\n let resolve3;\n let reject;\n const promise = new Promise((res, rej) => {\n resolve3 = res;\n reject = rej;\n });\n return {\n promise,\n resolve: resolve3,\n reject\n };\n}\n\n// src/util/create-stitchable-stream.ts\nfunction createStitchableStream() {\n let innerStreamReaders = [];\n let controller = null;\n let isClosed = false;\n let waitForNewStream = createResolvablePromise();\n const terminate = () => {\n isClosed = true;\n waitForNewStream.resolve();\n innerStreamReaders.forEach((reader) => reader.cancel());\n innerStreamReaders = [];\n controller == null ? void 0 : controller.close();\n };\n const processPull = async () => {\n if (isClosed && innerStreamReaders.length === 0) {\n controller == null ? void 0 : controller.close();\n return;\n }\n if (innerStreamReaders.length === 0) {\n waitForNewStream = createResolvablePromise();\n await waitForNewStream.promise;\n return processPull();\n }\n try {\n const { value, done } = await innerStreamReaders[0].read();\n if (done) {\n innerStreamReaders.shift();\n if (innerStreamReaders.length === 0 && isClosed) {\n controller == null ? void 0 : controller.close();\n } else {\n await processPull();\n }\n } else {\n controller == null ? void 0 : controller.enqueue(value);\n }\n } catch (error) {\n controller == null ? void 0 : controller.error(error);\n innerStreamReaders.shift();\n terminate();\n }\n };\n return {\n stream: new ReadableStream({\n start(controllerParam) {\n controller = controllerParam;\n },\n pull: processPull,\n async cancel() {\n for (const reader of innerStreamReaders) {\n await reader.cancel();\n }\n innerStreamReaders = [];\n isClosed = true;\n }\n }),\n addStream: (innerStream) => {\n if (isClosed) {\n throw new Error(\"Cannot add inner stream: outer stream is closed\");\n }\n innerStreamReaders.push(innerStream.getReader());\n waitForNewStream.resolve();\n },\n /**\n * Gracefully close the outer stream. This will let the inner streams\n * finish processing and then close the outer stream.\n */\n close: () => {\n isClosed = true;\n waitForNewStream.resolve();\n if (innerStreamReaders.length === 0) {\n controller == null ? void 0 : controller.close();\n }\n },\n /**\n * Immediately close the outer stream. This will cancel all inner streams\n * and close the outer stream.\n */\n terminate\n };\n}\n\n// src/generate-text/run-tools-transformation.ts\nimport {\n getErrorMessage as getErrorMessage6\n} from \"@ai-sdk/provider-utils\";\nfunction runToolsTransformation({\n tools,\n generatorStream,\n tracer,\n telemetry,\n system,\n messages,\n abortSignal,\n repairToolCall,\n experimental_context,\n generateId: generateId2,\n stepNumber,\n model,\n onToolCallStart,\n onToolCallFinish\n}) {\n let toolResultsStreamController = null;\n const toolResultsStream = new ReadableStream({\n start(controller) {\n toolResultsStreamController = controller;\n }\n });\n const outstandingToolResults = /* @__PURE__ */ new Set();\n const toolInputs = /* @__PURE__ */ new Map();\n const toolCallsByToolCallId = /* @__PURE__ */ new Map();\n let canClose = false;\n let finishChunk = void 0;\n function attemptClose() {\n if (canClose && outstandingToolResults.size === 0) {\n if (finishChunk != null) {\n toolResultsStreamController.enqueue(finishChunk);\n }\n toolResultsStreamController.close();\n }\n }\n const forwardStream = new TransformStream({\n async transform(chunk, controller) {\n const chunkType = chunk.type;\n switch (chunkType) {\n case \"stream-start\":\n case \"text-start\":\n case \"text-delta\":\n case \"text-end\":\n case \"reasoning-start\":\n case \"reasoning-delta\":\n case \"reasoning-end\":\n case \"tool-input-start\":\n case \"tool-input-delta\":\n case \"tool-input-end\":\n case \"source\":\n case \"response-metadata\":\n case \"error\":\n case \"raw\": {\n controller.enqueue(chunk);\n break;\n }\n case \"file\": {\n controller.enqueue({\n type: \"file\",\n file: new DefaultGeneratedFileWithType({\n data: chunk.data,\n mediaType: chunk.mediaType\n }),\n ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {}\n });\n break;\n }\n case \"finish\": {\n finishChunk = {\n type: \"finish\",\n finishReason: chunk.finishReason.unified,\n rawFinishReason: chunk.finishReason.raw,\n usage: asLanguageModelUsage(chunk.usage),\n providerMetadata: chunk.providerMetadata\n };\n break;\n }\n case \"tool-approval-request\": {\n const toolCall = toolCallsByToolCallId.get(chunk.toolCallId);\n if (toolCall == null) {\n toolResultsStreamController.enqueue({\n type: \"error\",\n error: new ToolCallNotFoundForApprovalError({\n toolCallId: chunk.toolCallId,\n approvalId: chunk.approvalId\n })\n });\n break;\n }\n controller.enqueue({\n type: \"tool-approval-request\",\n approvalId: chunk.approvalId,\n toolCall\n });\n break;\n }\n case \"tool-call\": {\n try {\n const toolCall = await parseToolCall({\n toolCall: chunk,\n tools,\n repairToolCall,\n system,\n messages\n });\n toolCallsByToolCallId.set(toolCall.toolCallId, toolCall);\n controller.enqueue(toolCall);\n if (toolCall.invalid) {\n toolResultsStreamController.enqueue({\n type: \"tool-error\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n error: getErrorMessage6(toolCall.error),\n dynamic: true,\n title: toolCall.title,\n ...toolCall.toolMetadata != null ? { toolMetadata: toolCall.toolMetadata } : {}\n });\n break;\n }\n const tool2 = tools == null ? void 0 : tools[toolCall.toolName];\n if (tool2 == null) {\n break;\n }\n if (tool2.onInputAvailable != null) {\n await tool2.onInputAvailable({\n input: toolCall.input,\n toolCallId: toolCall.toolCallId,\n messages,\n abortSignal,\n experimental_context\n });\n }\n if (await isApprovalNeeded({\n tool: tool2,\n toolCall,\n messages,\n experimental_context\n })) {\n toolResultsStreamController.enqueue({\n type: \"tool-approval-request\",\n approvalId: generateId2(),\n toolCall\n });\n break;\n }\n toolInputs.set(toolCall.toolCallId, toolCall.input);\n if (tool2.execute != null && toolCall.providerExecuted !== true) {\n const toolExecutionId = generateId2();\n outstandingToolResults.add(toolExecutionId);\n executeToolCall({\n toolCall,\n tools,\n tracer,\n telemetry,\n messages,\n abortSignal,\n experimental_context,\n stepNumber,\n model,\n onToolCallStart,\n onToolCallFinish,\n onPreliminaryToolResult: (result) => {\n toolResultsStreamController.enqueue(result);\n }\n }).then((result) => {\n toolResultsStreamController.enqueue(result);\n }).catch((error) => {\n toolResultsStreamController.enqueue({\n type: \"error\",\n error\n });\n }).finally(() => {\n outstandingToolResults.delete(toolExecutionId);\n attemptClose();\n });\n }\n } catch (error) {\n toolResultsStreamController.enqueue({ type: \"error\", error });\n }\n break;\n }\n case \"tool-result\": {\n const toolName = chunk.toolName;\n const toolCall = toolCallsByToolCallId.get(chunk.toolCallId);\n if (chunk.isError) {\n toolResultsStreamController.enqueue({\n type: \"tool-error\",\n toolCallId: chunk.toolCallId,\n toolName,\n input: toolInputs.get(chunk.toolCallId),\n providerExecuted: true,\n error: chunk.result,\n dynamic: chunk.dynamic,\n ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {},\n ...(toolCall == null ? void 0 : toolCall.toolMetadata) != null ? { toolMetadata: toolCall.toolMetadata } : {}\n });\n } else {\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: chunk.toolCallId,\n toolName,\n input: toolInputs.get(chunk.toolCallId),\n output: chunk.result,\n providerExecuted: true,\n dynamic: chunk.dynamic,\n ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {},\n ...(toolCall == null ? void 0 : toolCall.toolMetadata) != null ? { toolMetadata: toolCall.toolMetadata } : {}\n });\n }\n break;\n }\n default: {\n const _exhaustiveCheck = chunkType;\n throw new Error(`Unhandled chunk type: ${_exhaustiveCheck}`);\n }\n }\n },\n flush() {\n canClose = true;\n attemptClose();\n }\n });\n return new ReadableStream({\n async start(controller) {\n return Promise.all([\n generatorStream.pipeThrough(forwardStream).pipeTo(\n new WritableStream({\n write(chunk) {\n controller.enqueue(chunk);\n },\n close() {\n }\n })\n ),\n toolResultsStream.pipeTo(\n new WritableStream({\n write(chunk) {\n controller.enqueue(chunk);\n },\n close() {\n controller.close();\n }\n })\n )\n ]);\n }\n });\n}\n\n// src/generate-text/stream-text.ts\nvar originalGenerateId2 = createIdGenerator2({\n prefix: \"aitxt\",\n size: 24\n});\nfunction streamText({\n model,\n tools,\n toolChoice,\n system,\n prompt,\n messages,\n allowSystemInMessages,\n maxRetries,\n abortSignal,\n timeout,\n headers,\n stopWhen = stepCountIs(1),\n experimental_output,\n output = experimental_output,\n experimental_telemetry: telemetry,\n prepareStep,\n providerOptions,\n experimental_activeTools,\n activeTools = experimental_activeTools,\n experimental_repairToolCall: repairToolCall,\n experimental_transform: transform,\n experimental_download: download2,\n includeRawChunks = false,\n onChunk,\n onError = ({ error }) => {\n console.error(error);\n },\n onFinish,\n onAbort,\n onStepFinish,\n experimental_onStart: onStart,\n experimental_onStepStart: onStepStart,\n experimental_onToolCallStart: onToolCallStart,\n experimental_onToolCallFinish: onToolCallFinish,\n experimental_context,\n experimental_include: include,\n _internal: { now: now2 = now, generateId: generateId2 = originalGenerateId2 } = {},\n ...settings\n}) {\n const totalTimeoutMs = getTotalTimeoutMs(timeout);\n const stepTimeoutMs = getStepTimeoutMs(timeout);\n const chunkTimeoutMs = getChunkTimeoutMs(timeout);\n const stepAbortController = stepTimeoutMs != null ? new AbortController() : void 0;\n const chunkAbortController = chunkTimeoutMs != null ? new AbortController() : void 0;\n return new DefaultStreamTextResult({\n model: resolveLanguageModel(model),\n telemetry,\n headers,\n settings,\n maxRetries,\n abortSignal: mergeAbortSignals(\n abortSignal,\n totalTimeoutMs != null ? AbortSignal.timeout(totalTimeoutMs) : void 0,\n stepAbortController == null ? void 0 : stepAbortController.signal,\n chunkAbortController == null ? void 0 : chunkAbortController.signal\n ),\n stepTimeoutMs,\n stepAbortController,\n chunkTimeoutMs,\n chunkAbortController,\n system,\n prompt,\n messages,\n allowSystemInMessages,\n tools,\n toolChoice,\n transforms: asArray(transform),\n activeTools,\n repairToolCall,\n stopConditions: asArray(stopWhen),\n output,\n providerOptions,\n prepareStep,\n includeRawChunks,\n timeout,\n stopWhen,\n originalAbortSignal: abortSignal,\n onChunk,\n onError,\n onFinish,\n onAbort,\n onStepFinish,\n onStart,\n onStepStart,\n onToolCallStart,\n onToolCallFinish,\n now: now2,\n generateId: generateId2,\n experimental_context,\n download: download2,\n include\n });\n}\nfunction createOutputTransformStream(output) {\n let firstTextChunkId = void 0;\n let text2 = \"\";\n let textChunk = \"\";\n let textProviderMetadata = void 0;\n let lastPublishedValue = \"\";\n function publishTextChunk({\n controller,\n partialOutput = void 0\n }) {\n controller.enqueue({\n part: {\n type: \"text-delta\",\n id: firstTextChunkId,\n text: textChunk,\n providerMetadata: textProviderMetadata\n },\n partialOutput\n });\n textChunk = \"\";\n }\n return new TransformStream({\n async transform(chunk, controller) {\n var _a21;\n if (chunk.type === \"finish-step\" && textChunk.length > 0) {\n publishTextChunk({ controller });\n }\n if (chunk.type !== \"text-delta\" && chunk.type !== \"text-start\" && chunk.type !== \"text-end\") {\n controller.enqueue({ part: chunk, partialOutput: void 0 });\n return;\n }\n if (firstTextChunkId == null) {\n firstTextChunkId = chunk.id;\n } else if (chunk.id !== firstTextChunkId) {\n controller.enqueue({ part: chunk, partialOutput: void 0 });\n return;\n }\n if (chunk.type === \"text-start\") {\n controller.enqueue({ part: chunk, partialOutput: void 0 });\n return;\n }\n if (chunk.type === \"text-end\") {\n if (textChunk.length > 0) {\n publishTextChunk({ controller });\n }\n controller.enqueue({ part: chunk, partialOutput: void 0 });\n return;\n }\n text2 += chunk.text;\n textChunk += chunk.text;\n textProviderMetadata = (_a21 = chunk.providerMetadata) != null ? _a21 : textProviderMetadata;\n const result = await output.parsePartialOutput({ text: text2 });\n if (result !== void 0) {\n const currentValue = typeof result.partial === \"string\" ? result.partial : JSON.stringify(result.partial);\n if (currentValue !== lastPublishedValue) {\n publishTextChunk({ controller, partialOutput: result.partial });\n lastPublishedValue = currentValue;\n }\n }\n }\n });\n}\nvar DefaultStreamTextResult = class {\n constructor({\n model,\n telemetry,\n headers,\n settings,\n maxRetries: maxRetriesArg,\n abortSignal,\n stepTimeoutMs,\n stepAbortController,\n chunkTimeoutMs,\n chunkAbortController,\n system,\n prompt,\n messages,\n allowSystemInMessages,\n tools,\n toolChoice,\n transforms,\n activeTools,\n repairToolCall,\n stopConditions,\n output,\n providerOptions,\n prepareStep,\n includeRawChunks,\n now: now2,\n generateId: generateId2,\n timeout,\n stopWhen,\n originalAbortSignal,\n onChunk,\n onError,\n onFinish,\n onAbort,\n onStepFinish,\n onStart,\n onStepStart,\n onToolCallStart,\n onToolCallFinish,\n experimental_context,\n download: download2,\n include\n }) {\n this._totalUsage = new DelayedPromise();\n this._finishReason = new DelayedPromise();\n this._rawFinishReason = new DelayedPromise();\n this._steps = new DelayedPromise();\n this.outputSpecification = output;\n this.includeRawChunks = includeRawChunks;\n this.tools = tools;\n const createGlobalTelemetry = getGlobalTelemetryIntegration();\n const globalTelemetry = createGlobalTelemetry(telemetry == null ? void 0 : telemetry.integrations);\n let stepFinish;\n let recordedContent = [];\n const recordedResponseMessages = [];\n let recordedFinishReason = void 0;\n let recordedRawFinishReason = void 0;\n let recordedTotalUsage = void 0;\n let recordedRequest = {};\n let recordedWarnings = [];\n const recordedSteps = [];\n const pendingDeferredToolCalls = /* @__PURE__ */ new Map();\n let rootSpan;\n let activeTextContent = {};\n let activeReasoningContent = {};\n const eventProcessor = new TransformStream({\n async transform(chunk, controller) {\n var _a21, _b, _c, _d;\n controller.enqueue(chunk);\n const { part } = chunk;\n if (part.type === \"text-delta\" || part.type === \"reasoning-delta\" || part.type === \"source\" || part.type === \"tool-call\" || part.type === \"tool-result\" || part.type === \"tool-input-start\" || part.type === \"tool-input-delta\" || part.type === \"raw\") {\n await (onChunk == null ? void 0 : onChunk({ chunk: part }));\n }\n if (part.type === \"error\") {\n await onError({ error: wrapGatewayError(part.error) });\n }\n if (part.type === \"text-start\") {\n activeTextContent[part.id] = {\n type: \"text\",\n text: \"\",\n providerMetadata: part.providerMetadata\n };\n recordedContent.push(activeTextContent[part.id]);\n }\n if (part.type === \"text-delta\") {\n const activeText = activeTextContent[part.id];\n if (activeText == null) {\n controller.enqueue({\n part: {\n type: \"error\",\n error: `text part ${part.id} not found`\n },\n partialOutput: void 0\n });\n return;\n }\n activeText.text += part.text;\n activeText.providerMetadata = (_a21 = part.providerMetadata) != null ? _a21 : activeText.providerMetadata;\n }\n if (part.type === \"text-end\") {\n const activeText = activeTextContent[part.id];\n if (activeText == null) {\n controller.enqueue({\n part: {\n type: \"error\",\n error: `text part ${part.id} not found`\n },\n partialOutput: void 0\n });\n return;\n }\n activeText.providerMetadata = (_b = part.providerMetadata) != null ? _b : activeText.providerMetadata;\n delete activeTextContent[part.id];\n }\n if (part.type === \"reasoning-start\") {\n activeReasoningContent[part.id] = {\n type: \"reasoning\",\n text: \"\",\n providerMetadata: part.providerMetadata\n };\n recordedContent.push(activeReasoningContent[part.id]);\n }\n if (part.type === \"reasoning-delta\") {\n const activeReasoning = activeReasoningContent[part.id];\n if (activeReasoning == null) {\n controller.enqueue({\n part: {\n type: \"error\",\n error: `reasoning part ${part.id} not found`\n },\n partialOutput: void 0\n });\n return;\n }\n activeReasoning.text += part.text;\n activeReasoning.providerMetadata = (_c = part.providerMetadata) != null ? _c : activeReasoning.providerMetadata;\n }\n if (part.type === \"reasoning-end\") {\n const activeReasoning = activeReasoningContent[part.id];\n if (activeReasoning == null) {\n controller.enqueue({\n part: {\n type: \"error\",\n error: `reasoning part ${part.id} not found`\n },\n partialOutput: void 0\n });\n return;\n }\n activeReasoning.providerMetadata = (_d = part.providerMetadata) != null ? _d : activeReasoning.providerMetadata;\n delete activeReasoningContent[part.id];\n }\n if (part.type === \"file\") {\n recordedContent.push({\n type: \"file\",\n file: part.file,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n if (part.type === \"source\") {\n recordedContent.push(part);\n }\n if (part.type === \"tool-call\") {\n recordedContent.push(part);\n }\n if (part.type === \"tool-result\" && !part.preliminary) {\n recordedContent.push(part);\n }\n if (part.type === \"tool-approval-request\") {\n recordedContent.push(part);\n }\n if (part.type === \"tool-error\") {\n recordedContent.push(part);\n }\n if (part.type === \"start-step\") {\n recordedContent = [];\n activeReasoningContent = {};\n activeTextContent = {};\n recordedRequest = part.request;\n recordedWarnings = part.warnings;\n }\n if (part.type === \"finish-step\") {\n const stepMessages = await toResponseMessages({\n content: recordedContent,\n tools\n });\n const currentStepResult = new DefaultStepResult({\n stepNumber: recordedSteps.length,\n model: modelInfo,\n ...callbackTelemetryProps,\n experimental_context,\n content: recordedContent,\n finishReason: part.finishReason,\n rawFinishReason: part.rawFinishReason,\n usage: part.usage,\n warnings: recordedWarnings,\n request: recordedRequest,\n response: {\n ...part.response,\n messages: [...recordedResponseMessages, ...stepMessages]\n },\n providerMetadata: part.providerMetadata\n });\n await notify({\n event: currentStepResult,\n callbacks: [onStepFinish, globalTelemetry.onStepFinish]\n });\n logWarnings({\n warnings: recordedWarnings,\n provider: modelInfo.provider,\n model: modelInfo.modelId\n });\n recordedSteps.push(currentStepResult);\n recordedResponseMessages.push(...stepMessages);\n stepFinish.resolve();\n }\n if (part.type === \"finish\") {\n recordedTotalUsage = part.totalUsage;\n recordedFinishReason = part.finishReason;\n recordedRawFinishReason = part.rawFinishReason;\n }\n },\n async flush(controller) {\n var _a21, _b, _c, _d, _e, _f, _g;\n try {\n if (recordedSteps.length === 0) {\n const error = (abortSignal == null ? void 0 : abortSignal.aborted) ? abortSignal.reason : new NoOutputGeneratedError({\n message: \"No output generated. Check the stream for errors.\"\n });\n self._finishReason.reject(error);\n self._rawFinishReason.reject(error);\n self._totalUsage.reject(error);\n self._steps.reject(error);\n return;\n }\n const finishReason = recordedFinishReason != null ? recordedFinishReason : \"other\";\n const totalUsage = recordedTotalUsage != null ? recordedTotalUsage : createNullLanguageModelUsage();\n self._finishReason.resolve(finishReason);\n self._rawFinishReason.resolve(recordedRawFinishReason);\n self._totalUsage.resolve(totalUsage);\n self._steps.resolve(recordedSteps);\n const finalStep = recordedSteps[recordedSteps.length - 1];\n await notify({\n event: {\n stepNumber: finalStep.stepNumber,\n model: finalStep.model,\n functionId: finalStep.functionId,\n metadata: finalStep.metadata,\n experimental_context: finalStep.experimental_context,\n finishReason: finalStep.finishReason,\n rawFinishReason: finalStep.rawFinishReason,\n totalUsage,\n usage: finalStep.usage,\n content: finalStep.content,\n text: finalStep.text,\n reasoningText: finalStep.reasoningText,\n reasoning: finalStep.reasoning,\n files: finalStep.files,\n sources: finalStep.sources,\n toolCalls: finalStep.toolCalls,\n staticToolCalls: finalStep.staticToolCalls,\n dynamicToolCalls: finalStep.dynamicToolCalls,\n toolResults: finalStep.toolResults,\n staticToolResults: finalStep.staticToolResults,\n dynamicToolResults: finalStep.dynamicToolResults,\n request: finalStep.request,\n response: finalStep.response,\n warnings: finalStep.warnings,\n providerMetadata: finalStep.providerMetadata,\n steps: recordedSteps\n },\n callbacks: [\n onFinish,\n globalTelemetry.onFinish\n ]\n });\n rootSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": finishReason,\n \"ai.response.text\": { output: () => finalStep.text },\n \"ai.response.reasoning\": {\n output: () => finalStep.reasoningText\n },\n \"ai.response.toolCalls\": {\n output: () => {\n var _a22;\n return ((_a22 = finalStep.toolCalls) == null ? void 0 : _a22.length) ? JSON.stringify(finalStep.toolCalls) : void 0;\n }\n },\n \"ai.response.providerMetadata\": JSON.stringify(\n finalStep.providerMetadata\n ),\n \"ai.usage.inputTokens\": totalUsage.inputTokens,\n \"ai.usage.inputTokenDetails.noCacheTokens\": (_a21 = totalUsage.inputTokenDetails) == null ? void 0 : _a21.noCacheTokens,\n \"ai.usage.inputTokenDetails.cacheReadTokens\": (_b = totalUsage.inputTokenDetails) == null ? void 0 : _b.cacheReadTokens,\n \"ai.usage.inputTokenDetails.cacheWriteTokens\": (_c = totalUsage.inputTokenDetails) == null ? void 0 : _c.cacheWriteTokens,\n \"ai.usage.outputTokens\": totalUsage.outputTokens,\n \"ai.usage.outputTokenDetails.textTokens\": (_d = totalUsage.outputTokenDetails) == null ? void 0 : _d.textTokens,\n \"ai.usage.outputTokenDetails.reasoningTokens\": (_e = totalUsage.outputTokenDetails) == null ? void 0 : _e.reasoningTokens,\n \"ai.usage.totalTokens\": totalUsage.totalTokens,\n \"ai.usage.reasoningTokens\": (_f = totalUsage.outputTokenDetails) == null ? void 0 : _f.reasoningTokens,\n \"ai.usage.cachedInputTokens\": (_g = totalUsage.inputTokenDetails) == null ? void 0 : _g.cacheReadTokens\n }\n })\n );\n } catch (error) {\n controller.error(error);\n } finally {\n rootSpan.end();\n }\n }\n });\n const stitchableStream = createStitchableStream();\n this.addStream = stitchableStream.addStream;\n this.closeStream = stitchableStream.close;\n const reader = stitchableStream.stream.getReader();\n let stream = new ReadableStream({\n async start(controller) {\n controller.enqueue({ type: \"start\" });\n },\n async pull(controller) {\n function abort() {\n onAbort == null ? void 0 : onAbort({ steps: recordedSteps });\n controller.enqueue({\n type: \"abort\",\n // The `reason` is usually of type DOMException, but it can also be of any type,\n // so we use getErrorMessage for serialization because it is already designed to accept values of the unknown type.\n // See: https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/reason\n ...(abortSignal == null ? void 0 : abortSignal.reason) !== void 0 ? { reason: getErrorMessage7(abortSignal.reason) } : {}\n });\n controller.close();\n }\n try {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n return;\n }\n if (abortSignal == null ? void 0 : abortSignal.aborted) {\n abort();\n return;\n }\n controller.enqueue(value);\n } catch (error) {\n if (isAbortError2(error) && (abortSignal == null ? void 0 : abortSignal.aborted)) {\n abort();\n } else {\n controller.error(error);\n }\n }\n },\n cancel(reason) {\n return stitchableStream.stream.cancel(reason);\n }\n });\n for (const transform of transforms) {\n stream = stream.pipeThrough(\n transform({\n tools,\n stopStream() {\n stitchableStream.terminate();\n }\n })\n );\n }\n this.baseStream = stream.pipeThrough(createOutputTransformStream(output != null ? output : text())).pipeThrough(eventProcessor);\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const tracer = getTracer(telemetry);\n const callSettings = prepareCallSettings(settings);\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { ...callSettings, maxRetries }\n });\n const self = this;\n const modelInfo = { provider: model.provider, modelId: model.modelId };\n const callbackTelemetryProps = {\n functionId: telemetry == null ? void 0 : telemetry.functionId,\n metadata: telemetry == null ? void 0 : telemetry.metadata\n };\n recordSpan({\n name: \"ai.streamText\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: \"ai.streamText\", telemetry }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.prompt\": {\n input: () => JSON.stringify({ system, prompt, messages })\n }\n }\n }),\n tracer,\n endWhenDone: false,\n fn: async (rootSpanArg) => {\n rootSpan = rootSpanArg;\n const initialPrompt = await standardizePrompt({\n system,\n prompt,\n messages,\n allowSystemInMessages\n });\n await notify({\n event: {\n model: modelInfo,\n system,\n prompt,\n messages,\n tools,\n toolChoice,\n activeTools,\n maxOutputTokens: callSettings.maxOutputTokens,\n temperature: callSettings.temperature,\n topP: callSettings.topP,\n topK: callSettings.topK,\n presencePenalty: callSettings.presencePenalty,\n frequencyPenalty: callSettings.frequencyPenalty,\n stopSequences: callSettings.stopSequences,\n seed: callSettings.seed,\n maxRetries,\n timeout,\n headers,\n providerOptions,\n stopWhen,\n output,\n abortSignal: originalAbortSignal,\n include,\n ...callbackTelemetryProps,\n experimental_context\n },\n callbacks: [\n onStart,\n globalTelemetry.onStart\n ]\n });\n const initialMessages = initialPrompt.messages;\n const initialResponseMessages = [];\n const { approvedToolApprovals, deniedToolApprovals } = collectToolApprovals({ messages: initialMessages });\n if (deniedToolApprovals.length > 0 || approvedToolApprovals.length > 0) {\n const localApprovedToolApprovals = approvedToolApprovals.filter(\n (toolApproval) => !toolApproval.toolCall.providerExecuted\n );\n const localDeniedToolApprovals = deniedToolApprovals.filter(\n (toolApproval) => !toolApproval.toolCall.providerExecuted\n );\n const deniedProviderExecutedToolApprovals = deniedToolApprovals.filter(\n (toolApproval) => toolApproval.toolCall.providerExecuted\n );\n let toolExecutionStepStreamController;\n const toolExecutionStepStream = new ReadableStream({\n start(controller) {\n toolExecutionStepStreamController = controller;\n }\n });\n self.addStream(toolExecutionStepStream);\n try {\n for (const toolApproval of [\n ...localDeniedToolApprovals,\n ...deniedProviderExecutedToolApprovals\n ]) {\n toolExecutionStepStreamController == null ? void 0 : toolExecutionStepStreamController.enqueue({\n type: \"tool-output-denied\",\n toolCallId: toolApproval.toolCall.toolCallId,\n toolName: toolApproval.toolCall.toolName\n });\n }\n const toolOutputs = [];\n await Promise.all(\n localApprovedToolApprovals.map(async (toolApproval) => {\n const result = await executeToolCall({\n toolCall: toolApproval.toolCall,\n tools,\n tracer,\n telemetry,\n messages: initialMessages,\n abortSignal,\n experimental_context,\n stepNumber: recordedSteps.length,\n model: modelInfo,\n onToolCallStart: [\n onToolCallStart,\n globalTelemetry.onToolCallStart\n ],\n onToolCallFinish: [\n onToolCallFinish,\n globalTelemetry.onToolCallFinish\n ],\n onPreliminaryToolResult: (result2) => {\n toolExecutionStepStreamController == null ? void 0 : toolExecutionStepStreamController.enqueue(result2);\n }\n });\n if (result != null) {\n toolExecutionStepStreamController == null ? void 0 : toolExecutionStepStreamController.enqueue(result);\n toolOutputs.push(result);\n }\n })\n );\n if (toolOutputs.length > 0 || localDeniedToolApprovals.length > 0) {\n const localToolContent = [];\n for (const output2 of toolOutputs) {\n localToolContent.push({\n type: \"tool-result\",\n toolCallId: output2.toolCallId,\n toolName: output2.toolName,\n output: await createToolModelOutput({\n toolCallId: output2.toolCallId,\n input: output2.input,\n tool: tools == null ? void 0 : tools[output2.toolName],\n output: output2.type === \"tool-result\" ? output2.output : output2.error,\n errorMode: output2.type === \"tool-error\" ? \"text\" : \"none\"\n })\n });\n }\n for (const toolApproval of localDeniedToolApprovals) {\n localToolContent.push({\n type: \"tool-result\",\n toolCallId: toolApproval.toolCall.toolCallId,\n toolName: toolApproval.toolCall.toolName,\n output: {\n type: \"execution-denied\",\n reason: toolApproval.approvalResponse.reason\n }\n });\n }\n initialResponseMessages.push({\n role: \"tool\",\n content: localToolContent\n });\n }\n } finally {\n toolExecutionStepStreamController == null ? void 0 : toolExecutionStepStreamController.close();\n }\n }\n recordedResponseMessages.push(...initialResponseMessages);\n async function streamStep({\n currentStep,\n responseMessages,\n usage\n }) {\n var _a21, _b, _c, _d, _e, _f, _g, _h, _i;\n const includeRawChunks2 = self.includeRawChunks;\n const stepTimeoutId = stepTimeoutMs != null ? setTimeout(() => stepAbortController.abort(), stepTimeoutMs) : void 0;\n let chunkTimeoutId = void 0;\n function resetChunkTimeout() {\n if (chunkTimeoutMs != null) {\n if (chunkTimeoutId != null) {\n clearTimeout(chunkTimeoutId);\n }\n chunkTimeoutId = setTimeout(\n () => chunkAbortController.abort(),\n chunkTimeoutMs\n );\n }\n }\n function clearChunkTimeout() {\n if (chunkTimeoutId != null) {\n clearTimeout(chunkTimeoutId);\n chunkTimeoutId = void 0;\n }\n }\n function clearStepTimeout() {\n if (stepTimeoutId != null) {\n clearTimeout(stepTimeoutId);\n }\n }\n try {\n stepFinish = new DelayedPromise();\n const stepInputMessages = [...initialMessages, ...responseMessages];\n const prepareStepResult = await (prepareStep == null ? void 0 : prepareStep({\n model,\n steps: recordedSteps,\n stepNumber: recordedSteps.length,\n messages: stepInputMessages,\n experimental_context\n }));\n const stepModel = resolveLanguageModel(\n (_a21 = prepareStepResult == null ? void 0 : prepareStepResult.model) != null ? _a21 : model\n );\n const stepModelInfo = {\n provider: stepModel.provider,\n modelId: stepModel.modelId\n };\n const promptMessages = await convertToLanguageModelPrompt({\n prompt: {\n system: (_b = prepareStepResult == null ? void 0 : prepareStepResult.system) != null ? _b : initialPrompt.system,\n messages: (_c = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _c : stepInputMessages\n },\n supportedUrls: await stepModel.supportedUrls,\n download: download2\n });\n const stepActiveTools = (_d = prepareStepResult == null ? void 0 : prepareStepResult.activeTools) != null ? _d : activeTools;\n const { toolChoice: stepToolChoice, tools: stepTools } = await prepareToolsAndToolChoice({\n tools,\n toolChoice: (_e = prepareStepResult == null ? void 0 : prepareStepResult.toolChoice) != null ? _e : toolChoice,\n activeTools: stepActiveTools\n });\n experimental_context = (_f = prepareStepResult == null ? void 0 : prepareStepResult.experimental_context) != null ? _f : experimental_context;\n const stepMessages = (_g = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _g : stepInputMessages;\n const stepSystem = (_h = prepareStepResult == null ? void 0 : prepareStepResult.system) != null ? _h : initialPrompt.system;\n const stepProviderOptions = mergeObjects(\n providerOptions,\n prepareStepResult == null ? void 0 : prepareStepResult.providerOptions\n );\n await notify({\n event: {\n stepNumber: recordedSteps.length,\n model: stepModelInfo,\n system: stepSystem,\n messages: stepMessages,\n tools,\n toolChoice: stepToolChoice,\n activeTools: stepActiveTools,\n steps: [...recordedSteps],\n providerOptions: stepProviderOptions,\n timeout,\n headers,\n stopWhen,\n output,\n abortSignal: originalAbortSignal,\n include,\n ...callbackTelemetryProps,\n experimental_context\n },\n callbacks: [\n onStepStart,\n globalTelemetry.onStepStart\n ]\n });\n const {\n result: { stream: stream2, response, request },\n doStreamSpan,\n startTimestampMs\n } = await retry(\n () => recordSpan({\n name: \"ai.streamText.doStream\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.streamText.doStream\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // model:\n \"ai.model.provider\": stepModel.provider,\n \"ai.model.id\": stepModel.modelId,\n // prompt:\n \"ai.prompt.messages\": {\n input: () => stringifyForTelemetry(promptMessages)\n },\n \"ai.prompt.tools\": {\n // convert the language model level tools:\n input: () => stepTools == null ? void 0 : stepTools.map((tool2) => JSON.stringify(tool2))\n },\n \"ai.prompt.toolChoice\": {\n input: () => stepToolChoice != null ? JSON.stringify(stepToolChoice) : void 0\n },\n // standardized gen-ai llm span attributes:\n \"gen_ai.system\": stepModel.provider,\n \"gen_ai.request.model\": stepModel.modelId,\n \"gen_ai.request.frequency_penalty\": callSettings.frequencyPenalty,\n \"gen_ai.request.max_tokens\": callSettings.maxOutputTokens,\n \"gen_ai.request.presence_penalty\": callSettings.presencePenalty,\n \"gen_ai.request.stop_sequences\": callSettings.stopSequences,\n \"gen_ai.request.temperature\": callSettings.temperature,\n \"gen_ai.request.top_k\": callSettings.topK,\n \"gen_ai.request.top_p\": callSettings.topP\n }\n }),\n tracer,\n endWhenDone: false,\n fn: async (doStreamSpan2) => ({\n startTimestampMs: now2(),\n // get before the call\n doStreamSpan: doStreamSpan2,\n result: await stepModel.doStream({\n ...callSettings,\n tools: stepTools,\n toolChoice: stepToolChoice,\n responseFormat: await (output == null ? void 0 : output.responseFormat),\n prompt: promptMessages,\n providerOptions: stepProviderOptions,\n abortSignal,\n headers,\n includeRawChunks: includeRawChunks2\n })\n })\n })\n );\n const streamWithToolResults = runToolsTransformation({\n tools,\n generatorStream: stream2,\n tracer,\n telemetry,\n system,\n messages: stepInputMessages,\n repairToolCall,\n abortSignal,\n experimental_context,\n generateId: generateId2,\n stepNumber: recordedSteps.length,\n model: stepModelInfo,\n onToolCallStart: [\n onToolCallStart,\n globalTelemetry.onToolCallStart\n ],\n onToolCallFinish: [\n onToolCallFinish,\n globalTelemetry.onToolCallFinish\n ]\n });\n const stepRequest = ((_i = include == null ? void 0 : include.requestBody) != null ? _i : true) ? request != null ? request : {} : { ...request, body: void 0 };\n const stepToolCalls = [];\n const stepToolOutputs = [];\n let warnings;\n const activeToolCallToolNames = {};\n let stepFinishReason = \"other\";\n let stepRawFinishReason = void 0;\n let stepUsage = createNullLanguageModelUsage();\n let stepProviderMetadata;\n let stepFirstChunk = true;\n let stepResponse = {\n id: generateId2(),\n timestamp: /* @__PURE__ */ new Date(),\n modelId: modelInfo.modelId\n };\n let activeText = \"\";\n self.addStream(\n streamWithToolResults.pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n var _a22, _b2, _c2, _d2, _e2;\n resetChunkTimeout();\n if (chunk.type === \"stream-start\") {\n warnings = chunk.warnings;\n return;\n }\n if (stepFirstChunk) {\n const msToFirstChunk = now2() - startTimestampMs;\n stepFirstChunk = false;\n doStreamSpan.addEvent(\"ai.stream.firstChunk\", {\n \"ai.response.msToFirstChunk\": msToFirstChunk\n });\n doStreamSpan.setAttributes({\n \"ai.response.msToFirstChunk\": msToFirstChunk\n });\n controller.enqueue({\n type: \"start-step\",\n request: stepRequest,\n warnings: warnings != null ? warnings : []\n });\n }\n const chunkType = chunk.type;\n switch (chunkType) {\n case \"tool-approval-request\":\n case \"text-start\":\n case \"text-end\": {\n controller.enqueue(chunk);\n break;\n }\n case \"text-delta\": {\n if (chunk.delta.length > 0) {\n controller.enqueue({\n type: \"text-delta\",\n id: chunk.id,\n text: chunk.delta,\n providerMetadata: chunk.providerMetadata\n });\n activeText += chunk.delta;\n }\n break;\n }\n case \"reasoning-start\":\n case \"reasoning-end\": {\n controller.enqueue(chunk);\n break;\n }\n case \"reasoning-delta\": {\n controller.enqueue({\n type: \"reasoning-delta\",\n id: chunk.id,\n text: chunk.delta,\n providerMetadata: chunk.providerMetadata\n });\n break;\n }\n case \"tool-call\": {\n controller.enqueue(chunk);\n stepToolCalls.push(chunk);\n break;\n }\n case \"tool-result\": {\n controller.enqueue(chunk);\n if (!chunk.preliminary) {\n stepToolOutputs.push(chunk);\n }\n break;\n }\n case \"tool-error\": {\n controller.enqueue(chunk);\n stepToolOutputs.push(chunk);\n break;\n }\n case \"response-metadata\": {\n stepResponse = {\n id: (_a22 = chunk.id) != null ? _a22 : stepResponse.id,\n timestamp: (_b2 = chunk.timestamp) != null ? _b2 : stepResponse.timestamp,\n modelId: (_c2 = chunk.modelId) != null ? _c2 : stepResponse.modelId\n };\n break;\n }\n case \"finish\": {\n stepUsage = chunk.usage;\n stepFinishReason = chunk.finishReason;\n stepRawFinishReason = chunk.rawFinishReason;\n stepProviderMetadata = chunk.providerMetadata;\n const msToFinish = now2() - startTimestampMs;\n doStreamSpan.addEvent(\"ai.stream.finish\");\n doStreamSpan.setAttributes({\n \"ai.response.msToFinish\": msToFinish,\n \"ai.response.avgOutputTokensPerSecond\": 1e3 * ((_d2 = stepUsage.outputTokens) != null ? _d2 : 0) / msToFinish\n });\n break;\n }\n case \"file\": {\n controller.enqueue(chunk);\n break;\n }\n case \"source\": {\n controller.enqueue(chunk);\n break;\n }\n case \"tool-input-start\": {\n activeToolCallToolNames[chunk.id] = chunk.toolName;\n const tool2 = tools == null ? void 0 : tools[chunk.toolName];\n if ((tool2 == null ? void 0 : tool2.onInputStart) != null) {\n await tool2.onInputStart({\n toolCallId: chunk.id,\n messages: stepInputMessages,\n abortSignal,\n experimental_context\n });\n }\n controller.enqueue({\n ...chunk,\n dynamic: (_e2 = chunk.dynamic) != null ? _e2 : (tool2 == null ? void 0 : tool2.type) === \"dynamic\",\n title: tool2 == null ? void 0 : tool2.title\n });\n break;\n }\n case \"tool-input-end\": {\n delete activeToolCallToolNames[chunk.id];\n controller.enqueue(chunk);\n break;\n }\n case \"tool-input-delta\": {\n const toolName = activeToolCallToolNames[chunk.id];\n const tool2 = tools == null ? void 0 : tools[toolName];\n if ((tool2 == null ? void 0 : tool2.onInputDelta) != null) {\n await tool2.onInputDelta({\n inputTextDelta: chunk.delta,\n toolCallId: chunk.id,\n messages: stepInputMessages,\n abortSignal,\n experimental_context\n });\n }\n controller.enqueue(chunk);\n break;\n }\n case \"error\": {\n controller.enqueue(chunk);\n stepFinishReason = \"error\";\n break;\n }\n case \"raw\": {\n if (includeRawChunks2) {\n controller.enqueue(chunk);\n }\n break;\n }\n default: {\n const exhaustiveCheck = chunkType;\n throw new Error(\n `Unknown chunk type: ${exhaustiveCheck}`\n );\n }\n }\n },\n // invoke onFinish callback and resolve toolResults promise when the stream is about to close:\n async flush(controller) {\n var _a22, _b2, _c2, _d2, _e2, _f2, _g2;\n const stepToolCallsJson = stepToolCalls.length > 0 ? JSON.stringify(stepToolCalls) : void 0;\n try {\n doStreamSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": stepFinishReason,\n \"ai.response.toolCalls\": {\n output: () => stepToolCallsJson\n },\n \"ai.response.id\": stepResponse.id,\n \"ai.response.model\": stepResponse.modelId,\n \"ai.response.timestamp\": stepResponse.timestamp.toISOString(),\n \"ai.usage.inputTokens\": stepUsage.inputTokens,\n \"ai.usage.inputTokenDetails.noCacheTokens\": (_a22 = stepUsage.inputTokenDetails) == null ? void 0 : _a22.noCacheTokens,\n \"ai.usage.inputTokenDetails.cacheReadTokens\": (_b2 = stepUsage.inputTokenDetails) == null ? void 0 : _b2.cacheReadTokens,\n \"ai.usage.inputTokenDetails.cacheWriteTokens\": (_c2 = stepUsage.inputTokenDetails) == null ? void 0 : _c2.cacheWriteTokens,\n \"ai.usage.outputTokens\": stepUsage.outputTokens,\n \"ai.usage.outputTokenDetails.textTokens\": (_d2 = stepUsage.outputTokenDetails) == null ? void 0 : _d2.textTokens,\n \"ai.usage.outputTokenDetails.reasoningTokens\": (_e2 = stepUsage.outputTokenDetails) == null ? void 0 : _e2.reasoningTokens,\n \"ai.usage.totalTokens\": stepUsage.totalTokens,\n \"ai.usage.reasoningTokens\": (_f2 = stepUsage.outputTokenDetails) == null ? void 0 : _f2.reasoningTokens,\n \"ai.usage.cachedInputTokens\": (_g2 = stepUsage.inputTokenDetails) == null ? void 0 : _g2.cacheReadTokens,\n // standardized gen-ai llm span attributes:\n \"gen_ai.response.finish_reasons\": [\n stepFinishReason\n ],\n \"gen_ai.response.id\": stepResponse.id,\n \"gen_ai.response.model\": stepResponse.modelId,\n \"gen_ai.usage.input_tokens\": stepUsage.inputTokens,\n \"gen_ai.usage.output_tokens\": stepUsage.outputTokens\n }\n })\n );\n } catch (error) {\n }\n controller.enqueue({\n type: \"finish-step\",\n finishReason: stepFinishReason,\n rawFinishReason: stepRawFinishReason,\n usage: stepUsage,\n providerMetadata: stepProviderMetadata,\n response: {\n ...stepResponse,\n headers: response == null ? void 0 : response.headers\n }\n });\n const combinedUsage = addLanguageModelUsage(\n usage,\n stepUsage\n );\n await stepFinish.promise;\n const processedStep = recordedSteps[recordedSteps.length - 1];\n try {\n doStreamSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.text\": {\n output: () => processedStep.text\n },\n \"ai.response.reasoning\": {\n output: () => processedStep.reasoningText\n },\n \"ai.response.providerMetadata\": JSON.stringify(\n processedStep.providerMetadata\n )\n }\n })\n );\n } catch (error) {\n } finally {\n doStreamSpan.end();\n }\n const clientToolCalls = stepToolCalls.filter(\n (toolCall) => toolCall.providerExecuted !== true\n );\n const clientToolOutputs = stepToolOutputs.filter(\n (toolOutput) => toolOutput.providerExecuted !== true\n );\n for (const toolCall of stepToolCalls) {\n if (toolCall.providerExecuted !== true)\n continue;\n const tool2 = tools == null ? void 0 : tools[toolCall.toolName];\n if ((tool2 == null ? void 0 : tool2.type) === \"provider\" && tool2.supportsDeferredResults) {\n const hasResultInStep = stepToolOutputs.some(\n (output2) => (output2.type === \"tool-result\" || output2.type === \"tool-error\") && output2.toolCallId === toolCall.toolCallId\n );\n if (!hasResultInStep) {\n pendingDeferredToolCalls.set(toolCall.toolCallId, {\n toolName: toolCall.toolName\n });\n }\n }\n }\n for (const output2 of stepToolOutputs) {\n if (output2.type === \"tool-result\" || output2.type === \"tool-error\") {\n pendingDeferredToolCalls.delete(output2.toolCallId);\n }\n }\n clearStepTimeout();\n clearChunkTimeout();\n if (\n // Continue if:\n // 1. There are client tool calls that have all been executed, OR\n // 2. There are pending deferred results from provider-executed tools\n (clientToolCalls.length > 0 && clientToolOutputs.length === clientToolCalls.length || pendingDeferredToolCalls.size > 0) && // continue until a stop condition is met:\n !await isStopConditionMet({\n stopConditions,\n steps: recordedSteps\n })\n ) {\n responseMessages.push(\n ...await toResponseMessages({\n content: (\n // use transformed content to create the messages for the next step:\n recordedSteps[recordedSteps.length - 1].content\n ),\n tools\n })\n );\n try {\n await streamStep({\n currentStep: currentStep + 1,\n responseMessages,\n usage: combinedUsage\n });\n } catch (error) {\n controller.enqueue({\n type: \"error\",\n error\n });\n self.closeStream();\n }\n } else {\n controller.enqueue({\n type: \"finish\",\n finishReason: stepFinishReason,\n rawFinishReason: stepRawFinishReason,\n totalUsage: combinedUsage\n });\n self.closeStream();\n }\n }\n })\n )\n );\n } finally {\n clearStepTimeout();\n clearChunkTimeout();\n }\n }\n await streamStep({\n currentStep: 0,\n responseMessages: initialResponseMessages,\n usage: createNullLanguageModelUsage()\n });\n }\n }).catch((error) => {\n self.addStream(\n new ReadableStream({\n start(controller) {\n controller.enqueue({ type: \"error\", error });\n controller.close();\n }\n })\n );\n self.closeStream();\n });\n }\n get steps() {\n this.consumeStream();\n return this._steps.promise;\n }\n get finalStep() {\n return this.steps.then((steps) => steps[steps.length - 1]);\n }\n get content() {\n return this.finalStep.then((step) => step.content);\n }\n get warnings() {\n return this.finalStep.then((step) => step.warnings);\n }\n get providerMetadata() {\n return this.finalStep.then((step) => step.providerMetadata);\n }\n get text() {\n return this.finalStep.then((step) => step.text);\n }\n get reasoningText() {\n return this.finalStep.then((step) => step.reasoningText);\n }\n get reasoning() {\n return this.finalStep.then((step) => step.reasoning);\n }\n get sources() {\n return this.finalStep.then((step) => step.sources);\n }\n get files() {\n return this.finalStep.then((step) => step.files);\n }\n get toolCalls() {\n return this.finalStep.then((step) => step.toolCalls);\n }\n get staticToolCalls() {\n return this.finalStep.then((step) => step.staticToolCalls);\n }\n get dynamicToolCalls() {\n return this.finalStep.then((step) => step.dynamicToolCalls);\n }\n get toolResults() {\n return this.finalStep.then((step) => step.toolResults);\n }\n get staticToolResults() {\n return this.finalStep.then((step) => step.staticToolResults);\n }\n get dynamicToolResults() {\n return this.finalStep.then((step) => step.dynamicToolResults);\n }\n get usage() {\n return this.finalStep.then((step) => step.usage);\n }\n get request() {\n return this.finalStep.then((step) => step.request);\n }\n get response() {\n return this.finalStep.then((step) => step.response);\n }\n get totalUsage() {\n this.consumeStream();\n return this._totalUsage.promise;\n }\n get finishReason() {\n this.consumeStream();\n return this._finishReason.promise;\n }\n get rawFinishReason() {\n this.consumeStream();\n return this._rawFinishReason.promise;\n }\n /**\n * Split out a new stream from the original stream.\n * The original stream is replaced to allow for further splitting,\n * since we do not know how many times the stream will be split.\n *\n * Note: this leads to buffering the stream content on the server.\n * However, the LLM results are expected to be small enough to not cause issues.\n */\n teeStream() {\n const [stream1, stream2] = this.baseStream.tee();\n this.baseStream = stream2;\n return stream1;\n }\n get textStream() {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream({\n transform({ part }, controller) {\n if (part.type === \"text-delta\") {\n controller.enqueue(part.text);\n }\n }\n })\n )\n );\n }\n get fullStream() {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream({\n transform({ part }, controller) {\n controller.enqueue(part);\n }\n })\n )\n );\n }\n async consumeStream(options) {\n var _a21;\n try {\n await consumeStream({\n stream: this.fullStream,\n onError: options == null ? void 0 : options.onError\n });\n } catch (error) {\n (_a21 = options == null ? void 0 : options.onError) == null ? void 0 : _a21.call(options, error);\n }\n }\n get experimental_partialOutputStream() {\n return this.partialOutputStream;\n }\n get partialOutputStream() {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream({\n transform({ partialOutput }, controller) {\n if (partialOutput != null) {\n controller.enqueue(partialOutput);\n }\n }\n })\n )\n );\n }\n get elementStream() {\n var _a21, _b, _c;\n const transform = (_a21 = this.outputSpecification) == null ? void 0 : _a21.createElementStreamTransform();\n if (transform == null) {\n throw new UnsupportedFunctionalityError2({\n functionality: `element streams in ${(_c = (_b = this.outputSpecification) == null ? void 0 : _b.name) != null ? _c : \"text\"} mode`\n });\n }\n return createAsyncIterableStream(this.teeStream().pipeThrough(transform));\n }\n get output() {\n return this.finalStep.then((step) => {\n var _a21;\n const output = (_a21 = this.outputSpecification) != null ? _a21 : text();\n return output.parseCompleteOutput(\n { text: step.text },\n {\n response: step.response,\n usage: step.usage,\n finishReason: step.finishReason\n }\n );\n });\n }\n toUIMessageStream({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning = true,\n sendSources = false,\n sendStart = true,\n sendFinish = true,\n onError = getErrorMessage7\n } = {}) {\n const responseMessageId = generateMessageId != null ? getResponseUIMessageId({\n originalMessages,\n responseMessageId: generateMessageId\n }) : void 0;\n const isDynamic = (part) => {\n var _a21;\n const tool2 = (_a21 = this.tools) == null ? void 0 : _a21[part.toolName];\n if (tool2 == null) {\n return part.dynamic;\n }\n return (tool2 == null ? void 0 : tool2.type) === \"dynamic\" ? true : void 0;\n };\n const baseStream = this.fullStream.pipeThrough(\n new TransformStream({\n transform: async (part, controller) => {\n const messageMetadataValue = messageMetadata == null ? void 0 : messageMetadata({ part });\n const partType = part.type;\n switch (partType) {\n case \"text-start\": {\n controller.enqueue({\n type: \"text-start\",\n id: part.id,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"text-delta\": {\n controller.enqueue({\n type: \"text-delta\",\n id: part.id,\n delta: part.text,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"text-end\": {\n controller.enqueue({\n type: \"text-end\",\n id: part.id,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"reasoning-start\":\n case \"reasoning-end\": {\n if (sendReasoning) {\n controller.enqueue({\n type: partType,\n id: part.id,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n break;\n }\n case \"reasoning-delta\": {\n if (sendReasoning) {\n controller.enqueue({\n type: \"reasoning-delta\",\n id: part.id,\n delta: part.text,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n break;\n }\n case \"file\": {\n controller.enqueue({\n type: \"file\",\n mediaType: part.file.mediaType,\n url: `data:${part.file.mediaType};base64,${part.file.base64}`,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"source\": {\n if (sendSources && part.sourceType === \"url\") {\n controller.enqueue({\n type: \"source-url\",\n sourceId: part.id,\n url: part.url,\n title: part.title,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n if (sendSources && part.sourceType === \"document\") {\n controller.enqueue({\n type: \"source-document\",\n sourceId: part.id,\n mediaType: part.mediaType,\n title: part.title,\n filename: part.filename,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n break;\n }\n case \"tool-input-start\": {\n const dynamic = isDynamic(part);\n controller.enqueue({\n type: \"tool-input-start\",\n toolCallId: part.id,\n toolName: part.toolName,\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...part.toolMetadata != null ? { toolMetadata: part.toolMetadata } : {},\n ...dynamic != null ? { dynamic } : {},\n ...part.title != null ? { title: part.title } : {}\n });\n break;\n }\n case \"tool-input-delta\": {\n controller.enqueue({\n type: \"tool-input-delta\",\n toolCallId: part.id,\n inputTextDelta: part.delta\n });\n break;\n }\n case \"tool-call\": {\n const dynamic = isDynamic(part);\n if (part.invalid) {\n controller.enqueue({\n type: \"tool-input-error\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...part.toolMetadata != null ? { toolMetadata: part.toolMetadata } : {},\n ...dynamic != null ? { dynamic } : {},\n errorText: onError(part.error),\n ...part.title != null ? { title: part.title } : {}\n });\n } else {\n controller.enqueue({\n type: \"tool-input-available\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...part.toolMetadata != null ? { toolMetadata: part.toolMetadata } : {},\n ...dynamic != null ? { dynamic } : {},\n ...part.title != null ? { title: part.title } : {}\n });\n }\n break;\n }\n case \"tool-approval-request\": {\n controller.enqueue({\n type: \"tool-approval-request\",\n approvalId: part.approvalId,\n toolCallId: part.toolCall.toolCallId\n });\n break;\n }\n case \"tool-result\": {\n const dynamic = isDynamic(part);\n controller.enqueue({\n type: \"tool-output-available\",\n toolCallId: part.toolCallId,\n output: part.output,\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...part.toolMetadata != null ? { toolMetadata: part.toolMetadata } : {},\n ...part.preliminary != null ? { preliminary: part.preliminary } : {},\n ...dynamic != null ? { dynamic } : {}\n });\n break;\n }\n case \"tool-error\": {\n const dynamic = isDynamic(part);\n controller.enqueue({\n type: \"tool-output-error\",\n toolCallId: part.toolCallId,\n errorText: part.providerExecuted ? typeof part.error === \"string\" ? part.error : JSON.stringify(part.error) : onError(part.error),\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...part.toolMetadata != null ? { toolMetadata: part.toolMetadata } : {},\n ...dynamic != null ? { dynamic } : {}\n });\n break;\n }\n case \"tool-output-denied\": {\n controller.enqueue({\n type: \"tool-output-denied\",\n toolCallId: part.toolCallId\n });\n break;\n }\n case \"error\": {\n controller.enqueue({\n type: \"error\",\n errorText: onError(part.error)\n });\n break;\n }\n case \"start-step\": {\n controller.enqueue({ type: \"start-step\" });\n break;\n }\n case \"finish-step\": {\n controller.enqueue({ type: \"finish-step\" });\n break;\n }\n case \"start\": {\n if (sendStart) {\n controller.enqueue({\n type: \"start\",\n ...messageMetadataValue != null ? { messageMetadata: messageMetadataValue } : {},\n ...responseMessageId != null ? { messageId: responseMessageId } : {}\n });\n }\n break;\n }\n case \"finish\": {\n if (sendFinish) {\n controller.enqueue({\n type: \"finish\",\n finishReason: part.finishReason,\n ...messageMetadataValue != null ? { messageMetadata: messageMetadataValue } : {}\n });\n }\n break;\n }\n case \"abort\": {\n controller.enqueue(part);\n break;\n }\n case \"tool-input-end\": {\n break;\n }\n case \"raw\": {\n break;\n }\n default: {\n const exhaustiveCheck = partType;\n throw new Error(`Unknown chunk type: ${exhaustiveCheck}`);\n }\n }\n if (messageMetadataValue != null && partType !== \"start\" && partType !== \"finish\") {\n controller.enqueue({\n type: \"message-metadata\",\n messageMetadata: messageMetadataValue\n });\n }\n }\n })\n );\n return createAsyncIterableStream(\n handleUIMessageStreamFinish({\n stream: baseStream,\n messageId: responseMessageId != null ? responseMessageId : generateMessageId == null ? void 0 : generateMessageId(),\n originalMessages,\n onFinish,\n onError\n })\n );\n }\n pipeUIMessageStreamToResponse(response, {\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError,\n ...init\n } = {}) {\n pipeUIMessageStreamToResponse({\n response,\n stream: this.toUIMessageStream({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError\n }),\n ...init\n });\n }\n pipeTextStreamToResponse(response, init) {\n pipeTextStreamToResponse({\n response,\n textStream: this.textStream,\n ...init\n });\n }\n toUIMessageStreamResponse({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError,\n ...init\n } = {}) {\n return createUIMessageStreamResponse({\n stream: this.toUIMessageStream({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError\n }),\n ...init\n });\n }\n toTextStreamResponse(init) {\n return createTextStreamResponse({\n textStream: this.textStream,\n ...init\n });\n }\n};\n\n// src/agent/tool-loop-agent.ts\nvar ToolLoopAgent = class {\n constructor(settings) {\n this.version = \"agent-v1\";\n this.settings = settings;\n }\n /**\n * The id of the agent.\n */\n get id() {\n return this.settings.id;\n }\n /**\n * The tools that the agent can use.\n */\n get tools() {\n return this.settings.tools;\n }\n async prepareCall(options) {\n var _a21, _b, _c, _d;\n if (this.settings.callOptionsSchema != null && options.options !== void 0) {\n const validatedOptions = await validateTypes2({\n value: options.options,\n schema: this.settings.callOptionsSchema,\n context: { field: \"options\" }\n });\n options = { ...options, options: validatedOptions };\n }\n const { onStepFinish: _settingsOnStepFinish, ...settingsWithoutCallback } = this.settings;\n const baseCallArgs = {\n ...settingsWithoutCallback,\n stopWhen: (_a21 = this.settings.stopWhen) != null ? _a21 : stepCountIs(20),\n ...options\n };\n const preparedCallArgs = (_d = await ((_c = (_b = this.settings).prepareCall) == null ? void 0 : _c.call(\n _b,\n baseCallArgs\n ))) != null ? _d : baseCallArgs;\n const {\n instructions,\n allowSystemInMessages,\n messages,\n prompt,\n ...callArgs\n } = preparedCallArgs;\n return {\n ...callArgs,\n // restore prompt types\n ...{\n system: instructions,\n allowSystemInMessages,\n messages,\n prompt\n }\n };\n }\n mergeOnStepFinishCallbacks(methodCallback) {\n const constructorCallback = this.settings.onStepFinish;\n if (methodCallback && constructorCallback) {\n return async (stepResult) => {\n await constructorCallback(stepResult);\n await methodCallback(stepResult);\n };\n }\n return methodCallback != null ? methodCallback : constructorCallback;\n }\n /**\n * Generates an output from the agent (non-streaming).\n */\n async generate({\n abortSignal,\n timeout,\n onStepFinish,\n ...options\n }) {\n return generateText({\n ...await this.prepareCall(options),\n abortSignal,\n timeout,\n onStepFinish: this.mergeOnStepFinishCallbacks(onStepFinish)\n });\n }\n /**\n * Streams an output from the agent (streaming).\n */\n async stream({\n abortSignal,\n timeout,\n experimental_transform,\n onStepFinish,\n ...options\n }) {\n return streamText({\n ...await this.prepareCall(options),\n abortSignal,\n timeout,\n experimental_transform,\n onStepFinish: this.mergeOnStepFinishCallbacks(onStepFinish)\n });\n }\n};\n\n// src/ui-message-stream/create-ui-message-stream.ts\nimport {\n generateId as generateIdFunc,\n getErrorMessage as getErrorMessage8\n} from \"@ai-sdk/provider-utils\";\nfunction createUIMessageStream({\n execute,\n onError = getErrorMessage8,\n originalMessages,\n onStepFinish,\n onFinish,\n generateId: generateId2 = generateIdFunc\n}) {\n let controller;\n const ongoingStreamPromises = [];\n const stream = new ReadableStream({\n start(controllerArg) {\n controller = controllerArg;\n }\n });\n function safeEnqueue(data) {\n try {\n controller.enqueue(data);\n } catch (error) {\n }\n }\n try {\n const result = execute({\n writer: {\n write(part) {\n safeEnqueue(part);\n },\n merge(streamArg) {\n ongoingStreamPromises.push(\n (async () => {\n const reader = streamArg.getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done)\n break;\n safeEnqueue(value);\n }\n })().catch((error) => {\n safeEnqueue({\n type: \"error\",\n errorText: onError(error)\n });\n })\n );\n },\n onError\n }\n });\n if (result) {\n ongoingStreamPromises.push(\n result.catch((error) => {\n safeEnqueue({\n type: \"error\",\n errorText: onError(error)\n });\n })\n );\n }\n } catch (error) {\n safeEnqueue({\n type: \"error\",\n errorText: onError(error)\n });\n }\n const waitForStreams = new Promise(async (resolve3) => {\n while (ongoingStreamPromises.length > 0) {\n await ongoingStreamPromises.shift();\n }\n resolve3();\n });\n waitForStreams.finally(() => {\n try {\n controller.close();\n } catch (error) {\n }\n });\n return handleUIMessageStreamFinish({\n stream,\n messageId: generateId2(),\n originalMessages,\n onStepFinish,\n onFinish,\n onError\n });\n}\n\n// src/ui-message-stream/read-ui-message-stream.ts\nfunction readUIMessageStream({\n message,\n stream,\n onError,\n terminateOnError = false\n}) {\n var _a21;\n let controller;\n let hasErrored = false;\n const outputStream = new ReadableStream({\n start(controllerParam) {\n controller = controllerParam;\n }\n });\n const state = createStreamingUIMessageState({\n messageId: (_a21 = message == null ? void 0 : message.id) != null ? _a21 : \"\",\n lastMessage: message\n });\n const handleError = (error) => {\n onError == null ? void 0 : onError(error);\n if (!hasErrored && terminateOnError) {\n hasErrored = true;\n controller == null ? void 0 : controller.error(error);\n }\n };\n consumeStream({\n stream: processUIMessageStream({\n stream,\n runUpdateMessageJob(job) {\n return job({\n state,\n write: () => {\n controller == null ? void 0 : controller.enqueue(structuredClone(state.message));\n }\n });\n },\n onError: handleError\n }),\n onError: handleError\n }).finally(() => {\n if (!hasErrored) {\n controller == null ? void 0 : controller.close();\n }\n });\n return createAsyncIterableStream(outputStream);\n}\n\n// src/ui/convert-to-model-messages.ts\nimport {\n isNonNullable\n} from \"@ai-sdk/provider-utils\";\nasync function convertToModelMessages(messages, options) {\n const modelMessages = [];\n if (options == null ? void 0 : options.ignoreIncompleteToolCalls) {\n messages = messages.map((message) => ({\n ...message,\n parts: message.parts.filter(\n (part) => !isToolUIPart(part) || part.state !== \"input-streaming\" && part.state !== \"input-available\"\n )\n }));\n }\n for (const message of messages) {\n switch (message.role) {\n case \"system\": {\n const textParts = message.parts.filter(\n (part) => part.type === \"text\"\n );\n const providerMetadata = textParts.reduce((acc, part) => {\n if (part.providerMetadata != null) {\n return { ...acc, ...part.providerMetadata };\n }\n return acc;\n }, {});\n modelMessages.push({\n role: \"system\",\n content: textParts.map((part) => part.text).join(\"\"),\n ...Object.keys(providerMetadata).length > 0 ? { providerOptions: providerMetadata } : {}\n });\n break;\n }\n case \"user\": {\n modelMessages.push({\n role: \"user\",\n content: message.parts.map((part) => {\n var _a21;\n if (isTextUIPart(part)) {\n return {\n type: \"text\",\n text: part.text,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n };\n }\n if (isFileUIPart(part)) {\n return {\n type: \"file\",\n mediaType: part.mediaType,\n filename: part.filename,\n data: part.url,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n };\n }\n if (isDataUIPart(part)) {\n return (_a21 = options == null ? void 0 : options.convertDataPart) == null ? void 0 : _a21.call(\n options,\n part\n );\n }\n }).filter(isNonNullable)\n });\n break;\n }\n case \"assistant\": {\n if (message.parts != null) {\n let block = [];\n async function processBlock() {\n var _a21, _b, _c, _d, _e, _f, _g;\n if (block.length === 0) {\n return;\n }\n const content = [];\n for (const part of block) {\n if (isTextUIPart(part)) {\n content.push({\n type: \"text\",\n text: part.text,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n });\n } else if (isFileUIPart(part)) {\n content.push({\n type: \"file\",\n mediaType: part.mediaType,\n filename: part.filename,\n data: part.url,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n });\n } else if (isReasoningUIPart(part)) {\n content.push({\n type: \"reasoning\",\n text: part.text,\n providerOptions: part.providerMetadata\n });\n } else if (isToolUIPart(part)) {\n const toolName = getToolName(part);\n if (part.state !== \"input-streaming\") {\n content.push({\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName,\n input: part.state === \"output-error\" ? (_a21 = part.input) != null ? _a21 : \"rawInput\" in part ? part.rawInput : void 0 : part.input,\n providerExecuted: part.providerExecuted,\n ...part.callProviderMetadata != null ? { providerOptions: part.callProviderMetadata } : {}\n });\n if (part.approval != null) {\n content.push({\n type: \"tool-approval-request\",\n approvalId: part.approval.id,\n toolCallId: part.toolCallId\n });\n }\n if (part.providerExecuted === true && part.state !== \"approval-responded\" && (part.state === \"output-available\" || part.state === \"output-error\")) {\n const resultProviderMetadata = (_b = part.resultProviderMetadata) != null ? _b : part.callProviderMetadata;\n content.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName,\n output: await createToolModelOutput({\n toolCallId: part.toolCallId,\n input: part.input,\n output: part.state === \"output-error\" ? part.errorText : part.output,\n tool: (_c = options == null ? void 0 : options.tools) == null ? void 0 : _c[toolName],\n errorMode: part.state === \"output-error\" ? \"json\" : \"none\"\n }),\n ...resultProviderMetadata != null ? { providerOptions: resultProviderMetadata } : {}\n });\n }\n }\n } else if (isDataUIPart(part)) {\n const dataPart = (_d = options == null ? void 0 : options.convertDataPart) == null ? void 0 : _d.call(\n options,\n part\n );\n if (dataPart != null) {\n content.push(dataPart);\n }\n } else {\n const _exhaustiveCheck = part;\n throw new Error(`Unsupported part: ${_exhaustiveCheck}`);\n }\n }\n modelMessages.push({\n role: \"assistant\",\n content\n });\n const toolParts = block.filter(\n (part) => {\n var _a22;\n return isToolUIPart(part) && (part.providerExecuted !== true || ((_a22 = part.approval) == null ? void 0 : _a22.approved) != null);\n }\n );\n if (toolParts.length > 0) {\n {\n const content2 = [];\n for (const toolPart of toolParts) {\n if (((_e = toolPart.approval) == null ? void 0 : _e.approved) != null) {\n content2.push({\n type: \"tool-approval-response\",\n approvalId: toolPart.approval.id,\n approved: toolPart.approval.approved,\n reason: toolPart.approval.reason,\n providerExecuted: toolPart.providerExecuted\n });\n }\n if (toolPart.providerExecuted === true) {\n continue;\n }\n switch (toolPart.state) {\n case \"output-denied\": {\n content2.push({\n type: \"tool-result\",\n toolCallId: toolPart.toolCallId,\n toolName: getToolName(toolPart),\n output: {\n type: \"error-text\",\n value: (_f = toolPart.approval.reason) != null ? _f : \"Tool execution denied.\"\n },\n ...toolPart.callProviderMetadata != null ? { providerOptions: toolPart.callProviderMetadata } : {}\n });\n break;\n }\n case \"output-error\":\n case \"output-available\": {\n const toolName = getToolName(toolPart);\n content2.push({\n type: \"tool-result\",\n toolCallId: toolPart.toolCallId,\n toolName,\n output: await createToolModelOutput({\n toolCallId: toolPart.toolCallId,\n input: toolPart.input,\n output: toolPart.state === \"output-error\" ? toolPart.errorText : toolPart.output,\n tool: (_g = options == null ? void 0 : options.tools) == null ? void 0 : _g[toolName],\n errorMode: toolPart.state === \"output-error\" ? \"text\" : \"none\"\n }),\n ...toolPart.callProviderMetadata != null ? { providerOptions: toolPart.callProviderMetadata } : {}\n });\n break;\n }\n }\n }\n if (content2.length > 0) {\n modelMessages.push({\n role: \"tool\",\n content: content2\n });\n }\n }\n }\n block = [];\n }\n for (const part of message.parts) {\n if (isTextUIPart(part) || isReasoningUIPart(part) || isFileUIPart(part) || isToolUIPart(part) || isDataUIPart(part)) {\n block.push(part);\n } else if (part.type === \"step-start\") {\n await processBlock();\n }\n }\n await processBlock();\n break;\n }\n break;\n }\n default: {\n const _exhaustiveCheck = message.role;\n throw new MessageConversionError({\n originalMessage: message,\n message: `Unsupported role: ${_exhaustiveCheck}`\n });\n }\n }\n }\n return modelMessages;\n}\n\n// src/ui/validate-ui-messages.ts\nimport {\n TypeValidationError as TypeValidationError3\n} from \"@ai-sdk/provider\";\nimport {\n lazySchema as lazySchema2,\n validateTypes as validateTypes3,\n zodSchema as zodSchema2\n} from \"@ai-sdk/provider-utils\";\nimport { z as z8 } from \"zod/v4\";\nvar toolMetadataSchema2 = z8.record(\n z8.string(),\n jsonValueSchema.optional()\n);\nvar uiMessagesSchema = lazySchema2(\n () => zodSchema2(\n z8.array(\n z8.object({\n id: z8.string(),\n role: z8.enum([\"system\", \"user\", \"assistant\"]),\n metadata: z8.unknown().optional(),\n parts: z8.array(\n z8.union([\n z8.object({\n type: z8.literal(\"text\"),\n text: z8.string(),\n state: z8.enum([\"streaming\", \"done\"]).optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z8.object({\n type: z8.literal(\"reasoning\"),\n text: z8.string(),\n state: z8.enum([\"streaming\", \"done\"]).optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z8.object({\n type: z8.literal(\"source-url\"),\n sourceId: z8.string(),\n url: z8.string(),\n title: z8.string().optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z8.object({\n type: z8.literal(\"source-document\"),\n sourceId: z8.string(),\n mediaType: z8.string(),\n title: z8.string(),\n filename: z8.string().optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z8.object({\n type: z8.literal(\"file\"),\n mediaType: z8.string(),\n filename: z8.string().optional(),\n url: z8.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z8.object({\n type: z8.literal(\"step-start\")\n }),\n z8.object({\n type: z8.string().startsWith(\"data-\"),\n id: z8.string().optional(),\n data: z8.unknown()\n }),\n z8.object({\n type: z8.literal(\"dynamic-tool\"),\n toolName: z8.string(),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"input-streaming\"),\n input: z8.unknown().optional(),\n providerExecuted: z8.boolean().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n approval: z8.never().optional()\n }),\n z8.object({\n type: z8.literal(\"dynamic-tool\"),\n toolName: z8.string(),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"input-available\"),\n input: z8.unknown(),\n providerExecuted: z8.boolean().optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.never().optional()\n }),\n z8.object({\n type: z8.literal(\"dynamic-tool\"),\n toolName: z8.string(),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"approval-requested\"),\n input: z8.unknown(),\n providerExecuted: z8.boolean().optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.never().optional(),\n reason: z8.never().optional()\n })\n }),\n z8.object({\n type: z8.literal(\"dynamic-tool\"),\n toolName: z8.string(),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"approval-responded\"),\n input: z8.unknown(),\n providerExecuted: z8.boolean().optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.boolean(),\n reason: z8.string().optional()\n })\n }),\n z8.object({\n type: z8.literal(\"dynamic-tool\"),\n toolName: z8.string(),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"output-available\"),\n input: z8.unknown(),\n providerExecuted: z8.boolean().optional(),\n output: z8.unknown(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n resultProviderMetadata: providerMetadataSchema.optional(),\n preliminary: z8.boolean().optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.literal(true),\n reason: z8.string().optional()\n }).optional()\n }),\n z8.object({\n type: z8.literal(\"dynamic-tool\"),\n toolName: z8.string(),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"output-error\"),\n input: z8.unknown().optional(),\n rawInput: z8.unknown().optional(),\n providerExecuted: z8.boolean().optional(),\n output: z8.never().optional(),\n errorText: z8.string(),\n callProviderMetadata: providerMetadataSchema.optional(),\n resultProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.literal(true),\n reason: z8.string().optional()\n }).optional()\n }),\n z8.object({\n type: z8.literal(\"dynamic-tool\"),\n toolName: z8.string(),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"output-denied\"),\n input: z8.unknown(),\n providerExecuted: z8.boolean().optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.literal(false),\n reason: z8.string().optional()\n })\n }),\n z8.object({\n type: z8.string().startsWith(\"tool-\"),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"input-streaming\"),\n providerExecuted: z8.boolean().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n input: z8.unknown().optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n approval: z8.never().optional()\n }),\n z8.object({\n type: z8.string().startsWith(\"tool-\"),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"input-available\"),\n providerExecuted: z8.boolean().optional(),\n input: z8.unknown(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.never().optional()\n }),\n z8.object({\n type: z8.string().startsWith(\"tool-\"),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"approval-requested\"),\n input: z8.unknown(),\n providerExecuted: z8.boolean().optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.never().optional(),\n reason: z8.never().optional()\n })\n }),\n z8.object({\n type: z8.string().startsWith(\"tool-\"),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"approval-responded\"),\n input: z8.unknown(),\n providerExecuted: z8.boolean().optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.boolean(),\n reason: z8.string().optional()\n })\n }),\n z8.object({\n type: z8.string().startsWith(\"tool-\"),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"output-available\"),\n providerExecuted: z8.boolean().optional(),\n input: z8.unknown(),\n output: z8.unknown(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n resultProviderMetadata: providerMetadataSchema.optional(),\n preliminary: z8.boolean().optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.literal(true),\n reason: z8.string().optional()\n }).optional()\n }),\n z8.object({\n type: z8.string().startsWith(\"tool-\"),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"output-error\"),\n providerExecuted: z8.boolean().optional(),\n input: z8.unknown().optional(),\n rawInput: z8.unknown().optional(),\n output: z8.never().optional(),\n errorText: z8.string(),\n callProviderMetadata: providerMetadataSchema.optional(),\n resultProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.literal(true),\n reason: z8.string().optional()\n }).optional()\n }),\n z8.object({\n type: z8.string().startsWith(\"tool-\"),\n toolCallId: z8.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z8.literal(\"output-denied\"),\n providerExecuted: z8.boolean().optional(),\n input: z8.unknown(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.literal(false),\n reason: z8.string().optional()\n })\n })\n ])\n ).nonempty(\"Message must contain at least one part\")\n })\n ).nonempty(\"Messages array must not be empty\")\n )\n);\nasync function safeValidateUIMessages({\n messages,\n metadataSchema,\n dataSchemas,\n tools\n}) {\n try {\n if (messages == null) {\n return {\n success: false,\n error: new InvalidArgumentError({\n parameter: \"messages\",\n value: messages,\n message: \"messages parameter must be provided\"\n })\n };\n }\n const validatedMessages = await validateTypes3({\n value: messages,\n schema: uiMessagesSchema\n });\n if (metadataSchema) {\n for (const [msgIdx, message] of validatedMessages.entries()) {\n await validateTypes3({\n value: message.metadata,\n schema: metadataSchema,\n context: {\n field: `messages[${msgIdx}].metadata`,\n entityId: message.id\n }\n });\n }\n }\n if (dataSchemas || tools) {\n for (const [msgIdx, message] of validatedMessages.entries()) {\n for (const [partIdx, part] of message.parts.entries()) {\n if (dataSchemas && part.type.startsWith(\"data-\")) {\n const dataPart = part;\n const dataName = dataPart.type.slice(5);\n const dataSchema = dataSchemas[dataName];\n if (!dataSchema) {\n return {\n success: false,\n error: new TypeValidationError3({\n value: dataPart.data,\n cause: `No data schema found for data part ${dataName}`,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].data`,\n entityName: dataName,\n entityId: dataPart.id\n }\n })\n };\n }\n await validateTypes3({\n value: dataPart.data,\n schema: dataSchema,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].data`,\n entityName: dataName,\n entityId: dataPart.id\n }\n });\n }\n if (tools && part.type.startsWith(\"tool-\")) {\n const toolPart = part;\n const toolName = toolPart.type.slice(5);\n const tool2 = tools[toolName];\n if (!tool2 && (toolPart.state === \"output-available\" || toolPart.state === \"output-error\" || toolPart.state === \"output-denied\")) {\n continue;\n }\n if (!tool2) {\n return {\n success: false,\n error: new TypeValidationError3({\n value: toolPart.input,\n cause: `No tool schema found for tool part ${toolName}`,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].input`,\n entityName: toolName,\n entityId: toolPart.toolCallId\n }\n })\n };\n }\n if (toolPart.state === \"input-available\" || toolPart.state === \"output-available\") {\n await validateTypes3({\n value: toolPart.input,\n schema: tool2.inputSchema,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].input`,\n entityName: toolName,\n entityId: toolPart.toolCallId\n }\n });\n }\n if (toolPart.state === \"output-available\" && tool2.outputSchema) {\n await validateTypes3({\n value: toolPart.output,\n schema: tool2.outputSchema,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].output`,\n entityName: toolName,\n entityId: toolPart.toolCallId\n }\n });\n }\n }\n }\n }\n }\n return {\n success: true,\n data: validatedMessages\n };\n } catch (error) {\n const err = error;\n return {\n success: false,\n error: err\n };\n }\n}\nasync function validateUIMessages({\n messages,\n metadataSchema,\n dataSchemas,\n tools\n}) {\n const response = await safeValidateUIMessages({\n messages,\n metadataSchema,\n dataSchemas,\n tools\n });\n if (!response.success)\n throw response.error;\n return response.data;\n}\n\n// src/agent/create-agent-ui-stream.ts\nasync function createAgentUIStream({\n agent,\n uiMessages,\n options,\n abortSignal,\n timeout,\n experimental_transform,\n onStepFinish,\n ...uiMessageStreamOptions\n}) {\n var _a21;\n const validatedMessages = await validateUIMessages({\n messages: uiMessages,\n tools: agent.tools\n });\n const modelMessages = await convertToModelMessages(validatedMessages, {\n tools: agent.tools\n });\n const result = await agent.stream({\n prompt: modelMessages,\n options,\n abortSignal,\n timeout,\n experimental_transform,\n onStepFinish\n });\n return result.toUIMessageStream({\n ...uiMessageStreamOptions,\n // TODO reading `originalMessages` is here for bc, always use `validatedMessages` in v7\n originalMessages: (_a21 = uiMessageStreamOptions.originalMessages) != null ? _a21 : validatedMessages\n });\n}\n\n// src/agent/create-agent-ui-stream-response.ts\nasync function createAgentUIStreamResponse({\n headers,\n status,\n statusText,\n consumeSseStream,\n ...options\n}) {\n return createUIMessageStreamResponse({\n headers,\n status,\n statusText,\n consumeSseStream,\n stream: await createAgentUIStream(options)\n });\n}\n\n// src/agent/pipe-agent-ui-stream-to-response.ts\nasync function pipeAgentUIStreamToResponse({\n response,\n headers,\n status,\n statusText,\n consumeSseStream,\n ...options\n}) {\n pipeUIMessageStreamToResponse({\n response,\n headers,\n status,\n statusText,\n consumeSseStream,\n stream: await createAgentUIStream(options)\n });\n}\n\n// src/embed/embed.ts\nimport {\n withUserAgentSuffix as withUserAgentSuffix3\n} from \"@ai-sdk/provider-utils\";\nasync function embed({\n model: modelArg,\n value,\n providerOptions,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n experimental_telemetry: telemetry\n}) {\n const model = resolveEmbeddingModel(modelArg);\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const headersWithUserAgent = withUserAgentSuffix3(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers: headersWithUserAgent,\n settings: { maxRetries }\n });\n const tracer = getTracer(telemetry);\n return recordSpan({\n name: \"ai.embed\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: \"ai.embed\", telemetry }),\n ...baseTelemetryAttributes,\n \"ai.value\": { input: () => JSON.stringify(value) }\n }\n }),\n tracer,\n fn: async (span) => {\n const { embedding, usage, warnings, response, providerMetadata } = await retry(\n () => (\n // nested spans to align with the embedMany telemetry data:\n recordSpan({\n name: \"ai.embed.doEmbed\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.embed.doEmbed\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.values\": { input: () => [JSON.stringify(value)] }\n }\n }),\n tracer,\n fn: async (doEmbedSpan) => {\n var _a21, _b;\n const modelResponse = await model.doEmbed({\n values: [value],\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions\n });\n const embedding2 = modelResponse.embeddings[0];\n const usage2 = (_a21 = modelResponse.usage) != null ? _a21 : { tokens: NaN };\n doEmbedSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embeddings\": {\n output: () => modelResponse.embeddings.map(\n (embedding3) => JSON.stringify(embedding3)\n )\n },\n \"ai.usage.tokens\": usage2.tokens\n }\n })\n );\n return {\n embedding: embedding2,\n usage: usage2,\n warnings: (_b = modelResponse.warnings) != null ? _b : [],\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response\n };\n }\n })\n )\n );\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embedding\": { output: () => JSON.stringify(embedding) },\n \"ai.usage.tokens\": usage.tokens\n }\n })\n );\n logWarnings({ warnings, provider: model.provider, model: model.modelId });\n return new DefaultEmbedResult({\n value,\n embedding,\n usage,\n warnings,\n providerMetadata,\n response\n });\n }\n });\n}\nvar DefaultEmbedResult = class {\n constructor(options) {\n this.value = options.value;\n this.embedding = options.embedding;\n this.usage = options.usage;\n this.warnings = options.warnings;\n this.providerMetadata = options.providerMetadata;\n this.response = options.response;\n }\n};\n\n// src/embed/embed-many.ts\nimport {\n withUserAgentSuffix as withUserAgentSuffix4\n} from \"@ai-sdk/provider-utils\";\n\n// src/util/split-array.ts\nfunction splitArray(array2, chunkSize) {\n if (chunkSize <= 0) {\n throw new Error(\"chunkSize must be greater than 0\");\n }\n const result = [];\n for (let i = 0; i < array2.length; i += chunkSize) {\n result.push(array2.slice(i, i + chunkSize));\n }\n return result;\n}\n\n// src/embed/embed-many.ts\nasync function embedMany({\n model: modelArg,\n values,\n maxParallelCalls = Infinity,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n providerOptions,\n experimental_telemetry: telemetry\n}) {\n const model = resolveEmbeddingModel(modelArg);\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const headersWithUserAgent = withUserAgentSuffix4(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers: headersWithUserAgent,\n settings: { maxRetries }\n });\n const tracer = getTracer(telemetry);\n return recordSpan({\n name: \"ai.embedMany\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: \"ai.embedMany\", telemetry }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.values\": {\n input: () => values.map((value) => JSON.stringify(value))\n }\n }\n }),\n tracer,\n fn: async (span) => {\n var _a21;\n const [maxEmbeddingsPerCall, supportsParallelCalls] = await Promise.all([\n model.maxEmbeddingsPerCall,\n model.supportsParallelCalls\n ]);\n if (maxEmbeddingsPerCall == null || maxEmbeddingsPerCall === Infinity) {\n const { embeddings: embeddings2, usage, warnings: warnings2, response, providerMetadata: providerMetadata2 } = await retry(() => {\n return recordSpan({\n name: \"ai.embedMany.doEmbed\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.embedMany.doEmbed\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.values\": {\n input: () => values.map((value) => JSON.stringify(value))\n }\n }\n }),\n tracer,\n fn: async (doEmbedSpan) => {\n var _a22, _b;\n const modelResponse = await model.doEmbed({\n values,\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions\n });\n const embeddings3 = modelResponse.embeddings;\n const usage2 = (_a22 = modelResponse.usage) != null ? _a22 : { tokens: NaN };\n doEmbedSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embeddings\": {\n output: () => embeddings3.map(\n (embedding) => JSON.stringify(embedding)\n )\n },\n \"ai.usage.tokens\": usage2.tokens\n }\n })\n );\n return {\n embeddings: embeddings3,\n usage: usage2,\n warnings: (_b = modelResponse.warnings) != null ? _b : [],\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response\n };\n }\n });\n });\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embeddings\": {\n output: () => embeddings2.map((embedding) => JSON.stringify(embedding))\n },\n \"ai.usage.tokens\": usage.tokens\n }\n })\n );\n logWarnings({\n warnings: warnings2,\n provider: model.provider,\n model: model.modelId\n });\n return new DefaultEmbedManyResult({\n values,\n embeddings: embeddings2,\n usage,\n warnings: warnings2,\n providerMetadata: providerMetadata2,\n responses: [response]\n });\n }\n const valueChunks = splitArray(values, maxEmbeddingsPerCall);\n const embeddings = [];\n const warnings = [];\n const responses = [];\n let tokens = 0;\n let providerMetadata;\n const parallelChunks = splitArray(\n valueChunks,\n supportsParallelCalls ? maxParallelCalls : 1\n );\n for (const parallelChunk of parallelChunks) {\n const results = await Promise.all(\n parallelChunk.map((chunk) => {\n return retry(() => {\n return recordSpan({\n name: \"ai.embedMany.doEmbed\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.embedMany.doEmbed\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.values\": {\n input: () => chunk.map((value) => JSON.stringify(value))\n }\n }\n }),\n tracer,\n fn: async (doEmbedSpan) => {\n var _a22, _b;\n const modelResponse = await model.doEmbed({\n values: chunk,\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions\n });\n const embeddings2 = modelResponse.embeddings;\n const usage = (_a22 = modelResponse.usage) != null ? _a22 : { tokens: NaN };\n doEmbedSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embeddings\": {\n output: () => embeddings2.map(\n (embedding) => JSON.stringify(embedding)\n )\n },\n \"ai.usage.tokens\": usage.tokens\n }\n })\n );\n return {\n embeddings: embeddings2,\n usage,\n warnings: (_b = modelResponse.warnings) != null ? _b : [],\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response\n };\n }\n });\n });\n })\n );\n for (const result of results) {\n embeddings.push(...result.embeddings);\n warnings.push(...result.warnings);\n responses.push(result.response);\n tokens += result.usage.tokens;\n if (result.providerMetadata) {\n if (!providerMetadata) {\n providerMetadata = { ...result.providerMetadata };\n } else {\n for (const [providerName, metadata] of Object.entries(\n result.providerMetadata\n )) {\n providerMetadata[providerName] = {\n ...(_a21 = providerMetadata[providerName]) != null ? _a21 : {},\n ...metadata\n };\n }\n }\n }\n }\n }\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embeddings\": {\n output: () => embeddings.map((embedding) => JSON.stringify(embedding))\n },\n \"ai.usage.tokens\": tokens\n }\n })\n );\n logWarnings({\n warnings,\n provider: model.provider,\n model: model.modelId\n });\n return new DefaultEmbedManyResult({\n values,\n embeddings,\n usage: { tokens },\n warnings,\n providerMetadata,\n responses\n });\n }\n });\n}\nvar DefaultEmbedManyResult = class {\n constructor(options) {\n this.values = options.values;\n this.embeddings = options.embeddings;\n this.usage = options.usage;\n this.warnings = options.warnings;\n this.providerMetadata = options.providerMetadata;\n this.responses = options.responses;\n }\n};\n\n// src/generate-image/generate-image.ts\nimport {\n convertBase64ToUint8Array as convertBase64ToUint8Array4,\n withUserAgentSuffix as withUserAgentSuffix5\n} from \"@ai-sdk/provider-utils\";\nasync function generateImage({\n model: modelArg,\n prompt: promptArg,\n n = 1,\n maxImagesPerCall,\n size,\n aspectRatio,\n seed,\n providerOptions,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers\n}) {\n var _a21, _b;\n const model = resolveImageModel(modelArg);\n const headersWithUserAgent = withUserAgentSuffix5(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const maxImagesPerCallWithDefault = (_a21 = maxImagesPerCall != null ? maxImagesPerCall : await invokeModelMaxImagesPerCall(model)) != null ? _a21 : 1;\n const callCount = Math.ceil(n / maxImagesPerCallWithDefault);\n const callImageCounts = Array.from({ length: callCount }, (_, i) => {\n if (i < callCount - 1) {\n return maxImagesPerCallWithDefault;\n }\n const remainder = n % maxImagesPerCallWithDefault;\n return remainder === 0 ? maxImagesPerCallWithDefault : remainder;\n });\n const results = await Promise.all(\n callImageCounts.map(\n async (callImageCount) => retry(() => {\n const { prompt, files, mask } = normalizePrompt(promptArg);\n return model.doGenerate({\n prompt,\n files,\n mask,\n n: callImageCount,\n abortSignal,\n headers: headersWithUserAgent,\n size,\n aspectRatio,\n seed,\n providerOptions: providerOptions != null ? providerOptions : {}\n });\n })\n )\n );\n const images = [];\n const warnings = [];\n const responses = [];\n const providerMetadata = {};\n let totalUsage = {\n inputTokens: void 0,\n outputTokens: void 0,\n totalTokens: void 0\n };\n for (const result of results) {\n images.push(\n ...result.images.map(\n (image) => {\n var _a22;\n return new DefaultGeneratedFile({\n data: image,\n mediaType: (_a22 = detectMediaType({\n data: image,\n signatures: imageMediaTypeSignatures\n })) != null ? _a22 : \"image/png\"\n });\n }\n )\n );\n warnings.push(...result.warnings);\n if (result.usage != null) {\n totalUsage = addImageModelUsage(totalUsage, result.usage);\n }\n if (result.providerMetadata) {\n for (const [providerName, metadata] of Object.entries(result.providerMetadata)) {\n if (providerName === \"gateway\") {\n const currentEntry = providerMetadata[providerName];\n if (currentEntry != null && typeof currentEntry === \"object\") {\n providerMetadata[providerName] = {\n ...currentEntry,\n ...metadata\n };\n } else {\n providerMetadata[providerName] = metadata;\n }\n const imagesValue = providerMetadata[providerName].images;\n if (Array.isArray(imagesValue) && imagesValue.length === 0) {\n delete providerMetadata[providerName].images;\n }\n } else {\n (_b = providerMetadata[providerName]) != null ? _b : providerMetadata[providerName] = { images: [] };\n providerMetadata[providerName].images.push(\n ...result.providerMetadata[providerName].images\n );\n }\n }\n }\n responses.push(result.response);\n }\n logWarnings({ warnings, provider: model.provider, model: model.modelId });\n if (!images.length) {\n throw new NoImageGeneratedError({ responses });\n }\n return new DefaultGenerateImageResult({\n images,\n warnings,\n responses,\n providerMetadata,\n usage: totalUsage\n });\n}\nvar DefaultGenerateImageResult = class {\n constructor(options) {\n this.images = options.images;\n this.warnings = options.warnings;\n this.responses = options.responses;\n this.providerMetadata = options.providerMetadata;\n this.usage = options.usage;\n }\n get image() {\n return this.images[0];\n }\n};\nasync function invokeModelMaxImagesPerCall(model) {\n const isFunction = model.maxImagesPerCall instanceof Function;\n if (!isFunction) {\n return model.maxImagesPerCall;\n }\n return model.maxImagesPerCall({\n modelId: model.modelId\n });\n}\nfunction normalizePrompt(prompt) {\n if (typeof prompt === \"string\") {\n return { prompt, files: void 0, mask: void 0 };\n }\n return {\n prompt: prompt.text,\n files: prompt.images.map(toImageModelV3File),\n mask: prompt.mask ? toImageModelV3File(prompt.mask) : void 0\n };\n}\nfunction toImageModelV3File(dataContent) {\n if (typeof dataContent === \"string\" && dataContent.startsWith(\"http\")) {\n return {\n type: \"url\",\n url: dataContent\n };\n }\n if (typeof dataContent === \"string\" && dataContent.startsWith(\"data:\")) {\n const { mediaType: dataUrlMediaType, base64Content } = splitDataUrl(dataContent);\n if (base64Content != null) {\n const uint8Data2 = convertBase64ToUint8Array4(base64Content);\n return {\n type: \"file\",\n data: uint8Data2,\n mediaType: dataUrlMediaType || detectMediaType({\n data: uint8Data2,\n signatures: imageMediaTypeSignatures\n }) || \"image/png\"\n };\n }\n }\n const uint8Data = convertDataContentToUint8Array(dataContent);\n return {\n type: \"file\",\n data: uint8Data,\n mediaType: detectMediaType({\n data: uint8Data,\n signatures: imageMediaTypeSignatures\n }) || \"image/png\"\n };\n}\n\n// src/generate-image/index.ts\nvar experimental_generateImage = generateImage;\n\n// src/generate-object/generate-object.ts\nimport {\n createIdGenerator as createIdGenerator3,\n withUserAgentSuffix as withUserAgentSuffix6\n} from \"@ai-sdk/provider-utils\";\n\n// src/generate-object/output-strategy.ts\nimport {\n isJSONArray,\n isJSONObject,\n TypeValidationError as TypeValidationError4,\n UnsupportedFunctionalityError as UnsupportedFunctionalityError3\n} from \"@ai-sdk/provider\";\nimport {\n asSchema as asSchema4,\n safeValidateTypes as safeValidateTypes4\n} from \"@ai-sdk/provider-utils\";\nvar noSchemaOutputStrategy = {\n type: \"no-schema\",\n jsonSchema: async () => void 0,\n async validatePartialResult({ value, textDelta }) {\n return { success: true, value: { partial: value, textDelta } };\n },\n async validateFinalResult(value, context2) {\n return value === void 0 ? {\n success: false,\n error: new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n text: context2.text,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n })\n } : { success: true, value };\n },\n createElementStream() {\n throw new UnsupportedFunctionalityError3({\n functionality: \"element streams in no-schema mode\"\n });\n }\n};\nvar objectOutputStrategy = (schema) => ({\n type: \"object\",\n jsonSchema: async () => await schema.jsonSchema,\n async validatePartialResult({ value, textDelta }) {\n return {\n success: true,\n value: {\n // Note: currently no validation of partial results:\n partial: value,\n textDelta\n }\n };\n },\n async validateFinalResult(value) {\n return safeValidateTypes4({ value, schema });\n },\n createElementStream() {\n throw new UnsupportedFunctionalityError3({\n functionality: \"element streams in object mode\"\n });\n }\n});\nvar arrayOutputStrategy = (schema) => {\n return {\n type: \"array\",\n // wrap in object that contains array of elements, since most LLMs will not\n // be able to generate an array directly:\n // possible future optimization: use arrays directly when model supports grammar-guided generation\n jsonSchema: async () => {\n const { $schema, ...itemSchema } = await schema.jsonSchema;\n return {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n properties: {\n elements: { type: \"array\", items: itemSchema }\n },\n required: [\"elements\"],\n additionalProperties: false\n };\n },\n async validatePartialResult({\n value,\n latestObject,\n isFirstDelta,\n isFinalDelta\n }) {\n var _a21;\n if (!isJSONObject(value) || !isJSONArray(value.elements)) {\n return {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: \"value must be an object that contains an array of elements\"\n })\n };\n }\n const inputArray = value.elements;\n const resultArray = [];\n for (let i = 0; i < inputArray.length; i++) {\n const element = inputArray[i];\n const result = await safeValidateTypes4({ value: element, schema });\n if (i === inputArray.length - 1 && !isFinalDelta) {\n continue;\n }\n if (!result.success) {\n return result;\n }\n resultArray.push(result.value);\n }\n const publishedElementCount = (_a21 = latestObject == null ? void 0 : latestObject.length) != null ? _a21 : 0;\n let textDelta = \"\";\n if (isFirstDelta) {\n textDelta += \"[\";\n }\n if (publishedElementCount > 0) {\n textDelta += \",\";\n }\n textDelta += resultArray.slice(publishedElementCount).map((element) => JSON.stringify(element)).join(\",\");\n if (isFinalDelta) {\n textDelta += \"]\";\n }\n return {\n success: true,\n value: {\n partial: resultArray,\n textDelta\n }\n };\n },\n async validateFinalResult(value) {\n if (!isJSONObject(value) || !isJSONArray(value.elements)) {\n return {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: \"value must be an object that contains an array of elements\"\n })\n };\n }\n const inputArray = value.elements;\n for (const element of inputArray) {\n const result = await safeValidateTypes4({ value: element, schema });\n if (!result.success) {\n return result;\n }\n }\n return { success: true, value: inputArray };\n },\n createElementStream(originalStream) {\n let publishedElements = 0;\n return createAsyncIterableStream(\n originalStream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"object\": {\n const array2 = chunk.object;\n for (; publishedElements < array2.length; publishedElements++) {\n controller.enqueue(array2[publishedElements]);\n }\n break;\n }\n case \"text-delta\":\n case \"finish\":\n case \"error\":\n break;\n default: {\n const _exhaustiveCheck = chunk;\n throw new Error(\n `Unsupported chunk type: ${_exhaustiveCheck}`\n );\n }\n }\n }\n })\n )\n );\n }\n };\n};\nvar enumOutputStrategy = (enumValues) => {\n return {\n type: \"enum\",\n // wrap in object that contains result, since most LLMs will not\n // be able to generate an enum value directly:\n // possible future optimization: use enums directly when model supports top-level enums\n jsonSchema: async () => ({\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n properties: {\n result: { type: \"string\", enum: enumValues }\n },\n required: [\"result\"],\n additionalProperties: false\n }),\n async validateFinalResult(value) {\n if (!isJSONObject(value) || typeof value.result !== \"string\") {\n return {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: 'value must be an object that contains a string in the \"result\" property.'\n })\n };\n }\n const result = value.result;\n return enumValues.includes(result) ? { success: true, value: result } : {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: \"value must be a string in the enum\"\n })\n };\n },\n async validatePartialResult({ value, textDelta }) {\n if (!isJSONObject(value) || typeof value.result !== \"string\") {\n return {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: 'value must be an object that contains a string in the \"result\" property.'\n })\n };\n }\n const result = value.result;\n const possibleEnumValues = enumValues.filter(\n (enumValue) => enumValue.startsWith(result)\n );\n if (value.result.length === 0 || possibleEnumValues.length === 0) {\n return {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: \"value must be a string in the enum\"\n })\n };\n }\n return {\n success: true,\n value: {\n partial: possibleEnumValues.length > 1 ? result : possibleEnumValues[0],\n textDelta\n }\n };\n },\n createElementStream() {\n throw new UnsupportedFunctionalityError3({\n functionality: \"element streams in enum mode\"\n });\n }\n };\n};\nfunction getOutputStrategy({\n output,\n schema,\n enumValues\n}) {\n switch (output) {\n case \"object\":\n return objectOutputStrategy(asSchema4(schema));\n case \"array\":\n return arrayOutputStrategy(asSchema4(schema));\n case \"enum\":\n return enumOutputStrategy(enumValues);\n case \"no-schema\":\n return noSchemaOutputStrategy;\n default: {\n const _exhaustiveCheck = output;\n throw new Error(`Unsupported output: ${_exhaustiveCheck}`);\n }\n }\n}\n\n// src/generate-object/parse-and-validate-object-result.ts\nimport { JSONParseError as JSONParseError2, TypeValidationError as TypeValidationError5 } from \"@ai-sdk/provider\";\nimport { safeParseJSON as safeParseJSON4 } from \"@ai-sdk/provider-utils\";\nasync function parseAndValidateObjectResult(result, outputStrategy, context2) {\n const parseResult = await safeParseJSON4({ text: result });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: result,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n const validationResult = await outputStrategy.validateFinalResult(\n parseResult.value,\n {\n text: result,\n response: context2.response,\n usage: context2.usage\n }\n );\n if (!validationResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: validationResult.error,\n text: result,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n return validationResult.value;\n}\nasync function parseAndValidateObjectResultWithRepair(result, outputStrategy, repairText, context2) {\n try {\n return await parseAndValidateObjectResult(result, outputStrategy, context2);\n } catch (error) {\n if (repairText != null && NoObjectGeneratedError.isInstance(error) && (JSONParseError2.isInstance(error.cause) || TypeValidationError5.isInstance(error.cause))) {\n const repairedText = await repairText({\n text: result,\n error: error.cause\n });\n if (repairedText === null) {\n throw error;\n }\n return await parseAndValidateObjectResult(\n repairedText,\n outputStrategy,\n context2\n );\n }\n throw error;\n }\n}\n\n// src/generate-object/validate-object-generation-input.ts\nfunction validateObjectGenerationInput({\n output,\n schema,\n schemaName,\n schemaDescription,\n enumValues\n}) {\n if (output != null && output !== \"object\" && output !== \"array\" && output !== \"enum\" && output !== \"no-schema\") {\n throw new InvalidArgumentError({\n parameter: \"output\",\n value: output,\n message: \"Invalid output type.\"\n });\n }\n if (output === \"no-schema\") {\n if (schema != null) {\n throw new InvalidArgumentError({\n parameter: \"schema\",\n value: schema,\n message: \"Schema is not supported for no-schema output.\"\n });\n }\n if (schemaDescription != null) {\n throw new InvalidArgumentError({\n parameter: \"schemaDescription\",\n value: schemaDescription,\n message: \"Schema description is not supported for no-schema output.\"\n });\n }\n if (schemaName != null) {\n throw new InvalidArgumentError({\n parameter: \"schemaName\",\n value: schemaName,\n message: \"Schema name is not supported for no-schema output.\"\n });\n }\n if (enumValues != null) {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value: enumValues,\n message: \"Enum values are not supported for no-schema output.\"\n });\n }\n }\n if (output === \"object\") {\n if (schema == null) {\n throw new InvalidArgumentError({\n parameter: \"schema\",\n value: schema,\n message: \"Schema is required for object output.\"\n });\n }\n if (enumValues != null) {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value: enumValues,\n message: \"Enum values are not supported for object output.\"\n });\n }\n }\n if (output === \"array\") {\n if (schema == null) {\n throw new InvalidArgumentError({\n parameter: \"schema\",\n value: schema,\n message: \"Element schema is required for array output.\"\n });\n }\n if (enumValues != null) {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value: enumValues,\n message: \"Enum values are not supported for array output.\"\n });\n }\n }\n if (output === \"enum\") {\n if (schema != null) {\n throw new InvalidArgumentError({\n parameter: \"schema\",\n value: schema,\n message: \"Schema is not supported for enum output.\"\n });\n }\n if (schemaDescription != null) {\n throw new InvalidArgumentError({\n parameter: \"schemaDescription\",\n value: schemaDescription,\n message: \"Schema description is not supported for enum output.\"\n });\n }\n if (schemaName != null) {\n throw new InvalidArgumentError({\n parameter: \"schemaName\",\n value: schemaName,\n message: \"Schema name is not supported for enum output.\"\n });\n }\n if (enumValues == null) {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value: enumValues,\n message: \"Enum values are required for enum output.\"\n });\n }\n for (const value of enumValues) {\n if (typeof value !== \"string\") {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value,\n message: \"Enum values must be strings.\"\n });\n }\n }\n }\n}\n\n// src/generate-object/generate-object.ts\nvar originalGenerateId3 = createIdGenerator3({ prefix: \"aiobj\", size: 24 });\nasync function generateObject(options) {\n const {\n model: modelArg,\n output = \"object\",\n system,\n prompt,\n messages,\n allowSystemInMessages,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n experimental_repairText: repairText,\n experimental_telemetry: telemetry,\n experimental_download: download2,\n providerOptions,\n _internal: {\n generateId: generateId2 = originalGenerateId3,\n currentDate = () => /* @__PURE__ */ new Date()\n } = {},\n ...settings\n } = options;\n const model = resolveLanguageModel(modelArg);\n const enumValues = \"enum\" in options ? options.enum : void 0;\n const {\n schema: inputSchema,\n schemaDescription,\n schemaName\n } = \"schema\" in options ? options : {};\n validateObjectGenerationInput({\n output,\n schema: inputSchema,\n schemaName,\n schemaDescription,\n enumValues\n });\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const outputStrategy = getOutputStrategy({\n output,\n schema: inputSchema,\n enumValues\n });\n const callSettings = prepareCallSettings(settings);\n const headersWithUserAgent = withUserAgentSuffix6(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers: headersWithUserAgent,\n settings: { ...callSettings, maxRetries }\n });\n const tracer = getTracer(telemetry);\n const jsonSchema2 = await outputStrategy.jsonSchema();\n try {\n return await recordSpan({\n name: \"ai.generateObject\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.generateObject\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.prompt\": {\n input: () => JSON.stringify({ system, prompt, messages })\n },\n \"ai.schema\": jsonSchema2 != null ? { input: () => JSON.stringify(jsonSchema2) } : void 0,\n \"ai.schema.name\": schemaName,\n \"ai.schema.description\": schemaDescription,\n \"ai.settings.output\": outputStrategy.type\n }\n }),\n tracer,\n fn: async (span) => {\n var _a21;\n let result;\n let finishReason;\n let usage;\n let warnings;\n let response;\n let request;\n let resultProviderMetadata;\n let reasoning;\n const standardizedPrompt = await standardizePrompt({\n system,\n prompt,\n messages,\n allowSystemInMessages\n });\n const promptMessages = await convertToLanguageModelPrompt({\n prompt: standardizedPrompt,\n supportedUrls: await model.supportedUrls,\n download: download2\n });\n const generateResult = await retry(\n () => recordSpan({\n name: \"ai.generateObject.doGenerate\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.generateObject.doGenerate\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n \"ai.prompt.messages\": {\n input: () => stringifyForTelemetry(promptMessages)\n },\n // standardized gen-ai llm span attributes:\n \"gen_ai.system\": model.provider,\n \"gen_ai.request.model\": model.modelId,\n \"gen_ai.request.frequency_penalty\": callSettings.frequencyPenalty,\n \"gen_ai.request.max_tokens\": callSettings.maxOutputTokens,\n \"gen_ai.request.presence_penalty\": callSettings.presencePenalty,\n \"gen_ai.request.temperature\": callSettings.temperature,\n \"gen_ai.request.top_k\": callSettings.topK,\n \"gen_ai.request.top_p\": callSettings.topP\n }\n }),\n tracer,\n fn: async (span2) => {\n var _a22, _b, _c, _d, _e, _f, _g, _h;\n const result2 = await model.doGenerate({\n responseFormat: {\n type: \"json\",\n schema: jsonSchema2,\n name: schemaName,\n description: schemaDescription\n },\n ...prepareCallSettings(settings),\n prompt: promptMessages,\n providerOptions,\n abortSignal,\n headers: headersWithUserAgent\n });\n const responseData = {\n id: (_b = (_a22 = result2.response) == null ? void 0 : _a22.id) != null ? _b : generateId2(),\n timestamp: (_d = (_c = result2.response) == null ? void 0 : _c.timestamp) != null ? _d : currentDate(),\n modelId: (_f = (_e = result2.response) == null ? void 0 : _e.modelId) != null ? _f : model.modelId,\n headers: (_g = result2.response) == null ? void 0 : _g.headers,\n body: (_h = result2.response) == null ? void 0 : _h.body\n };\n const text2 = extractTextContent(result2.content);\n const reasoning2 = extractReasoningContent(result2.content);\n if (text2 === void 0) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: the model did not return a response.\",\n response: responseData,\n usage: asLanguageModelUsage(result2.usage),\n finishReason: result2.finishReason.unified\n });\n }\n span2.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": result2.finishReason.unified,\n \"ai.response.object\": { output: () => text2 },\n \"ai.response.id\": responseData.id,\n \"ai.response.model\": responseData.modelId,\n \"ai.response.timestamp\": responseData.timestamp.toISOString(),\n \"ai.response.providerMetadata\": JSON.stringify(\n result2.providerMetadata\n ),\n // TODO rename telemetry attributes to inputTokens and outputTokens\n \"ai.usage.promptTokens\": result2.usage.inputTokens.total,\n \"ai.usage.completionTokens\": result2.usage.outputTokens.total,\n // standardized gen-ai llm span attributes:\n \"gen_ai.response.finish_reasons\": [\n result2.finishReason.unified\n ],\n \"gen_ai.response.id\": responseData.id,\n \"gen_ai.response.model\": responseData.modelId,\n \"gen_ai.usage.input_tokens\": result2.usage.inputTokens.total,\n \"gen_ai.usage.output_tokens\": result2.usage.outputTokens.total\n }\n })\n );\n return {\n ...result2,\n objectText: text2,\n reasoning: reasoning2,\n responseData\n };\n }\n })\n );\n result = generateResult.objectText;\n finishReason = generateResult.finishReason.unified;\n usage = asLanguageModelUsage(generateResult.usage);\n warnings = generateResult.warnings;\n resultProviderMetadata = generateResult.providerMetadata;\n request = (_a21 = generateResult.request) != null ? _a21 : {};\n response = generateResult.responseData;\n reasoning = generateResult.reasoning;\n logWarnings({\n warnings,\n provider: model.provider,\n model: model.modelId\n });\n const object2 = await parseAndValidateObjectResultWithRepair(\n result,\n outputStrategy,\n repairText,\n {\n response,\n usage,\n finishReason\n }\n );\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": finishReason,\n \"ai.response.object\": {\n output: () => JSON.stringify(object2)\n },\n \"ai.response.providerMetadata\": JSON.stringify(\n resultProviderMetadata\n ),\n // TODO rename telemetry attributes to inputTokens and outputTokens\n \"ai.usage.promptTokens\": usage.inputTokens,\n \"ai.usage.completionTokens\": usage.outputTokens\n }\n })\n );\n return new DefaultGenerateObjectResult({\n object: object2,\n reasoning,\n finishReason,\n usage,\n warnings,\n request,\n response,\n providerMetadata: resultProviderMetadata\n });\n }\n });\n } catch (error) {\n throw wrapGatewayError(error);\n }\n}\nvar DefaultGenerateObjectResult = class {\n constructor(options) {\n this.object = options.object;\n this.finishReason = options.finishReason;\n this.usage = options.usage;\n this.warnings = options.warnings;\n this.providerMetadata = options.providerMetadata;\n this.response = options.response;\n this.request = options.request;\n this.reasoning = options.reasoning;\n }\n toJsonResponse(init) {\n var _a21;\n return new Response(JSON.stringify(this.object), {\n status: (_a21 = init == null ? void 0 : init.status) != null ? _a21 : 200,\n headers: prepareHeaders(init == null ? void 0 : init.headers, {\n \"content-type\": \"application/json; charset=utf-8\"\n })\n });\n }\n};\n\n// src/generate-object/stream-object.ts\nimport {\n createIdGenerator as createIdGenerator4,\n DelayedPromise as DelayedPromise2\n} from \"@ai-sdk/provider-utils\";\n\n// src/util/cosine-similarity.ts\nfunction cosineSimilarity(vector1, vector2) {\n if (vector1.length !== vector2.length) {\n throw new InvalidArgumentError({\n parameter: \"vector1,vector2\",\n value: { vector1Length: vector1.length, vector2Length: vector2.length },\n message: `Vectors must have the same length`\n });\n }\n const n = vector1.length;\n if (n === 0) {\n return 0;\n }\n let magnitudeSquared1 = 0;\n let magnitudeSquared2 = 0;\n let dotProduct = 0;\n for (let i = 0; i < n; i++) {\n const value1 = vector1[i];\n const value2 = vector2[i];\n magnitudeSquared1 += value1 * value1;\n magnitudeSquared2 += value2 * value2;\n dotProduct += value1 * value2;\n }\n return magnitudeSquared1 === 0 || magnitudeSquared2 === 0 ? 0 : dotProduct / (Math.sqrt(magnitudeSquared1) * Math.sqrt(magnitudeSquared2));\n}\n\n// src/util/download/create-download.ts\nfunction createDownload(options) {\n return ({ url, abortSignal }) => download({ url, maxBytes: options == null ? void 0 : options.maxBytes, abortSignal });\n}\n\n// src/util/data-url.ts\nfunction getTextFromDataUrl(dataUrl) {\n const [header, base64Content] = dataUrl.split(\",\");\n const mediaType = header.split(\";\")[0].split(\":\")[1];\n if (mediaType == null || base64Content == null) {\n throw new Error(\"Invalid data URL format\");\n }\n try {\n return window.atob(base64Content);\n } catch (error) {\n throw new Error(`Error decoding data URL`);\n }\n}\n\n// src/util/is-deep-equal-data.ts\nfunction isDeepEqualData(obj1, obj2) {\n if (obj1 === obj2)\n return true;\n if (obj1 == null || obj2 == null)\n return false;\n if (typeof obj1 !== \"object\" && typeof obj2 !== \"object\")\n return obj1 === obj2;\n if (obj1.constructor !== obj2.constructor)\n return false;\n if (obj1 instanceof Date && obj2 instanceof Date) {\n return obj1.getTime() === obj2.getTime();\n }\n if (Array.isArray(obj1)) {\n if (obj1.length !== obj2.length)\n return false;\n for (let i = 0; i < obj1.length; i++) {\n if (!isDeepEqualData(obj1[i], obj2[i]))\n return false;\n }\n return true;\n }\n const keys1 = Object.keys(obj1);\n const keys2 = Object.keys(obj2);\n if (keys1.length !== keys2.length)\n return false;\n for (const key of keys1) {\n if (!keys2.includes(key))\n return false;\n if (!isDeepEqualData(obj1[key], obj2[key]))\n return false;\n }\n return true;\n}\n\n// src/util/serial-job-executor.ts\nvar SerialJobExecutor = class {\n constructor() {\n this.queue = [];\n this.isProcessing = false;\n }\n async processQueue() {\n if (this.isProcessing) {\n return;\n }\n this.isProcessing = true;\n while (this.queue.length > 0) {\n await this.queue[0]();\n this.queue.shift();\n }\n this.isProcessing = false;\n }\n async run(job) {\n return new Promise((resolve3, reject) => {\n this.queue.push(async () => {\n try {\n await job();\n resolve3();\n } catch (error) {\n reject(error);\n }\n });\n void this.processQueue();\n });\n }\n};\n\n// src/util/simulate-readable-stream.ts\nimport { delay as delayFunction } from \"@ai-sdk/provider-utils\";\nfunction simulateReadableStream({\n chunks,\n initialDelayInMs = 0,\n chunkDelayInMs = 0,\n _internal\n}) {\n var _a21;\n const delay2 = (_a21 = _internal == null ? void 0 : _internal.delay) != null ? _a21 : delayFunction;\n let index = 0;\n return new ReadableStream({\n async pull(controller) {\n if (index < chunks.length) {\n await delay2(index === 0 ? initialDelayInMs : chunkDelayInMs);\n controller.enqueue(chunks[index++]);\n } else {\n controller.close();\n }\n }\n });\n}\n\n// src/generate-object/stream-object.ts\nvar originalGenerateId4 = createIdGenerator4({ prefix: \"aiobj\", size: 24 });\nfunction streamObject(options) {\n const {\n model,\n output = \"object\",\n system,\n prompt,\n messages,\n allowSystemInMessages,\n maxRetries,\n abortSignal,\n headers,\n experimental_repairText: repairText,\n experimental_telemetry: telemetry,\n experimental_download: download2,\n providerOptions,\n onError = ({ error }) => {\n console.error(error);\n },\n onFinish,\n _internal: {\n generateId: generateId2 = originalGenerateId4,\n currentDate = () => /* @__PURE__ */ new Date(),\n now: now2 = now\n } = {},\n ...settings\n } = options;\n const enumValues = \"enum\" in options && options.enum ? options.enum : void 0;\n const {\n schema: inputSchema,\n schemaDescription,\n schemaName\n } = \"schema\" in options ? options : {};\n validateObjectGenerationInput({\n output,\n schema: inputSchema,\n schemaName,\n schemaDescription,\n enumValues\n });\n const outputStrategy = getOutputStrategy({\n output,\n schema: inputSchema,\n enumValues\n });\n return new DefaultStreamObjectResult({\n model,\n telemetry,\n headers,\n settings,\n maxRetries,\n abortSignal,\n outputStrategy,\n system,\n prompt,\n messages,\n allowSystemInMessages,\n schemaName,\n schemaDescription,\n providerOptions,\n repairText,\n onError,\n onFinish,\n download: download2,\n generateId: generateId2,\n currentDate,\n now: now2\n });\n}\nvar DefaultStreamObjectResult = class {\n constructor({\n model: modelArg,\n headers,\n telemetry,\n settings,\n maxRetries: maxRetriesArg,\n abortSignal,\n outputStrategy,\n system,\n prompt,\n messages,\n allowSystemInMessages,\n schemaName,\n schemaDescription,\n providerOptions,\n repairText,\n onError,\n onFinish,\n download: download2,\n generateId: generateId2,\n currentDate,\n now: now2\n }) {\n this._object = new DelayedPromise2();\n this._usage = new DelayedPromise2();\n this._providerMetadata = new DelayedPromise2();\n this._warnings = new DelayedPromise2();\n this._request = new DelayedPromise2();\n this._response = new DelayedPromise2();\n this._finishReason = new DelayedPromise2();\n const model = resolveLanguageModel(modelArg);\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const callSettings = prepareCallSettings(settings);\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { ...callSettings, maxRetries }\n });\n const tracer = getTracer(telemetry);\n const self = this;\n const stitchableStream = createStitchableStream();\n const eventProcessor = new TransformStream({\n transform(chunk, controller) {\n controller.enqueue(chunk);\n if (chunk.type === \"error\") {\n onError({ error: wrapGatewayError(chunk.error) });\n }\n }\n });\n this.baseStream = stitchableStream.stream.pipeThrough(eventProcessor);\n recordSpan({\n name: \"ai.streamObject\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.streamObject\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.prompt\": {\n input: () => JSON.stringify({ system, prompt, messages })\n },\n \"ai.schema\": {\n input: async () => JSON.stringify(await outputStrategy.jsonSchema())\n },\n \"ai.schema.name\": schemaName,\n \"ai.schema.description\": schemaDescription,\n \"ai.settings.output\": outputStrategy.type\n }\n }),\n tracer,\n endWhenDone: false,\n fn: async (rootSpan) => {\n const standardizedPrompt = await standardizePrompt({\n system,\n prompt,\n messages,\n allowSystemInMessages\n });\n const callOptions = {\n responseFormat: {\n type: \"json\",\n schema: await outputStrategy.jsonSchema(),\n name: schemaName,\n description: schemaDescription\n },\n ...prepareCallSettings(settings),\n prompt: await convertToLanguageModelPrompt({\n prompt: standardizedPrompt,\n supportedUrls: await model.supportedUrls,\n download: download2\n }),\n providerOptions,\n abortSignal,\n headers,\n includeRawChunks: false\n };\n const transformer = {\n transform: (chunk, controller) => {\n switch (chunk.type) {\n case \"text-delta\":\n controller.enqueue(chunk.delta);\n break;\n case \"response-metadata\":\n case \"finish\":\n case \"error\":\n case \"stream-start\":\n controller.enqueue(chunk);\n break;\n }\n }\n };\n const {\n result: { stream, response, request },\n doStreamSpan,\n startTimestampMs\n } = await retry(\n () => recordSpan({\n name: \"ai.streamObject.doStream\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.streamObject.doStream\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n \"ai.prompt.messages\": {\n input: () => stringifyForTelemetry(callOptions.prompt)\n },\n // standardized gen-ai llm span attributes:\n \"gen_ai.system\": model.provider,\n \"gen_ai.request.model\": model.modelId,\n \"gen_ai.request.frequency_penalty\": callSettings.frequencyPenalty,\n \"gen_ai.request.max_tokens\": callSettings.maxOutputTokens,\n \"gen_ai.request.presence_penalty\": callSettings.presencePenalty,\n \"gen_ai.request.temperature\": callSettings.temperature,\n \"gen_ai.request.top_k\": callSettings.topK,\n \"gen_ai.request.top_p\": callSettings.topP\n }\n }),\n tracer,\n endWhenDone: false,\n fn: async (doStreamSpan2) => ({\n startTimestampMs: now2(),\n doStreamSpan: doStreamSpan2,\n result: await model.doStream(callOptions)\n })\n })\n );\n self._request.resolve(request != null ? request : {});\n let warnings;\n let usage = createNullLanguageModelUsage();\n let finishReason;\n let providerMetadata;\n let object2;\n let error;\n let accumulatedText = \"\";\n let textDelta = \"\";\n let fullResponse = {\n id: generateId2(),\n timestamp: currentDate(),\n modelId: model.modelId\n };\n let latestObjectJson = void 0;\n let latestObject = void 0;\n let isFirstChunk = true;\n let isFirstDelta = true;\n const transformedStream = stream.pipeThrough(new TransformStream(transformer)).pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n var _a21, _b, _c;\n if (typeof chunk === \"object\" && chunk.type === \"stream-start\") {\n warnings = chunk.warnings;\n return;\n }\n if (isFirstChunk) {\n const msToFirstChunk = now2() - startTimestampMs;\n isFirstChunk = false;\n doStreamSpan.addEvent(\"ai.stream.firstChunk\", {\n \"ai.stream.msToFirstChunk\": msToFirstChunk\n });\n doStreamSpan.setAttributes({\n \"ai.stream.msToFirstChunk\": msToFirstChunk\n });\n }\n if (typeof chunk === \"string\") {\n accumulatedText += chunk;\n textDelta += chunk;\n const { value: currentObjectJson, state: parseState } = await parsePartialJson(accumulatedText);\n if (currentObjectJson !== void 0 && !isDeepEqualData(latestObjectJson, currentObjectJson)) {\n const validationResult = await outputStrategy.validatePartialResult({\n value: currentObjectJson,\n textDelta,\n latestObject,\n isFirstDelta,\n isFinalDelta: parseState === \"successful-parse\"\n });\n if (validationResult.success && !isDeepEqualData(\n latestObject,\n validationResult.value.partial\n )) {\n latestObjectJson = currentObjectJson;\n latestObject = validationResult.value.partial;\n controller.enqueue({\n type: \"object\",\n object: latestObject\n });\n controller.enqueue({\n type: \"text-delta\",\n textDelta: validationResult.value.textDelta\n });\n textDelta = \"\";\n isFirstDelta = false;\n }\n }\n return;\n }\n switch (chunk.type) {\n case \"response-metadata\": {\n fullResponse = {\n id: (_a21 = chunk.id) != null ? _a21 : fullResponse.id,\n timestamp: (_b = chunk.timestamp) != null ? _b : fullResponse.timestamp,\n modelId: (_c = chunk.modelId) != null ? _c : fullResponse.modelId\n };\n break;\n }\n case \"finish\": {\n if (textDelta !== \"\") {\n controller.enqueue({ type: \"text-delta\", textDelta });\n }\n finishReason = chunk.finishReason.unified;\n usage = asLanguageModelUsage(chunk.usage);\n providerMetadata = chunk.providerMetadata;\n controller.enqueue({\n ...chunk,\n finishReason: chunk.finishReason.unified,\n usage,\n response: fullResponse\n });\n logWarnings({\n warnings: warnings != null ? warnings : [],\n provider: model.provider,\n model: model.modelId\n });\n self._usage.resolve(usage);\n self._providerMetadata.resolve(providerMetadata);\n self._warnings.resolve(warnings);\n self._response.resolve({\n ...fullResponse,\n headers: response == null ? void 0 : response.headers\n });\n self._finishReason.resolve(finishReason != null ? finishReason : \"other\");\n try {\n object2 = await parseAndValidateObjectResultWithRepair(\n accumulatedText,\n outputStrategy,\n repairText,\n {\n response: fullResponse,\n usage,\n finishReason\n }\n );\n self._object.resolve(object2);\n } catch (e) {\n error = e;\n self._object.reject(e);\n }\n break;\n }\n default: {\n controller.enqueue(chunk);\n break;\n }\n }\n },\n // invoke onFinish callback and resolve toolResults promise when the stream is about to close:\n async flush(controller) {\n try {\n const finalUsage = usage != null ? usage : {\n promptTokens: NaN,\n completionTokens: NaN,\n totalTokens: NaN\n };\n doStreamSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": finishReason,\n \"ai.response.object\": {\n output: () => JSON.stringify(object2)\n },\n \"ai.response.id\": fullResponse.id,\n \"ai.response.model\": fullResponse.modelId,\n \"ai.response.timestamp\": fullResponse.timestamp.toISOString(),\n \"ai.response.providerMetadata\": JSON.stringify(providerMetadata),\n \"ai.usage.inputTokens\": finalUsage.inputTokens,\n \"ai.usage.outputTokens\": finalUsage.outputTokens,\n \"ai.usage.totalTokens\": finalUsage.totalTokens,\n \"ai.usage.reasoningTokens\": finalUsage.reasoningTokens,\n \"ai.usage.cachedInputTokens\": finalUsage.cachedInputTokens,\n // standardized gen-ai llm span attributes:\n \"gen_ai.response.finish_reasons\": [finishReason],\n \"gen_ai.response.id\": fullResponse.id,\n \"gen_ai.response.model\": fullResponse.modelId,\n \"gen_ai.usage.input_tokens\": finalUsage.inputTokens,\n \"gen_ai.usage.output_tokens\": finalUsage.outputTokens\n }\n })\n );\n doStreamSpan.end();\n rootSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.usage.inputTokens\": finalUsage.inputTokens,\n \"ai.usage.outputTokens\": finalUsage.outputTokens,\n \"ai.usage.totalTokens\": finalUsage.totalTokens,\n \"ai.usage.reasoningTokens\": finalUsage.reasoningTokens,\n \"ai.usage.cachedInputTokens\": finalUsage.cachedInputTokens,\n \"ai.response.object\": {\n output: () => JSON.stringify(object2)\n },\n \"ai.response.providerMetadata\": JSON.stringify(providerMetadata)\n }\n })\n );\n await (onFinish == null ? void 0 : onFinish({\n usage: finalUsage,\n object: object2,\n error,\n response: {\n ...fullResponse,\n headers: response == null ? void 0 : response.headers\n },\n warnings,\n providerMetadata\n }));\n } catch (error2) {\n controller.enqueue({ type: \"error\", error: error2 });\n } finally {\n rootSpan.end();\n }\n }\n })\n );\n stitchableStream.addStream(transformedStream);\n }\n }).catch((error) => {\n stitchableStream.addStream(\n new ReadableStream({\n start(controller) {\n controller.enqueue({ type: \"error\", error });\n controller.close();\n }\n })\n );\n }).finally(() => {\n stitchableStream.close();\n });\n this.outputStrategy = outputStrategy;\n }\n get object() {\n return this._object.promise;\n }\n get usage() {\n return this._usage.promise;\n }\n get providerMetadata() {\n return this._providerMetadata.promise;\n }\n get warnings() {\n return this._warnings.promise;\n }\n get request() {\n return this._request.promise;\n }\n get response() {\n return this._response.promise;\n }\n get finishReason() {\n return this._finishReason.promise;\n }\n get partialObjectStream() {\n return createAsyncIterableStream(\n this.baseStream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"object\":\n controller.enqueue(chunk.object);\n break;\n case \"text-delta\":\n case \"finish\":\n case \"error\":\n break;\n default: {\n const _exhaustiveCheck = chunk;\n throw new Error(`Unsupported chunk type: ${_exhaustiveCheck}`);\n }\n }\n }\n })\n )\n );\n }\n get elementStream() {\n return this.outputStrategy.createElementStream(this.baseStream);\n }\n get textStream() {\n return createAsyncIterableStream(\n this.baseStream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"text-delta\":\n controller.enqueue(chunk.textDelta);\n break;\n case \"object\":\n case \"finish\":\n case \"error\":\n break;\n default: {\n const _exhaustiveCheck = chunk;\n throw new Error(`Unsupported chunk type: ${_exhaustiveCheck}`);\n }\n }\n }\n })\n )\n );\n }\n get fullStream() {\n return createAsyncIterableStream(this.baseStream);\n }\n pipeTextStreamToResponse(response, init) {\n pipeTextStreamToResponse({\n response,\n textStream: this.textStream,\n ...init\n });\n }\n toTextStreamResponse(init) {\n return createTextStreamResponse({\n textStream: this.textStream,\n ...init\n });\n }\n};\n\n// src/generate-speech/generate-speech.ts\nimport {\n withUserAgentSuffix as withUserAgentSuffix7\n} from \"@ai-sdk/provider-utils\";\n\n// src/generate-speech/generated-audio-file.ts\nvar DefaultGeneratedAudioFile = class extends DefaultGeneratedFile {\n constructor({\n data,\n mediaType\n }) {\n super({ data, mediaType });\n let format = \"mp3\";\n if (mediaType) {\n const mediaTypeParts = mediaType.split(\"/\");\n if (mediaTypeParts.length === 2) {\n if (mediaType !== \"audio/mpeg\") {\n format = mediaTypeParts[1];\n }\n }\n }\n if (!format) {\n throw new Error(\n \"Audio format must be provided or determinable from media type\"\n );\n }\n this.format = format;\n }\n};\n\n// src/generate-speech/generate-speech.ts\nasync function generateSpeech({\n model,\n text: text2,\n voice,\n outputFormat,\n instructions,\n speed,\n language,\n providerOptions = {},\n maxRetries: maxRetriesArg,\n abortSignal,\n headers\n}) {\n var _a21;\n const resolvedModel = resolveSpeechModel(model);\n if (!resolvedModel) {\n throw new Error(\"Model could not be resolved\");\n }\n const headersWithUserAgent = withUserAgentSuffix7(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const result = await retry(\n () => resolvedModel.doGenerate({\n text: text2,\n voice,\n outputFormat,\n instructions,\n speed,\n language,\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions\n })\n );\n if (!result.audio || result.audio.length === 0) {\n throw new NoSpeechGeneratedError({ responses: [result.response] });\n }\n logWarnings({\n warnings: result.warnings,\n provider: resolvedModel.provider,\n model: resolvedModel.modelId\n });\n return new DefaultSpeechResult({\n audio: new DefaultGeneratedAudioFile({\n data: result.audio,\n mediaType: (_a21 = detectMediaType({\n data: result.audio,\n signatures: audioMediaTypeSignatures\n })) != null ? _a21 : \"audio/mp3\"\n }),\n warnings: result.warnings,\n responses: [result.response],\n providerMetadata: result.providerMetadata\n });\n}\nvar DefaultSpeechResult = class {\n constructor(options) {\n var _a21;\n this.audio = options.audio;\n this.warnings = options.warnings;\n this.responses = options.responses;\n this.providerMetadata = (_a21 = options.providerMetadata) != null ? _a21 : {};\n }\n};\n\n// src/generate-text/prune-messages.ts\nfunction pruneMessages({\n messages,\n reasoning = \"none\",\n toolCalls = [],\n emptyMessages = \"remove\"\n}) {\n if (reasoning === \"all\" || reasoning === \"before-last-message\") {\n messages = messages.map((message, messageIndex) => {\n if (message.role !== \"assistant\" || typeof message.content === \"string\" || reasoning === \"before-last-message\" && messageIndex === messages.length - 1) {\n return message;\n }\n return {\n ...message,\n content: message.content.filter((part) => part.type !== \"reasoning\")\n };\n });\n }\n if (toolCalls === \"none\") {\n toolCalls = [];\n } else if (toolCalls === \"all\") {\n toolCalls = [{ type: \"all\" }];\n } else if (toolCalls === \"before-last-message\") {\n toolCalls = [{ type: \"before-last-message\" }];\n } else if (typeof toolCalls === \"string\") {\n toolCalls = [{ type: toolCalls }];\n }\n for (const toolCall of toolCalls) {\n const keepLastMessagesCount = toolCall.type === \"all\" ? void 0 : toolCall.type === \"before-last-message\" ? 1 : Number(\n toolCall.type.slice(\"before-last-\".length).slice(0, -\"-messages\".length)\n );\n const keptToolCallIds = /* @__PURE__ */ new Set();\n const keptApprovalIds = /* @__PURE__ */ new Set();\n if (keepLastMessagesCount != null) {\n for (const message of messages.slice(-keepLastMessagesCount)) {\n if ((message.role === \"assistant\" || message.role === \"tool\") && typeof message.content !== \"string\") {\n for (const part of message.content) {\n if (part.type === \"tool-call\" || part.type === \"tool-result\") {\n keptToolCallIds.add(part.toolCallId);\n } else if (part.type === \"tool-approval-request\" || part.type === \"tool-approval-response\") {\n keptApprovalIds.add(part.approvalId);\n }\n }\n }\n }\n }\n messages = messages.map((message, messageIndex) => {\n if (message.role !== \"assistant\" && message.role !== \"tool\" || typeof message.content === \"string\" || keepLastMessagesCount && messageIndex >= messages.length - keepLastMessagesCount) {\n return message;\n }\n const toolCallIdToToolName = {};\n const approvalIdToToolName = {};\n return {\n ...message,\n content: message.content.filter((part) => {\n if (part.type !== \"tool-call\" && part.type !== \"tool-result\" && part.type !== \"tool-approval-request\" && part.type !== \"tool-approval-response\") {\n return true;\n }\n if (part.type === \"tool-call\") {\n toolCallIdToToolName[part.toolCallId] = part.toolName;\n } else if (part.type === \"tool-approval-request\") {\n approvalIdToToolName[part.approvalId] = toolCallIdToToolName[part.toolCallId];\n }\n if ((part.type === \"tool-call\" || part.type === \"tool-result\") && keptToolCallIds.has(part.toolCallId) || (part.type === \"tool-approval-request\" || part.type === \"tool-approval-response\") && keptApprovalIds.has(part.approvalId)) {\n return true;\n }\n return toolCall.tools != null && !toolCall.tools.includes(\n part.type === \"tool-call\" || part.type === \"tool-result\" ? part.toolName : approvalIdToToolName[part.approvalId]\n );\n })\n };\n });\n }\n if (emptyMessages === \"remove\") {\n messages = messages.filter((message) => message.content.length > 0);\n }\n return messages;\n}\n\n// src/generate-text/smooth-stream.ts\nimport { delay as originalDelay } from \"@ai-sdk/provider-utils\";\nimport {\n InvalidArgumentError as InvalidArgumentError2\n} from \"@ai-sdk/provider\";\nvar CHUNKING_REGEXPS = {\n word: /\\S+\\s+/m,\n line: /\\n+/m\n};\nfunction smoothStream({\n delayInMs = 10,\n chunking = \"word\",\n _internal: { delay: delay2 = originalDelay } = {}\n} = {}) {\n let detectChunk;\n if (chunking != null && typeof chunking === \"object\" && \"segment\" in chunking && typeof chunking.segment === \"function\") {\n const segmenter = chunking;\n detectChunk = (buffer) => {\n if (buffer.length === 0)\n return null;\n const iterator = segmenter.segment(buffer)[Symbol.iterator]();\n const first = iterator.next().value;\n return (first == null ? void 0 : first.segment) || null;\n };\n } else if (typeof chunking === \"function\") {\n detectChunk = (buffer) => {\n const match = chunking(buffer);\n if (match == null) {\n return null;\n }\n if (!match.length) {\n throw new Error(`Chunking function must return a non-empty string.`);\n }\n if (!buffer.startsWith(match)) {\n throw new Error(\n `Chunking function must return a match that is a prefix of the buffer. Received: \"${match}\" expected to start with \"${buffer}\"`\n );\n }\n return match;\n };\n } else {\n const chunkingRegex = typeof chunking === \"string\" ? CHUNKING_REGEXPS[chunking] : chunking instanceof RegExp ? chunking : void 0;\n if (chunkingRegex == null) {\n throw new InvalidArgumentError2({\n argument: \"chunking\",\n message: `Chunking must be \"word\", \"line\", a RegExp, an Intl.Segmenter, or a ChunkDetector function. Received: ${chunking}`\n });\n }\n detectChunk = (buffer) => {\n const match = chunkingRegex.exec(buffer);\n if (!match) {\n return null;\n }\n return buffer.slice(0, match.index) + (match == null ? void 0 : match[0]);\n };\n }\n return () => {\n let buffer = \"\";\n let id = \"\";\n let type = void 0;\n let providerMetadata = void 0;\n function flushBuffer(controller) {\n if (buffer.length > 0 && type !== void 0) {\n controller.enqueue({\n type,\n text: buffer,\n id,\n ...providerMetadata != null ? { providerMetadata } : {}\n });\n buffer = \"\";\n providerMetadata = void 0;\n }\n }\n return new TransformStream({\n async transform(chunk, controller) {\n if (chunk.type !== \"text-delta\" && chunk.type !== \"reasoning-delta\") {\n flushBuffer(controller);\n controller.enqueue(chunk);\n return;\n }\n if ((chunk.type !== type || chunk.id !== id) && buffer.length > 0) {\n flushBuffer(controller);\n }\n buffer += chunk.text;\n id = chunk.id;\n type = chunk.type;\n if (chunk.providerMetadata != null) {\n providerMetadata = chunk.providerMetadata;\n }\n let match;\n while ((match = detectChunk(buffer)) != null) {\n controller.enqueue({ type, text: match, id });\n buffer = buffer.slice(match.length);\n await delay2(delayInMs);\n }\n }\n });\n };\n}\n\n// src/generate-video/generate-video.ts\nimport {\n convertBase64ToUint8Array as convertBase64ToUint8Array5,\n withUserAgentSuffix as withUserAgentSuffix8\n} from \"@ai-sdk/provider-utils\";\nvar defaultDownload = createDownload();\nasync function experimental_generateVideo({\n model: modelArg,\n prompt: promptArg,\n n = 1,\n maxVideosPerCall,\n aspectRatio,\n resolution,\n duration,\n fps,\n seed,\n providerOptions,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n download: downloadFn = defaultDownload\n}) {\n var _a21;\n const model = resolveVideoModel(modelArg);\n const headersWithUserAgent = withUserAgentSuffix8(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const { prompt, image } = normalizePrompt2(promptArg);\n const maxVideosPerCallWithDefault = (_a21 = maxVideosPerCall != null ? maxVideosPerCall : await invokeModelMaxVideosPerCall(model)) != null ? _a21 : 1;\n const callCount = Math.ceil(n / maxVideosPerCallWithDefault);\n const callVideoCounts = Array.from({ length: callCount }, (_, index) => {\n const remaining = n - index * maxVideosPerCallWithDefault;\n return Math.min(remaining, maxVideosPerCallWithDefault);\n });\n const results = await Promise.all(\n callVideoCounts.map(\n async (callVideoCount) => retry(\n () => model.doGenerate({\n prompt,\n n: callVideoCount,\n aspectRatio,\n resolution,\n duration,\n fps,\n seed,\n image,\n providerOptions: providerOptions != null ? providerOptions : {},\n headers: headersWithUserAgent,\n abortSignal\n })\n )\n )\n );\n const videos = [];\n const warnings = [];\n const responses = [];\n const providerMetadata = {};\n for (const result of results) {\n for (const videoData of result.videos) {\n switch (videoData.type) {\n case \"url\": {\n const { data, mediaType: downloadedMediaType } = await downloadFn({\n url: new URL(videoData.url),\n abortSignal\n });\n const isUsableMediaType = (type) => !!type && type !== \"application/octet-stream\";\n const mediaType = isUsableMediaType(videoData.mediaType) && videoData.mediaType || isUsableMediaType(downloadedMediaType) && downloadedMediaType || detectMediaType({\n data,\n signatures: videoMediaTypeSignatures\n }) || \"video/mp4\";\n videos.push(\n new DefaultGeneratedFile({\n data,\n mediaType\n })\n );\n break;\n }\n case \"base64\": {\n videos.push(\n new DefaultGeneratedFile({\n data: videoData.data,\n mediaType: videoData.mediaType || \"video/mp4\"\n })\n );\n break;\n }\n case \"binary\": {\n const mediaType = videoData.mediaType || detectMediaType({\n data: videoData.data,\n signatures: videoMediaTypeSignatures\n }) || \"video/mp4\";\n videos.push(\n new DefaultGeneratedFile({\n data: videoData.data,\n mediaType\n })\n );\n break;\n }\n }\n }\n warnings.push(...result.warnings);\n responses.push({\n timestamp: result.response.timestamp,\n modelId: result.response.modelId,\n headers: result.response.headers,\n providerMetadata: result.providerMetadata\n });\n if (result.providerMetadata != null) {\n for (const [providerName, metadata] of Object.entries(\n result.providerMetadata\n )) {\n const existingMetadata = providerMetadata[providerName];\n if (existingMetadata != null && typeof existingMetadata === \"object\") {\n providerMetadata[providerName] = {\n ...existingMetadata,\n ...metadata\n };\n if (\"videos\" in existingMetadata && Array.isArray(existingMetadata.videos) && \"videos\" in metadata && Array.isArray(metadata.videos)) {\n providerMetadata[providerName].videos = [\n ...existingMetadata.videos,\n ...metadata.videos\n ];\n }\n } else {\n providerMetadata[providerName] = metadata;\n }\n }\n }\n }\n if (videos.length === 0) {\n throw new NoVideoGeneratedError({ responses });\n }\n if (warnings.length > 0) {\n logWarnings({\n warnings,\n provider: model.provider,\n model: model.modelId\n });\n }\n return {\n video: videos[0],\n videos,\n warnings,\n responses,\n providerMetadata\n };\n}\nfunction normalizePrompt2(promptArg) {\n var _a21, _b;\n if (typeof promptArg === \"string\") {\n return {\n prompt: promptArg,\n image: void 0\n };\n }\n let image;\n if (promptArg.image != null) {\n const dataContent = promptArg.image;\n if (typeof dataContent === \"string\") {\n if (dataContent.startsWith(\"http://\") || dataContent.startsWith(\"https://\")) {\n image = {\n type: \"url\",\n url: dataContent\n };\n } else if (dataContent.startsWith(\"data:\")) {\n const { mediaType, base64Content } = splitDataUrl(dataContent);\n image = {\n type: \"file\",\n mediaType: mediaType != null ? mediaType : \"image/png\",\n data: convertBase64ToUint8Array5(base64Content != null ? base64Content : \"\")\n };\n } else {\n const bytes = convertBase64ToUint8Array5(dataContent);\n const mediaType = (_a21 = detectMediaType({\n data: bytes,\n signatures: imageMediaTypeSignatures\n })) != null ? _a21 : \"image/png\";\n image = {\n type: \"file\",\n mediaType,\n data: bytes\n };\n }\n } else if (dataContent instanceof Uint8Array) {\n const mediaType = (_b = detectMediaType({\n data: dataContent,\n signatures: imageMediaTypeSignatures\n })) != null ? _b : \"image/png\";\n image = {\n type: \"file\",\n mediaType,\n data: dataContent\n };\n }\n }\n return {\n prompt: promptArg.text,\n image\n };\n}\nasync function invokeModelMaxVideosPerCall(model) {\n if (typeof model.maxVideosPerCall === \"function\") {\n return await model.maxVideosPerCall({ modelId: model.modelId });\n }\n return model.maxVideosPerCall;\n}\n\n// src/middleware/default-embedding-settings-middleware.ts\nfunction defaultEmbeddingSettingsMiddleware({\n settings\n}) {\n return {\n specificationVersion: \"v3\",\n transformParams: async ({ params }) => {\n return mergeObjects(settings, params);\n }\n };\n}\n\n// src/middleware/default-settings-middleware.ts\nfunction defaultSettingsMiddleware({\n settings\n}) {\n return {\n specificationVersion: \"v3\",\n transformParams: async ({ params }) => {\n return mergeObjects(settings, params);\n }\n };\n}\n\n// src/middleware/extract-json-middleware.ts\nfunction defaultTransform(text2) {\n return text2.replace(/^```(?:json)?\\s*\\n?/, \"\").replace(/\\n?```\\s*$/, \"\").trim();\n}\nfunction extractJsonMiddleware(options) {\n var _a21;\n const transform = (_a21 = options == null ? void 0 : options.transform) != null ? _a21 : defaultTransform;\n const hasCustomTransform = (options == null ? void 0 : options.transform) !== void 0;\n return {\n specificationVersion: \"v3\",\n wrapGenerate: async ({ doGenerate }) => {\n const { content, ...rest } = await doGenerate();\n const transformedContent = [];\n for (const part of content) {\n if (part.type !== \"text\") {\n transformedContent.push(part);\n continue;\n }\n transformedContent.push({\n ...part,\n text: transform(part.text)\n });\n }\n return { content: transformedContent, ...rest };\n },\n wrapStream: async ({ doStream }) => {\n const { stream, ...rest } = await doStream();\n const textBlocks = {};\n const SUFFIX_BUFFER_SIZE = 12;\n return {\n stream: stream.pipeThrough(\n new TransformStream({\n transform: (chunk, controller) => {\n if (chunk.type === \"text-start\") {\n textBlocks[chunk.id] = {\n startEvent: chunk,\n // Custom transforms need to buffer all content\n phase: hasCustomTransform ? \"buffering\" : \"prefix\",\n buffer: \"\",\n prefixStripped: false\n };\n return;\n }\n if (chunk.type === \"text-delta\") {\n const block = textBlocks[chunk.id];\n if (!block) {\n controller.enqueue(chunk);\n return;\n }\n block.buffer += chunk.delta;\n if (block.phase === \"buffering\") {\n return;\n }\n if (block.phase === \"prefix\") {\n if (block.buffer.length > 0 && !block.buffer.startsWith(\"`\")) {\n block.phase = \"streaming\";\n controller.enqueue(block.startEvent);\n } else if (block.buffer.startsWith(\"```\")) {\n if (block.buffer.includes(\"\\n\")) {\n const prefixMatch = block.buffer.match(/^```(?:json)?\\s*\\n/);\n if (prefixMatch) {\n block.buffer = block.buffer.slice(\n prefixMatch[0].length\n );\n block.prefixStripped = true;\n block.phase = \"streaming\";\n controller.enqueue(block.startEvent);\n } else {\n block.phase = \"streaming\";\n controller.enqueue(block.startEvent);\n }\n }\n } else if (block.buffer.length >= 3 && !block.buffer.startsWith(\"```\")) {\n block.phase = \"streaming\";\n controller.enqueue(block.startEvent);\n }\n }\n if (block.phase === \"streaming\" && block.buffer.length > SUFFIX_BUFFER_SIZE) {\n const toStream = block.buffer.slice(0, -SUFFIX_BUFFER_SIZE);\n block.buffer = block.buffer.slice(-SUFFIX_BUFFER_SIZE);\n controller.enqueue({\n type: \"text-delta\",\n id: chunk.id,\n delta: toStream\n });\n }\n return;\n }\n if (chunk.type === \"text-end\") {\n const block = textBlocks[chunk.id];\n if (block) {\n if (block.phase === \"prefix\" || block.phase === \"buffering\") {\n controller.enqueue(block.startEvent);\n }\n let remaining = block.buffer;\n if (block.phase === \"buffering\") {\n remaining = transform(remaining);\n } else if (block.prefixStripped) {\n remaining = remaining.replace(/\\n?```\\s*$/, \"\").trimEnd();\n } else {\n remaining = transform(remaining);\n }\n if (remaining.length > 0) {\n controller.enqueue({\n type: \"text-delta\",\n id: chunk.id,\n delta: remaining\n });\n }\n controller.enqueue(chunk);\n delete textBlocks[chunk.id];\n return;\n }\n }\n controller.enqueue(chunk);\n }\n })\n ),\n ...rest\n };\n }\n };\n}\n\n// src/util/get-potential-start-index.ts\nfunction getPotentialStartIndex(text2, searchedText) {\n if (searchedText.length === 0) {\n return null;\n }\n const directIndex = text2.indexOf(searchedText);\n if (directIndex !== -1) {\n return directIndex;\n }\n for (let i = text2.length - 1; i >= 0; i--) {\n const suffix = text2.substring(i);\n if (searchedText.startsWith(suffix)) {\n return i;\n }\n }\n return null;\n}\n\n// src/middleware/extract-reasoning-middleware.ts\nfunction extractReasoningMiddleware({\n tagName,\n separator = \"\\n\",\n startWithReasoning = false\n}) {\n const openingTag = `<${tagName}>`;\n const closingTag = `</${tagName}>`;\n return {\n specificationVersion: \"v3\",\n wrapGenerate: async ({ doGenerate }) => {\n const { content, ...rest } = await doGenerate();\n const transformedContent = [];\n for (const part of content) {\n if (part.type !== \"text\") {\n transformedContent.push(part);\n continue;\n }\n const text2 = startWithReasoning ? openingTag + part.text : part.text;\n const regexp = new RegExp(`${openingTag}(.*?)${closingTag}`, \"gs\");\n const matches = Array.from(text2.matchAll(regexp));\n if (!matches.length) {\n transformedContent.push(part);\n continue;\n }\n const reasoningText = matches.map((match) => match[1]).join(separator);\n let textWithoutReasoning = text2;\n for (let i = matches.length - 1; i >= 0; i--) {\n const match = matches[i];\n const beforeMatch = textWithoutReasoning.slice(0, match.index);\n const afterMatch = textWithoutReasoning.slice(\n match.index + match[0].length\n );\n textWithoutReasoning = beforeMatch + (beforeMatch.length > 0 && afterMatch.length > 0 ? separator : \"\") + afterMatch;\n }\n transformedContent.push({\n type: \"reasoning\",\n text: reasoningText\n });\n transformedContent.push({\n type: \"text\",\n text: textWithoutReasoning\n });\n }\n return { content: transformedContent, ...rest };\n },\n wrapStream: async ({ doStream }) => {\n const { stream, ...rest } = await doStream();\n const reasoningExtractions = {};\n let delayedTextStart;\n return {\n stream: stream.pipeThrough(\n new TransformStream({\n transform: (chunk, controller) => {\n if (chunk.type === \"text-start\") {\n delayedTextStart = chunk;\n return;\n }\n if (chunk.type === \"text-end\" && delayedTextStart) {\n controller.enqueue(delayedTextStart);\n delayedTextStart = void 0;\n }\n if (chunk.type !== \"text-delta\") {\n controller.enqueue(chunk);\n return;\n }\n if (reasoningExtractions[chunk.id] == null) {\n reasoningExtractions[chunk.id] = {\n isFirstReasoning: true,\n isFirstText: true,\n afterSwitch: false,\n isReasoning: startWithReasoning,\n buffer: \"\",\n idCounter: 0,\n textId: chunk.id\n };\n }\n const activeExtraction = reasoningExtractions[chunk.id];\n activeExtraction.buffer += chunk.delta;\n function publish(text2) {\n if (text2.length > 0) {\n const prefix = activeExtraction.afterSwitch && (activeExtraction.isReasoning ? !activeExtraction.isFirstReasoning : !activeExtraction.isFirstText) ? separator : \"\";\n if (activeExtraction.isReasoning && (activeExtraction.afterSwitch || activeExtraction.isFirstReasoning)) {\n controller.enqueue({\n type: \"reasoning-start\",\n id: `reasoning-${activeExtraction.idCounter}`\n });\n }\n if (activeExtraction.isReasoning) {\n controller.enqueue({\n type: \"reasoning-delta\",\n delta: prefix + text2,\n id: `reasoning-${activeExtraction.idCounter}`\n });\n } else {\n if (delayedTextStart) {\n controller.enqueue(delayedTextStart);\n delayedTextStart = void 0;\n }\n controller.enqueue({\n type: \"text-delta\",\n delta: prefix + text2,\n id: activeExtraction.textId\n });\n }\n activeExtraction.afterSwitch = false;\n if (activeExtraction.isReasoning) {\n activeExtraction.isFirstReasoning = false;\n } else {\n activeExtraction.isFirstText = false;\n }\n }\n }\n do {\n const nextTag = activeExtraction.isReasoning ? closingTag : openingTag;\n const startIndex = getPotentialStartIndex(\n activeExtraction.buffer,\n nextTag\n );\n if (startIndex == null) {\n publish(activeExtraction.buffer);\n activeExtraction.buffer = \"\";\n break;\n }\n publish(activeExtraction.buffer.slice(0, startIndex));\n const foundFullMatch = startIndex + nextTag.length <= activeExtraction.buffer.length;\n if (foundFullMatch) {\n activeExtraction.buffer = activeExtraction.buffer.slice(\n startIndex + nextTag.length\n );\n if (activeExtraction.isReasoning) {\n if (activeExtraction.isFirstReasoning) {\n controller.enqueue({\n type: \"reasoning-start\",\n id: `reasoning-${activeExtraction.idCounter}`\n });\n }\n controller.enqueue({\n type: \"reasoning-end\",\n id: `reasoning-${activeExtraction.idCounter++}`\n });\n }\n activeExtraction.isReasoning = !activeExtraction.isReasoning;\n activeExtraction.afterSwitch = true;\n } else {\n activeExtraction.buffer = activeExtraction.buffer.slice(startIndex);\n break;\n }\n } while (true);\n }\n })\n ),\n ...rest\n };\n }\n };\n}\n\n// src/middleware/simulate-streaming-middleware.ts\nfunction simulateStreamingMiddleware() {\n return {\n specificationVersion: \"v3\",\n wrapStream: async ({ doGenerate }) => {\n const result = await doGenerate();\n let id = 0;\n const simulatedStream = new ReadableStream({\n start(controller) {\n controller.enqueue({\n type: \"stream-start\",\n warnings: result.warnings\n });\n controller.enqueue({ type: \"response-metadata\", ...result.response });\n for (const part of result.content) {\n switch (part.type) {\n case \"text\": {\n if (part.text.length > 0) {\n controller.enqueue({ type: \"text-start\", id: String(id) });\n controller.enqueue({\n type: \"text-delta\",\n id: String(id),\n delta: part.text\n });\n controller.enqueue({ type: \"text-end\", id: String(id) });\n id++;\n }\n break;\n }\n case \"reasoning\": {\n controller.enqueue({\n type: \"reasoning-start\",\n id: String(id),\n providerMetadata: part.providerMetadata\n });\n controller.enqueue({\n type: \"reasoning-delta\",\n id: String(id),\n delta: part.text\n });\n controller.enqueue({ type: \"reasoning-end\", id: String(id) });\n id++;\n break;\n }\n default: {\n controller.enqueue(part);\n break;\n }\n }\n }\n controller.enqueue({\n type: \"finish\",\n finishReason: result.finishReason,\n usage: result.usage,\n providerMetadata: result.providerMetadata\n });\n controller.close();\n }\n });\n return {\n stream: simulatedStream,\n request: result.request,\n response: result.response\n };\n }\n };\n}\n\n// src/middleware/add-tool-input-examples-middleware.ts\nfunction defaultFormatExample(example) {\n return JSON.stringify(example.input);\n}\nfunction addToolInputExamplesMiddleware({\n prefix = \"Input Examples:\",\n format = defaultFormatExample,\n remove = true\n} = {}) {\n return {\n specificationVersion: \"v3\",\n transformParams: async ({ params }) => {\n var _a21;\n if (!((_a21 = params.tools) == null ? void 0 : _a21.length)) {\n return params;\n }\n const transformedTools = params.tools.map((tool2) => {\n var _a22;\n if (tool2.type !== \"function\" || !((_a22 = tool2.inputExamples) == null ? void 0 : _a22.length)) {\n return tool2;\n }\n const formattedExamples = tool2.inputExamples.map((example, index) => format(example, index)).join(\"\\n\");\n const examplesSection = `${prefix}\n${formattedExamples}`;\n const toolDescription = tool2.description ? `${tool2.description}\n\n${examplesSection}` : examplesSection;\n return {\n ...tool2,\n description: toolDescription,\n inputExamples: remove ? void 0 : tool2.inputExamples\n };\n });\n return {\n ...params,\n tools: transformedTools\n };\n }\n };\n}\n\n// src/middleware/wrap-language-model.ts\nvar wrapLanguageModel = ({\n model,\n middleware: middlewareArg,\n modelId,\n providerId\n}) => {\n return [...asArray(middlewareArg)].reverse().reduce((wrappedModel, middleware) => {\n return doWrap({ model: wrappedModel, middleware, modelId, providerId });\n }, model);\n};\nvar doWrap = ({\n model,\n middleware: {\n transformParams,\n wrapGenerate,\n wrapStream,\n overrideProvider,\n overrideModelId,\n overrideSupportedUrls\n },\n modelId,\n providerId\n}) => {\n var _a21, _b, _c;\n async function doTransform({\n params,\n type\n }) {\n return transformParams ? await transformParams({ params, type, model }) : params;\n }\n return {\n specificationVersion: \"v3\",\n provider: (_a21 = providerId != null ? providerId : overrideProvider == null ? void 0 : overrideProvider({ model })) != null ? _a21 : model.provider,\n modelId: (_b = modelId != null ? modelId : overrideModelId == null ? void 0 : overrideModelId({ model })) != null ? _b : model.modelId,\n supportedUrls: (_c = overrideSupportedUrls == null ? void 0 : overrideSupportedUrls({ model })) != null ? _c : model.supportedUrls,\n async doGenerate(params) {\n const transformedParams = await doTransform({ params, type: \"generate\" });\n const doGenerate = async () => model.doGenerate(transformedParams);\n const doStream = async () => model.doStream(transformedParams);\n return wrapGenerate ? wrapGenerate({\n doGenerate,\n doStream,\n params: transformedParams,\n model\n }) : doGenerate();\n },\n async doStream(params) {\n const transformedParams = await doTransform({ params, type: \"stream\" });\n const doGenerate = async () => model.doGenerate(transformedParams);\n const doStream = async () => model.doStream(transformedParams);\n return wrapStream ? wrapStream({ doGenerate, doStream, params: transformedParams, model }) : doStream();\n }\n };\n};\n\n// src/middleware/wrap-embedding-model.ts\nvar wrapEmbeddingModel = ({\n model,\n middleware: middlewareArg,\n modelId,\n providerId\n}) => {\n return [...asArray(middlewareArg)].reverse().reduce((wrappedModel, middleware) => {\n return doWrap2({ model: wrappedModel, middleware, modelId, providerId });\n }, model);\n};\nvar doWrap2 = ({\n model,\n middleware: {\n transformParams,\n wrapEmbed,\n overrideProvider,\n overrideModelId,\n overrideMaxEmbeddingsPerCall,\n overrideSupportsParallelCalls\n },\n modelId,\n providerId\n}) => {\n var _a21, _b, _c, _d;\n async function doTransform({\n params\n }) {\n return transformParams ? await transformParams({ params, model }) : params;\n }\n return {\n specificationVersion: \"v3\",\n provider: (_a21 = providerId != null ? providerId : overrideProvider == null ? void 0 : overrideProvider({ model })) != null ? _a21 : model.provider,\n modelId: (_b = modelId != null ? modelId : overrideModelId == null ? void 0 : overrideModelId({ model })) != null ? _b : model.modelId,\n maxEmbeddingsPerCall: (_c = overrideMaxEmbeddingsPerCall == null ? void 0 : overrideMaxEmbeddingsPerCall({ model })) != null ? _c : model.maxEmbeddingsPerCall,\n supportsParallelCalls: (_d = overrideSupportsParallelCalls == null ? void 0 : overrideSupportsParallelCalls({ model })) != null ? _d : model.supportsParallelCalls,\n async doEmbed(params) {\n const transformedParams = await doTransform({ params });\n const doEmbed = async () => model.doEmbed(transformedParams);\n return wrapEmbed ? wrapEmbed({\n doEmbed,\n params: transformedParams,\n model\n }) : doEmbed();\n }\n };\n};\n\n// src/middleware/wrap-image-model.ts\nvar wrapImageModel = ({\n model,\n middleware: middlewareArg,\n modelId,\n providerId\n}) => {\n return [...asArray(middlewareArg)].reverse().reduce((wrappedModel, middleware) => {\n return doWrap3({ model: wrappedModel, middleware, modelId, providerId });\n }, model);\n};\nvar doWrap3 = ({\n model,\n middleware: {\n transformParams,\n wrapGenerate,\n overrideProvider,\n overrideModelId,\n overrideMaxImagesPerCall\n },\n modelId,\n providerId\n}) => {\n var _a21, _b, _c;\n async function doTransform({ params }) {\n return transformParams ? await transformParams({ params, model }) : params;\n }\n const maxImagesPerCallRaw = (_a21 = overrideMaxImagesPerCall == null ? void 0 : overrideMaxImagesPerCall({ model })) != null ? _a21 : model.maxImagesPerCall;\n const maxImagesPerCall = maxImagesPerCallRaw instanceof Function ? maxImagesPerCallRaw.bind(model) : maxImagesPerCallRaw;\n return {\n specificationVersion: \"v3\",\n provider: (_b = providerId != null ? providerId : overrideProvider == null ? void 0 : overrideProvider({ model })) != null ? _b : model.provider,\n modelId: (_c = modelId != null ? modelId : overrideModelId == null ? void 0 : overrideModelId({ model })) != null ? _c : model.modelId,\n maxImagesPerCall,\n async doGenerate(params) {\n const transformedParams = await doTransform({ params });\n const doGenerate = async () => model.doGenerate(transformedParams);\n return wrapGenerate ? wrapGenerate({\n doGenerate,\n params: transformedParams,\n model\n }) : doGenerate();\n }\n };\n};\n\n// src/model/as-provider-v3.ts\nfunction asProviderV3(provider) {\n if (\"specificationVersion\" in provider && provider.specificationVersion === \"v3\") {\n return provider;\n }\n const v2Provider = provider;\n return {\n specificationVersion: \"v3\",\n languageModel: (modelId) => asLanguageModelV3(v2Provider.languageModel(modelId)),\n embeddingModel: (modelId) => asEmbeddingModelV3(v2Provider.textEmbeddingModel(modelId)),\n imageModel: (modelId) => asImageModelV3(v2Provider.imageModel(modelId)),\n transcriptionModel: v2Provider.transcriptionModel ? (modelId) => asTranscriptionModelV3(v2Provider.transcriptionModel(modelId)) : void 0,\n speechModel: v2Provider.speechModel ? (modelId) => asSpeechModelV3(v2Provider.speechModel(modelId)) : void 0,\n rerankingModel: void 0\n // v2 providers don't have reranking models\n };\n}\n\n// src/middleware/wrap-provider.ts\nfunction wrapProvider({\n provider,\n languageModelMiddleware,\n imageModelMiddleware\n}) {\n const providerV3 = asProviderV3(provider);\n return {\n specificationVersion: \"v3\",\n languageModel: (modelId) => wrapLanguageModel({\n model: providerV3.languageModel(modelId),\n middleware: languageModelMiddleware\n }),\n embeddingModel: providerV3.embeddingModel,\n imageModel: (modelId) => {\n let model = providerV3.imageModel(modelId);\n if (imageModelMiddleware != null) {\n model = wrapImageModel({ model, middleware: imageModelMiddleware });\n }\n return model;\n },\n transcriptionModel: providerV3.transcriptionModel,\n speechModel: providerV3.speechModel,\n rerankingModel: providerV3.rerankingModel\n };\n}\n\n// src/registry/custom-provider.ts\nimport {\n NoSuchModelError as NoSuchModelError2\n} from \"@ai-sdk/provider\";\nfunction customProvider({\n languageModels,\n embeddingModels,\n imageModels,\n transcriptionModels,\n speechModels,\n rerankingModels,\n videoModels,\n fallbackProvider: fallbackProviderArg\n}) {\n const fallbackProvider = fallbackProviderArg ? asProviderV3(fallbackProviderArg) : void 0;\n return {\n specificationVersion: \"v3\",\n languageModel(modelId) {\n if (languageModels != null && modelId in languageModels) {\n return languageModels[modelId];\n }\n if (fallbackProvider) {\n return fallbackProvider.languageModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"languageModel\" });\n },\n embeddingModel(modelId) {\n if (embeddingModels != null && modelId in embeddingModels) {\n return embeddingModels[modelId];\n }\n if (fallbackProvider) {\n return fallbackProvider.embeddingModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"embeddingModel\" });\n },\n imageModel(modelId) {\n if (imageModels != null && modelId in imageModels) {\n return imageModels[modelId];\n }\n if (fallbackProvider == null ? void 0 : fallbackProvider.imageModel) {\n return fallbackProvider.imageModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"imageModel\" });\n },\n transcriptionModel(modelId) {\n if (transcriptionModels != null && modelId in transcriptionModels) {\n return transcriptionModels[modelId];\n }\n if (fallbackProvider == null ? void 0 : fallbackProvider.transcriptionModel) {\n return fallbackProvider.transcriptionModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"transcriptionModel\" });\n },\n speechModel(modelId) {\n if (speechModels != null && modelId in speechModels) {\n return speechModels[modelId];\n }\n if (fallbackProvider == null ? void 0 : fallbackProvider.speechModel) {\n return fallbackProvider.speechModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"speechModel\" });\n },\n rerankingModel(modelId) {\n if (rerankingModels != null && modelId in rerankingModels) {\n return rerankingModels[modelId];\n }\n if (fallbackProvider == null ? void 0 : fallbackProvider.rerankingModel) {\n return fallbackProvider.rerankingModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"rerankingModel\" });\n },\n videoModel(modelId) {\n if (videoModels != null && modelId in videoModels) {\n return videoModels[modelId];\n }\n const videoModel = fallbackProvider == null ? void 0 : fallbackProvider.videoModel;\n if (videoModel) {\n return videoModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"videoModel\" });\n }\n };\n}\nvar experimental_customProvider = customProvider;\n\n// src/registry/no-such-provider-error.ts\nimport { AISDKError as AISDKError24, NoSuchModelError as NoSuchModelError3 } from \"@ai-sdk/provider\";\nvar name20 = \"AI_NoSuchProviderError\";\nvar marker20 = `vercel.ai.error.${name20}`;\nvar symbol20 = Symbol.for(marker20);\nvar _a20;\nvar NoSuchProviderError = class extends NoSuchModelError3 {\n constructor({\n modelId,\n modelType,\n providerId,\n availableProviders,\n message = `No such provider: ${providerId} (available providers: ${availableProviders.join()})`\n }) {\n super({ errorName: name20, modelId, modelType, message });\n this[_a20] = true;\n this.providerId = providerId;\n this.availableProviders = availableProviders;\n }\n static isInstance(error) {\n return AISDKError24.hasMarker(error, marker20);\n }\n};\n_a20 = symbol20;\n\n// src/registry/provider-registry.ts\nimport {\n NoSuchModelError as NoSuchModelError4\n} from \"@ai-sdk/provider\";\nfunction createProviderRegistry(providers, {\n separator = \":\",\n languageModelMiddleware,\n imageModelMiddleware\n} = {}) {\n const registry = new DefaultProviderRegistry({\n separator,\n languageModelMiddleware,\n imageModelMiddleware\n });\n for (const [id, provider] of Object.entries(providers)) {\n registry.registerProvider({ id, provider });\n }\n return registry;\n}\nvar experimental_createProviderRegistry = createProviderRegistry;\nvar DefaultProviderRegistry = class {\n constructor({\n separator,\n languageModelMiddleware,\n imageModelMiddleware\n }) {\n this.providers = {};\n this.separator = separator;\n this.languageModelMiddleware = languageModelMiddleware;\n this.imageModelMiddleware = imageModelMiddleware;\n }\n registerProvider({\n id,\n provider\n }) {\n this.providers[id] = provider;\n }\n getProvider(id, modelType) {\n const provider = this.providers[id];\n if (provider == null) {\n throw new NoSuchProviderError({\n modelId: id,\n modelType,\n providerId: id,\n availableProviders: Object.keys(this.providers)\n });\n }\n return provider;\n }\n splitId(id, modelType) {\n const index = id.indexOf(this.separator);\n if (index === -1) {\n throw new NoSuchModelError4({\n modelId: id,\n modelType,\n message: `Invalid ${modelType} id for registry: ${id} (must be in the format \"providerId${this.separator}modelId\")`\n });\n }\n return [id.slice(0, index), id.slice(index + this.separator.length)];\n }\n languageModel(id) {\n var _a21, _b;\n const [providerId, modelId] = this.splitId(id, \"languageModel\");\n let model = (_b = (_a21 = this.getProvider(providerId, \"languageModel\")).languageModel) == null ? void 0 : _b.call(\n _a21,\n modelId\n );\n if (model == null) {\n throw new NoSuchModelError4({ modelId: id, modelType: \"languageModel\" });\n }\n if (this.languageModelMiddleware != null) {\n model = wrapLanguageModel({\n model,\n middleware: this.languageModelMiddleware\n });\n }\n return model;\n }\n embeddingModel(id) {\n var _a21;\n const [providerId, modelId] = this.splitId(id, \"embeddingModel\");\n const provider = this.getProvider(providerId, \"embeddingModel\");\n const model = (_a21 = provider.embeddingModel) == null ? void 0 : _a21.call(provider, modelId);\n if (model == null) {\n throw new NoSuchModelError4({\n modelId: id,\n modelType: \"embeddingModel\"\n });\n }\n return model;\n }\n imageModel(id) {\n var _a21;\n const [providerId, modelId] = this.splitId(id, \"imageModel\");\n const provider = this.getProvider(providerId, \"imageModel\");\n let model = (_a21 = provider.imageModel) == null ? void 0 : _a21.call(provider, modelId);\n if (model == null) {\n throw new NoSuchModelError4({ modelId: id, modelType: \"imageModel\" });\n }\n if (this.imageModelMiddleware != null) {\n model = wrapImageModel({\n model,\n middleware: this.imageModelMiddleware\n });\n }\n return model;\n }\n transcriptionModel(id) {\n var _a21;\n const [providerId, modelId] = this.splitId(id, \"transcriptionModel\");\n const provider = this.getProvider(providerId, \"transcriptionModel\");\n const model = (_a21 = provider.transcriptionModel) == null ? void 0 : _a21.call(provider, modelId);\n if (model == null) {\n throw new NoSuchModelError4({\n modelId: id,\n modelType: \"transcriptionModel\"\n });\n }\n return model;\n }\n speechModel(id) {\n var _a21;\n const [providerId, modelId] = this.splitId(id, \"speechModel\");\n const provider = this.getProvider(providerId, \"speechModel\");\n const model = (_a21 = provider.speechModel) == null ? void 0 : _a21.call(provider, modelId);\n if (model == null) {\n throw new NoSuchModelError4({ modelId: id, modelType: \"speechModel\" });\n }\n return model;\n }\n rerankingModel(id) {\n var _a21;\n const [providerId, modelId] = this.splitId(id, \"rerankingModel\");\n const provider = this.getProvider(providerId, \"rerankingModel\");\n const model = (_a21 = provider.rerankingModel) == null ? void 0 : _a21.call(provider, modelId);\n if (model == null) {\n throw new NoSuchModelError4({ modelId: id, modelType: \"rerankingModel\" });\n }\n return model;\n }\n};\n\n// src/rerank/rerank.ts\nasync function rerank({\n model: modelArg,\n documents,\n query,\n topN,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n providerOptions,\n experimental_telemetry: telemetry\n}) {\n const model = resolveRerankingModel(modelArg);\n if (documents.length === 0) {\n return new DefaultRerankResult({\n originalDocuments: [],\n ranking: [],\n providerMetadata: void 0,\n response: {\n timestamp: /* @__PURE__ */ new Date(),\n modelId: model.modelId\n }\n });\n }\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const documentsToSend = typeof documents[0] === \"string\" ? { type: \"text\", values: documents } : { type: \"object\", values: documents };\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { maxRetries }\n });\n const tracer = getTracer(telemetry);\n return recordSpan({\n name: \"ai.rerank\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: \"ai.rerank\", telemetry }),\n ...baseTelemetryAttributes,\n \"ai.documents\": {\n input: () => documents.map((document) => JSON.stringify(document))\n }\n }\n }),\n tracer,\n fn: async () => {\n var _a21, _b;\n const { ranking, response, providerMetadata, warnings } = await retry(\n () => recordSpan({\n name: \"ai.rerank.doRerank\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.rerank.doRerank\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.documents\": {\n input: () => documents.map((document) => JSON.stringify(document))\n }\n }\n }),\n tracer,\n fn: async (doRerankSpan) => {\n const modelResponse = await model.doRerank({\n documents: documentsToSend,\n query,\n topN,\n providerOptions,\n abortSignal,\n headers\n });\n const ranking2 = modelResponse.ranking;\n doRerankSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.ranking.type\": documentsToSend.type,\n \"ai.ranking\": {\n output: () => ranking2.map((ranking3) => JSON.stringify(ranking3))\n }\n }\n })\n );\n return {\n ranking: ranking2,\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response,\n warnings: modelResponse.warnings\n };\n }\n })\n );\n logWarnings({\n warnings: warnings != null ? warnings : [],\n provider: model.provider,\n model: model.modelId\n });\n return new DefaultRerankResult({\n originalDocuments: documents,\n ranking: ranking.map((ranking2) => ({\n originalIndex: ranking2.index,\n score: ranking2.relevanceScore,\n document: documents[ranking2.index]\n })),\n providerMetadata,\n response: {\n id: response == null ? void 0 : response.id,\n timestamp: (_a21 = response == null ? void 0 : response.timestamp) != null ? _a21 : /* @__PURE__ */ new Date(),\n modelId: (_b = response == null ? void 0 : response.modelId) != null ? _b : model.modelId,\n headers: response == null ? void 0 : response.headers,\n body: response == null ? void 0 : response.body\n }\n });\n }\n });\n}\nvar DefaultRerankResult = class {\n constructor(options) {\n this.originalDocuments = options.originalDocuments;\n this.ranking = options.ranking;\n this.response = options.response;\n this.providerMetadata = options.providerMetadata;\n }\n get rerankedDocuments() {\n return this.ranking.map((ranking) => ranking.document);\n }\n};\n\n// src/transcribe/transcribe.ts\nimport {\n withUserAgentSuffix as withUserAgentSuffix9\n} from \"@ai-sdk/provider-utils\";\nvar defaultDownload2 = createDownload();\nasync function transcribe({\n model,\n audio,\n providerOptions = {},\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n download: downloadFn = defaultDownload2\n}) {\n const resolvedModel = resolveTranscriptionModel(model);\n if (!resolvedModel) {\n throw new Error(\"Model could not be resolved\");\n }\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const headersWithUserAgent = withUserAgentSuffix9(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const audioData = audio instanceof URL ? (await downloadFn({ url: audio, abortSignal })).data : convertDataContentToUint8Array(audio);\n const result = await retry(\n () => {\n var _a21;\n return resolvedModel.doGenerate({\n audio: audioData,\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions,\n mediaType: (_a21 = detectMediaType({\n data: audioData,\n signatures: audioMediaTypeSignatures\n })) != null ? _a21 : \"audio/wav\"\n });\n }\n );\n logWarnings({\n warnings: result.warnings,\n provider: resolvedModel.provider,\n model: resolvedModel.modelId\n });\n if (!result.text) {\n throw new NoTranscriptGeneratedError({ responses: [result.response] });\n }\n return new DefaultTranscriptionResult({\n text: result.text,\n segments: result.segments,\n language: result.language,\n durationInSeconds: result.durationInSeconds,\n warnings: result.warnings,\n responses: [result.response],\n providerMetadata: result.providerMetadata\n });\n}\nvar DefaultTranscriptionResult = class {\n constructor(options) {\n var _a21;\n this.text = options.text;\n this.segments = options.segments;\n this.language = options.language;\n this.durationInSeconds = options.durationInSeconds;\n this.warnings = options.warnings;\n this.responses = options.responses;\n this.providerMetadata = (_a21 = options.providerMetadata) != null ? _a21 : {};\n }\n};\n\n// src/ui/call-completion-api.ts\nimport {\n parseJsonEventStream,\n withUserAgentSuffix as withUserAgentSuffix10,\n getRuntimeEnvironmentUserAgent as getRuntimeEnvironmentUserAgent2\n} from \"@ai-sdk/provider-utils\";\n\n// src/ui/process-text-stream.ts\nasync function processTextStream({\n stream,\n onTextPart\n}) {\n const reader = stream.pipeThrough(new TextDecoderStream()).getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n await onTextPart(value);\n }\n}\n\n// src/ui/call-completion-api.ts\nvar getOriginalFetch = () => fetch;\nasync function callCompletionApi({\n api,\n prompt,\n credentials,\n headers,\n body,\n streamProtocol = \"data\",\n setCompletion,\n setLoading,\n setError,\n setAbortController,\n onFinish,\n onError,\n fetch: fetch2 = getOriginalFetch()\n}) {\n var _a21;\n try {\n setLoading(true);\n setError(void 0);\n const abortController = new AbortController();\n setAbortController(abortController);\n setCompletion(\"\");\n const response = await fetch2(api, {\n method: \"POST\",\n body: JSON.stringify({\n prompt,\n ...body\n }),\n credentials,\n headers: withUserAgentSuffix10(\n {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n `ai-sdk/${VERSION}`,\n getRuntimeEnvironmentUserAgent2()\n ),\n signal: abortController.signal\n }).catch((err) => {\n throw err;\n });\n if (!response.ok) {\n throw new Error(\n (_a21 = await response.text()) != null ? _a21 : \"Failed to fetch the chat response.\"\n );\n }\n if (!response.body) {\n throw new Error(\"The response body is empty.\");\n }\n let result = \"\";\n switch (streamProtocol) {\n case \"text\": {\n await processTextStream({\n stream: response.body,\n onTextPart: (chunk) => {\n result += chunk;\n setCompletion(result);\n }\n });\n break;\n }\n case \"data\": {\n await consumeStream({\n stream: parseJsonEventStream({\n stream: response.body,\n schema: uiMessageChunkSchema\n }).pipeThrough(\n new TransformStream({\n async transform(part) {\n if (!part.success) {\n throw part.error;\n }\n const streamPart = part.value;\n if (streamPart.type === \"text-delta\") {\n result += streamPart.delta;\n setCompletion(result);\n } else if (streamPart.type === \"error\") {\n throw new Error(streamPart.errorText);\n }\n }\n })\n ),\n onError: (error) => {\n throw error;\n }\n });\n break;\n }\n default: {\n const exhaustiveCheck = streamProtocol;\n throw new Error(`Unknown stream protocol: ${exhaustiveCheck}`);\n }\n }\n if (onFinish) {\n onFinish(prompt, result);\n }\n setAbortController(null);\n return result;\n } catch (err) {\n if (err.name === \"AbortError\") {\n setAbortController(null);\n return null;\n }\n if (err instanceof Error) {\n if (onError) {\n onError(err);\n }\n }\n setError(err);\n } finally {\n setLoading(false);\n }\n}\n\n// src/ui/chat.ts\nimport {\n generateId as generateIdFunc2\n} from \"@ai-sdk/provider-utils\";\n\n// src/ui/convert-file-list-to-file-ui-parts.ts\nasync function convertFileListToFileUIParts(files) {\n if (files == null) {\n return [];\n }\n if (!globalThis.FileList || !(files instanceof globalThis.FileList)) {\n throw new Error(\"FileList is not supported in the current environment\");\n }\n return Promise.all(\n Array.from(files).map(async (file) => {\n const { name: name21, type } = file;\n const dataUrl = await new Promise((resolve3, reject) => {\n const reader = new FileReader();\n reader.onload = (readerEvent) => {\n var _a21;\n resolve3((_a21 = readerEvent.target) == null ? void 0 : _a21.result);\n };\n reader.onerror = (error) => reject(error);\n reader.readAsDataURL(file);\n });\n return {\n type: \"file\",\n mediaType: type,\n filename: name21,\n url: dataUrl\n };\n })\n );\n}\n\n// src/ui/default-chat-transport.ts\nimport { parseJsonEventStream as parseJsonEventStream2 } from \"@ai-sdk/provider-utils\";\n\n// src/ui/http-chat-transport.ts\nimport {\n normalizeHeaders,\n resolve as resolve2\n} from \"@ai-sdk/provider-utils\";\nvar HttpChatTransport = class {\n constructor({\n api = \"/api/chat\",\n credentials,\n headers,\n body,\n fetch: fetch2,\n prepareSendMessagesRequest,\n prepareReconnectToStreamRequest\n }) {\n this.api = api;\n this.credentials = credentials;\n this.headers = headers;\n this.body = body;\n this.fetch = fetch2;\n this.prepareSendMessagesRequest = prepareSendMessagesRequest;\n this.prepareReconnectToStreamRequest = prepareReconnectToStreamRequest;\n }\n async sendMessages({\n abortSignal,\n ...options\n }) {\n var _a21, _b, _c, _d, _e;\n const resolvedBody = await resolve2(this.body);\n const resolvedHeaders = await resolve2(this.headers);\n const resolvedCredentials = await resolve2(this.credentials);\n const baseHeaders = {\n ...normalizeHeaders(resolvedHeaders),\n ...normalizeHeaders(options.headers)\n };\n const preparedRequest = await ((_a21 = this.prepareSendMessagesRequest) == null ? void 0 : _a21.call(this, {\n api: this.api,\n id: options.chatId,\n messages: options.messages,\n body: { ...resolvedBody, ...options.body },\n headers: baseHeaders,\n credentials: resolvedCredentials,\n requestMetadata: options.metadata,\n trigger: options.trigger,\n messageId: options.messageId\n }));\n const api = (_b = preparedRequest == null ? void 0 : preparedRequest.api) != null ? _b : this.api;\n const headers = (preparedRequest == null ? void 0 : preparedRequest.headers) !== void 0 ? normalizeHeaders(preparedRequest.headers) : baseHeaders;\n const body = (preparedRequest == null ? void 0 : preparedRequest.body) !== void 0 ? preparedRequest.body : {\n ...resolvedBody,\n ...options.body,\n id: options.chatId,\n messages: options.messages,\n trigger: options.trigger,\n messageId: options.messageId\n };\n const credentials = (_c = preparedRequest == null ? void 0 : preparedRequest.credentials) != null ? _c : resolvedCredentials;\n const fetch2 = (_d = this.fetch) != null ? _d : globalThis.fetch;\n const response = await fetch2(api, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n body: JSON.stringify(body),\n credentials,\n signal: abortSignal\n });\n if (!response.ok) {\n throw new Error(\n (_e = await response.text()) != null ? _e : \"Failed to fetch the chat response.\"\n );\n }\n if (!response.body) {\n throw new Error(\"The response body is empty.\");\n }\n return this.processResponseStream(response.body);\n }\n async reconnectToStream(options) {\n var _a21, _b, _c, _d, _e;\n const resolvedBody = await resolve2(this.body);\n const resolvedHeaders = await resolve2(this.headers);\n const resolvedCredentials = await resolve2(this.credentials);\n const baseHeaders = {\n ...normalizeHeaders(resolvedHeaders),\n ...normalizeHeaders(options.headers)\n };\n const preparedRequest = await ((_a21 = this.prepareReconnectToStreamRequest) == null ? void 0 : _a21.call(this, {\n api: this.api,\n id: options.chatId,\n body: { ...resolvedBody, ...options.body },\n headers: baseHeaders,\n credentials: resolvedCredentials,\n requestMetadata: options.metadata\n }));\n const api = (_b = preparedRequest == null ? void 0 : preparedRequest.api) != null ? _b : `${this.api}/${options.chatId}/stream`;\n const headers = (preparedRequest == null ? void 0 : preparedRequest.headers) !== void 0 ? normalizeHeaders(preparedRequest.headers) : baseHeaders;\n const credentials = (_c = preparedRequest == null ? void 0 : preparedRequest.credentials) != null ? _c : resolvedCredentials;\n const fetch2 = (_d = this.fetch) != null ? _d : globalThis.fetch;\n const response = await fetch2(api, {\n method: \"GET\",\n headers,\n credentials\n });\n if (response.status === 204) {\n return null;\n }\n if (!response.ok) {\n throw new Error(\n (_e = await response.text()) != null ? _e : \"Failed to fetch the chat response.\"\n );\n }\n if (!response.body) {\n throw new Error(\"The response body is empty.\");\n }\n return this.processResponseStream(response.body);\n }\n};\n\n// src/ui/default-chat-transport.ts\nvar DefaultChatTransport = class extends HttpChatTransport {\n constructor(options = {}) {\n super(options);\n }\n processResponseStream(stream) {\n return parseJsonEventStream2({\n stream,\n schema: uiMessageChunkSchema\n }).pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n if (!chunk.success) {\n throw chunk.error;\n }\n controller.enqueue(chunk.value);\n }\n })\n );\n }\n};\n\n// src/ui/chat.ts\nvar AbstractChat = class {\n constructor({\n generateId: generateId2 = generateIdFunc2,\n id = generateId2(),\n transport = new DefaultChatTransport(),\n messageMetadataSchema,\n dataPartSchemas,\n state,\n onError,\n onToolCall,\n onFinish,\n onData,\n sendAutomaticallyWhen\n }) {\n this.activeResponse = void 0;\n this.jobExecutor = new SerialJobExecutor();\n /**\n * Appends or replaces a user message to the chat list. This triggers the API call to fetch\n * the assistant's response.\n *\n * If a messageId is provided, the message will be replaced.\n */\n this.sendMessage = async (message, options) => {\n var _a21, _b, _c, _d;\n if (message == null) {\n await this.makeRequest({\n trigger: \"submit-message\",\n messageId: (_a21 = this.lastMessage) == null ? void 0 : _a21.id,\n ...options\n });\n return;\n }\n let uiMessage;\n if (\"text\" in message || \"files\" in message) {\n const fileParts = Array.isArray(message.files) ? message.files : await convertFileListToFileUIParts(message.files);\n uiMessage = {\n parts: [\n ...fileParts,\n ...\"text\" in message && message.text != null ? [{ type: \"text\", text: message.text }] : []\n ]\n };\n } else {\n uiMessage = message;\n }\n if (message.messageId != null) {\n const messageIndex = this.state.messages.findIndex(\n (m) => m.id === message.messageId\n );\n if (messageIndex === -1) {\n throw new Error(`message with id ${message.messageId} not found`);\n }\n if (this.state.messages[messageIndex].role !== \"user\") {\n throw new Error(\n `message with id ${message.messageId} is not a user message`\n );\n }\n this.state.messages = this.state.messages.slice(0, messageIndex + 1);\n this.state.replaceMessage(messageIndex, {\n ...uiMessage,\n id: message.messageId,\n role: (_b = uiMessage.role) != null ? _b : \"user\",\n metadata: message.metadata\n });\n } else {\n this.state.pushMessage({\n ...uiMessage,\n id: (_c = uiMessage.id) != null ? _c : this.generateId(),\n role: (_d = uiMessage.role) != null ? _d : \"user\",\n metadata: message.metadata\n });\n }\n await this.makeRequest({\n trigger: \"submit-message\",\n messageId: message.messageId,\n ...options\n });\n };\n /**\n * Regenerate the assistant message with the provided message id.\n * If no message id is provided, the last assistant message will be regenerated.\n */\n this.regenerate = async ({\n messageId,\n ...options\n } = {}) => {\n const messageIndex = messageId == null ? this.state.messages.length - 1 : this.state.messages.findIndex((message) => message.id === messageId);\n if (messageIndex === -1) {\n throw new Error(`message ${messageId} not found`);\n }\n this.state.messages = this.state.messages.slice(\n 0,\n // if the message is a user message, we need to include it in the request:\n this.messages[messageIndex].role === \"assistant\" ? messageIndex : messageIndex + 1\n );\n await this.makeRequest({\n trigger: \"regenerate-message\",\n messageId,\n ...options\n });\n };\n /**\n * Attempt to resume an ongoing streaming response.\n */\n this.resumeStream = async (options = {}) => {\n await this.makeRequest({ trigger: \"resume-stream\", ...options });\n };\n /**\n * Clear the error state and set the status to ready if the chat is in an error state.\n */\n this.clearError = () => {\n if (this.status === \"error\") {\n this.state.error = void 0;\n this.setStatus({ status: \"ready\" });\n }\n };\n this.addToolApprovalResponse = async ({\n id,\n approved,\n reason,\n options\n }) => this.jobExecutor.run(async () => {\n const messages = this.state.messages;\n const lastMessage = messages[messages.length - 1];\n const updatePart = (part) => isToolUIPart(part) && part.state === \"approval-requested\" && part.approval.id === id ? {\n ...part,\n state: \"approval-responded\",\n approval: { id, approved, reason }\n } : part;\n this.state.replaceMessage(messages.length - 1, {\n ...lastMessage,\n parts: lastMessage.parts.map(updatePart)\n });\n if (this.activeResponse) {\n this.activeResponse.state.message.parts = this.activeResponse.state.message.parts.map(updatePart);\n }\n if (this.status !== \"streaming\" && this.status !== \"submitted\" && this.sendAutomaticallyWhen) {\n this.shouldSendAutomatically().then((shouldSend) => {\n var _a21;\n if (shouldSend) {\n this.makeRequest({\n trigger: \"submit-message\",\n messageId: (_a21 = this.lastMessage) == null ? void 0 : _a21.id,\n ...options\n });\n }\n });\n }\n });\n this.addToolOutput = async ({\n state = \"output-available\",\n toolCallId,\n output,\n errorText,\n options\n }) => this.jobExecutor.run(async () => {\n const messages = this.state.messages;\n const lastMessage = messages[messages.length - 1];\n const updatePart = (part) => isToolUIPart(part) && part.toolCallId === toolCallId ? { ...part, state, output, errorText } : part;\n this.state.replaceMessage(messages.length - 1, {\n ...lastMessage,\n parts: lastMessage.parts.map(updatePart)\n });\n if (this.activeResponse) {\n this.activeResponse.state.message.parts = this.activeResponse.state.message.parts.map(updatePart);\n }\n if (this.status !== \"streaming\" && this.status !== \"submitted\" && this.sendAutomaticallyWhen) {\n this.shouldSendAutomatically().then((shouldSend) => {\n var _a21;\n if (shouldSend) {\n this.makeRequest({\n trigger: \"submit-message\",\n messageId: (_a21 = this.lastMessage) == null ? void 0 : _a21.id,\n ...options\n });\n }\n });\n }\n });\n /** @deprecated Use addToolOutput */\n this.addToolResult = this.addToolOutput;\n /**\n * Abort the current request immediately, keep the generated tokens if any.\n */\n this.stop = async () => {\n var _a21;\n if (this.status !== \"streaming\" && this.status !== \"submitted\")\n return;\n if ((_a21 = this.activeResponse) == null ? void 0 : _a21.abortController) {\n this.activeResponse.abortController.abort();\n }\n };\n this.id = id;\n this.transport = transport;\n this.generateId = generateId2;\n this.messageMetadataSchema = messageMetadataSchema;\n this.dataPartSchemas = dataPartSchemas;\n this.state = state;\n this.onError = onError;\n this.onToolCall = onToolCall;\n this.onFinish = onFinish;\n this.onData = onData;\n this.sendAutomaticallyWhen = sendAutomaticallyWhen;\n }\n /**\n * Hook status:\n *\n * - `submitted`: The message has been sent to the API and we're awaiting the start of the response stream.\n * - `streaming`: The response is actively streaming in from the API, receiving chunks of data.\n * - `ready`: The full response has been received and processed; a new user message can be submitted.\n * - `error`: An error occurred during the API request, preventing successful completion.\n */\n get status() {\n return this.state.status;\n }\n setStatus({\n status,\n error\n }) {\n if (this.status === status)\n return;\n this.state.status = status;\n this.state.error = error;\n }\n get error() {\n return this.state.error;\n }\n get messages() {\n return this.state.messages;\n }\n get lastMessage() {\n return this.state.messages[this.state.messages.length - 1];\n }\n set messages(messages) {\n this.state.messages = messages;\n }\n async shouldSendAutomatically() {\n if (!this.sendAutomaticallyWhen)\n return false;\n const result = this.sendAutomaticallyWhen({\n messages: this.state.messages\n });\n if (result && typeof result === \"object\" && \"then\" in result) {\n return await result;\n }\n return result;\n }\n async makeRequest({\n trigger,\n metadata,\n headers,\n body,\n messageId\n }) {\n var _a21, _b, _c;\n let resumeStream;\n if (trigger === \"resume-stream\") {\n try {\n const reconnect = await this.transport.reconnectToStream({\n chatId: this.id,\n metadata,\n headers,\n body\n });\n if (reconnect == null) {\n return;\n }\n resumeStream = reconnect;\n } catch (err) {\n if (this.onError && err instanceof Error) {\n this.onError(err);\n }\n this.setStatus({ status: \"error\", error: err });\n return;\n }\n }\n this.setStatus({ status: \"submitted\", error: void 0 });\n const lastMessage = this.lastMessage;\n let isAbort = false;\n let isDisconnect = false;\n let isError = false;\n try {\n const activeResponse = {\n state: createStreamingUIMessageState({\n lastMessage: this.state.snapshot(lastMessage),\n messageId: this.generateId()\n }),\n abortController: new AbortController()\n };\n activeResponse.abortController.signal.addEventListener(\"abort\", () => {\n isAbort = true;\n });\n this.activeResponse = activeResponse;\n let stream;\n if (trigger === \"resume-stream\") {\n stream = resumeStream;\n } else {\n stream = await this.transport.sendMessages({\n chatId: this.id,\n messages: this.state.messages,\n abortSignal: activeResponse.abortController.signal,\n metadata,\n headers,\n body,\n trigger,\n messageId\n });\n }\n const runUpdateMessageJob = (job) => (\n // serialize the job execution to avoid race conditions:\n this.jobExecutor.run(\n () => job({\n state: activeResponse.state,\n write: () => {\n var _a22;\n this.setStatus({ status: \"streaming\" });\n const replaceLastMessage = activeResponse.state.message.id === ((_a22 = this.lastMessage) == null ? void 0 : _a22.id);\n if (replaceLastMessage) {\n this.state.replaceMessage(\n this.state.messages.length - 1,\n activeResponse.state.message\n );\n } else {\n this.state.pushMessage(activeResponse.state.message);\n }\n }\n })\n )\n );\n await consumeStream({\n stream: processUIMessageStream({\n stream,\n onToolCall: this.onToolCall,\n onData: this.onData,\n messageMetadataSchema: this.messageMetadataSchema,\n dataPartSchemas: this.dataPartSchemas,\n runUpdateMessageJob,\n onError: (error) => {\n throw error;\n }\n }),\n onError: (error) => {\n throw error;\n }\n });\n this.setStatus({ status: \"ready\" });\n } catch (err) {\n if (isAbort || err.name === \"AbortError\") {\n isAbort = true;\n this.setStatus({ status: \"ready\" });\n return null;\n }\n isError = true;\n if (err instanceof TypeError && (err.message.toLowerCase().includes(\"fetch\") || err.message.toLowerCase().includes(\"network\"))) {\n isDisconnect = true;\n }\n if (this.onError && err instanceof Error) {\n this.onError(err);\n }\n this.setStatus({ status: \"error\", error: err });\n } finally {\n try {\n (_b = this.onFinish) == null ? void 0 : _b.call(this, {\n message: this.activeResponse.state.message,\n messages: this.state.messages,\n isAbort,\n isDisconnect,\n isError,\n finishReason: (_a21 = this.activeResponse) == null ? void 0 : _a21.state.finishReason\n });\n } catch (err) {\n console.error(err);\n }\n this.activeResponse = void 0;\n }\n if (!isError && await this.shouldSendAutomatically()) {\n await this.makeRequest({\n trigger: \"submit-message\",\n messageId: (_c = this.lastMessage) == null ? void 0 : _c.id,\n metadata,\n headers,\n body\n });\n }\n }\n};\n\n// src/ui/direct-chat-transport.ts\nvar DirectChatTransport = class {\n constructor({\n agent,\n options,\n ...uiMessageStreamOptions\n }) {\n this.agent = agent;\n this.agentOptions = options;\n this.uiMessageStreamOptions = uiMessageStreamOptions;\n }\n async sendMessages({\n messages,\n abortSignal\n }) {\n const validatedMessages = await validateUIMessages({\n messages,\n tools: this.agent.tools\n });\n const modelMessages = await convertToModelMessages(validatedMessages, {\n tools: this.agent.tools\n });\n const result = await this.agent.stream({\n prompt: modelMessages,\n abortSignal,\n ...this.agentOptions !== void 0 ? { options: this.agentOptions } : {}\n });\n return result.toUIMessageStream(this.uiMessageStreamOptions);\n }\n /**\n * Direct transport does not support reconnection since there is no\n * persistent server-side stream to reconnect to.\n *\n * @returns Always returns `null`\n */\n async reconnectToStream(_options) {\n return null;\n }\n};\n\n// src/ui/last-assistant-message-is-complete-with-approval-responses.ts\nfunction lastAssistantMessageIsCompleteWithApprovalResponses({\n messages\n}) {\n const message = messages[messages.length - 1];\n if (!message) {\n return false;\n }\n if (message.role !== \"assistant\") {\n return false;\n }\n const lastStepStartIndex = message.parts.reduce((lastIndex, part, index) => {\n return part.type === \"step-start\" ? index : lastIndex;\n }, -1);\n const lastStepToolInvocations = message.parts.slice(lastStepStartIndex + 1).filter(isToolUIPart);\n return (\n // has at least one tool approval response\n lastStepToolInvocations.filter((part) => part.state === \"approval-responded\").length > 0 && // all tool approvals must have a response\n lastStepToolInvocations.every(\n (part) => part.state === \"output-available\" || part.state === \"output-error\" || part.state === \"approval-responded\"\n )\n );\n}\n\n// src/ui/last-assistant-message-is-complete-with-tool-calls.ts\nfunction lastAssistantMessageIsCompleteWithToolCalls({\n messages\n}) {\n const message = messages[messages.length - 1];\n if (!message) {\n return false;\n }\n if (message.role !== \"assistant\") {\n return false;\n }\n const lastStepStartIndex = message.parts.reduce((lastIndex, part, index) => {\n return part.type === \"step-start\" ? index : lastIndex;\n }, -1);\n const lastStepToolInvocations = message.parts.slice(lastStepStartIndex + 1).filter(isToolUIPart).filter((part) => !part.providerExecuted);\n return lastStepToolInvocations.length > 0 && lastStepToolInvocations.every(\n (part) => part.state === \"output-available\" || part.state === \"output-error\"\n );\n}\n\n// src/ui/transform-text-to-ui-message-stream.ts\nfunction transformTextToUiMessageStream({\n stream\n}) {\n return stream.pipeThrough(\n new TransformStream({\n start(controller) {\n controller.enqueue({ type: \"start\" });\n controller.enqueue({ type: \"start-step\" });\n controller.enqueue({ type: \"text-start\", id: \"text-1\" });\n },\n async transform(part, controller) {\n controller.enqueue({ type: \"text-delta\", id: \"text-1\", delta: part });\n },\n async flush(controller) {\n controller.enqueue({ type: \"text-end\", id: \"text-1\" });\n controller.enqueue({ type: \"finish-step\" });\n controller.enqueue({ type: \"finish\" });\n }\n })\n );\n}\n\n// src/ui/text-stream-chat-transport.ts\nvar TextStreamChatTransport = class extends HttpChatTransport {\n constructor(options = {}) {\n super(options);\n }\n processResponseStream(stream) {\n return transformTextToUiMessageStream({\n stream: stream.pipeThrough(new TextDecoderStream())\n });\n }\n};\nexport {\n AISDKError21 as AISDKError,\n APICallError,\n AbstractChat,\n DefaultChatTransport,\n DefaultGeneratedFile,\n DirectChatTransport,\n DownloadError,\n EmptyResponseBodyError,\n ToolLoopAgent as Experimental_Agent,\n HttpChatTransport,\n InvalidArgumentError,\n InvalidDataContentError,\n InvalidMessageRoleError,\n InvalidPromptError,\n InvalidResponseDataError,\n InvalidStreamPartError,\n InvalidToolApprovalError,\n InvalidToolInputError,\n JSONParseError,\n JsonToSseTransformStream,\n LoadAPIKeyError,\n LoadSettingError,\n MessageConversionError,\n MissingToolResultsError,\n NoContentGeneratedError,\n NoImageGeneratedError,\n NoObjectGeneratedError,\n NoOutputGeneratedError,\n NoSpeechGeneratedError,\n NoSuchModelError,\n NoSuchProviderError,\n NoSuchToolError,\n NoTranscriptGeneratedError,\n NoVideoGeneratedError,\n output_exports as Output,\n RetryError,\n SerialJobExecutor,\n TextStreamChatTransport,\n TooManyEmbeddingValuesForCallError,\n ToolCallNotFoundForApprovalError,\n ToolCallRepairError,\n ToolLoopAgent,\n TypeValidationError,\n UIMessageStreamError,\n UI_MESSAGE_STREAM_HEADERS,\n UnsupportedFunctionalityError,\n UnsupportedModelVersionError,\n addToolInputExamplesMiddleware,\n asSchema5 as asSchema,\n assistantModelMessageSchema,\n bindTelemetryIntegration,\n callCompletionApi,\n consumeStream,\n convertFileListToFileUIParts,\n convertToModelMessages,\n cosineSimilarity,\n createAgentUIStream,\n createAgentUIStreamResponse,\n createDownload,\n createGateway,\n createIdGenerator5 as createIdGenerator,\n createProviderRegistry,\n createTextStreamResponse,\n createUIMessageStream,\n createUIMessageStreamResponse,\n customProvider,\n defaultEmbeddingSettingsMiddleware,\n defaultSettingsMiddleware,\n dynamicTool,\n embed,\n embedMany,\n experimental_createProviderRegistry,\n experimental_customProvider,\n experimental_generateImage,\n generateSpeech as experimental_generateSpeech,\n experimental_generateVideo,\n transcribe as experimental_transcribe,\n extractJsonMiddleware,\n extractReasoningMiddleware,\n gateway2 as gateway,\n generateId,\n generateImage,\n generateObject,\n generateText,\n getStaticToolName,\n getTextFromDataUrl,\n getToolName,\n getToolOrDynamicToolName,\n hasToolCall,\n isDataUIPart,\n isDeepEqualData,\n isFileUIPart,\n isLoopFinished,\n isReasoningUIPart,\n isStaticToolUIPart,\n isTextUIPart,\n isToolOrDynamicToolUIPart,\n isToolUIPart,\n jsonSchema,\n lastAssistantMessageIsCompleteWithApprovalResponses,\n lastAssistantMessageIsCompleteWithToolCalls,\n modelMessageSchema,\n parseJsonEventStream3 as parseJsonEventStream,\n parsePartialJson,\n pipeAgentUIStreamToResponse,\n pipeTextStreamToResponse,\n pipeUIMessageStreamToResponse,\n pruneMessages,\n readUIMessageStream,\n registerTelemetryIntegration,\n rerank,\n safeValidateUIMessages,\n simulateReadableStream,\n simulateStreamingMiddleware,\n smoothStream,\n stepCountIs,\n streamObject,\n streamText,\n systemModelMessageSchema,\n tool,\n toolModelMessageSchema,\n uiMessageChunkSchema,\n userModelMessageSchema,\n validateUIMessages,\n wrapEmbeddingModel,\n wrapImageModel,\n wrapLanguageModel,\n wrapProvider,\n zodSchema3 as zodSchema\n};\n//# sourceMappingURL=index.mjs.map","import { joinPath } from '@/lib/string/paths/joinPath';\nimport { DefaultChatTransport } from 'ai';\n\nexport function getChatTransport(orgId: string) {\n\treturn new DefaultChatTransport({\n\t\tapi: joinPath(import.meta.env.VITE_CENTRAL_MANAGER_API_URL || '/', 'Chat/Messages/'),\n\t\tcredentials: 'include',\n\t\tbody: { orgId },\n\t});\n}\n","function throttle(function_, wait) {\n\tif (typeof function_ !== 'function') {\n\t\tthrow new TypeError(`Expected the first argument to be a \\`function\\`, got \\`${typeof function_}\\`.`);\n\t}\n\n\t// TODO: Add `wait` validation too in the next major version.\n\n\tlet timeoutId;\n\tlet lastCallTime = 0;\n\n\treturn function throttled(...arguments_) { // eslint-disable-line func-names\n\t\tclearTimeout(timeoutId);\n\n\t\tconst now = Date.now();\n\t\tconst timeSinceLastCall = now - lastCallTime;\n\t\tconst delayForNextCall = wait - timeSinceLastCall;\n\n\t\tif (delayForNextCall <= 0) {\n\t\t\tlastCallTime = now;\n\t\t\tfunction_.apply(this, arguments_);\n\t\t} else {\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tlastCallTime = Date.now();\n\t\t\t\tfunction_.apply(this, arguments_);\n\t\t\t}, delayForNextCall);\n\t\t}\n\t};\n}\n\nmodule.exports = throttle;\n","var __accessCheck = (obj, member, msg) => {\n if (!member.has(obj))\n throw TypeError(\"Cannot \" + msg);\n};\nvar __privateGet = (obj, member, getter) => {\n __accessCheck(obj, member, \"read from private field\");\n return getter ? getter.call(obj) : member.get(obj);\n};\nvar __privateAdd = (obj, member, value) => {\n if (member.has(obj))\n throw TypeError(\"Cannot add the same private member more than once\");\n member instanceof WeakSet ? member.add(obj) : member.set(obj, value);\n};\nvar __privateSet = (obj, member, value, setter) => {\n __accessCheck(obj, member, \"write to private field\");\n setter ? setter.call(obj, value) : member.set(obj, value);\n return value;\n};\n\n// src/use-chat.ts\nimport { useCallback, useEffect, useRef, useSyncExternalStore } from \"react\";\n\n// src/chat.react.ts\nimport {\n AbstractChat\n} from \"ai\";\n\n// src/throttle.ts\nimport throttleFunction from \"throttleit\";\nfunction throttle(fn, waitMs) {\n return waitMs != null ? throttleFunction(fn, waitMs) : fn;\n}\n\n// src/chat.react.ts\nvar _messages, _status, _error, _messagesCallbacks, _statusCallbacks, _errorCallbacks, _callMessagesCallbacks, _callStatusCallbacks, _callErrorCallbacks;\nvar ReactChatState = class {\n constructor(initialMessages = []) {\n __privateAdd(this, _messages, void 0);\n __privateAdd(this, _status, \"ready\");\n __privateAdd(this, _error, void 0);\n __privateAdd(this, _messagesCallbacks, /* @__PURE__ */ new Set());\n __privateAdd(this, _statusCallbacks, /* @__PURE__ */ new Set());\n __privateAdd(this, _errorCallbacks, /* @__PURE__ */ new Set());\n this.pushMessage = (message) => {\n __privateSet(this, _messages, __privateGet(this, _messages).concat(message));\n __privateGet(this, _callMessagesCallbacks).call(this);\n };\n this.popMessage = () => {\n __privateSet(this, _messages, __privateGet(this, _messages).slice(0, -1));\n __privateGet(this, _callMessagesCallbacks).call(this);\n };\n this.replaceMessage = (index, message) => {\n __privateSet(this, _messages, [\n ...__privateGet(this, _messages).slice(0, index),\n // We deep clone the message here to ensure the new React Compiler (currently in RC) detects deeply nested parts/metadata changes:\n this.snapshot(message),\n ...__privateGet(this, _messages).slice(index + 1)\n ]);\n __privateGet(this, _callMessagesCallbacks).call(this);\n };\n this.snapshot = (value) => structuredClone(value);\n this[\"~registerMessagesCallback\"] = (onChange, throttleWaitMs) => {\n const callback = throttleWaitMs ? throttle(onChange, throttleWaitMs) : onChange;\n __privateGet(this, _messagesCallbacks).add(callback);\n return () => {\n __privateGet(this, _messagesCallbacks).delete(callback);\n };\n };\n this[\"~registerStatusCallback\"] = (onChange) => {\n __privateGet(this, _statusCallbacks).add(onChange);\n return () => {\n __privateGet(this, _statusCallbacks).delete(onChange);\n };\n };\n this[\"~registerErrorCallback\"] = (onChange) => {\n __privateGet(this, _errorCallbacks).add(onChange);\n return () => {\n __privateGet(this, _errorCallbacks).delete(onChange);\n };\n };\n __privateAdd(this, _callMessagesCallbacks, () => {\n __privateGet(this, _messagesCallbacks).forEach((callback) => callback());\n });\n __privateAdd(this, _callStatusCallbacks, () => {\n __privateGet(this, _statusCallbacks).forEach((callback) => callback());\n });\n __privateAdd(this, _callErrorCallbacks, () => {\n __privateGet(this, _errorCallbacks).forEach((callback) => callback());\n });\n __privateSet(this, _messages, initialMessages);\n }\n get status() {\n return __privateGet(this, _status);\n }\n set status(newStatus) {\n __privateSet(this, _status, newStatus);\n __privateGet(this, _callStatusCallbacks).call(this);\n }\n get error() {\n return __privateGet(this, _error);\n }\n set error(newError) {\n __privateSet(this, _error, newError);\n __privateGet(this, _callErrorCallbacks).call(this);\n }\n get messages() {\n return __privateGet(this, _messages);\n }\n set messages(newMessages) {\n __privateSet(this, _messages, [...newMessages]);\n __privateGet(this, _callMessagesCallbacks).call(this);\n }\n};\n_messages = new WeakMap();\n_status = new WeakMap();\n_error = new WeakMap();\n_messagesCallbacks = new WeakMap();\n_statusCallbacks = new WeakMap();\n_errorCallbacks = new WeakMap();\n_callMessagesCallbacks = new WeakMap();\n_callStatusCallbacks = new WeakMap();\n_callErrorCallbacks = new WeakMap();\nvar _state;\nvar Chat = class extends AbstractChat {\n constructor({ messages, ...init }) {\n const state = new ReactChatState(messages);\n super({ ...init, state });\n __privateAdd(this, _state, void 0);\n this[\"~registerMessagesCallback\"] = (onChange, throttleWaitMs) => __privateGet(this, _state)[\"~registerMessagesCallback\"](onChange, throttleWaitMs);\n this[\"~registerStatusCallback\"] = (onChange) => __privateGet(this, _state)[\"~registerStatusCallback\"](onChange);\n this[\"~registerErrorCallback\"] = (onChange) => __privateGet(this, _state)[\"~registerErrorCallback\"](onChange);\n __privateSet(this, _state, state);\n }\n};\n_state = new WeakMap();\n\n// src/use-chat.ts\nfunction useChat({\n experimental_throttle: throttleWaitMs,\n resume = false,\n ...options\n} = {}) {\n const callbacksRef = useRef(\n !(\"chat\" in options) ? {\n onToolCall: options.onToolCall,\n onData: options.onData,\n onFinish: options.onFinish,\n onError: options.onError,\n sendAutomaticallyWhen: options.sendAutomaticallyWhen\n } : {}\n );\n if (!(\"chat\" in options)) {\n callbacksRef.current = {\n onToolCall: options.onToolCall,\n onData: options.onData,\n onFinish: options.onFinish,\n onError: options.onError,\n sendAutomaticallyWhen: options.sendAutomaticallyWhen\n };\n }\n const optionsWithCallbacks = {\n ...options,\n onToolCall: (arg) => {\n var _a, _b;\n return (_b = (_a = callbacksRef.current).onToolCall) == null ? void 0 : _b.call(_a, arg);\n },\n onData: (arg) => {\n var _a, _b;\n return (_b = (_a = callbacksRef.current).onData) == null ? void 0 : _b.call(_a, arg);\n },\n onFinish: (arg) => {\n var _a, _b;\n return (_b = (_a = callbacksRef.current).onFinish) == null ? void 0 : _b.call(_a, arg);\n },\n onError: (arg) => {\n var _a, _b;\n return (_b = (_a = callbacksRef.current).onError) == null ? void 0 : _b.call(_a, arg);\n },\n sendAutomaticallyWhen: (arg) => {\n var _a, _b, _c;\n return (_c = (_b = (_a = callbacksRef.current).sendAutomaticallyWhen) == null ? void 0 : _b.call(_a, arg)) != null ? _c : false;\n }\n };\n const chatRef = useRef(\n \"chat\" in options ? options.chat : new Chat(optionsWithCallbacks)\n );\n const shouldRecreateChat = \"chat\" in options && options.chat !== chatRef.current || \"id\" in options && chatRef.current.id !== options.id;\n if (shouldRecreateChat) {\n chatRef.current = \"chat\" in options ? options.chat : new Chat(optionsWithCallbacks);\n }\n const subscribeToMessages = useCallback(\n (update) => chatRef.current[\"~registerMessagesCallback\"](update, throttleWaitMs),\n // `chatRef.current.id` is required to trigger re-subscription when the chat ID changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [throttleWaitMs, chatRef.current.id]\n );\n const messages = useSyncExternalStore(\n subscribeToMessages,\n () => chatRef.current.messages,\n () => chatRef.current.messages\n );\n const status = useSyncExternalStore(\n chatRef.current[\"~registerStatusCallback\"],\n () => chatRef.current.status,\n () => chatRef.current.status\n );\n const error = useSyncExternalStore(\n chatRef.current[\"~registerErrorCallback\"],\n () => chatRef.current.error,\n () => chatRef.current.error\n );\n const setMessages = useCallback(\n (messagesParam) => {\n if (typeof messagesParam === \"function\") {\n messagesParam = messagesParam(chatRef.current.messages);\n }\n chatRef.current.messages = messagesParam;\n },\n [chatRef]\n );\n useEffect(() => {\n if (resume) {\n chatRef.current.resumeStream();\n }\n }, [resume, chatRef]);\n return {\n id: chatRef.current.id,\n messages,\n setMessages,\n sendMessage: chatRef.current.sendMessage,\n regenerate: chatRef.current.regenerate,\n clearError: chatRef.current.clearError,\n stop: chatRef.current.stop,\n error,\n resumeStream: chatRef.current.resumeStream,\n status,\n /**\n * @deprecated Use `addToolOutput` instead.\n */\n addToolResult: chatRef.current.addToolOutput,\n addToolOutput: chatRef.current.addToolOutput,\n addToolApprovalResponse: chatRef.current.addToolApprovalResponse\n };\n}\n\n// src/use-completion.ts\nimport {\n callCompletionApi\n} from \"ai\";\nimport { useCallback as useCallback2, useEffect as useEffect2, useId, useRef as useRef2, useState } from \"react\";\nimport useSWR from \"swr\";\nfunction useCompletion({\n api = \"/api/completion\",\n id,\n initialCompletion = \"\",\n initialInput = \"\",\n credentials,\n headers,\n body,\n streamProtocol = \"data\",\n fetch: fetch2,\n onFinish,\n onError,\n experimental_throttle: throttleWaitMs\n} = {}) {\n const hookId = useId();\n const completionId = id || hookId;\n const { data, mutate } = useSWR([api, completionId], null, {\n fallbackData: initialCompletion\n });\n const { data: isLoading = false, mutate: mutateLoading } = useSWR(\n [completionId, \"loading\"],\n null\n );\n const [error, setError] = useState(void 0);\n const completion = data;\n const [abortController, setAbortController] = useState(null);\n const extraMetadataRef = useRef2({\n credentials,\n headers,\n body\n });\n useEffect2(() => {\n extraMetadataRef.current = {\n credentials,\n headers,\n body\n };\n }, [credentials, headers, body]);\n const triggerRequest = useCallback2(\n async (prompt, options) => callCompletionApi({\n api,\n prompt,\n credentials: extraMetadataRef.current.credentials,\n headers: { ...extraMetadataRef.current.headers, ...options == null ? void 0 : options.headers },\n body: {\n ...extraMetadataRef.current.body,\n ...options == null ? void 0 : options.body\n },\n streamProtocol,\n fetch: fetch2,\n // throttle streamed ui updates:\n setCompletion: throttle(\n (completion2) => mutate(completion2, false),\n throttleWaitMs\n ),\n setLoading: mutateLoading,\n setError,\n setAbortController,\n onFinish,\n onError\n }),\n [\n mutate,\n mutateLoading,\n api,\n extraMetadataRef,\n setAbortController,\n onFinish,\n onError,\n setError,\n streamProtocol,\n fetch2,\n throttleWaitMs\n ]\n );\n const stop = useCallback2(() => {\n if (abortController) {\n abortController.abort();\n setAbortController(null);\n }\n }, [abortController]);\n const setCompletion = useCallback2(\n (completion2) => {\n mutate(completion2, false);\n },\n [mutate]\n );\n const complete = useCallback2(\n async (prompt, options) => {\n return triggerRequest(prompt, options);\n },\n [triggerRequest]\n );\n const [input, setInput] = useState(initialInput);\n const handleSubmit = useCallback2(\n (event) => {\n var _a;\n (_a = event == null ? void 0 : event.preventDefault) == null ? void 0 : _a.call(event);\n return input ? complete(input) : void 0;\n },\n [input, complete]\n );\n const handleInputChange = useCallback2(\n (e) => {\n setInput(e.target.value);\n },\n [setInput]\n );\n return {\n completion,\n complete,\n error,\n setCompletion,\n stop,\n input,\n setInput,\n handleInputChange,\n handleSubmit,\n isLoading\n };\n}\n\n// src/use-object.ts\nimport {\n isAbortError,\n resolve,\n normalizeHeaders,\n safeValidateTypes\n} from \"@ai-sdk/provider-utils\";\nimport {\n asSchema,\n isDeepEqualData,\n parsePartialJson\n} from \"ai\";\nimport { useCallback as useCallback3, useId as useId2, useRef as useRef3, useState as useState2 } from \"react\";\nimport useSWR2 from \"swr\";\nvar getOriginalFetch = () => fetch;\nfunction useObject({\n api,\n id,\n schema,\n // required, in the future we will use it for validation\n initialValue,\n fetch: fetch2,\n onError,\n onFinish,\n headers,\n credentials\n}) {\n const hookId = useId2();\n const completionId = id != null ? id : hookId;\n const { data, mutate } = useSWR2(\n [api, completionId],\n null,\n { fallbackData: initialValue }\n );\n const [error, setError] = useState2(void 0);\n const [isLoading, setIsLoading] = useState2(false);\n const abortControllerRef = useRef3(null);\n const stop = useCallback3(() => {\n var _a;\n try {\n (_a = abortControllerRef.current) == null ? void 0 : _a.abort();\n } catch (ignored) {\n } finally {\n setIsLoading(false);\n abortControllerRef.current = null;\n }\n }, []);\n const submit = async (input) => {\n var _a;\n try {\n clearObject();\n setIsLoading(true);\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n const resolvedHeaders = await resolve(headers);\n const actualFetch = fetch2 != null ? fetch2 : getOriginalFetch();\n const response = await actualFetch(api, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...normalizeHeaders(resolvedHeaders)\n },\n credentials,\n signal: abortController.signal,\n body: JSON.stringify(input)\n });\n if (!response.ok) {\n throw new Error(\n (_a = await response.text()) != null ? _a : \"Failed to fetch the response.\"\n );\n }\n if (response.body == null) {\n throw new Error(\"The response body is empty.\");\n }\n let accumulatedText = \"\";\n let latestObject = void 0;\n await response.body.pipeThrough(new TextDecoderStream()).pipeTo(\n new WritableStream({\n async write(chunk) {\n accumulatedText += chunk;\n const { value } = await parsePartialJson(accumulatedText);\n const currentObject = value;\n if (!isDeepEqualData(latestObject, currentObject)) {\n latestObject = currentObject;\n mutate(currentObject);\n }\n },\n async close() {\n setIsLoading(false);\n abortControllerRef.current = null;\n if (onFinish != null) {\n const validationResult = await safeValidateTypes({\n value: latestObject,\n schema: asSchema(schema)\n });\n onFinish(\n validationResult.success ? { object: validationResult.value, error: void 0 } : { object: void 0, error: validationResult.error }\n );\n }\n }\n })\n );\n } catch (error2) {\n if (isAbortError(error2)) {\n return;\n }\n if (onError && error2 instanceof Error) {\n onError(error2);\n }\n setIsLoading(false);\n setError(error2 instanceof Error ? error2 : new Error(String(error2)));\n }\n };\n const clear = () => {\n stop();\n clearObject();\n };\n const clearObject = () => {\n setError(void 0);\n setIsLoading(false);\n mutate(void 0);\n };\n return {\n submit,\n object: data,\n error,\n isLoading,\n stop,\n clear\n };\n}\nvar experimental_useObject = useObject;\nexport {\n Chat,\n experimental_useObject,\n useChat,\n useCompletion\n};\n//# sourceMappingURL=index.mjs.map","import { Send } from 'lucide-react';\nimport { useEffect, useRef } from 'react';\nimport { SubmitEvent } from 'react';\n\ninterface ChatInputProps {\n\tinput: string;\n\tsetInput: (value: string) => void;\n\tonSubmit: (e: SubmitEvent) => void;\n\tdisabled: boolean;\n\tautoFocus?: boolean;\n}\n\nexport function ChatInput({ input, setInput, onSubmit, disabled, autoFocus }: ChatInputProps) {\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\n\tuseEffect(() => {\n\t\tif (autoFocus && !disabled) {\n\t\t\tinputRef.current?.focus();\n\t\t}\n\t}, [autoFocus, disabled]);\n\n\treturn (\n\t\t<form onSubmit={onSubmit} className=\"input-area\">\n\t\t\t<input\n\t\t\t\tref={inputRef}\n\t\t\t\tvalue={input}\n\t\t\t\tonChange={(e) => setInput(e.target.value)}\n\t\t\t\tplaceholder=\"Type a message...\"\n\t\t\t\tdisabled={disabled}\n\t\t\t/>\n\t\t\t<button type=\"submit\" disabled={disabled || !input.trim()}>\n\t\t\t\t<Send size={18} />\n\t\t\t</button>\n\t\t</form>\n\t);\n}\n","import { RefreshCw } from 'lucide-react';\n\nexport function LoadingState() {\n\treturn (\n\t\t<div className=\"loading-state\">\n\t\t\t<RefreshCw className=\"animate-spin\" size={24} />\n\t\t\t<p>Loading conversation...</p>\n\t\t</div>\n\t);\n}\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n feedbackSummary: z\n .string()\n .describe('A brief summary of the feedback, used as the discussion title.'),\n feedbackDetails: z.string().describe('Detailed feedback from the user or agent observation.'),\n recap: z\n .string()\n .describe('A sanitized recap of what the agent and user did together and if it was successful. No sensitive information.'),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'collectFeedback',\n description: 'Collects feedback from the user by fetching a link to a pre-populated GitHub Discussion. Use this if' +\n ' the user lets us know we did something well, or if the user seems frustrated, or wants to report a bug.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { inputSchema } from '@harperfast/agent-tools/tools/collectFeedback/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { feedbackSummary, feedbackDetails, recap } }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\tconst title = feedbackSummary;\n\tconst body = `${feedbackDetails}\\n\\n${recap}`;\n\tconst encodedTitle = encodeURIComponent(title);\n\tconst encodedBody = encodeURIComponent(body);\n\tconst url =\n\t\t`https://github.com/HarperFast/harper-agent/discussions/new?category=usage-feedback&title=${encodedTitle}&body=${encodedBody}`;\n\n\treturn {\n\t\tsuccess: true,\n\t\turl,\n\t\tmessage: 'Feedback URL created! Ask the user to open it in their browser, and they will be brought to a form to'\n\t\t\t+ ' approve the details of the feedback.',\n\t};\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/collectFeedback/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/collectFeedback/serverSchema';\nimport { MessageSquareHeartIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const collectFeedback: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: MessageSquareHeartIcon,\n\texecute,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n name: z.string().trim(),\n // TODO: Bind this up to the `templates` array somehow\n type: z.enum(['vanilla-js', 'vanilla-ts']),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'createApp',\n description: 'Create a new Harper app with the specified name and template type.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { templates } from '@/features/instance/applications/components/NewApplication/templates';\nimport { addComponent } from '@/integrations/api/instance/applications/addComponent';\nimport { restartInstance } from '@/integrations/api/instance/status/restartInstance';\nimport { findBy } from '@/lib/arrays/findBy';\nimport { emitToListeners } from '@/lib/events/listener';\nimport { toKebabCase } from '@/lib/string/to-kebab-case';\nimport { inputSchema } from '@harperfast/agent-tools/tools/createApp/inputSchema';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { name: rawName, type }, instanceClientParams, baseURL }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\tconst name = toKebabCase(rawName);\n\tconst template = findBy(templates, 'id', type);\n\tif (!template) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: Invalid template type, ${type}, please choose from: ${templates.map(t => t.id).join(', ')}`,\n\t\t};\n\t}\n\n\t// TODO: Make sure it doesn't exist already.\n\t// TODO: HITL approval right here? During the tool? IDK.\n\n\tconst toastId = toast.loading(`Creating from template...`, {\n\t\tdescription: 'This may take a bit.',\n\t\tduration: 300_000,\n\t});\n\n\ttry {\n\t\tawait addComponent({\n\t\t\t...instanceClientParams,\n\t\t\tproject: name,\n\t\t\ttemplate: template.npm || template.githubUrl,\n\t\t});\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n\n\temitToListeners('ReloadApplicationRootEntries', true);\n\n\ttoast.loading(`Created successfully!`, {\n\t\tdescription: `${name} created! Restarting the HTTP service...`,\n\t\tid: toastId,\n\t\tduration: 300_000,\n\t});\n\n\ttry {\n\t\tawait restartInstance({\n\t\t\t...instanceClientParams,\n\t\t\toperation: 'restart_service',\n\t\t\treplicated: instanceClientParams.entityType === 'cluster',\n\t\t});\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n\n\ttoast.success(`Created successfully!`, {\n\t\tdescription: `${name} created!`,\n\t\tid: toastId,\n\t\tduration: 5_000,\n\t});\n\n\treturn {\n\t\tsuccess: true,\n\t\tmessage: `App \"${name}\" created successfully.`,\n\t\twebURL: baseURL,\n\t};\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/createApp/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/createApp/serverSchema';\nimport { PlusIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const createApp: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: PlusIcon,\n\texecute,\n\trequiresApproval: true,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n database: z.string().trim(),\n table: z.string().trim(),\n primaryKeys: z.array(z.string()),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'deleteTableRecords',\n description: 'Deletes records in a particular table in a particular database on the server ' +\n 'by their primary keys.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { deleteTableRecords } from '@/integrations/api/instance/database/deleteTableRecords';\nimport { queryClient } from '@/react-query/queryClient';\nimport { inputSchema } from '@harperfast/agent-tools/tools/deleteTableRecords/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { database, table, primaryKeys }, instanceClientParams, params }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst data = await deleteTableRecords({\n\t\t\t...instanceClientParams,\n\t\t\tdatabaseName: database,\n\t\t\ttableName: table,\n\t\t\thashValues: primaryKeys,\n\t\t});\n\t\tconst { databaseName, tableName } = params;\n\t\tawait queryClient.invalidateQueries({ queryKey: [instanceClientParams.entityId, databaseName, tableName] });\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/deleteTableRecords/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/deleteTableRecords/serverSchema';\nimport { BetweenHorizonalStartIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const deleteTableRecords: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: BetweenHorizonalStartIcon,\n\texecute,\n\trequiresApproval: true,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n path: z.string().trim(),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'dropComponentFile',\n description: 'Drops a component file by its full path (which was returned by getComponents)',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { dropComponent } from '@/integrations/api/instance/applications/dropComponent';\nimport { inputSchema } from '@harperfast/agent-tools/tools/dropComponentFile/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { path }, instanceClientParams }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst parts = path.split('/');\n\t\tconst project = parts.shift()!;\n\t\tconst file = parts.join('/');\n\t\tconst data = await dropComponent({ ...instanceClientParams, file, project });\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/dropComponentFile/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/dropComponentFile/serverSchema';\nimport { TrashIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const dropComponentFile: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: TrashIcon,\n\texecute,\n\trequiresApproval: true,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n metricName: z.string().describe('The name of the metric to retrieve.'),\n startTime: z\n .number()\n .describe('The start of the time range for the metric, in milliseconds since the Unix epoch.'),\n endTime: z\n .number()\n .describe('The end of the time range for the metric, in milliseconds since the Unix epoch.'),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'getAnalytics',\n description: 'Retrieves analytics metrics for the server, such as CPU usage or database operations (reads, writes,' +\n ' messages).',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { getRawAnalytics } from '@/integrations/api/instance/status/getAnalytics';\nimport { inputSchema } from '@harperfast/agent-tools/tools/getAnalytics/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input, instanceClientParams }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst { metricName, startTime, endTime } = input;\n\n\t\tconst data = await getRawAnalytics({\n\t\t\tmetric: metricName,\n\t\t\tstartTime,\n\t\t\tendTime,\n\t\t\tinstanceParams: instanceClientParams,\n\t\t});\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error retrieving analytics: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/getAnalytics/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/getAnalytics/serverSchema';\nimport { ChartAreaIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const getAnalytics: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: ChartAreaIcon,\n\texecute,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n path: z.string().trim(),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'getComponentFile',\n description: 'Returns the contents of a component file by its full path (which was returned by getComponents)',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { getComponentFile } from '@/integrations/api/instance/applications/getComponentFile';\nimport { inputSchema } from '@harperfast/agent-tools/tools/getComponentFile/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { path }, instanceClientParams }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst parts = path.split('/');\n\t\tconst project = parts.shift();\n\t\tconst file = parts.join('/');\n\t\tconst data = await getComponentFile({ ...instanceClientParams, file, project });\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/getComponentFile/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/getComponentFile/serverSchema';\nimport { FileIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const getComponentFile: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: FileIcon,\n\texecute,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'getComponents',\n description: 'Retrieves a tree of all the component (files and folders) names and sizes stored on the server.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { buildItems } from '@/features/instance/applications/components/ApplicationsSidebar/buildItems';\nimport {\n\tcalculateRootEntries,\n} from '@/features/instance/applications/components/ApplicationsSidebar/calculateRootEntries';\nimport { getComponents } from '@/integrations/api/instance/applications/getComponents';\nimport { inputSchema } from '@harperfast/agent-tools/tools/getComponents/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ instanceClientParams }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst data = await getComponents(instanceClientParams);\n\t\tconst { rootEntries } = calculateRootEntries(data.entries);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\titems: buildItems(rootEntries).items,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/getComponents/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/getComponents/serverSchema';\nimport { FolderIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const getComponents: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: FolderIcon,\n\texecute,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'getDescribeAll',\n description: 'Retrieves a map of the names of databases and their tables stored on the server.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { getDescribeAll } from '@/integrations/api/instance/database/getDescribeAll';\nimport { inputSchema } from '@harperfast/agent-tools/tools/getDescribeAll/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ instanceClientParams }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst data = await getDescribeAll(instanceClientParams);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tmap: data,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/getDescribeAll/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/getDescribeAll/serverSchema';\nimport { DatabaseIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const getDescribeAll: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: DatabaseIcon,\n\texecute,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n database: z.string().trim(),\n table: z.string().trim(),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'getDescribeTable',\n description: 'Returns the schema metadata describing a particular table in a particular database on the server.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { getDescribeTable } from '@/integrations/api/instance/database/getDescribeTable';\nimport { inputSchema } from '@harperfast/agent-tools/tools/getDescribeTable/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { database, table }, instanceClientParams }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst data = await getDescribeTable({ ...instanceClientParams, databaseName: database, tableName: table });\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/getDescribeTable/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/getDescribeTable/serverSchema';\nimport { TableIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const getDescribeTable: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: TableIcon,\n\texecute,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'getUserContext',\n description: 'Retrieves the context of what the user is looking at on their screen, such as the current page, ' +\n 'the file they are viewing, the database and table visible to them, that sort of thing.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { getSessionStorage } from '@/lib/storage/getSessionStorage';\nimport { currentUrlAfterHash } from '@/lib/urls/currentUrlAfterHash';\nimport { inputSchema } from '@harperfast/agent-tools/tools/getUserContext/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ instanceClientParams, params }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\tconst url = currentUrlAfterHash();\n\n\tif (url.includes('/databases')) {\n\t\tconst { databaseName, tableName } = params;\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdescription: 'viewing the database',\n\t\t\tdata: {\n\t\t\t\tdatabaseName,\n\t\t\t\ttableName,\n\t\t\t},\n\t\t};\n\t}\n\n\tif (url.endsWith('/apis')) {\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdescription: 'viewing the APIs',\n\t\t};\n\t}\n\n\tif (url.endsWith('/status')) {\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdescription: 'viewing the status graphs',\n\t\t};\n\t}\n\n\tif (url.endsWith('/logs')) {\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdescription: 'viewing the logs',\n\t\t};\n\t}\n\n\tif (url.includes('/config/')) {\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdescription: 'viewing the configuration pages',\n\t\t};\n\t}\n\n\tconst focusedItem = getSessionStorage(\n\t\t`FileFocused/${instanceClientParams.entityId}` as 'FileFocused/{entityId}',\n\t\tundefined,\n\t);\n\tconst expandedItems = getSessionStorage(\n\t\t`FolderOpened/${instanceClientParams.entityId}` as 'FolderOpened/{entityId}',\n\t\t[],\n\t);\n\tconst selectedItems = getSessionStorage(\n\t\t`FileSelected/${instanceClientParams.entityId}` as 'FileSelected/{entityId}',\n\t\t[],\n\t);\n\n\tif (focusedItem) {\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdescription: 'editing application files',\n\t\t\tdata: {\n\t\t\t\topenedPath: focusedItem,\n\t\t\t\texpandedItems,\n\t\t\t\tselectedItems,\n\t\t\t},\n\t\t};\n\t}\n\n\treturn {\n\t\tsuccess: true,\n\t\tdescription: url,\n\t};\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/getUserContext/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/getUserContext/serverSchema';\nimport { UserIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const getUserContext: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: UserIcon,\n\texecute,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n database: z.string().trim(),\n table: z.string().trim(),\n records: z.array(z.any()),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'insertTableRecords',\n description: 'Inserts one or more records into a particular table in a particular database on the server.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { insertTableRecords } from '@/integrations/api/instance/database/insertTableRecords';\nimport { queryClient } from '@/react-query/queryClient';\nimport { inputSchema } from '@harperfast/agent-tools/tools/insertTableRecords/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { database, table, records }, instanceClientParams, params }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst data = await insertTableRecords({\n\t\t\t...instanceClientParams,\n\t\t\tdatabaseName: database,\n\t\t\ttableName: table,\n\t\t\trecords,\n\t\t});\n\t\tconst { databaseName, tableName } = params;\n\t\tawait queryClient.invalidateQueries({ queryKey: [instanceClientParams.entityId, databaseName, tableName] });\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/insertTableRecords/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/insertTableRecords/serverSchema';\nimport { BetweenHorizonalStartIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const insertTableRecords: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: BetweenHorizonalStartIcon,\n\texecute,\n\trequiresApproval: true,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n metricTypes: z.enum(['builtin', 'custom']),\n customWindowMS: z\n .number()\n .optional()\n .describe('Default to one week time window for finding custom metrics.'),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'listAnalyticsMetrics',\n description: 'Lists the available analytics metric names available for calling getAnalytics upon.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","export async function listAnalyticsMetrics({\n\tmetricTypes,\n\tcustomWindowMS,\n\tinstanceParams,\n}: any) {\n\tconst { data } = await instanceParams.instanceClient.post('/', {\n\t\toperation: 'list_analytics_metrics',\n\t\tmetricTypes,\n\t\tcustomWindowMS,\n\t});\n\treturn data;\n}\n","import { listAnalyticsMetrics } from '@/integrations/api/instance/status/listAnalyticsMetrics';\nimport { inputSchema } from '@harperfast/agent-tools/tools/listAnalyticsMetrics/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input, instanceClientParams }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst { metricTypes, customWindowMS } = input;\n\n\t\tconst data = await listAnalyticsMetrics({\n\t\t\tmetricTypes,\n\t\t\tcustomWindowMS,\n\t\t\tinstanceParams: instanceClientParams,\n\t\t});\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tmetricNames: data,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error retrieving analytics: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/listAnalyticsMetrics/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/listAnalyticsMetrics/serverSchema';\nimport { ChartAreaIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const listAnalyticsMetrics: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: ChartAreaIcon,\n\texecute,\n};\n","/**\n * An array of all available rule names.\n */\nexport const ruleNames = [\n\t\"adding-tables-with-schemas\",\n\t\"automatic-apis\",\n\t\"caching\",\n\t\"checking-authentication\",\n\t\"creating-a-fabric-account-and-cluster\",\n\t\"creating-harper-apps\",\n\t\"custom-resources\",\n\t\"defining-relationships\",\n\t\"deploying-to-harper-fabric\",\n\t\"extending-tables\",\n\t\"handling-binary-data\",\n\t\"load-env\",\n\t\"logging\",\n\t\"programmatic-table-requests\",\n\t\"querying-rest-apis\",\n\t\"real-time-apps\",\n\t\"schema-design-tooling\",\n\t\"serving-web-content\",\n\t\"typescript-type-stripping\",\n\t\"using-blob-datatype\",\n\t\"vector-indexing\"\n];\n\n/**\n * A map from rule names to their markdown content.\n */\nexport const rules = {\n\t\"adding-tables-with-schemas\": \"---\\nname: adding-tables-with-schemas\\ndescription: Guidelines for adding tables to a Harper database using GraphQL schemas.\\nmetadata:\\n mode: synthesized\\n---\\n\\n# Adding Tables with Schemas\\n\\nInstructions for the agent to follow when adding tables to a Harper database.\\n\\n## When to Use\\n\\nUse this skill when you need to define new data structures or modify existing ones in a Harper database.\\n\\n## How It Works\\n\\n1. **Create Dedicated Schema Files**: Prefer having a dedicated schema `.graphql` file for each table. Check the `config.yaml` file under `graphqlSchema.files` to see how it's configured. It typically accepts wildcards (e.g., `schemas/*.graphql`), but may be configured to point at a single file.\\n2. **Use Directives**: All available directives for defining your schema are defined in `node_modules/harper/schema.graphql`. Common directives include `@table`, `@export`, `@primaryKey`, `@indexed`, and `@relationship`.\\n3. **Define Relationships**: Link tables together using the `@relationship` directive. For more details, see the [Defining Relationships](defining-relationships.md) skill.\\n4. **Enable Automatic APIs**: If you add `@table @export` to a schema type, Harper automatically sets up REST and WebSocket APIs for basic CRUD operations against that table. **Important**: REST endpoints also require `rest: true` in `config.yaml` — without it, `@export`ed tables will not respond to HTTP requests. For a detailed list of available endpoints and how to use them, see the [Automatic REST APIs](automatic-apis.md) skill.\\n - `GET /{TableName}`: Describes the schema itself.\\n - `GET /{TableName}/`: Lists all records (supports filtering, sorting, and pagination via query parameters). See the [Querying REST APIs](querying-rest-apis.md) skill for details.\\n - `GET /{TableName}/{id}`: Retrieves a single record by its ID.\\n - `POST /{TableName}/`: Creates a new record.\\n - `PUT /{TableName}/{id}`: Updates an existing record.\\n - `PATCH /{TableName}/{id}`: Performs a partial update on a record.\\n - `DELETE /{TableName}/`: Deletes all records or filtered records.\\n - `DELETE /{TableName}/{id}`: Deletes a single record by its ID.\\n5. **Consider Table Extensions**: If you are going to [extend the table](./extending-tables.md) in your resources, then do not `@export` the table from the schema.\\n\\n## Examples\\n\\nIn a hypothetical `schemas/ExamplePerson.graphql`:\\n\\n```graphql\\ntype ExamplePerson @table @export {\\n\\tid: ID @primaryKey\\n\\tname: String\\n\\ttag: String @indexed\\n}\\n```\\n\",\n\t\"automatic-apis\": \"---\\nname: automatic-apis\\ndescription: How to use Harper's automatically generated REST and WebSocket APIs.\\nmetadata:\\n mode: generate\\n sources:\\n - reference/v5/rest/overview.md\\n - reference/v5/rest/websockets.md\\n sourceCommit: b7fbddadd42eb4487190b650a9abc4bcfeef5819\\n inputHash: 8fcf0cfe190e013e\\n---\\n\\n# Automatic APIs\\n\\nInstructions for the agent to follow when enabling and using Harper's automatically generated REST and WebSocket APIs.\\n\\n## When to Use\\n\\nApply this rule when adding REST or WebSocket API access to Harper tables or custom resources. Use it when configuring `config.yaml` to expose endpoints, mapping HTTP methods to resource operations, or implementing real-time WebSocket connections on a resource class.\\n\\n## How It Works\\n\\n1. **Enable the REST plugin**: Add `rest: true` to your application's `config.yaml`. This activates the HTTP REST interface and enables WebSocket support by default.\\n\\n ```yaml\\n rest: true\\n ```\\n\\n To configure optional behavior:\\n\\n ```yaml\\n rest:\\n lastModified: true # enables Last-Modified response header support\\n webSocket: false # disables automatic WebSocket support (enabled by default)\\n ```\\n\\n2. **Export your resource in the schema**: Tables are not exposed by default. Use the `@export` directive in your schema definition to make a table available as a REST endpoint. The exported name defines the base URL path, served on the application HTTP server port (default `9926`).\\n\\n3. **Use the correct URL structure**: The REST interface follows a consistent path convention.\\n\\n | Path | Description |\\n | -------------------------------------------- | ---------------------------------------------------------------------------------- |\\n | `/my-resource` | Returns a description of the resource (e.g., table metadata) |\\n | `/my-resource/` | Trailing slash — represents the full collection; append query parameters to search |\\n | `/my-resource/record-id` | A specific record identified by its primary key |\\n | `/my-resource/record-id/` | Trailing slash — collection of records with the given id prefix |\\n | `/my-resource/record-id/with/multiple/parts` | Record id with multiple path segments |\\n\\n4. **Map HTTP methods to operations**: Each HTTP method maps to a resource method and operation.\\n - **GET** — Retrieve a record or search. Calls `get()`.\\n\\n ```\\n GET /MyTable/123\\n GET /MyTable/?name=Harper\\n GET /MyTable/123.propertyName\\n ```\\n\\n Responses include an `ETag` header. Clients may send `If-None-Match` to receive `304 Not Modified` when the record is unchanged.\\n\\n - **PUT** — Create or replace a record (upsert). Calls `put(record)`. Properties not in the body are removed.\\n\\n ```\\n PUT /MyTable/123\\n Content-Type: application/json\\n\\n { \\\"name\\\": \\\"some data\\\" }\\n ```\\n\\n - **POST** — Create a new record without specifying a primary key. Calls `post(data)`. The assigned key is returned in the `Location` response header.\\n\\n ```\\n POST /MyTable/\\n Content-Type: application/json\\n\\n { \\\"name\\\": \\\"some data\\\" }\\n ```\\n\\n - **PATCH** — Partially update a record, merging only provided properties. Unspecified properties are preserved.\\n\\n ```\\n PATCH /MyTable/123\\n Content-Type: application/json\\n\\n { \\\"status\\\": \\\"active\\\" }\\n ```\\n\\n - **DELETE** — Delete a record or all records matching a query.\\n ```\\n DELETE /MyTable/123\\n DELETE /MyTable/?status=archived\\n ```\\n\\n5. **Access the auto-generated OpenAPI spec**: Harper generates an OpenAPI specification for all exported resources. Retrieve it at:\\n\\n ```\\n GET /openapi\\n ```\\n\\n6. **Connect via WebSocket**: When `rest` is enabled, WebSocket support is on by default. Connect to a resource URL to subscribe to change events for that resource.\\n\\n ```javascript\\n let ws = new WebSocket('wss://server/my-resource/341');\\n ws.onmessage = (event) => {\\n \\tlet data = JSON.parse(event.data);\\n };\\n ```\\n\\n Connecting to `wss://server/my-resource/341` accesses the `my-resource` resource with record id `341` and subscribes to it. When the record changes or a message is published to it, the WebSocket connection receives the update.\\n\\n7. **Implement a custom `connect()` handler**: Override `connect(incomingMessages)` on a resource class to control WebSocket behavior. The method must return an async iterable or generator that produces messages to send to the client.\\n\\n## Examples\\n\\n**Simple echo server using an async generator**:\\n\\n```javascript\\nexport class Echo extends Resource {\\n\\tasync *connect(incomingMessages) {\\n\\t\\tfor await (let message of incomingMessages) {\\n\\t\\t\\tyield message; // echo each message back\\n\\t\\t}\\n\\t}\\n}\\n```\\n\\n**Using the default `connect()` with event-style access and a timer**:\\n\\n```javascript\\nexport class Example extends Resource {\\n\\tconnect(incomingMessages) {\\n\\t\\tlet outgoingMessages = super.connect();\\n\\n\\t\\tlet timer = setInterval(() => {\\n\\t\\t\\toutgoingMessages.send({ greeting: 'hi again!' });\\n\\t\\t}, 1000);\\n\\n\\t\\tincomingMessages.on('data', (message) => {\\n\\t\\t\\toutgoingMessages.send(message); // echo incoming messages\\n\\t\\t});\\n\\n\\t\\toutgoingMessages.on('close', () => {\\n\\t\\t\\tclearInterval(timer);\\n\\t\\t});\\n\\n\\t\\treturn outgoingMessages;\\n\\t}\\n}\\n```\\n\\n**Minimal `config.yaml` enabling REST with WebSocket disabled**:\\n\\n```yaml\\nrest:\\n webSocket: false\\n```\\n\\n## Notes\\n\\n- Tables must be explicitly exported using `@export` in the schema — they are not exposed by default.\\n- `rest: true` is the minimal configuration to enable both REST and WebSocket support. See [real-time-apps.md](real-time-apps.md) for patterns around real-time WebSocket usage.\\n- For full query syntax on `GET` and `DELETE` with query parameters, see [querying-rest-apis.md](querying-rest-apis.md).\\n- The default `connect()` returns an iterable with a `send(message)` method and a `close` event for cleanup on disconnect.\\n- For MQTT over WebSockets, set the sub-protocol header `Sec-WebSocket-Protocol: mqtt`.\\n- In distributed environments, non-retained messages are delivered in the order received per node; retained messages (PUT/updated records) keep only the latest-timestamp version as the winning record across the cluster.\\n- Use the `Content-Type` request header to specify body format and the `Accept` header to request a specific response format.\\n\",\n\t\"caching\": \"---\\nname: caching\\ndescription: How to implement integrated data caching in Harper from external sources.\\nmetadata:\\n mode: generate\\n sources:\\n - learn/developers/caching-with-harper.md\\n sourceCommit: b7fbddadd42eb4487190b650a9abc4bcfeef5819\\n inputHash: 8212a7d7dbbd2b18\\n---\\n\\n# Caching External Data Sources in Harper\\n\\nInstructions for the agent to implement integrated data caching in Harper by wrapping external sources with a cache table and `sourcedFrom`.\\n\\n## When to Use\\n\\nApply this rule when a Harper application needs to cache responses from an external API, microservice, or database to avoid repeated slow or expensive upstream calls. Use it whenever you need to define TTL-based cache expiration, observe ETag-based conditional responses, or manually invalidate cached entries.\\n\\n## How It Works\\n\\n1. **Define a cache table with `expiration`**: In `schema.graphql`, add the `expiration` argument to `@table`. The value is in seconds. Any record older than this threshold is considered stale and will be re-fetched on next access.\\n\\n ```graphql\\n type JokeCache @table(expiration: 60) @export {\\n \\tid: ID @primaryKey\\n \\tsetup: String\\n \\tpunchline: String\\n }\\n ```\\n\\n2. **Wrap the external source in `resources.js`**: Create an object with a `get(id)` method that fetches from the upstream source. Then call `sourcedFrom` on the table to register it.\\n\\n ```javascript\\n const jokeAPI = {\\n \\tasync get(id) {\\n \\t\\tconst response = await fetch(`https://official-joke-api.appspot.com/jokes/${id}`);\\n \\t\\treturn response.json();\\n \\t},\\n };\\n\\n tables.JokeCache.sourcedFrom(jokeAPI);\\n ```\\n\\n Harper's caching behavior after `sourcedFrom` is registered:\\n - A request arrives for `/JokeCache/1`.\\n - Harper checks if the record with id `1` exists in `JokeCache` and is not stale.\\n - If fresh, Harper returns it immediately.\\n - If missing or stale, Harper calls `jokeAPI.get()`, stores the result in `JokeCache`, and returns it.\\n - Multiple simultaneous requests for the same missing or stale record wait on a single upstream call — Harper prevents cache stampedes automatically.\\n\\n3. **Configure plugins in `config.yaml`**: Enable the schema, REST API, and JS resource plugins.\\n\\n ```yaml\\n graphqlSchema:\\n files: 'schema.graphql'\\n rest: true\\n jsResource:\\n files: 'resources.js'\\n ```\\n\\n4. **Observe caching via ETags**: Harper automatically computes an ETag from the record's last-modified timestamp. On the first request you receive a `200` with an `etag` header. Pass that value back in `If-None-Match` on subsequent requests; Harper returns `304 Not Modified` with an empty body if the record is unchanged.\\n\\n ```bash\\n curl -i 'http://localhost:9926/JokeCache/1' \\\\\\n -H 'If-None-Match: \\\"abCDefGHij\\\"'\\n ```\\n\\n5. **Force a cache bypass**: Send `Cache-Control: no-cache` to make Harper skip the local cache and always call the upstream source, regardless of TTL.\\n\\n ```bash\\n curl -i 'http://localhost:9926/JokeCache/1' \\\\\\n -H 'Cache-Control: no-cache'\\n ```\\n\\n6. **Invalidate a cache entry on demand**: Remove `@export` from the schema type, then export a class of the same name in `resources.js` that extends the table and implements a `post` handler calling `this.invalidate(target)`.\\n\\n ```graphql\\n type JokeCache @table(expiration: 60) {\\n \\tid: ID @primaryKey\\n \\tsetup: String\\n \\tpunchline: String\\n }\\n ```\\n\\n ```javascript\\n export class JokeCache extends tables.JokeCache {\\n \\tstatic async post(target, data) {\\n \\t\\tconst body = await data;\\n \\t\\tif (body?.action === 'invalidate') {\\n \\t\\t\\tthis.invalidate(target);\\n \\t\\t\\treturn { status: 200, data: { message: 'invalidated' } };\\n \\t\\t}\\n \\t}\\n }\\n ```\\n\\n Trigger invalidation with a `POST`:\\n\\n ```bash\\n curl -X POST 'http://localhost:9926/JokeCache/1' \\\\\\n -H 'Content-Type: application/json' \\\\\\n -d '{\\\"action\\\": \\\"invalidate\\\"}'\\n ```\\n\\n The next `GET /JokeCache/1` will fetch fresh data from the upstream source regardless of TTL.\\n\\n## Examples\\n\\nComplete `schema.graphql` and `resources.js` for a cached external API with on-demand invalidation:\\n\\n```graphql\\ntype JokeCache @table(expiration: 60) {\\n\\tid: ID @primaryKey\\n\\tsetup: String\\n\\tpunchline: String\\n}\\n```\\n\\n```javascript\\n// resources.js\\n\\nconst jokeAPI = {\\n\\tasync get() {\\n\\t\\tconst id = this.getId();\\n\\t\\tconst response = await fetch(`https://official-joke-api.appspot.com/jokes/${id}`);\\n\\t\\treturn response.json();\\n\\t},\\n};\\n\\ntables.JokeCache.sourcedFrom(jokeAPI);\\n\\nexport class JokeCache extends tables.JokeCache {\\n\\tstatic async post(target, data) {\\n\\t\\tconst body = await data;\\n\\t\\tif (body?.action === 'invalidate') {\\n\\t\\t\\tthis.invalidate(target);\\n\\t\\t\\treturn { status: 200, data: { message: 'invalidated' } };\\n\\t\\t}\\n\\t}\\n}\\n```\\n\\nFirst request — cache miss, upstream is called, `200` returned:\\n\\n```bash\\ncurl -i 'http://localhost:9926/JokeCache/1'\\n```\\n\\nSecond request with ETag — cache hit, `304 Not Modified`:\\n\\n```bash\\ncurl -i 'http://localhost:9926/JokeCache/1' \\\\\\n -H 'If-None-Match: \\\"abCDefGHij\\\"'\\n```\\n\\n## Notes\\n\\n- `expiration` is measured in seconds. Harper also supports separate `eviction` and `scanInterval` arguments on `@table` for fine-grained control over physical record removal.\\n- The `@export` directive on the schema type is not required when you export a Resource class of the same name from `resources.js` — the class export serves as the endpoint registration. See [custom-resources.md](custom-resources.md) for details on building Resource classes.\\n- Harper's REST layer automatically exposes `@export`-ed tables and Resource classes as HTTP endpoints. See [automatic-apis.md](automatic-apis.md) for how endpoints are structured and named.\\n- ETag values include their double quotes as part of the value — include them verbatim when passing the value in `If-None-Match`.\\n- `sourcedFrom` must be called after the table reference (`tables.JokeCache`) is available, which is guaranteed when the call is at the top level of `resources.js`.\\n\",\n\t\"checking-authentication\": \"---\\nname: checking-authentication\\ndescription: How to handle user authentication and sessions in Harper Resources.\\nmetadata:\\n mode: generate\\n sources:\\n - >-\\n reference/v5/resources/resource-api.md#`getCurrentUser(): User |\\n undefined`\\n - reference/v5/resources/resource-api.md#Session and Login from a Resource\\n - reference/v5/security/jwt-authentication.md\\n sourceCommit: b7fbddadd42eb4487190b650a9abc4bcfeef5819\\n inputHash: fdd9ec3b11011490\\n---\\n\\n# Checking Authentication\\n\\nInstructions for the agent to follow when handling user authentication and session management inside Harper Resources.\\n\\n## When to Use\\n\\nApply this rule when implementing authentication checks, login/logout flows, or token issuance inside a custom Resource. Use it any time a Resource needs to identify the current user, establish a session, or issue JWTs to clients. See [custom-resources.md](custom-resources.md) for the general Resource authoring pattern.\\n\\n## How It Works\\n\\n1. **Check the current user** with `getCurrentUser()`. Call it inside any Resource method to retrieve the authenticated user or `undefined` if no user is authenticated. Guard protected endpoints by returning a `401` when the result is `undefined`.\\n\\n ```javascript\\n async get(target) {\\n const user = this.getCurrentUser();\\n if (!user) return new Response(null, { status: 401 });\\n return { username: user.username, role: user.role };\\n }\\n ```\\n\\n The returned object exposes `username`, `role`, and `role.permission` flags.\\n\\n2. **Enable sessions** before using session-based login. Set `authentication.enableSessions: true` in `harperdb-config.yaml`:\\n\\n ```yaml\\n authentication:\\n enableSessions: true\\n ```\\n\\n3. **Access login and session helpers** via `getContext()`. The context object exposes `context.login` and `context.session` for sign-in/out flows.\\n - Call `context.login(username, password)` to verify credentials and establish a session cookie on success.\\n - To end a session, delete it via `context.session.delete(context.session.id)`.\\n\\n4. **Implement sign-in and sign-out Resources** using the context helpers:\\n\\n ```javascript\\n export class SignIn extends Resource {\\n \\tasync post(_target, data) {\\n \\t\\tconst context = this.getContext();\\n \\t\\ttry {\\n \\t\\t\\tawait context.login(data.username, data.password);\\n \\t\\t} catch {\\n \\t\\t\\treturn new Response('Invalid credentials', { status: 403 });\\n \\t\\t}\\n \\t\\treturn new Response('Logged in', { status: 200 });\\n \\t}\\n }\\n\\n export class SignOut extends Resource {\\n \\tasync post() {\\n \\t\\tconst context = this.getContext();\\n \\t\\tif (!context.session) return new Response(null, { status: 401 });\\n \\t\\tawait context.session.delete(context.session.id);\\n \\t\\treturn new Response('Logged out', { status: 200 });\\n \\t}\\n }\\n ```\\n\\n5. **Issue JWTs for non-browser clients** (CLI tools, mobile apps, service-to-service). Cookie-based sessions are intended for browser clients. For other clients, mint tokens programmatically using `server.operation()`:\\n\\n ```javascript\\n import { Resource, server } from 'harper';\\n\\n export class IssueTokens extends Resource {\\n \\tstatic async get(_target, context) {\\n \\t\\tconst { operation_token, refresh_token } = await server.operation(\\n \\t\\t\\t{ operation: 'create_authentication_tokens' },\\n \\t\\t\\tcontext,\\n \\t\\t\\ttrue,\\n \\t\\t);\\n \\t\\treturn { operation_token, refresh_token };\\n \\t}\\n\\n \\tstatic async post(_target, data) {\\n \\t\\tconst { username, password } = await data;\\n \\t\\tif (!username || !password) {\\n \\t\\t\\treturn new Response('username and password required', { status: 400 });\\n \\t\\t}\\n \\t\\tconst { operation_token, refresh_token } = await server.operation({\\n \\t\\t\\toperation: 'create_authentication_tokens',\\n \\t\\t\\tusername,\\n \\t\\t\\tpassword,\\n \\t\\t});\\n \\t\\treturn { operation_token, refresh_token };\\n \\t}\\n }\\n\\n export class RefreshJWT extends Resource {\\n \\tstatic async post(_target, data) {\\n \\t\\tconst { refresh_token } = await data;\\n \\t\\tif (!refresh_token) {\\n \\t\\t\\treturn new Response('refresh_token required', { status: 400 });\\n \\t\\t}\\n \\t\\tconst { operation_token } = await server.operation({\\n \\t\\t\\toperation: 'refresh_operation_token',\\n \\t\\t\\trefresh_token,\\n \\t\\t});\\n \\t\\treturn { operation_token };\\n \\t}\\n }\\n ```\\n\\n Pass `true` as the third argument to `server.operation()` when the operation should run as the current authenticated user. Omit it or pass `false` when the operation supplies its own credentials.\\n\\n6. **Configure JWT token expiry** in `harperdb-config.yaml` under the `authentication` section:\\n\\n ```yaml\\n authentication:\\n operationTokenTimeout: 1d\\n refreshTokenTimeout: 30d\\n ```\\n\\n Duration strings follow the `jsonwebtoken` package format (e.g., `1d`, `12h`, `60m`).\\n\\n## Examples\\n\\n**Protecting a resource endpoint and returning user info:**\\n\\n```javascript\\nasync get(target) {\\n const user = this.getCurrentUser();\\n if (!user) return new Response(null, { status: 401 });\\n return { username: user.username, role: user.role };\\n}\\n```\\n\\n**Full session-based sign-in/sign-out flow:**\\n\\n```javascript\\nexport class SignIn extends Resource {\\n\\tasync post(_target, data) {\\n\\t\\tconst context = this.getContext();\\n\\t\\ttry {\\n\\t\\t\\tawait context.login(data.username, data.password);\\n\\t\\t} catch {\\n\\t\\t\\treturn new Response('Invalid credentials', { status: 403 });\\n\\t\\t}\\n\\t\\treturn new Response('Logged in', { status: 200 });\\n\\t}\\n}\\n\\nexport class SignOut extends Resource {\\n\\tasync post() {\\n\\t\\tconst context = this.getContext();\\n\\t\\tif (!context.session) return new Response(null, { status: 401 });\\n\\t\\tawait context.session.delete(context.session.id);\\n\\t\\treturn new Response('Logged out', { status: 200 });\\n\\t}\\n}\\n```\\n\\n**JWT token refresh endpoint:**\\n\\n```javascript\\nexport class RefreshJWT extends Resource {\\n\\tstatic async post(_target, data) {\\n\\t\\tconst { refresh_token } = await data;\\n\\t\\tif (!refresh_token) {\\n\\t\\t\\treturn new Response('refresh_token required', { status: 400 });\\n\\t\\t}\\n\\t\\tconst { operation_token } = await server.operation({\\n\\t\\t\\toperation: 'refresh_operation_token',\\n\\t\\t\\trefresh_token,\\n\\t\\t});\\n\\t\\treturn { operation_token };\\n\\t}\\n}\\n```\\n\\n## Notes\\n\\n- `getCurrentUser()` and `getContext()` are instance methods; call them with `this` inside non-static Resource methods.\\n- `enableSessions` must be `true` in config before `context.login` or `context.session` will function.\\n- Cookie-based sessions target browser clients. Use JWT issuance via `server.operation()` for all other client types.\\n- When both `operation_token` and `refresh_token` have expired, the client must call `create_authentication_tokens` again with credentials.\\n\",\n\t\"creating-a-fabric-account-and-cluster\": \"---\\nname: creating-a-fabric-account-and-cluster\\ndescription: How to create a Harper Fabric account, organization, and cluster.\\nmetadata:\\n mode: synthesized\\n---\\n\\n# Creating a Harper Fabric Account and Cluster\\n\\nFollow these steps to set up your Harper Fabric environment for deployment.\\n\\n## How It Works\\n\\n1. **Sign Up/In**: Go to [https://fabric.harper.fast/](https://fabric.harper.fast/) and sign up or sign in.\\n2. **Create an Organization**: Create an organization (org) to manage your projects.\\n3. **Create a Cluster**: Create a new cluster. This can be on the free tier, no credit card required.\\n4. **Set Credentials**: During setup, set the cluster username and password to finish configuring it.\\n5. **Get Application URL**: Navigate to the **Config** tab and copy the **Application URL**.\\n6. **Configure Environment**: Update your `.env` file or GitHub Actions secrets with cluster-specific credentials.\\n7. **Next Steps**: See the [deploying-to-harper-fabric](deploying-to-harper-fabric.md) rule for detailed instructions on deploying your application successfully.\\n\\n## Examples\\n\\n### Environment Configuration\\n\\n```bash\\nCLI_TARGET_USERNAME='YOUR_CLUSTER_USERNAME'\\nCLI_TARGET_PASSWORD='YOUR_CLUSTER_PASSWORD'\\nCLI_TARGET='YOUR_CLUSTER_URL'\\n```\\n\",\n\t\"creating-harper-apps\": \"---\\nname: creating-harper-apps\\ndescription: How to initialize a new Harper application using the CLI.\\nmetadata:\\n mode: synthesized\\n---\\n\\n# Creating Harper Applications\\n\\nThe fastest way to start a new Harper project is using the `create-harper` CLI tool. This command\\ninitializes a project with a standard folder structure, essential configuration files, and basic\\nschema definitions.\\n\\n## When to Use\\n\\nUse this command when starting a new Harper application or adding a new Harper microservice to an\\nexisting architecture.\\n\\n## Commands\\n\\nInitialize a project using your preferred package manager:\\n\\n### NPM\\n\\n```bash\\nnpm create harper@latest\\n```\\n\\n### PNPM\\n\\n```bash\\npnpm create harper@latest\\n```\\n\\n### Bun\\n\\n```bash\\nbun create harper@latest\\n```\\n\\n## Options\\n\\nYou can specify the project name and template directly:\\n\\n```bash\\nnpm create harper@latest my-app --template default\\n```\\n\\n## Next Steps\\n\\n1. **Configure Environment**: Set up your `.env` file with local or cloud credentials.\\n2. **Define Schema**: Modify `schema.graphql` to fit your application's data model.\\n3. **Start Development**: Run `npm run dev` to start the local Harper instance.\\n4. **Deploy**: Use `npm run deploy` to push your application to Harper Fabric.\\n\",\n\t\"custom-resources\": \"---\\nname: custom-resources\\ndescription: How to define custom REST endpoints with JavaScript or TypeScript in Harper.\\nmetadata:\\n mode: synthesized\\n---\\n\\n# Custom Resources\\n\\nInstructions for the agent to follow when creating custom resources in Harper.\\n\\n## When to Use\\n\\nUse this skill when the automatic CRUD operations provided by `@table @export` are insufficient, and you need custom logic, third-party API integration, or specialized data handling for your REST endpoints.\\n\\n## How It Works\\n\\n1. **Check if a Custom Resource is Necessary**: Verify if [Automatic APIs](./automatic-apis.md) or [Extending Tables](./extending-tables.md) can satisfy the requirement first.\\n2. **Create the Resource File**: Create a `.ts` or `.js` file in the directory specified by `jsResource` in `config.yaml` (typically `resources/`).\\n3. **Define the Resource Class**: Export a class extending `Resource` from `harper`:\\n\\n ```typescript\\n import { type RequestTargetOrId, Resource } from 'harper';\\n\\n export class MyResource extends Resource {\\n \\tasync get(target?: RequestTargetOrId) {\\n \\t\\treturn { message: 'Hello from custom GET!' };\\n \\t}\\n }\\n ```\\n\\n4. **Implement HTTP Methods**: Add methods like `get`, `post`, `put`, `patch`, or `delete` to handle corresponding requests.\\n5. **Route Nesting and Naming**: You can control the URL structure by how you export your resources:\\n - **Direct Class Export**: `export class Foo extends Resource` creates endpoints at `/Foo/`. Class names are case-sensitive in the URL.\\n - **Nested Objects**: `export const Bar = { Foo };` creates endpoints at `/Bar/Foo/`.\\n - **Lowercase and Hyphens**: Use object keys to define custom paths: `export const bar = { 'foo-baz': Foo };` exposes endpoints at `/bar/foo-baz/`.\\n6. **Access Tables (Optional)**: Import and use the `tables` object to interact with your data:\\n ```typescript\\n import { tables } from 'harper';\\n // ... inside a method\\n const results = await tables.MyTable.list();\\n ```\\n7. **Configure Loading**: Ensure `config.yaml` points to your resource files (e.g., `jsResource: { files: 'resources/*.ts' }`).\\n\",\n\t\"defining-relationships\": \"---\\nname: defining-relationships\\ndescription: How to define and use relationships between tables in Harper using GraphQL.\\nmetadata:\\n mode: synthesized\\n---\\n\\n# Defining Relationships\\n\\nInstructions for the agent to follow when defining relationships between Harper tables.\\n\\n## When to Use\\n\\nUse this skill when you need to link data across different tables, enabling automatic joins and efficient related-data fetching via REST APIs.\\n\\n## How It Works\\n\\n1. **Identify the Relationship Type**: Determine if it's one-to-one, many-to-one, or one-to-many.\\n2. **Use the `@relationship` Directive**: Apply it to a field in your GraphQL schema.\\n - **Many-to-One (Current table holds FK)**: Use `from`.\\n ```graphql\\n type Book @table @export {\\n \\tauthorId: ID\\n \\tauthor: Author @relationship(from: \\\"authorId\\\")\\n }\\n ```\\n - **One-to-Many (Related table holds FK)**: Use `to` and an array type.\\n ```graphql\\n type Author @table @export {\\n \\tbooks: [Book] @relationship(to: \\\"authorId\\\")\\n }\\n ```\\n3. **Query with Relationships**: Use dot syntax in REST API calls for filtering or the `select()` operator for including related data.\\n - Example Filter: `GET /Book/?author.name=Harper`\\n - Example Select: `GET /Author/?select(name,books(title))`\\n\",\n\t\"deploying-to-harper-fabric\": \"---\\nname: deploying-to-harper-fabric\\ndescription: How to deploy a Harper application to the Harper Fabric cloud.\\nmetadata:\\n mode: generate\\n sources:\\n - reference/v5/components/applications.md#Remote Management\\n - >-\\n fabric/cluster-creation-management.md#Connecting the Harper CLI to a\\n Cluster\\n sourceCommit: b7fbddadd42eb4487190b650a9abc4bcfeef5819\\n inputHash: ccdefbbf8f3b8657\\n---\\n\\n# Deploying to Harper Fabric\\n\\nInstructions for the agent to follow when deploying a Harper application to the Harper Fabric cloud using the Harper CLI.\\n\\n## When to Use\\n\\nApply this rule when deploying a Harper application to a remote Harper instance or Harper Fabric cluster. This covers interactive deployments, CI/CD pipelines, and any scenario where the agent must push a local or remote package to a target environment.\\n\\n## How It Works\\n\\n1. **Authenticate with the remote target**: Run `harper login` once to store an authentication token. The CLI writes `HARPER_CLI_TARGET` to a local `.env` so subsequent commands do not need credentials repeated. Find the **Application URL** on the cluster's **Config → Overview** page (see [creating-a-fabric-account-and-cluster.md](creating-a-fabric-account-and-cluster.md)).\\n\\n ```bash\\n harper login <Application URL>\\n # Provide cluster username and password when prompted\\n ```\\n\\n2. **Deploy the application**: Run `harper deploy` with the required parameters. After logging in, no credentials are needed inline.\\n\\n ```bash\\n harper deploy \\\\\\n project=<name> \\\\\\n package=<package> \\\\\\n target=<remote> \\\\\\n restart=true \\\\\\n replicated=true\\n ```\\n\\n3. **Choose a package source**: Set the `package` parameter to any valid npm dependency value, or omit it to package and deploy the current local directory.\\n\\n | Value | Effect |\\n | ---------------------------------------------------- | ------------------------------------------------ |\\n | _(omitted)_ | Packages and deploys the current local directory |\\n | `\\\"@harperdb/status-check\\\"` | npm package |\\n | `\\\"HarperDB/status-check\\\"` | GitHub repo (short form) |\\n | `\\\"https://github.com/HarperDB/status-check\\\"` | GitHub repo (full URL) |\\n | `\\\"git+ssh://git@github.com:HarperDB/secret-app.git\\\"` | Private repo via SSH |\\n | `\\\"https://example.com/application.tar.gz\\\"` | Remote tarball |\\n\\n For git tags, use the `semver` directive for reliable versioning:\\n\\n ```\\n HarperDB/application-template#semver:v1.0.0\\n ```\\n\\n4. **Authenticate for CI/CD pipelines**: Use environment variables instead of interactive login. Set credentials before running `harper deploy`.\\n\\n ```bash\\n export HARPER_CLI_USERNAME=<username>\\n export HARPER_CLI_PASSWORD=<password>\\n harper deploy \\\\\\n project=<name> \\\\\\n package=<package> \\\\\\n target=<remote> \\\\\\n restart=true \\\\\\n replicated=true\\n ```\\n\\n5. **Register SSH keys for private repos**: Before deploying from an SSH-based private repository, use the Add SSH Key operation to register the key with the remote instance.\\n\\n## Examples\\n\\n**Interactive login then deploy (recommended):**\\n\\n```bash\\n# Log in once\\nharper login <remote>\\n# Provide your username and password when prompted\\n\\n# Subsequently deploy without credentials\\nharper deploy \\\\\\n project=<name> \\\\\\n package=<package> \\\\\\n target=<remote> \\\\\\n restart=true \\\\\\n replicated=true\\n```\\n\\n**Deploy with inline credentials (not recommended for production):**\\n\\n```bash\\nharper deploy \\\\\\n project=<name> \\\\\\n package=<package> \\\\\\n username=<username> \\\\\\n password=<password> \\\\\\n target=<remote> \\\\\\n restart=true \\\\\\n replicated=true\\n```\\n\\n**Deploy a specific GitHub release by semver tag:**\\n\\n```bash\\nharper deploy \\\\\\n project=my-app \\\\\\n package=\\\"HarperDB/application-template#semver:v1.0.0\\\" \\\\\\n target=<remote> \\\\\\n restart=true \\\\\\n replicated=true\\n```\\n\\n## Notes\\n\\n- Always prefer `harper login` for interactive use and environment variables (`HARPER_CLI_USERNAME`, `HARPER_CLI_PASSWORD`) for CI/CD. Avoid inline `username`/`password` parameters in production.\\n- Omitting `package` causes the CLI to package the current local directory. Specifying a local file path creates a symlink, so changes are picked up between restarts without redeploying.\\n- Harper generates a `package.json` from component configurations and resolves dependencies using a form of `npm install`.\\n- For SSH-based private repos, register keys with the Add SSH Key operation before deploying.\\n\",\n\t\"extending-tables\": \"---\\nname: extending-tables\\ndescription: How to add custom logic to automatically generated table resources in Harper.\\nmetadata:\\n mode: synthesized\\n---\\n\\n# Extending Tables\\n\\nInstructions for the agent to follow when extending table resources in Harper.\\n\\n## When to Use\\n\\nUse this skill when you need to add custom validation, side effects (like webhooks), data transformation, or custom access control to the standard CRUD operations of a Harper table.\\n\\n## How It Works\\n\\n1. **Define the Table in GraphQL**: In your `.graphql` schema, define the table using the `@table` directive. **Do not** use `@export` if you plan to extend it.\\n ```graphql\\n type MyTable @table {\\n \\tid: ID @primaryKey\\n \\tname: String\\n }\\n ```\\n2. **Create the Extension File**: Create a `.ts` file in your `resources/` directory.\\n3. **Extend the Table Resource**: Export a class that extends `tables.YourTableName`:\\n\\n ```typescript\\n import { type RequestTargetOrId, tables } from 'harper';\\n\\n export class MyTable extends tables.MyTable {\\n \\tasync post(target: RequestTargetOrId, record: any) {\\n \\t\\t// Custom logic here\\n \\t\\tif (!record.name) {\\n \\t\\t\\tthrow new Error('Name required');\\n \\t\\t}\\n \\t\\treturn super.post(target, record);\\n \\t}\\n }\\n ```\\n\\n4. **Override Methods**: Override `get`, `post`, `put`, `patch`, or `delete` as needed. Always call `super[method]` to maintain default Harper functionality unless you intend to replace it entirely.\\n5. **Implement Logic**: Use overrides for validation, side effects, or transforming data before/after database operations.\\n\",\n\t\"handling-binary-data\": \"---\\nname: handling-binary-data\\ndescription: How to store and serve binary data like images or audio in Harper.\\nmetadata:\\n mode: synthesized\\n---\\n\\n# Handling Binary Data\\n\\nInstructions for the agent to follow when handling binary data in Harper.\\n\\n## When to Use\\n\\nUse this skill when you need to store binary files (images, audio, etc.) in the database or serve them back to clients via REST endpoints.\\n\\n## How It Works\\n\\n1. **Store Binary Data**: In your resource's `post` or `put` method, convert incoming data to Buffers and then to Blobs using `createBlob` from Harper's globals. Include the MIME type if available:\\n\\n ```typescript\\n async post(target, record) {\\n if (record.data) {\\n record.data = createBlob(Buffer.from(record.data, record.encoding || 'base64'), {\\n type: record.contentType || 'application/octet-stream',\\n });\\n }\\n return super.post(target, record);\\n }\\n ```\\n\\n2. **Serve Binary Data**: In your resource's `get` method, return a response object with the appropriate `Content-Type` and the binary data in the `body`:\\n ```typescript\\n async get(target) {\\n const record = await super.get(target);\\n if (record?.data) {\\n return {\\n status: 200,\\n headers: { 'Content-Type': record.data.type || 'application/octet-stream' },\\n body: record.data,\\n };\\n }\\n return record;\\n }\\n ```\\n3. **Use the Blob Type**: Ensure your GraphQL schema uses the `Blob` scalar for binary fields.\\n\",\n\t\"load-env\": \"---\\nname: load-env\\ndescription: >-\\n How to load environment variables from .env files into a Harper application\\n using the loadEnv plugin.\\nmetadata:\\n mode: generate\\n sources:\\n - reference/v5/environment-variables/overview.md\\n sourceCommit: 42231db17c025a4a455e3d91875fad4084a01cb5\\n inputHash: fe610fc245226357\\n---\\n\\n# Load Environment Variables with loadEnv\\n\\nInstructions for the agent to follow when loading environment variables from `.env` files into a Harper application using the `loadEnv` plugin.\\n\\n## When to Use\\n\\nApply this rule when a Harper application needs to load secrets or configuration values from `.env` files into `process.env` at startup. Use it whenever hardcoding values must be avoided and environment-specific configuration must be supplied to Harper components.\\n\\n## How It Works\\n\\n1. **Declare `loadEnv` in `config.yaml`**: Add `loadEnv` as a top-level key. It is built into Harper and requires no installation.\\n\\n ```yaml\\n loadEnv:\\n files: '.env'\\n ```\\n\\n2. **Place `loadEnv` first**: Always list `loadEnv` before any other components in `config.yaml` so that environment variables are available on `process.env` before dependent components start.\\n\\n ```yaml\\n # config.yaml — loadEnv must come first\\n loadEnv:\\n files: '.env'\\n\\n rest: true\\n\\n myApp:\\n files: './src/*.js'\\n ```\\n\\n3. **Configure the `files` option**: Provide one or more paths or glob patterns pointing to the env files to load. This option is required.\\n\\n4. **Set `override` if needed**: By default, existing environment variables take precedence over values in `.env` files. Set `override: true` to reverse this and have loaded values win.\\n\\n ```yaml\\n loadEnv:\\n files: '.env'\\n override: true\\n ```\\n\\n5. **Load multiple files when required**: Supply a list of files or a glob pattern. Files are loaded in the order specified.\\n ```yaml\\n loadEnv:\\n files:\\n - '.env'\\n - '.env.local'\\n ```\\n or\\n ```yaml\\n loadEnv:\\n files: 'env-vars/*'\\n ```\\n\\n### Configuration Options\\n\\n| Option | Type | Required | Description |\\n| ---------- | -------------------- | -------- | -------------------------------------------------------------------------------------- |\\n| `files` | `string \\\\| string[]` | **Yes** | Path(s) or glob pattern(s) to the env file(s) to load. |\\n| `override` | `boolean` | No | If `true`, loaded values override existing environment variables. Defaults to `false`. |\\n\\n## Examples\\n\\n**Minimal setup — single `.env` file:**\\n\\n```yaml\\nloadEnv:\\n files: '.env'\\n```\\n\\n**Full `config.yaml` with load order, multiple files, and override:**\\n\\n```yaml\\n# config.yaml — loadEnv must come first\\nloadEnv:\\n files:\\n - '.env'\\n - '.env.local'\\n override: true\\n\\nrest: true\\n\\nmyApp:\\n files: './src/*.js'\\n```\\n\\n**Glob pattern:**\\n\\n```yaml\\nloadEnv:\\n files: 'env-vars/*'\\n```\\n\\n## Notes\\n\\n- `loadEnv` is built into Harper — do not install it separately; only declare it in `config.yaml`.\\n- Because Harper is a single-process application, variables loaded onto `process.env` are shared across all components.\\n- Without `override: true`, variables already set in the shell or container environment will not be overwritten by values in `.env` files.\\n- `files` is the only required option; omitting it will produce an invalid configuration.\\n\",\n\t\"logging\": \"---\\nname: logging\\ndescription: >-\\n Best practices for logging in Harper, including console capture, the granular\\n logger interface, and programmatic log retrieval.\\nmetadata:\\n mode: generate\\n sources:\\n - reference/v5/logging/overview.md\\n - reference/v5/logging/api.md\\n sourceCommit: b7fbddadd42eb4487190b650a9abc4bcfeef5819\\n inputHash: 46cd384598304e3b\\n---\\n\\n# Harper Logging\\n\\nInstructions for the agent to follow when implementing logging in Harper applications, including direct logger usage, tagged loggers, and console capture behavior.\\n\\n## When to Use\\n\\nApply this rule when writing any JavaScript component, plugin, or resource that needs to emit structured log entries, filter logs by component, or capture existing `console.log` output into Harper's log system. Use it whenever you need to understand log levels, log entry format, or the `logger` global API.\\n\\n## How It Works\\n\\n1. **Use the `logger` global directly** — `logger` is available in all JavaScript components without any imports. Call the method matching the desired severity level:\\n\\n ```javascript\\n logger.trace('detailed trace message');\\n logger.debug('debug info', { someContext: 'value' });\\n logger.info('informational message');\\n logger.warn('potential issue');\\n logger.error('error occurred', error);\\n logger.fatal('fatal error');\\n logger.notify('server is ready');\\n ```\\n\\n Only entries at or above the configured `logging.level` (or `logging.external.level`) are written to `hdb.log`.\\n\\n2. **Create a tagged logger with `withTag(`** — Call `logger.withTag(tag)` once per module or class to get a `TaggedLogger` scoped to that tag. This prefixes every log entry with the tag, making log output filterable by component.\\n\\n ```javascript\\n const log = logger.withTag('my-resource');\\n ```\\n\\n Because `TaggedLogger` methods for disabled levels are `null`, always use optional chaining (`?.`) when calling them:\\n\\n ```javascript\\n log.debug?.('Fetching record', { id });\\n log.warn?.('Record not found', { id });\\n log.error?.('Failed to update record', err);\\n ```\\n\\n `TaggedLogger` does not have a `withTag()` method.\\n\\n3. **Understand the interface contracts** — `MainLogger` always has all methods defined:\\n\\n ```typescript\\n interface MainLogger {\\n \\ttrace(...messages: any[]): void;\\n \\tdebug(...messages: any[]): void;\\n \\tinfo(...messages: any[]): void;\\n \\twarn(...messages: any[]): void;\\n \\terror(...messages: any[]): void;\\n \\tfatal(...messages: any[]): void;\\n \\tnotify(...messages: any[]): void;\\n \\twithTag(tag: string): TaggedLogger;\\n }\\n ```\\n\\n `TaggedLogger` methods may be `null`:\\n\\n ```typescript\\n interface TaggedLogger {\\n \\ttrace: ((...messages: any[]) => void) | null;\\n \\tdebug: ((...messages: any[]) => void) | null;\\n \\tinfo: ((...messages: any[]) => void) | null;\\n \\twarn: ((...messages: any[]) => void) | null;\\n \\terror: ((...messages: any[]) => void) | null;\\n \\tfatal: ((...messages: any[]) => void) | null;\\n \\tnotify: ((...messages: any[]) => void) | null;\\n }\\n ```\\n\\n4. **Know the log levels** — From least to most severe:\\n\\n | Level | Description |\\n | -------- | -------------------------------------------------------------------- |\\n | `trace` | Highly detailed internal execution tracing. |\\n | `debug` | Diagnostic information useful during development. |\\n | `info` | General operational events. |\\n | `warn` | Potential issues that don't prevent normal operation. |\\n | `error` | Errors that affect specific operations. |\\n | `fatal` | Critical errors causing process termination. |\\n | `notify` | Important operational milestones. Always logged regardless of level. |\\n\\n The default log level is `warn`. Setting a level includes that level and all more-severe levels.\\n\\n5. **Enable console capture when porting existing code** — When `logging.console: true` is set, writes via `console.log`, `console.warn`, `console.error`, etc. are appended verbatim to `hdb.log`. Captured lines do **not** pass through `logger`'s level filter. Prefer `logger` directly in production code so that level filtering and tagging apply. Console capture is intended as a convenience for porting existing code and for debugging.\\n\\n6. **Know where logs are written** — All standard log output goes to `<ROOTPATH>/log/hdb.log` (default: `~/hdb/log/hdb.log`). To also log to `stdout`/`stderr`, set `logging.stdStreams: true`.\\n\\n## Examples\\n\\n### Basic logging in a resource\\n\\n```javascript\\nexport class MyResource extends Resource {\\n\\tasync get(id) {\\n\\t\\tlogger.debug('Fetching record', { id });\\n\\t\\tconst record = await super.get(id);\\n\\t\\tif (!record) {\\n\\t\\t\\tlogger.warn('Record not found', { id });\\n\\t\\t}\\n\\t\\treturn record;\\n\\t}\\n\\n\\tasync put(record) {\\n\\t\\tlogger.info('Updating record', { id: record.id });\\n\\t\\ttry {\\n\\t\\t\\treturn await super.put(record);\\n\\t\\t} catch (err) {\\n\\t\\t\\tlogger.error('Failed to update record', err);\\n\\t\\t\\tthrow err;\\n\\t\\t}\\n\\t}\\n}\\n```\\n\\n### Tagged logging with `withTag()`\\n\\n```javascript\\nconst log = logger.withTag('my-resource');\\n\\nexport class MyResource extends Resource {\\n\\tasync get(id) {\\n\\t\\tlog.debug?.('Fetching record', { id });\\n\\t\\tconst record = await super.get(id);\\n\\t\\tif (!record) {\\n\\t\\t\\tlog.warn?.('Record not found', { id });\\n\\t\\t}\\n\\t\\treturn record;\\n\\t}\\n\\n\\tasync put(record) {\\n\\t\\tlog.info?.('Updating record', { id: record.id });\\n\\t\\ttry {\\n\\t\\t\\treturn await super.put(record);\\n\\t\\t} catch (err) {\\n\\t\\t\\tlog.error?.('Failed to update record', err);\\n\\t\\t\\tthrow err;\\n\\t\\t}\\n\\t}\\n}\\n```\\n\\nTagged entries appear in `hdb.log` with the tag in the header:\\n\\n```\\n2023-03-09T14:25:05.269Z [info] [my-resource]: Updating record\\n```\\n\\n## Notes\\n\\n- All log output is written to `<ROOTPATH>/log/hdb.log`. The `logger` global writes to this file at the configured `logging.external` level.\\n- Log entry format for `logger`: `<timestamp> [<level>] [<thread>/<id>]: <message>`\\n- Log entry format for `TaggedLogger`: `<timestamp> [<level>] [<tag>]: <message>`\\n- `console.log` output is only forwarded to `hdb.log` when `logging.console: true` is explicitly set; it is not forwarded by default.\\n- When logging to standard streams, run Harper in the foreground (`harper`, not `harper start`).\\n- `TaggedLogger` is bound to the configured log level at creation time — always use `?.` on its methods.\\n\",\n\t\"programmatic-table-requests\": \"---\\nname: programmatic-table-requests\\ndescription: How to interact with Harper tables programmatically using the `tables` object.\\nmetadata:\\n mode: synthesized\\n---\\n\\n# Programmatic Table Requests\\n\\nInstructions for the agent to follow when interacting with Harper tables via code.\\n\\n## When to Use\\n\\nUse this skill when you need to perform database operations (CRUD, search, subscribe) from within Harper Resources or scripts.\\n\\n## How It Works\\n\\n1. **Access the Table**: Use the global `tables` object followed by your table name (e.g., `tables.MyTable`).\\n2. **Perform CRUD Operations**:\\n - **Get**: `await tables.MyTable.get(id)` for a single record or `await tables.MyTable.get({ conditions: [...] })` for multiple.\\n - **Create**: `await tables.MyTable.post(record)` (auto-generates ID) or `await tables.MyTable.put(id, record)`.\\n - **Update**: `await tables.MyTable.patch(id, partialRecord)` for partial updates.\\n - **Delete**: `await tables.MyTable.delete(id)`.\\n3. **Use Updatable Records for Atomic Ops**: Call `update(id)` to get a reference, then use `addTo` or `subtractFrom` for atomic increments/decrements:\\n ```typescript\\n const stats = await tables.Stats.update('daily');\\n stats.addTo('viewCount', 1);\\n ```\\n4. **Search and Stream**: Use `search(query)` for efficient streaming of large result sets:\\n ```typescript\\n for await (const record of tables.MyTable.search({ conditions: [...] })) {\\n // process record\\n }\\n ```\\n See the [Query Conditions](#query-conditions) section below for the full query object reference.\\n5. **Real-time Subscriptions**: Use `subscribe(query)` to listen for changes:\\n ```typescript\\n for await (const event of tables.MyTable.subscribe(query)) {\\n \\t// handle event\\n }\\n ```\\n6. **Publish Events**: Use `publish(id, message)` to trigger subscriptions without necessarily persisting data.\\n\\n## Query Conditions\\n\\nWhen passing a query to `search()`, `get()`, or `subscribe()`, use a query object with a `conditions` array.\\n\\n### Condition Object Shape\\n\\n| Property | Description |\\n| ------------ | ------------------------------------------------------------------------------------------ |\\n| `attribute` | Field name, or array of field names to traverse a relationship (e.g., `['brand', 'name']`) |\\n| `value` | The value to compare against |\\n| `comparator` | One of the comparator strings below (default: `equals`) |\\n| `operator` | `and` (default) or `or` — applies to a nested `conditions` block |\\n| `conditions` | Nested array of condition objects for complex AND/OR logic |\\n\\n### Comparator Values\\n\\nUse these exact strings — incorrect comparator names will silently fail or error:\\n\\n| Comparator | Meaning |\\n| -------------------- | ---------------------------------------------------------- |\\n| `equals` | Exact match (default) |\\n| `not_equal` | Not equal |\\n| `greater_than` | `>` |\\n| `greater_than_equal` | `>=` |\\n| `less_than` | `<` |\\n| `less_than_equal` | `<=` |\\n| `starts_with` | String starts with value |\\n| `contains` | String contains value |\\n| `ends_with` | String ends with value |\\n| `between` | Value is between two bounds (pass `value` as `[min, max]`) |\\n\\n### Query Object Parameters\\n\\n| Property | Description |\\n| ------------ | ------------------------------------------------------------------------------------ |\\n| `conditions` | Array of condition objects |\\n| `limit` | Maximum number of records to return |\\n| `offset` | Number of records to skip (for pagination) |\\n| `select` | Array of attribute names to return; supports `$id` and `$updatedtime` |\\n| `sort` | Object with `attribute`, `descending` (bool), and optional `next` for secondary sort |\\n\\n### Examples\\n\\n**Simple filter:**\\n\\n```javascript\\nfor await (const record of tables.Product.search({\\n conditions: [{ attribute: 'price', comparator: 'less_than', value: 100 }],\\n limit: 20,\\n})) { ... }\\n```\\n\\n**AND + nested OR:**\\n\\n```javascript\\nfor await (const record of tables.Product.search({\\n conditions: [\\n { attribute: 'price', comparator: 'less_than', value: 100 },\\n {\\n operator: 'or',\\n conditions: [\\n { attribute: 'rating', comparator: 'greater_than', value: 4 },\\n { attribute: 'featured', value: true },\\n ],\\n },\\n ],\\n})) { ... }\\n```\\n\\n**Relationship traversal:**\\n\\n```javascript\\nfor await (const record of tables.Book.search({\\n conditions: [{ attribute: ['brand', 'name'], comparator: 'equals', value: 'Harper' }],\\n})) { ... }\\n```\\n\\n**Sort and paginate:**\\n\\n```javascript\\nfor await (const record of tables.Product.search({\\n conditions: [{ attribute: 'inStock', value: true }],\\n sort: { attribute: 'price', descending: false },\\n limit: 10,\\n offset: 20,\\n})) { ... }\\n```\\n\\n## Cautions\\n\\nBe very careful when performing updates and deletions! You may be dealing with live production data. The wrong request to delete, without approval from a human, could be devastating to a business. Always use the proper approval process.\\n\",\n\t\"querying-rest-apis\": \"---\\nname: querying-rest-apis\\ndescription: 'How to use query parameters to filter, sort, and paginate Harper REST APIs.'\\nmetadata:\\n mode: generate\\n sources:\\n - reference/v5/rest/querying.md\\n sourceCommit: b7fbddadd42eb4487190b650a9abc4bcfeef5819\\n inputHash: 9f8c981a629ef606\\n---\\n\\n# Querying REST APIs\\n\\nInstructions for the agent to filter, sort, select, and paginate Harper REST API collections using URL query parameters.\\n\\n## When to Use\\n\\nApply this rule when building or modifying code that queries Harper REST endpoints with filtering, sorting, field selection, or pagination. Use it whenever constructing URLs against collection paths exposed by Harper's automatic REST interface (see [automatic-apis.md](automatic-apis.md)).\\n\\n## How It Works\\n\\n1. **Filter by attribute**: Add query parameters matching attribute names and values. The queried attribute must be indexed.\\n\\n ```\\n GET /Product/?category=software\\n GET /Product/?category=software&inStock=true\\n ```\\n\\n2. **Apply comparison operators (FIQL syntax)**: Use FIQL operators directly in query parameter values.\\n\\n | Operator | Meaning |\\n | ------------ | -------------------------------------- |\\n | `==` | Equal |\\n | `=lt=` | Less than |\\n | `=le=` | Less than or equal |\\n | `=gt=` | Greater than |\\n | `=ge=` | Greater than or equal |\\n | `=ne=`, `!=` | Not equal |\\n | `=ct=` | Contains (strings) |\\n | `=sw=` | Starts with (strings) |\\n | `=ew=` | Ends with (strings) |\\n | `=`, `===` | Strict equality (no type conversion) |\\n | `!==` | Strict inequality (no type conversion) |\\n\\n ```\\n GET /Product/?price=gt=100\\n GET /Product/?price=le=20\\n GET /Product/?name==Keyboard*\\n GET /Product/?category=software&price=gt=100&price=lt=200\\n ```\\n\\n For date fields, URL-encode colons as `%3A`:\\n\\n ```\\n GET /Product/?listDate=gt=2017-03-08T09%3A30%3A00.000Z\\n ```\\n\\n3. **Chain conditions for range queries**: Omit the attribute name on the second condition to apply it to the same attribute. Only `gt`/`ge` combined with `lt`/`le` is supported.\\n\\n ```\\n GET /Product/?price=gt=100<=200\\n ```\\n\\n4. **Combine conditions with OR logic**: Use `|` instead of `&`.\\n\\n ```\\n GET /Product/?rating=5|featured=true\\n ```\\n\\n5. **Group conditions**: Use parentheses or square brackets to control order of operations. Prefer square brackets when constructing queries from user input, since standard URI encoding safely encodes `[` and `]`.\\n\\n ```\\n GET /Product/?rating=5|(price=gt=100&price=lt=200)\\n GET /Product/?rating=5&[tag=fast|tag=scalable|tag=efficient]\\n ```\\n\\n Construct grouped queries from JavaScript:\\n\\n ```javascript\\n let url = `/Product/?rating=5&[${tags.map(encodeURIComponent).join('|')}]`;\\n ```\\n\\n6. **Select specific properties with `select(`**: Use `select()` to control which fields are returned.\\n\\n | Syntax | Returns |\\n | -------------------------------------- | ------------------------------------------- |\\n | `?select(property)` | Values of a single property directly |\\n | `?select(property1,property2)` | Objects with only the specified properties |\\n | `?select([property1,property2])` | Arrays of property values |\\n | `?select(property1,)` | Objects with a single specified property |\\n | `?select(property{subProp1,subProp2})` | Nested objects with specific sub-properties |\\n\\n ```\\n GET /Product/?category=software&select(name)\\n GET /Product/?brand.name=Microsoft&select(name,brand{name})\\n ```\\n\\n7. **Limit results with `limit(`**: Use `limit(end)` or `limit(start,end)` to paginate.\\n\\n ```\\n GET /Product/?rating=gt=3&inStock=true&select(rating,name)&limit(20)\\n GET /Product/?rating=gt=3&limit(10,30)\\n ```\\n\\n8. **Sort results with `sort(`**: Use `sort(property)` or `sort(+property,-property,...)`. Prefix `+` or no prefix = ascending; `-` = descending.\\n\\n ```\\n GET /Product/?rating=gt=3&sort(+name)\\n GET /Product/?sort(+rating,-price)\\n ```\\n\\n9. **Query across relationships**: Use dot-syntax to filter by related table attributes. Relationships must be defined in the schema using `@relation`.\\n\\n ```\\n GET /Product/?brand.name=Microsoft\\n GET /Brand/?products.name=Keyboard\\n ```\\n\\n Use `select()` to include relationship attributes in the response (they are not included by default):\\n\\n ```\\n GET /Product/?brand.name=Microsoft&select(name,brand{name})\\n ```\\n\\n10. **Access a specific property by URL**: Append the property name with dot syntax to the record ID. Only works for properties declared in the schema.\\n ```\\n GET /MyTable/123.propertyName\\n ```\\n\\n## Examples\\n\\n**Range filter with select and limit:**\\n\\n```\\nGET /Product/?category=software&price=gt=100&price=lt=200&select(name,price)&limit(20)\\n```\\n\\n**Sort descending with multiple fields:**\\n\\n```\\nGET /Product/?sort(+rating,-price)\\n```\\n\\n**OR logic with grouping:**\\n\\n```\\nGET /Product/?price=lt=100|[rating=5&[tag=fast|tag=scalable|tag=efficient]&inStock=true]\\n```\\n\\n**Relationship join with nested select:**\\n\\n```\\nGET /Product/?brand.name=Microsoft&select(name,brand{name,id})\\n```\\n\\n**Schema defining a relationship for join queries:**\\n\\n```graphql\\ntype Product @table @export {\\n\\tid: Long @primaryKey\\n\\tname: String\\n\\tbrandId: Long @indexed\\n\\tbrand: Brand @relation(from: \\\"brandId\\\")\\n}\\ntype Brand @table @export {\\n\\tid: Long @primaryKey\\n\\tname: String\\n\\tproducts: [Product] @relation(to: \\\"brandId\\\")\\n}\\n```\\n\\n**Many-to-many relationship query:**\\n\\n```graphql\\ntype Product @table @export {\\n\\tid: Long @primaryKey\\n\\tname: String\\n\\tresellerIds: [Long] @indexed\\n\\tresellers: [Reseller] @relation(from: \\\"resellerId\\\")\\n}\\n```\\n\\n```\\nGET /Product/?resellers.name=Cool Shop&select(id,name,resellers{name,id})\\n```\\n\\n**Type conversion with explicit prefix:**\\n\\n```\\nGET /Product/?price==number:123\\nGET /Product/?active==boolean:true\\nGET /Product/?listDate==date:2024-01-05T20%3A07%3A27.955Z\\n```\\n\\n## Notes\\n\\n- Only indexed attributes can be used as the primary filter; additional unindexed attributes can be combined with `&` once at least one indexed attribute is present.\\n- For null value queries, use `?attribute=null`. Indexes must have been created with null indexing support; existing indexes must be removed and re-added to support null queries.\\n- FIQL comparators (`==`, `!=`, `=gt=`, etc.) apply automatic type conversion based on value syntax or schema-declared type. Strict operators (`=`, `===`, `!==`) skip automatic type conversion.\\n- Filtering by a related attribute produces INNER JOIN behavior (only records with a matching related record are returned). Using `select()` on a relationship without a filter produces LEFT JOIN behavior.\\n- The array order of foreign key values in many-to-many relationships is preserved when resolving the relationship.\\n- See [automatic-apis.md](automatic-apis.md) for how Harper tables are automatically exposed as REST endpoints.\\n\",\n\t\"real-time-apps\": \"---\\nname: real-time-apps\\ndescription: How to build real-time features in Harper using WebSockets and Pub/Sub.\\nmetadata:\\n mode: generate\\n sources:\\n - reference/v5/rest/websockets.md\\n sourceCommit: b7fbddadd42eb4487190b650a9abc4bcfeef5819\\n inputHash: a8afd4d3a52f77ba\\n---\\n\\n# Real-Time Apps with WebSockets and Pub/Sub\\n\\nInstructions for the agent to follow when building real-time features in Harper using WebSockets and Pub/Sub.\\n\\n## When to Use\\n\\nApply this rule when implementing any feature that requires real-time bidirectional communication, live data streaming, or push-based updates in a Harper application. This includes chat, live dashboards, sensor feeds, and any scenario where clients must receive resource changes as they happen.\\n\\n## How It Works\\n\\n1. **Enable WebSocket support**: WebSocket support is enabled automatically when the `rest` plugin is enabled. To explicitly disable it, set the following in your config:\\n\\n ```yaml\\n rest:\\n webSocket: false\\n ```\\n\\n2. **Connect a client to a resource**: A WebSocket connection to a resource URL automatically subscribes to that resource. When the record changes or a message is published to it, the connection receives the update.\\n\\n ```javascript\\n let ws = new WebSocket('wss://server/my-resource/341');\\n ws.onmessage = (event) => {\\n \\tlet data = JSON.parse(event.data);\\n };\\n ```\\n\\n `new WebSocket('wss://server/my-resource/341')` accesses the resource defined for `my-resource` with record id `341` and subscribes to it.\\n\\n3. **Implement a custom `connect()` handler**: Override the `connect(incomingMessages)` method on a resource class to control WebSocket behavior. The method must return an async iterable (or generator) that produces messages to send to the client. See [automatic-apis.md](automatic-apis.md) for more on defining resource classes.\\n\\n4. **Use the default `connect()` for event-style access**: Call `super.connect()` to get a streaming iterable that provides:\\n - A `send(message)` method for pushing outgoing messages\\n - A `close` event for cleanup on disconnect\\n\\n5. **Handle message ordering in distributed environments**: Harper delivers messages to local subscribers immediately without inter-node coordination delay.\\n\\n | Message Type | Behavior |\\n | -------------------------------------------------------- | ----------------------------------------------------------------------- |\\n | Non-retained (no `retain` flag) | Every message delivered in order received; suitable for chat |\\n | Retained (published with `retain`, or PUT/updated in DB) | Only the latest-timestamp message is kept; suitable for sensor readings |\\n\\n6. **Use MQTT over WebSockets** when needed by setting the sub-protocol header:\\n ```\\n Sec-WebSocket-Protocol: mqtt\\n ```\\n\\n## Examples\\n\\n**Simple echo server** — override `connect(incomingMessages)` to yield each incoming message back to the client:\\n\\n```javascript\\nexport class Echo extends Resource {\\n\\tasync *connect(incomingMessages) {\\n\\t\\tfor await (let message of incomingMessages) {\\n\\t\\t\\tyield message; // echo each message back\\n\\t\\t}\\n\\t}\\n}\\n```\\n\\n**Custom connect with timer and event-style access** — use `super.connect()` to get the outgoing stream, push periodic messages, echo incoming messages, and clean up on disconnect:\\n\\n```javascript\\nexport class Example extends Resource {\\n\\tconnect(incomingMessages) {\\n\\t\\tlet outgoingMessages = super.connect();\\n\\n\\t\\tlet timer = setInterval(() => {\\n\\t\\t\\toutgoingMessages.send({ greeting: 'hi again!' });\\n\\t\\t}, 1000);\\n\\n\\t\\tincomingMessages.on('data', (message) => {\\n\\t\\t\\toutgoingMessages.send(message); // echo incoming messages\\n\\t\\t});\\n\\n\\t\\toutgoingMessages.on('close', () => {\\n\\t\\t\\tclearInterval(timer);\\n\\t\\t});\\n\\n\\t\\treturn outgoingMessages;\\n\\t}\\n}\\n```\\n\\n## Notes\\n\\n- WebSocket connections target a resource URL path. By default, connecting to a resource subscribes to changes for that resource.\\n- The `connect(incomingMessages)` method **must** return an async iterable or generator; returning a plain value will not work.\\n- `super.connect()` returns a streaming iterable with `send(message)` and a `close` event — use this when you need to push messages outside of the incoming message loop.\\n- For one-way real-time streaming without bidirectional communication, consider Server-Sent Events instead.\\n- For full pub/sub capabilities, Harper also supports MQTT; set `Sec-WebSocket-Protocol: mqtt` to use MQTT over WebSockets.\\n\",\n\t\"schema-design-tooling\": \"---\\nname: schema-design-tooling\\ndescription: >-\\n Best practices for Harper schema design, including core directives and GraphQL\\n tooling configuration.\\nmetadata:\\n mode: generate\\n sources:\\n - reference/v5/database/schema.md#Overview\\n - reference/v5/database/schema.md#Type Directives\\n - reference/v5/database/schema.md#Field Directives\\n sourceCommit: b7fbddadd42eb4487190b650a9abc4bcfeef5819\\n inputHash: 4faa3baed7cfa854\\n---\\n\\n# Schema Design and Tooling\\n\\nInstructions for the agent to follow when designing Harper schemas, applying core directives, and configuring GraphQL tooling.\\n\\n## When to Use\\n\\nApply this rule when creating or modifying Harper schema files, configuring `graphqlSchema` in `config.yaml`, or deciding which directives to apply to tables and fields. Use it any time a component needs tables, indexes, primary keys, or exported endpoints defined.\\n\\n## How It Works\\n\\n1. **Create a GraphQL schema file** with Harper-specific directives. Name it (e.g., `schema.graphql`) and place it in your component directory.\\n\\n ```graphql\\n type Dog @table {\\n \\tid: Long @primaryKey\\n \\tname: String\\n \\tbreed: String\\n \\tage: Int\\n }\\n\\n type Breed @table {\\n \\tid: Long @primaryKey\\n \\tname: String @indexed\\n }\\n ```\\n\\n2. **Register the schema in `config.yaml`** using the `graphqlSchema` plugin key:\\n\\n ```yaml\\n graphqlSchema:\\n files: 'schema.graphql'\\n ```\\n\\n Both plugins and applications can specify schemas this way.\\n\\n3. **Mark every table type with `@table`**. The type name becomes the table name by default. Use optional arguments to override behavior:\\n\\n | Argument | Type | Default | Description |\\n | -------------- | --------- | ----------------------------- | ------------------------------------------------------------- |\\n | `table` | `String` | type name | Override the table name |\\n | `database` | `String` | `\\\"data\\\"` | Database to place the table in |\\n | `expiration` | `Int` | — | Seconds until a record goes stale |\\n | `eviction` | `Int` | `0` | Additional seconds after `expiration` before physical removal |\\n | `scanInterval` | `Int` | `(expiration + eviction) / 4` | Seconds between eviction scans |\\n | `replicate` | `Boolean` | `true` | Enable replication of this table |\\n\\n4. **Designate a primary key on every table** using `@primaryKey`. Primary keys must be unique; duplicate-key inserts are rejected. If no key is provided on insert, Harper auto-generates one:\\n - `String` or `ID` → UUID string\\n - `Int`, `Long`, or `Any` → auto-incrementing integer\\n\\n Prefer `Long` or `Any` for auto-generated numeric keys; `Int` is 32-bit and may be insufficient for large tables.\\n\\n5. **Index fields that need fast querying** with `@indexed`. This is required for filtering by that attribute in REST queries, SQL, or NoSQL operations. If the field value is an array, each element is individually indexed.\\n\\n ```graphql\\n type Product @table {\\n \\tid: Long @primaryKey\\n \\tcategory: String @indexed\\n \\tprice: Float @indexed\\n }\\n ```\\n\\n6. **Expose a table as an external resource endpoint** with `@export`. This makes the table accessible via REST, MQTT, and other interfaces. The optional `name` parameter sets the URL path segment; without it, the type name is used.\\n\\n ```graphql\\n type MyTable @table @export(name: \\\"my-table\\\") {\\n \\tid: Long @primaryKey\\n }\\n ```\\n\\n7. **Restrict extra properties** with `@sealed` when records must not include attributes beyond those declared. By default, Harper allows additional properties.\\n\\n ```graphql\\n type StrictRecord @table @sealed {\\n \\tid: Long @primaryKey\\n \\tname: String\\n }\\n ```\\n\\n8. **Configure expiration, eviction, and scan behavior** together when building caching tables. These three arguments control the full record lifecycle:\\n - `expiration` — record becomes stale; next request triggers a source fetch\\n - `eviction` — additional time after `expiration` before physical removal\\n - `scanInterval` — how often Harper scans for records to evict; clock-aligned, not startup-aligned\\n\\n## Examples\\n\\n**Caching table with tuned expiration:**\\n\\n```graphql\\n# Expire after 5 minutes, evict after 1 hour, scan every 10 minutes\\ntype WeatherCache @table(expiration: 300, eviction: 3300, scanInterval: 600) {\\n\\tid: ID @primaryKey\\n\\ttemperature: Float\\n}\\n```\\n\\n**Table in a named database with expiration and an indexed field:**\\n\\n```graphql\\ntype Event @table(database: \\\"analytics\\\", expiration: 86400) {\\n\\tid: Long @primaryKey\\n\\tname: String @indexed\\n}\\n```\\n\\n**Session cache with auto-expiry:**\\n\\n```graphql\\ntype Session @table(expiration: 3600) {\\n\\tid: Long @primaryKey\\n\\tuserId: String\\n}\\n```\\n\\n**Table with audit timestamps:**\\n\\n```graphql\\ntype Order @table @export(name: \\\"orders\\\") {\\n\\tid: Long @primaryKey\\n\\tcreatedAt: Long @createdTime\\n\\tupdatedAt: Long @updatedTime\\n\\tstatus: String @indexed\\n}\\n```\\n\\n**Overriding the table name and disabling replication:**\\n\\n```graphql\\ntype Product @table(table: \\\"products\\\") {\\n\\tid: Long @primaryKey\\n\\tname: String\\n}\\n\\ntype LocalRecord @table(replicate: false) {\\n\\tid: Long @primaryKey\\n\\tvalue: String\\n}\\n```\\n\\n## Notes\\n\\n- Use unique `database` names in plugins and applications to avoid table naming collisions, since all tables default to the `\\\"data\\\"` database.\\n- Eviction removes non-indexed record data but does **not** remove a record from its secondary indexes. Indexes remain functional for evicted records; Harper fetches the full record from the source on demand when a query matches an evicted record.\\n- `scanInterval` is clock-aligned to the server's local timezone. The server's startup time does not affect when eviction runs.\\n- If replication is disabled on a table and later re-enabled, it will not catch up on writes made while replication was disabled.\\n- Null values are indexed by `@indexed` fields, enabling queries such as `GET /Product/?category=null`.\\n\",\n\t\"serving-web-content\": \"---\\nname: serving-web-content\\ndescription: How to serve static files and integrated Vite/React applications in Harper.\\nmetadata:\\n mode: synthesized\\n---\\n\\n# Serving Web Content\\n\\nInstructions for the agent to follow when serving web content from Harper.\\n\\n## When to Use\\n\\nUse this skill when you need to serve a frontend (HTML, CSS, JS, or a React app) directly from your Harper instance.\\n\\n## How It Works\\n\\n1. **Choose a Method**: Decide between the simple Static Plugin or the integrated Vite Plugin.\\n2. **Option A: Static Plugin (Simple)**:\\n - Add to `config.yaml`:\\n ```yaml\\n static:\\n files: 'web/*'\\n ```\\n - Place files in a `web/` folder in the project root.\\n - Files are served at the root URL (e.g., `http://localhost:9926/index.html`).\\n3. **Option B: Vite Plugin (Advanced/Development)**:\\n - Add to `config.yaml`:\\n ```yaml\\n '@harperfast/vite-plugin':\\n package: '@harperfast/vite-plugin'\\n ```\\n - Ensure `vite.config.ts` and `index.html` are in the project root.\\n\\n ```javascript\\n import vue from '@vitejs/plugin-vue';\\n import path from 'node:path';\\n import { defineConfig } from 'vite';\\n\\n // https://vite.dev/config/\\n export default defineConfig({\\n \\tplugins: [vue()],\\n \\tresolve: {\\n \\t\\talias: {\\n \\t\\t\\t'@': path.resolve(import.meta.dirname, './src'),\\n \\t\\t},\\n \\t},\\n \\tbuild: {\\n \\t\\toutDir: 'web',\\n \\t\\temptyOutDir: true,\\n \\t\\trolldownOptions: {\\n \\t\\t\\texternal: ['**/*.test.*', '**/*.spec.*'],\\n \\t\\t},\\n \\t},\\n });\\n ```\\n\\n - Install dependencies: `npm install --save-dev vite @harperfast/vite-plugin`.\\n - Then `harper run .` will start up Harper and Vite with HMR. Vite does _not_ need to be executed separately.\\n\\n4. **Deploy for Production**: For Vite apps, use a build script to generate static files into a `web/` folder and deploy them using the static handler pattern. For example, these scripts in a package.json can perform the necessary steps:\\n ```json\\n \\\"build\\\": \\\"vite build\\\",\\n \\\"deploy\\\": \\\"rm -Rf deploy && npm run build && mkdir deploy && mv web deploy/ && cp -R deploy-template/* deploy/ && cp -R schemas resources deploy/ && (cd deploy && harper deploy_component . project=web restart=rolling replicated=true) && rm -Rf deploy\\\",\\n ```\\n Then in production, the \\\"Static Plugin\\\" option will performantly and securely serve your assets. `npm create harper@latest` scaffolds all of this for you.\\n\",\n\t\"typescript-type-stripping\": \"---\\nname: typescript-type-stripping\\ndescription: How to run TypeScript files directly in Harper without a build step.\\nmetadata:\\n mode: generate\\n sources:\\n - reference/v5/components/javascript-environment.md#TypeScript Support\\n sourceCommit: b7fbddadd42eb4487190b650a9abc4bcfeef5819\\n inputHash: 4e6bd8b610edd595\\n---\\n\\n# TypeScript Type Stripping in Harper\\n\\nInstructions for the agent to run `.ts` files directly in Harper without a build step using Node.js's built-in type stripping.\\n\\n## When to Use\\n\\nApply this rule when writing Harper resource files in TypeScript. Use it any time you need to reference `.ts` source files from `config.yaml` or import between local TypeScript modules in a Harper project.\\n\\n## How It Works\\n\\n1. **Ensure Node.js version**: Require Node.js 22.6 or later. Type stripping is unavailable on earlier versions.\\n\\n2. **Point `jsResource` at `.ts` files**: The `jsResource` plugin loads both `.js` and `.ts` files. Set its `files` glob in `config.yaml` to target your `.ts` source files:\\n\\n ```yaml\\n jsResource:\\n files: 'resources/*.ts'\\n ```\\n\\n3. **Use explicit `.ts` extensions in local imports**: Node's loader does not resolve `'./helper'` to `'./helper.ts'`, so always include the full extension:\\n\\n ```typescript\\n import { helper } from './helper.ts';\\n ```\\n\\n4. **Stay within type-stripping limits**: Only type annotations and declarations are removed. Do not use enums with runtime values, namespaces with runtime semantics, or any other features that require code transformation beyond type stripping.\\n\\n## Examples\\n\\nA complete Harper resource written in TypeScript, using imports from the `harper` package:\\n\\n```typescript\\nimport { type RequestTargetOrId, Resource, tables } from 'harper';\\n\\nexport class MyResource extends Resource {\\n\\tasync get(target?: RequestTargetOrId): Promise<{ message: string }> {\\n\\t\\treturn { message: 'Hello from TS' };\\n\\t}\\n}\\n```\\n\\nPaired `config.yaml` entry loading the file via `jsResource`:\\n\\n```yaml\\njsResource:\\n files: 'resources/*.ts'\\n```\\n\\n## Notes\\n\\n- No build step or transpiler is required — Harper runs `.ts` files directly.\\n- Type imports (e.g., `import { type RequestTargetOrId }`) from the `harper` package work as usual.\\n- Unsupported TypeScript features include: enums with runtime values, namespaces with runtime semantics, and anything requiring code transformation beyond simple type stripping.\\n\",\n\t\"using-blob-datatype\": \"---\\nname: using-blob-datatype\\ndescription: How to use the Blob data type for efficient binary storage in Harper.\\nmetadata:\\n mode: synthesized\\n---\\n\\n# Using Blob Datatype\\n\\nInstructions for the agent to follow when working with the Blob data type in Harper.\\n\\n## When to Use\\n\\nUse this skill when you need to store unstructured or large binary data (media, documents) that is too large for standard JSON fields. Blobs provide efficient storage and integrated streaming support.\\n\\n## How It Works\\n\\n1. **Define Blob Fields**: In your GraphQL schema, use the `Blob` type:\\n ```graphql\\n type MyTable @table {\\n \\tid: ID @primaryKey\\n \\tdata: Blob\\n }\\n ```\\n2. **Create and Store Blobs**: Use `createBlob()` from Harper's globals to wrap Buffers or Streams:\\n ```javascript\\n import { tables } from 'harper';\\n const blob = createBlob(largeBuffer);\\n await tables.MyTable.put('my-id', { data: blob });\\n ```\\n3. **Use Streaming (Optional)**: For very large files, pass a stream to `createBlob()` to avoid loading the entire file into memory.\\n4. **Read Blob Data**: Retrieve the record and use `.bytes()` or streaming interfaces on the blob field:\\n ```javascript\\n const record = await tables.MyTable.get('my-id');\\n const buffer = await record.data.bytes();\\n ```\\n5. **Ensure Write Completion**: Use `saveBeforeCommit: true` in `createBlob` options if you need the blob fully written before the record is committed.\\n6. **Handle Errors**: Attach error listeners to the blob object to handle streaming failures.\\n\",\n\t\"vector-indexing\": \"---\\nname: vector-indexing\\ndescription: How to enable and query vector indexes for similarity search in Harper.\\nmetadata:\\n mode: generate\\n sources:\\n - reference/v5/database/schema.md#Vector Indexing\\n sourceCommit: b7fbddadd42eb4487190b650a9abc4bcfeef5819\\n inputHash: 3732961c671aac00\\n---\\n\\n# Vector Indexing\\n\\nInstructions for the agent to follow when enabling and querying vector indexes for similarity search in Harper using the HNSW algorithm.\\n\\n## When to Use\\n\\nApply this rule when adding a vector index to a Harper table schema or writing similarity search queries against high-dimensional vector fields. Use it whenever you need approximate nearest-neighbor search, distance-threshold filtering, or distance-scored results.\\n\\n## How It Works\\n\\n1. **Declare the vector index on a `[Float]` field**: Add `@indexed(type: \\\"HNSW\\\")` to any `[Float]` attribute in a `@table` type. See [adding-tables-with-schemas.md](adding-tables-with-schemas.md) for general schema setup.\\n\\n ```graphql\\n type Document @table {\\n \\tid: Long @primaryKey\\n \\ttextEmbeddings: [Float] @indexed(type: \\\"HNSW\\\")\\n }\\n ```\\n\\n2. **Query by nearest neighbors using `sort`**: Call `Document.search()` with a `sort` object containing `attribute` (the indexed field name) and `target` (the query vector). Include `limit` to cap results.\\n\\n ```javascript\\n let results = Document.search({\\n \\tsort: { attribute: 'textEmbeddings', target: searchVector },\\n \\tlimit: 5,\\n });\\n ```\\n\\n3. **Combine with filter conditions**: Add a `conditions` array alongside `sort` to pre-filter records before ranking by similarity.\\n\\n ```javascript\\n let results = Document.search({\\n \\tconditions: [{ attribute: 'price', comparator: 'lt', value: 50 }],\\n \\tsort: { attribute: 'textEmbeddings', target: searchVector },\\n \\tlimit: 5,\\n });\\n ```\\n\\n4. **Filter by distance threshold**: To return only records within a similarity cutoff (without ranking), place `target` directly on the condition alongside `comparator` and `value`. Omit `sort`.\\n\\n ```javascript\\n let results = Document.search({\\n \\tconditions: {\\n \\t\\tattribute: 'textEmbeddings',\\n \\t\\tcomparator: 'lt',\\n \\t\\tvalue: 0.1,\\n \\t\\ttarget: searchVector,\\n \\t},\\n });\\n ```\\n\\n5. **Include computed distance in results**: Use the special `$distance` field in `select` to return the distance from the target vector. Works with both `sort`-based and `conditions`-based queries.\\n\\n ```javascript\\n let results = Document.search({\\n \\tselect: ['name', '$distance'],\\n \\tsort: { attribute: 'textEmbeddings', target: searchVector },\\n \\tlimit: 5,\\n });\\n ```\\n\\n6. **Tune HNSW parameters**: Pass additional parameters to `@indexed(type: \\\"HNSW\\\", ...)` to control index quality and performance.\\n\\n | Parameter | Default | Description |\\n | ---------------------- | ----------------- | --------------------------------------------------------------------------------------------------- |\\n | `distance` | `\\\"cosine\\\"` | Distance function: `\\\"euclidean\\\"` or `\\\"cosine\\\"` (negative cosine similarity) |\\n | `efConstruction` | `100` | Max nodes explored during index construction. Higher = better recall, lower = better performance |\\n | `M` | `16` | Preferred connections per graph layer. Higher = more space, better recall for high-dimensional data |\\n | `optimizeRouting` | `0.5` | Heuristic aggressiveness for omitting redundant connections (0 = off, 1 = most aggressive) |\\n | `mL` | computed from `M` | Normalization factor for level generation |\\n | `efSearchConstruction` | `50` | Max nodes explored during search |\\n\\n## Examples\\n\\n**Schema with custom HNSW parameters:**\\n\\n```graphql\\ntype Document @table {\\n\\tid: Long @primaryKey\\n\\ttextEmbeddings: [Float]\\n\\t\\t@indexed(type: \\\"HNSW\\\", distance: \\\"euclidean\\\", optimizeRouting: 0, efSearchConstruction: 100)\\n}\\n```\\n\\n**Nearest-neighbor search with distance score:**\\n\\n```javascript\\nlet results = Document.search({\\n\\tselect: ['name', '$distance'],\\n\\tsort: { attribute: 'textEmbeddings', target: searchVector },\\n\\tlimit: 5,\\n});\\n```\\n\\n**Distance-threshold filter (no ranking):**\\n\\n```javascript\\nlet results = Document.search({\\n\\tconditions: {\\n\\t\\tattribute: 'textEmbeddings',\\n\\t\\tcomparator: 'lt',\\n\\t\\tvalue: 0.1,\\n\\t\\ttarget: searchVector,\\n\\t},\\n});\\n```\\n\\n## Notes\\n\\n- The default `distance` function is `cosine`. Pass `distance: \\\"euclidean\\\"` to switch.\\n- `efConstruction` controls index build quality; raising it improves recall at the cost of build time.\\n- `$distance` is available in both `sort`-based ranking and `conditions`-based threshold queries.\\n- Use the threshold (`conditions` + `target`) form when you want to bound result quality by a similarity cutoff rather than ranking by similarity.\\n\"\n};\n\n/**\n * The content of the Harper Best Practices SKILL.md.\n */\nexport const skillSummary = \"---\\nname: harper-best-practices\\ndescription: Best practices for building Harper applications, covering schema definition,\\n automatic APIs, authentication, custom resources, and data handling.\\n Triggers on tasks involving Harper database design, API implementation,\\n and deployment.\\nlicense: Apache-2.0\\nmetadata:\\n author: harper\\n version: '1.0.0'\\n---\\n\\n# Harper Best Practices\\n\\nGuidelines for building scalable, secure, and performant applications on Harper. These practices cover everything from initial schema design to advanced deployment strategies.\\n\\n## When to Use\\n\\nReference these guidelines when:\\n\\n- Defining or modifying database schemas\\n- Implementing or extending REST/WebSocket APIs\\n- Handling authentication and session management\\n- Working with custom resources and extensions\\n- Optimizing data storage and retrieval (Blobs, Vector Indexing)\\n- Deploying applications to Harper Fabric\\n\\n## How It Works\\n\\n1. Review the requirements for the task (schema design, API needs, or infrastructure setup).\\n2. Consult the relevant category under \\\"Rule Categories by Priority\\\" to understand the impact of your decisions.\\n3. Apply specific rules from the \\\"Quick Reference\\\" section below by reading their detailed rule files.\\n4. If you're building a new table, prioritize the `schema-` rules.\\n5. If you're extending functionality, consult the `logic-` and `api-` rules.\\n6. Validate your implementation against the `ops-` rules before deployment.\\n\\n## Examples\\n\\nSee the concrete examples embedded in each rule subsection below (GraphQL schemas, REST query patterns, and deployment workflow snippets).\\n\\n<!-- BEGIN GENERATED INDEX -->\\n\\n## Rule Categories by Priority\\n\\n| Priority | Category | Impact | Prefix |\\n| -------- | -------------------- | ------ | --------- |\\n| 1 | Schema & Data Design | HIGH | `schema-` |\\n| 2 | API & Communication | HIGH | `api-` |\\n| 3 | Logic & Extension | MEDIUM | `logic-` |\\n| 4 | Infrastructure & Ops | MEDIUM | `ops-` |\\n\\n## Quick Reference\\n\\n### 1. Schema & Data Design (HIGH)\\n\\n- `adding-tables-with-schemas` — Guidelines for adding tables to a Harper database using GraphQL schemas.\\n- `schema-design-tooling` — Best practices for Harper schema design, including core directives and GraphQL tooling configuration.\\n- `defining-relationships` — How to define and use relationships between tables in Harper using GraphQL.\\n- `vector-indexing` — How to enable and query vector indexes for similarity search in Harper.\\n- `using-blob-datatype` — How to use the Blob data type for efficient binary storage in Harper.\\n- `handling-binary-data` — How to store and serve binary data like images or audio in Harper.\\n\\n### 2. API & Communication (HIGH)\\n\\n- `automatic-apis` — How to use Harper's automatically generated REST and WebSocket APIs.\\n- `querying-rest-apis` — How to use query parameters to filter, sort, and paginate Harper REST APIs.\\n- `real-time-apps` — How to build real-time features in Harper using WebSockets and Pub/Sub.\\n- `checking-authentication` — How to handle user authentication and sessions in Harper Resources.\\n\\n### 3. Logic & Extension (MEDIUM)\\n\\n- `custom-resources` — How to define custom REST endpoints with JavaScript or TypeScript in Harper.\\n- `extending-tables` — How to add custom logic to automatically generated table resources in Harper.\\n- `programmatic-table-requests` — How to interact with Harper tables programmatically using the `tables` object.\\n- `typescript-type-stripping` — How to run TypeScript files directly in Harper without a build step.\\n- `caching` — How to implement integrated data caching in Harper from external sources.\\n\\n### 4. Infrastructure & Ops (MEDIUM)\\n\\n- `deploying-to-harper-fabric` — How to deploy a Harper application to the Harper Fabric cloud.\\n- `creating-a-fabric-account-and-cluster` — How to create a Harper Fabric account, organization, and cluster.\\n- `creating-harper-apps` — How to initialize a new Harper application using the CLI.\\n- `serving-web-content` — How to serve static files and integrated Vite/React applications in Harper.\\n- `logging` — Best practices for logging in Harper, including console capture, the granular logger interface, and programmatic log retrieval.\\n- `load-env` — How to load environment variables from .env files into a Harper application using the loadEnv plugin.\\n\\n<!-- END GENERATED INDEX -->\\n\\n## How to Use\\n\\nRead individual rule files for detailed explanations and code examples:\\n\\n```\\nrules/adding-tables-with-schemas.md\\nrules/schema-design-tooling.md\\nrules/automatic-apis.md\\nrules/creating-harper-apps.md\\nrules/logging.md\\n```\\n\\n## Full Compiled Document\\n\\nFor the complete guide with all rules expanded: `AGENTS.md`\\n\";\n","import { ruleNames } from '@harperfast/skills';\nimport { z } from 'zod';\nexport const inputSchema = z.object({\n skill: z.enum(ruleNames),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'readHarperSkill',\n description: 'Returns documentation for a Harper skill or best practice. Skills provide guidance on developing' +\n ' Harper applications.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { inputSchema } from '@harperfast/agent-tools/tools/readHarperSkill/inputSchema';\nimport { rules } from '@harperfast/skills';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { skill } }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\treturn {\n\t\tsuccess: !!rules[skill],\n\t\tmessage: rules[skill] || `No skill found with the name ${skill}`,\n\t};\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/readHarperSkill/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/readHarperSkill/serverSchema';\nimport { BookIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const readHarperSkill: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: BookIcon,\n\texecute,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n log_name: z.enum(['hdb.log', 'system.log']).default('hdb.log'),\n limit: z.string().or(z.null()).optional(),\n level: z\n .enum(['notify', 'error', 'warn', 'info', 'debug', 'trace', 'undefined'])\n .or(z.null())\n .optional(),\n from: z.string().or(z.null()).optional(),\n until: z.string().or(z.null()).optional(),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'readLogs',\n description: 'Returns the matching logs from the server.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { getReadLog } from '@/integrations/api/instance/status/getReadLog';\nimport { inputSchema } from '@harperfast/agent-tools/tools/readLogs/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input, instanceClientParams }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst data = await getReadLog({\n\t\t\t...instanceClientParams,\n\t\t\tlogFilters: input,\n\t\t\treplicated: instanceClientParams.entityType === 'cluster',\n\t\t});\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/readLogs/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/readLogs/serverSchema';\nimport { LogsIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const readLogs: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: LogsIcon,\n\texecute,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n database: z.string().trim(),\n table: z.string().trim(),\n pageIndex: z.number().default(0),\n pageSize: z.number().default(10),\n primaryKey: z.string(),\n conditions: z.array(z.object({\n search_attribute: z.string(),\n search_type: z.enum([\n 'between',\n 'eq',\n 'equals',\n 'greater_than',\n 'greater_than_equal',\n 'less_than',\n 'less_than_equal',\n 'ne',\n 'not_equal',\n 'starts_with',\n ]),\n search_value: z.any(),\n })),\n sort: z.object({\n attribute: z.string(),\n descending: z.boolean(),\n }),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'readTableRecords',\n description: 'Retrieves some or all table records from a database on the server.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { getSearchByConditions } from '@/integrations/api/instance/database/getSearchByConditions';\nimport { getSearchByValue } from '@/integrations/api/instance/database/getSearchByValue';\nimport { inputSchema } from '@harperfast/agent-tools/tools/readTableRecords/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { database, table, conditions, primaryKey, ...otherParams }, instanceClientParams }: ExecuteParams<\n\t\tz.infer<typeof inputSchema>\n\t>,\n): Promise<Output> {\n\ttry {\n\t\tif (!conditions.length) {\n\t\t\tconst { data } = await getSearchByValue({\n\t\t\t\t...instanceClientParams,\n\t\t\t\tdatabaseName: database,\n\t\t\t\ttableName: table,\n\t\t\t\tonlyIfCached: true,\n\t\t\t\tsearchAttribute: primaryKey,\n\t\t\t\t...otherParams,\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tdata,\n\t\t\t};\n\t\t}\n\t\tconst { data } = await getSearchByConditions({\n\t\t\t...instanceClientParams,\n\t\t\tdatabaseName: database,\n\t\t\ttableName: table,\n\t\t\tonlyIfCached: true,\n\t\t\tconditions,\n\t\t\t...otherParams,\n\t\t});\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/readTableRecords/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/readTableRecords/serverSchema';\nimport { SearchIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const readTableRecords: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: SearchIcon,\n\texecute,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'restartHTTPService',\n description: 'Restarts the HTTP service on the server to allow schema and resource changes to be applied.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { restartInstance } from '@/integrations/api/instance/status/restartInstance';\nimport { inputSchema } from '@harperfast/agent-tools/tools/restartHTTPService/inputSchema';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ instanceClientParams, baseURL }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\tconst toastId = toast.loading(`Restarting HTTP service...`, {\n\t\tdescription: 'This may take a bit.',\n\t\tduration: 300_000,\n\t});\n\n\ttry {\n\t\tawait restartInstance({\n\t\t\t...instanceClientParams,\n\t\t\toperation: 'restart_service',\n\t\t\treplicated: instanceClientParams.entityType === 'cluster',\n\t\t});\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n\n\ttoast.success(`Done!`, {\n\t\tdescription: `HTTP Service restarted!`,\n\t\tid: toastId,\n\t\tduration: 5_000,\n\t});\n\n\treturn {\n\t\tsuccess: true,\n\t\tmessage: `HTTP Service restarted!`,\n\t\twebURL: baseURL,\n\t};\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/restartHTTPService/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/restartHTTPService/serverSchema';\nimport { RefreshCwIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const restartHTTPService: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: RefreshCwIcon,\n\texecute,\n\trequiresApproval: true,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n path: z.string().trim(),\n payload: z.string(),\n encoding: z.enum(['utf8', 'ASCII', 'binary', 'hex', 'base64', 'utf16le', 'latin1', 'ucs2']),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'setComponentFile',\n description: 'Returns the contents of a component file by its full path (which was returned by getComponents)',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { setComponentFile } from '@/integrations/api/instance/applications/setComponentFile';\nimport { emitToListeners } from '@/lib/events/listener';\nimport { queryClient } from '@/react-query/queryClient';\nimport { inputSchema } from '@harperfast/agent-tools/tools/setComponentFile/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { path, encoding, payload }, instanceClientParams }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst parts = path.split('/');\n\t\tconst project = parts.shift()!;\n\t\tconst file = parts.join('/');\n\t\tconst data = await setComponentFile({ ...instanceClientParams, file, project, payload, encoding });\n\n\t\tawait queryClient.invalidateQueries({\n\t\t\tqueryKey: [instanceClientParams.entityId, 'get_component_file', project, file],\n\t\t});\n\t\temitToListeners('ReloadApplicationRootEntries', true);\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/setComponentFile/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/setComponentFile/serverSchema';\nimport { FilePenIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const setComponentFile: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: FilePenIcon,\n\texecute,\n\trequiresApproval: true,\n};\n","import { z } from 'zod';\nexport const inputSchema = z.object({\n database: z.string().trim(),\n table: z.string().trim(),\n records: z.array(z.any()),\n});\n//# sourceMappingURL=inputSchema.js.map","import { z } from 'zod';\nimport { inputSchema } from './inputSchema.js';\nexport const serverSchema = {\n name: 'updateTableRecords',\n description: 'Updates records in a particular table in a particular database on the server.',\n inputSchema,\n};\n//# sourceMappingURL=serverSchema.js.map","import { updateTableRecords } from '@/integrations/api/instance/database/updateTableRecords';\nimport { queryClient } from '@/react-query/queryClient';\nimport { inputSchema } from '@harperfast/agent-tools/tools/updateTableRecords/inputSchema';\nimport { z } from 'zod';\nimport { ExecuteParams } from '../../types/executeParams';\nimport { Output } from './output';\n\nexport async function execute(\n\t{ input: { database, table, records }, instanceClientParams, params }: ExecuteParams<z.infer<typeof inputSchema>>,\n): Promise<Output> {\n\ttry {\n\t\tconst data = await updateTableRecords({\n\t\t\t...instanceClientParams,\n\t\t\tdatabaseName: database,\n\t\t\ttableName: table,\n\t\t\trecords,\n\t\t});\n\t\tconst { databaseName, tableName } = params;\n\t\tawait queryClient.invalidateQueries({ queryKey: [instanceClientParams.entityId, databaseName, tableName] });\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Error: ${err}`,\n\t\t};\n\t}\n}\n","import { inputSchema } from '@harperfast/agent-tools/tools/updateTableRecords/inputSchema';\nimport { serverSchema } from '@harperfast/agent-tools/tools/updateTableRecords/serverSchema';\nimport { BetweenHorizonalStartIcon } from 'lucide-react';\nimport { z } from 'zod';\nimport type { ClientSideTool } from '../../types/clientSideTool';\nimport { execute } from './execute';\nimport { Output } from './output';\n\nexport const updateTableRecords: ClientSideTool<z.infer<typeof inputSchema>, Output> = {\n\t...serverSchema,\n\ticon: BetweenHorizonalStartIcon,\n\texecute,\n\trequiresApproval: true,\n};\n","import { ToolNames } from '@harperfast/agent-tools/types/toolNames';\nimport type { ClientSideTool } from '../types/clientSideTool';\nimport { collectFeedback } from './collectFeedback/clientTool';\nimport { createApp } from './createApp/clientTool';\nimport { deleteTableRecords } from './deleteTableRecords/clientTool';\nimport { dropComponentFile } from './dropComponentFile/clientTool';\nimport { getAnalytics } from './getAnalytics/clientTool';\nimport { getComponentFile } from './getComponentFile/clientTool';\nimport { getComponents } from './getComponents/clientTool';\nimport { getDescribeAll } from './getDescribeAll/clientTool';\nimport { getDescribeTable } from './getDescribeTable/clientTool';\nimport { getUserContext } from './getUserContext/clientTool';\nimport { insertTableRecords } from './insertTableRecords/clientTool';\nimport { listAnalyticsMetrics } from './listAnalyticsMetrics/clientTool';\nimport { readHarperSkill } from './readHarperSkill/clientTool';\nimport { readLogs } from './readLogs/clientTool';\nimport { readTableRecords } from './readTableRecords/clientTool';\nimport { restartHTTPService } from './restartHTTPService/clientTool';\nimport { setComponentFile } from './setComponentFile/clientTool';\nimport { updateTableRecords } from './updateTableRecords/clientTool';\n\nconst clientTools: Record<ToolNames, ClientSideTool> = {\n\t// Application management.\n\treadHarperSkill,\n\tcreateApp,\n\treadLogs,\n\tgetAnalytics,\n\tlistAnalyticsMetrics,\n\trestartHTTPService,\n\tcollectFeedback,\n\tgetUserContext,\n\t// File manipulation.\n\tgetComponentFile,\n\tgetComponents,\n\tsetComponentFile,\n\tdropComponentFile,\n\t// Database interaction.\n\tgetDescribeAll,\n\tgetDescribeTable,\n\tinsertTableRecords,\n\treadTableRecords,\n\tupdateTableRecords,\n\tdeleteTableRecords,\n};\n\nexport function getTool(name: ToolNames | string): ClientSideTool | undefined {\n\treturn clientTools[name as ToolNames];\n}\n","import { Button } from '@/components/ui/button';\nimport type { ToolNames } from '@harperfast/agent-tools/types/toolNames';\nimport { type DynamicToolUIPart, getToolName, type ToolUIPart } from 'ai';\nimport { Check, ChevronDown, ChevronUp, Info, Loader2, XCircle } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { getTool } from '../tools/clientTools';\n\ninterface ToolInvocationProps {\n\tpart: ToolUIPart | DynamicToolUIPart;\n\tonApprove?: (toolCallId: string) => void;\n\tonDeny?: (toolCallId: string) => void;\n\tonAlwaysApprove?: (toolCallId: string) => void;\n\tisApproving?: boolean;\n}\n\nexport function ToolInvocation({ part, onApprove, onDeny, onAlwaysApprove, isApproving }: ToolInvocationProps) {\n\tconst [isInputExpanded, setIsInputExpanded] = useState(false);\n\tconst [isOutputExpanded, setIsOutputExpanded] = useState(false);\n\tconst toolName = getToolName(part) as ToolNames;\n\tconst tool = getTool(toolName);\n\tconst Icon = tool?.icon || Info;\n\tconst requiresApproval = tool?.requiresApproval;\n\tconst isInputEmpty = useMemo(() => {\n\t\tif (!part.input) { return true; }\n\t\tif (typeof part.input !== 'object') { return false; }\n\t\treturn Object.keys(part.input).length === 0;\n\t}, [part.input]);\n\tconst input = useMemo(() => {\n\t\tconst json = JSON.stringify(part.input, null, '\\t');\n\t\treturn { json, lines: json ? json.split('\\n').length : 0 };\n\t}, [part.input]);\n\tconst output = useMemo(() => {\n\t\tconst json = JSON.stringify(part.output, null, '\\t');\n\t\treturn { json, lines: json ? json.split('\\n').length : 0 };\n\t}, [part.output]);\n\n\treturn (\n\t\t<div className={`tool-invocation ${part.state}`}>\n\t\t\t<div className=\"tool-info\">\n\t\t\t\t<div className=\"tool-name\">\n\t\t\t\t\t<Icon size={14} />\n\t\t\t\t\t<span>{toolName}</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"tool-status\">\n\t\t\t\t\t{part.state === 'input-streaming' && 'Thinking...'}\n\t\t\t\t\t{part.state === 'input-available'\n\t\t\t\t\t\t&& (isApproving ? 'Executing...' : (requiresApproval ? 'Awaiting Approval...' : 'Executing...'))}\n\t\t\t\t\t{part.state === 'output-available'\n\t\t\t\t\t\t&& ((part.output as any)?.error ? <XCircle size={14} className=\"text-destructive\" /> : <Check size={14} />)}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{part.state !== 'input-streaming' && (\n\t\t\t\t<div className=\"tool-io\">\n\t\t\t\t\t{!isInputEmpty && (\n\t\t\t\t\t\t<div className=\"tool-args\">\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-between gap-2 mb-1\">\n\t\t\t\t\t\t\t\t<strong>Input:</strong>\n\t\t\t\t\t\t\t\t{input.lines > 3 && (\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-6 px-2 text-[10px] uppercase tracking-wider text-muted-foreground hover:text-foreground\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => setIsInputExpanded(!isInputExpanded)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{isInputExpanded\n\t\t\t\t\t\t\t\t\t\t\t? (\n\t\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ChevronUp size={12} />\n\t\t\t\t\t\t\t\t\t\t\t\t\tHide\n\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t: (\n\t\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ChevronDown size={12} />\n\t\t\t\t\t\t\t\t\t\t\t\t\tShow\n\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={isInputExpanded ? 'whitespace-pre-wrap' : 'line-clamp-3 overflow-hidden whitespace-pre-wrap'}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{input.json}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{part.state === 'input-available' && requiresApproval && (\n\t\t\t\t\t\t<div className=\"flex gap-2 mt-3 pt-3 border-t\">\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tclassName=\"h-8 text-xs bg-green-600 hover:bg-green-700 text-white\"\n\t\t\t\t\t\t\t\tonClick={() => onApprove?.(part.toolCallId)}\n\t\t\t\t\t\t\t\tdisabled={isApproving}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isApproving ? <Loader2 className=\"mr-2 h-3 w-3 animate-spin\" /> : null}\n\t\t\t\t\t\t\t\tApprove\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\tclassName=\"h-8 text-xs\"\n\t\t\t\t\t\t\t\tonClick={() => onAlwaysApprove?.(part.toolCallId)}\n\t\t\t\t\t\t\t\tdisabled={isApproving}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tAlways Approve\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\tclassName=\"h-8 text-xs\"\n\t\t\t\t\t\t\t\tonClick={() => onDeny?.(part.toolCallId)}\n\t\t\t\t\t\t\t\tdisabled={isApproving}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tDeny\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{part.state === 'output-available' && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{tool?.render\n\t\t\t\t\t\t\t\t? (\n\t\t\t\t\t\t\t\t\ttool.render(part as any)\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: (\n\t\t\t\t\t\t\t\t\t<div className=\"tool-result\">\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-between gap-2 mb-1\">\n\t\t\t\t\t\t\t\t\t\t\t<strong>Result:</strong>\n\t\t\t\t\t\t\t\t\t\t\t{output.lines > 3 && (\n\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-6 px-2 text-[10px] uppercase tracking-wider text-muted-foreground hover:text-foreground\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => setIsOutputExpanded(!isOutputExpanded)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{isOutputExpanded\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ChevronUp size={12} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHide\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ChevronDown size={12} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tShow\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName={isOutputExpanded\n\t\t\t\t\t\t\t\t\t\t\t\t? 'whitespace-pre-wrap'\n\t\t\t\t\t\t\t\t\t\t\t\t: 'line-clamp-3 overflow-hidden whitespace-pre-wrap'}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{output.json}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { isTextUIPart, isToolUIPart, type UIMessage } from 'ai';\nimport { Bot, User } from 'lucide-react';\nimport { motion } from 'motion/react';\nimport { ToolInvocation } from './ToolInvocation';\n\ninterface MessageBubbleProps {\n\tmessage: UIMessage;\n\tonApprove?: (toolCallId: string) => void;\n\tonDeny?: (toolCallId: string) => void;\n\tonAlwaysApprove?: (toolCallId: string) => void;\n\tapprovingToolCallIds?: Set<string>;\n}\n\nexport function MessageBubble(\n\t{ message: m, onApprove, onDeny, onAlwaysApprove, approvingToolCallIds }: MessageBubbleProps,\n) {\n\treturn (\n\t\t<motion.div\n\t\t\tkey={m.id}\n\t\t\tinitial={{ opacity: 0, y: 10 }}\n\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\tclassName={`message-bubble ${m.role === 'user' ? 'user' : 'assistant'}`}\n\t\t>\n\t\t\t<div className=\"avatar\">\n\t\t\t\t{m.role === 'user' ? <User size={18} /> : <Bot size={18} />}\n\t\t\t</div>\n\t\t\t<div className=\"content\">\n\t\t\t\t{m.parts?.map((part, i) => {\n\t\t\t\t\tif (isTextUIPart(part)) {\n\t\t\t\t\t\treturn <div key={i} className=\"text-block\">{part.text}</div>;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isToolUIPart(part)) {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<ToolInvocation\n\t\t\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\t\t\tpart={part}\n\t\t\t\t\t\t\t\tonApprove={onApprove}\n\t\t\t\t\t\t\t\tonDeny={onDeny}\n\t\t\t\t\t\t\t\tonAlwaysApprove={onAlwaysApprove}\n\t\t\t\t\t\t\t\tisApproving={approvingToolCallIds?.has(part.toolCallId)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn null;\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</motion.div>\n\t);\n}\n","import { apiClient } from '@/config/apiClient';\nimport { queryOptions, useQuery } from '@tanstack/react-query';\nimport { useParams } from '@tanstack/react-router';\n\nexport interface ChatUsage {\n\tuserId: string;\n\tyearMonth: string;\n\tusageUSD: number;\n\tmonthlyLimitUSD: number;\n\tusageBarPercent: number;\n}\n\nfunction getChatUsageQueryOptions(orgId: string) {\n\treturn queryOptions({\n\t\tqueryKey: ['getMyUsage', orgId],\n\t\tqueryFn: async (): Promise<ChatUsage> => {\n\t\t\tconst { data } = await apiClient.get(`/Chat/Usage/${orgId}` as any);\n\t\t\treturn data;\n\t\t},\n\t});\n}\n\nexport function useChatUsage() {\n\tconst { organizationId }: { organizationId: string } = useParams({ strict: false });\n\treturn useQuery(getChatUsageQueryOptions(organizationId));\n}\n","import { useChatUsage } from '@/integrations/api/chat/getChatUsage';\n\nexport function UsageBar() {\n\tconst { data, isLoading, error } = useChatUsage();\n\n\tif (isLoading || error || !data) {\n\t\treturn null;\n\t}\n\n\tconst { usageUSD, monthlyLimitUSD, usageBarPercent } = data;\n\n\tconst formatUSD = (amount: number) =>\n\t\tnew Intl.NumberFormat('en-US', {\n\t\t\tstyle: 'currency',\n\t\t\tcurrency: 'USD',\n\t\t}).format(amount);\n\n\treturn (\n\t\t<div className=\"usage-container\">\n\t\t\t<div className=\"usage-info\">\n\t\t\t\t<span>Monthly Org Usage</span>\n\t\t\t\t<span>{formatUSD(usageUSD)} / {formatUSD(monthlyLimitUSD)}</span>\n\t\t\t\t<span>{Math.round(usageBarPercent)}%</span>\n\t\t\t</div>\n\t\t\t<div className=\"usage-bar-bg\">\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"usage-bar-fill\"\n\t\t\t\t\tstyle={{ width: `${usageBarPercent}%` }}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { useEntityRestURL } from '@/config/useEntityRestURL';\nimport { useInstanceClientIdParams } from '@/config/useInstanceClient';\nimport { ClearChat } from '@/features/instance/applications/components/Chat/components/ClearChat';\nimport { useLocalStorage } from '@/hooks/useLocalStorage';\nimport { useSessionStorage } from '@/hooks/useSessionStorage';\nimport { getChatMessages } from '@/integrations/api/chat/getChatMessages';\nimport { getChatTransport } from '@/integrations/api/chat/getChatTransport';\nimport { unique } from '@/lib/arrays/unique';\nimport { LocalStorageKeys } from '@/lib/storage/localStorageKeys';\nimport { useChat } from '@ai-sdk/react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useParams } from '@tanstack/react-router';\nimport { createIdGenerator, lastAssistantMessageIsCompleteWithToolCalls, type ToolCallPart } from 'ai';\nimport { Bot, X } from 'lucide-react';\nimport { SubmitEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { ChatInput } from './components/ChatInput';\nimport { LoadingState } from './components/LoadingState';\nimport { MessageBubble } from './components/MessageBubble';\nimport { UsageBar } from './components/UsageBar';\nimport { getTool } from './tools/clientTools';\nimport './Chat.css';\n\nexport function Chat({ autoFocus, closeChat }: { autoFocus: boolean; closeChat: () => void }) {\n\tconst params = useParams({ strict: false });\n\tconst { organizationId }: { organizationId: string } = params;\n\tconst [input, setInput] = useSessionStorage('ApplicationChat', '');\n\tconst [isLoadingInitial, setIsLoadingInitial] = useState(true);\n\tconst [pendingToolCalls, setPendingToolCalls] = useState<Record<string, ToolCallPart>>({});\n\tconst [approvingToolCallIds, setApprovingToolCallIds] = useState<Set<string>>(new Set());\n\tconst [alwaysApprovedToolsList, setAlwaysApprovedToolsList] = useLocalStorage<string[]>(\n\t\tLocalStorageKeys.ChatAlwaysApprovedTools,\n\t\t[],\n\t);\n\tconst alwaysApprovedTools = new Set(alwaysApprovedToolsList);\n\tconst baseURL = useEntityRestURL();\n\tconst instanceClientParams = useInstanceClientIdParams();\n\tconst queryClient = useQueryClient();\n\tconst { messages, sendMessage, status, addToolOutput, setMessages } = useChat({\n\t\ttransport: getChatTransport(organizationId),\n\t\tgenerateId: createIdGenerator(),\n\t\tsendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCalls,\n\t\tonFinish() {\n\t\t\tvoid queryClient.invalidateQueries({ queryKey: ['getMyUsage'] });\n\t\t},\n\t\tasync onToolCall({ toolCall }) {\n\t\t\t// Check if it's a dynamic tool first for proper type narrowing\n\t\t\tif (toolCall.dynamic) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst tool = getTool(toolCall.toolName);\n\t\t\tif (tool) {\n\t\t\t\tif (tool.requiresApproval && !alwaysApprovedTools.has(toolCall.toolName)) {\n\t\t\t\t\tconst toolCallPart: ToolCallPart = {\n\t\t\t\t\t\ttype: 'tool-call',\n\t\t\t\t\t\ttoolCallId: toolCall.toolCallId,\n\t\t\t\t\t\ttoolName: toolCall.toolName,\n\t\t\t\t\t\tinput: toolCall.input,\n\t\t\t\t\t};\n\t\t\t\t\tsetPendingToolCalls(prev => ({ ...prev, [toolCall.toolCallId]: toolCallPart }));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst output = await tool.execute({ input: toolCall.input, instanceClientParams, baseURL, params });\n\t\t\t\taddToolOutput({\n\t\t\t\t\ttool: toolCall.toolName,\n\t\t\t\t\ttoolCallId: toolCall.toolCallId,\n\t\t\t\t\toutput,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t});\n\n\tconst handleApprove = useCallback(\n\t\tasync (toolCallId: string) => {\n\t\t\tconst toolCall = pendingToolCalls[toolCallId];\n\t\t\tif (!toolCall) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetApprovingToolCallIds(prev => {\n\t\t\t\tconst next = new Set(prev);\n\t\t\t\tnext.add(toolCallId);\n\t\t\t\treturn next;\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\tconst tool = getTool(toolCall.toolName);\n\t\t\t\tif (tool) {\n\t\t\t\t\tconst output = await tool.execute({ input: toolCall.input, instanceClientParams, baseURL, params });\n\t\t\t\t\taddToolOutput({\n\t\t\t\t\t\ttool: toolCall.toolName,\n\t\t\t\t\t\ttoolCallId: toolCall.toolCallId,\n\t\t\t\t\t\toutput,\n\t\t\t\t\t});\n\t\t\t\t\tsetPendingToolCalls(prev => {\n\t\t\t\t\t\tconst next = { ...prev };\n\t\t\t\t\t\tdelete next[toolCallId];\n\t\t\t\t\t\treturn next;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tsetApprovingToolCallIds(prev => {\n\t\t\t\t\tconst next = new Set(prev);\n\t\t\t\t\tnext.delete(toolCallId);\n\t\t\t\t\treturn next;\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[pendingToolCalls, instanceClientParams, baseURL, addToolOutput, params],\n\t);\n\n\tconst handleDeny = useCallback(\n\t\t(toolCallId: string) => {\n\t\t\tconst toolCall = pendingToolCalls[toolCallId];\n\t\t\tif (!toolCall) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\taddToolOutput({\n\t\t\t\ttool: toolCall.toolName,\n\t\t\t\ttoolCallId: toolCall.toolCallId,\n\t\t\t\toutput: { error: 'User denied the tool execution.' },\n\t\t\t});\n\t\t\tsetPendingToolCalls(prev => {\n\t\t\t\tconst next = { ...prev };\n\t\t\t\tdelete next[toolCallId];\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[pendingToolCalls, addToolOutput],\n\t);\n\n\tconst handleAlwaysApprove = useCallback(\n\t\tasync (toolCallId: string) => {\n\t\t\tconst toolCall = pendingToolCalls[toolCallId];\n\t\t\tif (!toolCall) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetAlwaysApprovedToolsList(prev => unique([...prev, toolCall.toolName]));\n\t\t\tawait handleApprove(toolCallId);\n\t\t},\n\t\t[pendingToolCalls, setAlwaysApprovedToolsList, handleApprove],\n\t);\n\n\tuseEffect(() => {\n\t\tconst fetchInitialMessages = async () => {\n\t\t\ttry {\n\t\t\t\tconst data = await getChatMessages();\n\t\t\t\tif (Array.isArray(data)) {\n\t\t\t\t\tsetMessages(data);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Failed to fetch initial messages:', error);\n\t\t\t} finally {\n\t\t\t\tsetIsLoadingInitial(false);\n\t\t\t}\n\t\t};\n\n\t\tvoid fetchInitialMessages();\n\t}, [setMessages]);\n\n\tconst isStreaming = status === 'streaming' || status === 'submitted';\n\n\tconst messagesEndRef = useRef<HTMLDivElement>(null);\n\tuseEffect(() => {\n\t\tmessagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n\t}, [messages]);\n\n\tconst handleChatSubmit = (e: SubmitEvent) => {\n\t\te.preventDefault();\n\t\tif (input.trim() && !isStreaming && !isLoadingInitial) {\n\t\t\tvoid sendMessage({ text: input });\n\t\t\tsetInput('');\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col h-full\">\n\t\t\t<div className=\"flex items-start justify-between gap-6 px-4 py-2.5 border-b border-border bg-card\">\n\t\t\t\t<div className=\"flex flex-col gap-1 min-w-0 flex-1\">\n\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t<Bot className=\"text-primary\" size={20} />\n\t\t\t\t\t\t<span className=\"font-semibold text-foreground\">Harper Agent</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<UsageBar />\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex items-center gap-2 shrink-0\">\n\t\t\t\t\t<ClearChat setMessages={setMessages} />\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={closeChat}\n\t\t\t\t\t\tclassName=\"p-1 hover:bg-accent rounded-md transition-colors text-muted-foreground hover:text-foreground\"\n\t\t\t\t\t\ttitle=\"Close chat\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<X size={20} />\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex-1 overflow-hidden\">\n\t\t\t\t<div className=\"chat-interface h-full w-full\">\n\t\t\t\t\t<div className=\"messages-area\">\n\t\t\t\t\t\t{isLoadingInitial && <LoadingState />}\n\t\t\t\t\t\t{!isLoadingInitial && messages.length === 0 && (\n\t\t\t\t\t\t\t<div className=\"empty-state\">\n\t\t\t\t\t\t\t\t<Bot size={48} />\n\t\t\t\t\t\t\t\t<p>Ask me to create a Harper app!</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{messages.map(m => (\n\t\t\t\t\t\t\t<MessageBubble\n\t\t\t\t\t\t\t\tkey={m.id}\n\t\t\t\t\t\t\t\tmessage={m}\n\t\t\t\t\t\t\t\tonApprove={handleApprove}\n\t\t\t\t\t\t\t\tonDeny={handleDeny}\n\t\t\t\t\t\t\t\tonAlwaysApprove={handleAlwaysApprove}\n\t\t\t\t\t\t\t\tapprovingToolCallIds={approvingToolCallIds}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t<div ref={messagesEndRef} />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<ChatInput\n\t\t\t\t\t\tinput={input}\n\t\t\t\t\t\tsetInput={setInput}\n\t\t\t\t\t\tonSubmit={handleChatSubmit}\n\t\t\t\t\t\tdisabled={isLoadingInitial}\n\t\t\t\t\t\tautoFocus={autoFocus}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,11,12,13,14,15,17,18,21,22,25,26,29,30,33,34,37,38,41,42,45,46,49,50,53,54,57,58,61,62,65,66,70,71,72,75,76,79,80,83,84,87,88,91,92],"mappings":"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"}
|