diff --git a/.changeset/agents-instrumentation.md b/.changeset/agents-instrumentation.md new file mode 100644 index 000000000..5c15d6bdb --- /dev/null +++ b/.changeset/agents-instrumentation.md @@ -0,0 +1,5 @@ +--- +"braintrust": minor +--- + +feat: Add `agents` instrumentation diff --git a/e2e/config/pr-comment-scenarios.json b/e2e/config/pr-comment-scenarios.json index 28d073967..20e426009 100644 --- a/e2e/config/pr-comment-scenarios.json +++ b/e2e/config/pr-comment-scenarios.json @@ -1,4 +1,19 @@ [ + { + "scenarioDirName": "cloudflare-agents-instrumentation", + "label": "Cloudflare Agents Instrumentation", + "metadataScenario": "cloudflare-agents-instrumentation", + "variants": [ + { + "variantKey": "cloudflare-agents-v0-17", + "label": "v0.17 pinned" + }, + { + "variantKey": "cloudflare-agents-v0-17-latest", + "label": "v0.17 latest" + } + ] + }, { "scenarioDirName": "openai-instrumentation", "label": "OpenAI Instrumentation", diff --git a/e2e/scenarios/ai-sdk-instrumentation/__cassettes__/ai-sdk-v7-latest.cassette.json b/e2e/scenarios/ai-sdk-instrumentation/__cassettes__/ai-sdk-v7-latest.cassette.json index 9005aa141..7c6f96655 100644 --- a/e2e/scenarios/ai-sdk-instrumentation/__cassettes__/ai-sdk-v7-latest.cassette.json +++ b/e2e/scenarios/ai-sdk-instrumentation/__cassettes__/ai-sdk-v7-latest.cassette.json @@ -1313,8 +1313,10 @@ "role": "user" }, { - "id": "fc_0abe86d93d0c9ec6006a5f280e7de481a2b8ebed08905110a6", - "type": "item_reference" + "arguments": "{\"location\":\"Paris, France\"}", + "call_id": "call_Ii2Sz2ZK817uFrWie866Up02", + "name": "get_weather", + "type": "function_call" }, { "call_id": "call_Ii2Sz2ZK817uFrWie866Up02", @@ -1515,8 +1517,10 @@ "role": "user" }, { - "id": "fc_0abe86d93d0c9ec6006a5f280e7de481a2b8ebed08905110a6", - "type": "item_reference" + "arguments": "{\"location\":\"Paris, France\"}", + "call_id": "call_Ii2Sz2ZK817uFrWie866Up02", + "name": "get_weather", + "type": "function_call" }, { "call_id": "call_Ii2Sz2ZK817uFrWie866Up02", @@ -1524,8 +1528,10 @@ "type": "function_call_output" }, { - "id": "fc_0abe86d93d0c9ec6006a5f280f366481a2894dedf7b27324df", - "type": "item_reference" + "arguments": "{\"location\":\"Paris, France\"}", + "call_id": "call_y5QnF2PdsUkY3kCKOvjG2Ony", + "name": "get_weather", + "type": "function_call" }, { "call_id": "call_y5QnF2PdsUkY3kCKOvjG2Ony", @@ -1726,8 +1732,10 @@ "role": "user" }, { - "id": "fc_0abe86d93d0c9ec6006a5f280e7de481a2b8ebed08905110a6", - "type": "item_reference" + "arguments": "{\"location\":\"Paris, France\"}", + "call_id": "call_Ii2Sz2ZK817uFrWie866Up02", + "name": "get_weather", + "type": "function_call" }, { "call_id": "call_Ii2Sz2ZK817uFrWie866Up02", @@ -1735,8 +1743,10 @@ "type": "function_call_output" }, { - "id": "fc_0abe86d93d0c9ec6006a5f280f366481a2894dedf7b27324df", - "type": "item_reference" + "arguments": "{\"location\":\"Paris, France\"}", + "call_id": "call_y5QnF2PdsUkY3kCKOvjG2Ony", + "name": "get_weather", + "type": "function_call" }, { "call_id": "call_y5QnF2PdsUkY3kCKOvjG2Ony", @@ -1744,8 +1754,10 @@ "type": "function_call_output" }, { - "id": "fc_0abe86d93d0c9ec6006a5f28100aa881a2bf371590c7e2ac11", - "type": "item_reference" + "arguments": "{\"location\":\"Paris, France\"}", + "call_id": "call_vBMKyY3OpdAQCm3DnKJmhdU9", + "name": "get_weather", + "type": "function_call" }, { "call_id": "call_vBMKyY3OpdAQCm3DnKJmhdU9", @@ -2742,12 +2754,16 @@ "role": "user" }, { - "id": "fc_03e7cc3a04c36e1a006a5f2816e51881a1918a87d07e38d225", - "type": "item_reference" + "arguments": "{\"item\":\"laptop\",\"store\":\"StoreA\"}", + "call_id": "call_Sbvn5IpyZQ87RYFs54LTQOsT", + "name": "get_store_price", + "type": "function_call" }, { - "id": "fc_03e7cc3a04c36e1a006a5f2816e52c81a18374619829b9c65f", - "type": "item_reference" + "arguments": "{\"item\":\"laptop\",\"store\":\"StoreB\"}", + "call_id": "call_hnJAlz8hGRJ4087mPHkHomzU", + "name": "get_store_price", + "type": "function_call" }, { "call_id": "call_Sbvn5IpyZQ87RYFs54LTQOsT", @@ -3023,12 +3039,16 @@ "role": "user" }, { - "id": "fc_03e7cc3a04c36e1a006a5f2816e51881a1918a87d07e38d225", - "type": "item_reference" + "arguments": "{\"item\":\"laptop\",\"store\":\"StoreA\"}", + "call_id": "call_Sbvn5IpyZQ87RYFs54LTQOsT", + "name": "get_store_price", + "type": "function_call" }, { - "id": "fc_03e7cc3a04c36e1a006a5f2816e52c81a18374619829b9c65f", - "type": "item_reference" + "arguments": "{\"item\":\"laptop\",\"store\":\"StoreB\"}", + "call_id": "call_hnJAlz8hGRJ4087mPHkHomzU", + "name": "get_store_price", + "type": "function_call" }, { "call_id": "call_Sbvn5IpyZQ87RYFs54LTQOsT", @@ -3041,8 +3061,10 @@ "type": "function_call_output" }, { - "id": "fc_03e7cc3a04c36e1a006a5f2818727c81a1bd86af2d77f7f1c4", - "type": "item_reference" + "arguments": "{\"discountCode\":\"SAVE20\",\"total\":999}", + "call_id": "call_vdhe3VvCry0zQD8sqTnxwSu9", + "name": "apply_discount", + "type": "function_call" }, { "call_id": "call_vdhe3VvCry0zQD8sqTnxwSu9", diff --git a/e2e/scenarios/ai-sdk-instrumentation/__cassettes__/ai-sdk-v7.cassette.json b/e2e/scenarios/ai-sdk-instrumentation/__cassettes__/ai-sdk-v7.cassette.json index 1ee1bedf5..0e3a2ec15 100644 --- a/e2e/scenarios/ai-sdk-instrumentation/__cassettes__/ai-sdk-v7.cassette.json +++ b/e2e/scenarios/ai-sdk-instrumentation/__cassettes__/ai-sdk-v7.cassette.json @@ -1313,8 +1313,10 @@ "role": "user" }, { - "id": "fc_090bb5c218164489006a5f27e576a88192a7b9184af5fa34eb", - "type": "item_reference" + "arguments": "{\"location\":\"Paris, France\"}", + "call_id": "call_EKOO5Hn3MTSQzNcIuDjca7Aw", + "name": "get_weather", + "type": "function_call" }, { "call_id": "call_EKOO5Hn3MTSQzNcIuDjca7Aw", @@ -1515,8 +1517,10 @@ "role": "user" }, { - "id": "fc_090bb5c218164489006a5f27e576a88192a7b9184af5fa34eb", - "type": "item_reference" + "arguments": "{\"location\":\"Paris, France\"}", + "call_id": "call_EKOO5Hn3MTSQzNcIuDjca7Aw", + "name": "get_weather", + "type": "function_call" }, { "call_id": "call_EKOO5Hn3MTSQzNcIuDjca7Aw", @@ -1524,8 +1528,10 @@ "type": "function_call_output" }, { - "id": "fc_090bb5c218164489006a5f27e61d74819282f688766aa8bea0", - "type": "item_reference" + "arguments": "{\"location\":\"Paris, France\"}", + "call_id": "call_n0DLmcb240rqgOPKQKAUJx1u", + "name": "get_weather", + "type": "function_call" }, { "call_id": "call_n0DLmcb240rqgOPKQKAUJx1u", @@ -1726,8 +1732,10 @@ "role": "user" }, { - "id": "fc_090bb5c218164489006a5f27e576a88192a7b9184af5fa34eb", - "type": "item_reference" + "arguments": "{\"location\":\"Paris, France\"}", + "call_id": "call_EKOO5Hn3MTSQzNcIuDjca7Aw", + "name": "get_weather", + "type": "function_call" }, { "call_id": "call_EKOO5Hn3MTSQzNcIuDjca7Aw", @@ -1735,8 +1743,10 @@ "type": "function_call_output" }, { - "id": "fc_090bb5c218164489006a5f27e61d74819282f688766aa8bea0", - "type": "item_reference" + "arguments": "{\"location\":\"Paris, France\"}", + "call_id": "call_n0DLmcb240rqgOPKQKAUJx1u", + "name": "get_weather", + "type": "function_call" }, { "call_id": "call_n0DLmcb240rqgOPKQKAUJx1u", @@ -1744,8 +1754,10 @@ "type": "function_call_output" }, { - "id": "fc_090bb5c218164489006a5f27e6dc5081928f573b5067818f58", - "type": "item_reference" + "arguments": "{\"location\":\"Paris, France\"}", + "call_id": "call_CqbaTgLUcYKFmpM44r2PYobK", + "name": "get_weather", + "type": "function_call" }, { "call_id": "call_CqbaTgLUcYKFmpM44r2PYobK", @@ -2742,12 +2754,16 @@ "role": "user" }, { - "id": "fc_0bc34b37f36070e3006a5f27ed333881a399b741a36c0b301e", - "type": "item_reference" + "arguments": "{\"item\":\"laptop\",\"store\":\"StoreA\"}", + "call_id": "call_TjPPIKKVTTeVRRCfm4ZN1Y8v", + "name": "get_store_price", + "type": "function_call" }, { - "id": "fc_0bc34b37f36070e3006a5f27ed334481a3875f8ac116afe562", - "type": "item_reference" + "arguments": "{\"item\":\"laptop\",\"store\":\"StoreB\"}", + "call_id": "call_ope2842MEXxBBvRf2BJXrS7d", + "name": "get_store_price", + "type": "function_call" }, { "call_id": "call_TjPPIKKVTTeVRRCfm4ZN1Y8v", @@ -3023,12 +3039,16 @@ "role": "user" }, { - "id": "fc_0bc34b37f36070e3006a5f27ed333881a399b741a36c0b301e", - "type": "item_reference" + "arguments": "{\"item\":\"laptop\",\"store\":\"StoreA\"}", + "call_id": "call_TjPPIKKVTTeVRRCfm4ZN1Y8v", + "name": "get_store_price", + "type": "function_call" }, { - "id": "fc_0bc34b37f36070e3006a5f27ed334481a3875f8ac116afe562", - "type": "item_reference" + "arguments": "{\"item\":\"laptop\",\"store\":\"StoreB\"}", + "call_id": "call_ope2842MEXxBBvRf2BJXrS7d", + "name": "get_store_price", + "type": "function_call" }, { "call_id": "call_TjPPIKKVTTeVRRCfm4ZN1Y8v", @@ -3041,8 +3061,10 @@ "type": "function_call_output" }, { - "id": "fc_0bc34b37f36070e3006a5f27ee431081a3a5e08cd3679cd665", - "type": "item_reference" + "arguments": "{\"discountCode\":\"SAVE20\",\"total\":999}", + "call_id": "call_IN20AE9uVzVHjg5jO7D2LjdA", + "name": "apply_discount", + "type": "function_call" }, { "call_id": "call_IN20AE9uVzVHjg5jO7D2LjdA", diff --git a/e2e/scenarios/ai-sdk-instrumentation/__snapshots__/ai-sdk-v7-latest-auto-hook.span-tree.json b/e2e/scenarios/ai-sdk-instrumentation/__snapshots__/ai-sdk-v7-latest-auto-hook.span-tree.json index 8603131c4..096e62c03 100644 --- a/e2e/scenarios/ai-sdk-instrumentation/__snapshots__/ai-sdk-v7-latest-auto-hook.span-tree.json +++ b/e2e/scenarios/ai-sdk-instrumentation/__snapshots__/ai-sdk-v7-latest-auto-hook.span-tree.json @@ -46,6 +46,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 18 }, "inputTokens": 18, @@ -57,6 +58,7 @@ "raw": { "input_tokens": 18, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 3, @@ -77,6 +79,7 @@ }, "metrics": { "completion_tokens": 3, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 18, "tokens": 21 @@ -189,6 +192,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 18 }, "inputTokens": 18, @@ -200,6 +204,7 @@ "raw": { "input_tokens": 18, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 3, @@ -218,6 +223,7 @@ "totalUsage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 18 }, "inputTokens": 18, @@ -231,6 +237,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 18 }, "inputTokens": 18, @@ -308,6 +315,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 45 }, "inputTokens": 45, @@ -319,6 +327,7 @@ "raw": { "input_tokens": 45, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 6, @@ -339,6 +348,7 @@ }, "metrics": { "completion_tokens": 6, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 45, "tokens": 51 @@ -469,6 +479,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 45 }, "inputTokens": 45, @@ -480,6 +491,7 @@ "raw": { "input_tokens": 45, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 6, @@ -498,6 +510,7 @@ "totalUsage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 45 }, "inputTokens": 45, @@ -511,6 +524,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 45 }, "inputTokens": 45, @@ -580,6 +594,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 22 }, "inputTokens": 22, @@ -591,6 +606,7 @@ "raw": { "input_tokens": 22, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 7, @@ -611,6 +627,7 @@ }, "metrics": { "completion_tokens": 7, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 22, "tokens": 29 @@ -723,6 +740,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 22 }, "inputTokens": 22, @@ -734,6 +752,7 @@ "raw": { "input_tokens": 22, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 7, @@ -752,6 +771,7 @@ "totalUsage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 22 }, "inputTokens": 22, @@ -765,6 +785,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 22 }, "inputTokens": 22, @@ -999,6 +1020,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 94 }, "inputTokens": 94, @@ -1010,6 +1032,7 @@ "raw": { "input_tokens": 94, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 8, @@ -1030,6 +1053,7 @@ }, "metrics": { "completion_tokens": 8, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 94, "tokens": 102 @@ -1146,6 +1170,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 133 }, "inputTokens": 133, @@ -1157,6 +1182,7 @@ "raw": { "input_tokens": 133, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 8, @@ -1177,6 +1203,7 @@ }, "metrics": { "completion_tokens": 8, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 133, "tokens": 141 @@ -1328,6 +1355,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 172 }, "inputTokens": 172, @@ -1339,6 +1367,7 @@ "raw": { "input_tokens": 172, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 8, @@ -1359,6 +1388,7 @@ }, "metrics": { "completion_tokens": 8, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 172, "tokens": 180 @@ -1545,6 +1575,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 211 }, "inputTokens": 211, @@ -1556,6 +1587,7 @@ "raw": { "input_tokens": 211, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 8, @@ -1576,6 +1608,7 @@ }, "metrics": { "completion_tokens": 8, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 211, "tokens": 219 @@ -1879,6 +1912,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 94 }, "inputTokens": 94, @@ -1890,6 +1924,7 @@ "raw": { "input_tokens": 94, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 8, @@ -1989,6 +2024,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 133 }, "inputTokens": 133, @@ -2000,6 +2036,7 @@ "raw": { "input_tokens": 133, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 8, @@ -2099,6 +2136,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 172 }, "inputTokens": 172, @@ -2110,6 +2148,7 @@ "raw": { "input_tokens": 172, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 8, @@ -2209,6 +2248,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 211 }, "inputTokens": 211, @@ -2220,6 +2260,7 @@ "raw": { "input_tokens": 211, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 8, @@ -2344,6 +2385,7 @@ "totalUsage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 610 }, "inputTokens": 610, @@ -2357,6 +2399,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 610 }, "inputTokens": 610, @@ -2425,6 +2468,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 38 }, "inputTokens": 38, @@ -2436,6 +2480,7 @@ "raw": { "input_tokens": 38, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 6, @@ -2457,6 +2502,7 @@ }, "metrics": { "completion_tokens": 6, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 38, "tokens": 44 @@ -2506,6 +2552,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 38 }, "inputTokens": 38, @@ -2517,6 +2564,7 @@ "raw": { "input_tokens": 38, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 6, @@ -2583,6 +2631,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 38 }, "inputTokens": 38, @@ -2594,6 +2643,7 @@ "raw": { "input_tokens": 38, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 6, @@ -2615,6 +2665,7 @@ }, "metrics": { "completion_tokens": 6, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 38, "tokens": 44 @@ -2663,6 +2714,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 38 }, "inputTokens": 38, @@ -2674,6 +2726,7 @@ "raw": { "input_tokens": 38, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 6, @@ -2742,6 +2795,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 26 }, "inputTokens": 26, @@ -2753,6 +2807,7 @@ "raw": { "input_tokens": 26, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 3, @@ -2773,6 +2828,7 @@ }, "metrics": { "completion_tokens": 3, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 26, "tokens": 29 @@ -2885,6 +2941,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 26 }, "inputTokens": 26, @@ -2896,6 +2953,7 @@ "raw": { "input_tokens": 26, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 3, @@ -2914,6 +2972,7 @@ "totalUsage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 26 }, "inputTokens": 26, @@ -2927,6 +2986,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 26 }, "inputTokens": 26, @@ -2996,6 +3056,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 27 }, "inputTokens": 27, @@ -3007,6 +3068,7 @@ "raw": { "input_tokens": 27, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 4, @@ -3027,6 +3089,7 @@ }, "metrics": { "completion_tokens": 4, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 27, "tokens": 31 @@ -3139,6 +3202,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 27 }, "inputTokens": 27, @@ -3150,6 +3214,7 @@ "raw": { "input_tokens": 27, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 4, @@ -3168,6 +3233,7 @@ "totalUsage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 27 }, "inputTokens": 27, @@ -3181,6 +3247,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 27 }, "inputTokens": 27, @@ -3329,6 +3396,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 173 }, "inputTokens": 173, @@ -3340,6 +3408,7 @@ "raw": { "input_tokens": 173, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 59, @@ -3360,6 +3429,7 @@ }, "metrics": { "completion_tokens": 59, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 173, "tokens": 232 @@ -3559,6 +3629,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 260 }, "inputTokens": 260, @@ -3570,6 +3641,7 @@ "raw": { "input_tokens": 260, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 21, @@ -3590,6 +3662,7 @@ }, "metrics": { "completion_tokens": 21, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 260, "tokens": 281 @@ -3804,6 +3877,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 308 }, "inputTokens": 308, @@ -3815,6 +3889,7 @@ "raw": { "input_tokens": 308, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 62, @@ -3835,6 +3910,7 @@ }, "metrics": { "completion_tokens": 62, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 308, "tokens": 370 @@ -4181,6 +4257,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 173 }, "inputTokens": 173, @@ -4192,6 +4269,7 @@ "raw": { "input_tokens": 173, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 59, @@ -4294,6 +4372,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 260 }, "inputTokens": 260, @@ -4305,6 +4384,7 @@ "raw": { "input_tokens": 260, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 21, @@ -4366,6 +4446,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 308 }, "inputTokens": 308, @@ -4377,6 +4458,7 @@ "raw": { "input_tokens": 308, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 62, @@ -4481,6 +4563,7 @@ "totalUsage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 741 }, "inputTokens": 741, @@ -4494,6 +4577,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 741 }, "inputTokens": 741, diff --git a/e2e/scenarios/ai-sdk-instrumentation/__snapshots__/ai-sdk-v7-latest-auto-hook.span-tree.txt b/e2e/scenarios/ai-sdk-instrumentation/__snapshots__/ai-sdk-v7-latest-auto-hook.span-tree.txt index 4f0dfb281..61f1961d2 100644 --- a/e2e/scenarios/ai-sdk-instrumentation/__snapshots__/ai-sdk-v7-latest-auto-hook.span-tree.txt +++ b/e2e/scenarios/ai-sdk-instrumentation/__snapshots__/ai-sdk-v7-latest-auto-hook.span-tree.txt @@ -117,6 +117,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 18 │ }, │ "inputTokens": 18, @@ -128,6 +129,7 @@ span_tree: │ "raw": { │ "input_tokens": 18, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 3, @@ -146,6 +148,7 @@ span_tree: │ "totalUsage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 18 │ }, │ "inputTokens": 18, @@ -159,6 +162,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 18 │ }, │ "inputTokens": 18, @@ -211,6 +215,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 18 │ }, │ "inputTokens": 18, @@ -222,6 +227,7 @@ span_tree: │ "raw": { │ "input_tokens": 18, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 3, @@ -242,6 +248,7 @@ span_tree: │ } │ metrics: { │ "completion_tokens": 3, + │ "prompt_cache_creation_tokens": 0, │ "prompt_cached_tokens": 0, │ "prompt_tokens": 18, │ "tokens": 21 @@ -381,6 +388,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 45 │ }, │ "inputTokens": 45, @@ -392,6 +400,7 @@ span_tree: │ "raw": { │ "input_tokens": 45, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 6, @@ -410,6 +419,7 @@ span_tree: │ "totalUsage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 45 │ }, │ "inputTokens": 45, @@ -423,6 +433,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 45 │ }, │ "inputTokens": 45, @@ -475,6 +486,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 45 │ }, │ "inputTokens": 45, @@ -486,6 +498,7 @@ span_tree: │ "raw": { │ "input_tokens": 45, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 6, @@ -506,6 +519,7 @@ span_tree: │ } │ metrics: { │ "completion_tokens": 6, + │ "prompt_cache_creation_tokens": 0, │ "prompt_cached_tokens": 0, │ "prompt_tokens": 45, │ "tokens": 51 @@ -622,6 +636,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 22 │ }, │ "inputTokens": 22, @@ -633,6 +648,7 @@ span_tree: │ "raw": { │ "input_tokens": 22, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 7, @@ -651,6 +667,7 @@ span_tree: │ "totalUsage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 22 │ }, │ "inputTokens": 22, @@ -664,6 +681,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 22 │ }, │ "inputTokens": 22, @@ -719,6 +737,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 22 │ }, │ "inputTokens": 22, @@ -730,6 +749,7 @@ span_tree: │ "raw": { │ "input_tokens": 22, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 7, @@ -750,6 +770,7 @@ span_tree: │ } │ metrics: { │ "completion_tokens": 7, + │ "prompt_cache_creation_tokens": 0, │ "prompt_cached_tokens": 0, │ "prompt_tokens": 22, │ "tokens": 29 @@ -1152,6 +1173,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 94 │ }, │ "inputTokens": 94, @@ -1163,6 +1185,7 @@ span_tree: │ "raw": { │ "input_tokens": 94, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 8, @@ -1262,6 +1285,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 133 │ }, │ "inputTokens": 133, @@ -1273,6 +1297,7 @@ span_tree: │ "raw": { │ "input_tokens": 133, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 8, @@ -1372,6 +1397,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 172 │ }, │ "inputTokens": 172, @@ -1383,6 +1409,7 @@ span_tree: │ "raw": { │ "input_tokens": 172, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 8, @@ -1482,6 +1509,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 211 │ }, │ "inputTokens": 211, @@ -1493,6 +1521,7 @@ span_tree: │ "raw": { │ "input_tokens": 211, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 8, @@ -1617,6 +1646,7 @@ span_tree: │ "totalUsage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 610 │ }, │ "inputTokens": 610, @@ -1630,6 +1660,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 610 │ }, │ "inputTokens": 610, @@ -1707,6 +1738,7 @@ span_tree: │ │ "usage": { │ │ "inputTokenDetails": { │ │ "cacheReadTokens": 0, + │ │ "cacheWriteTokens": 0, │ │ "noCacheTokens": 94 │ │ }, │ │ "inputTokens": 94, @@ -1718,6 +1750,7 @@ span_tree: │ │ "raw": { │ │ "input_tokens": 94, │ │ "input_tokens_details": { + │ │ "cache_write_tokens": 0, │ │ "cached_tokens": 0 │ │ }, │ │ "output_tokens": 8, @@ -1738,6 +1771,7 @@ span_tree: │ │ } │ │ metrics: { │ │ "completion_tokens": 8, + │ │ "prompt_cache_creation_tokens": 0, │ │ "prompt_cached_tokens": 0, │ │ "prompt_tokens": 94, │ │ "tokens": 102 @@ -1846,6 +1880,7 @@ span_tree: │ │ "usage": { │ │ "inputTokenDetails": { │ │ "cacheReadTokens": 0, + │ │ "cacheWriteTokens": 0, │ │ "noCacheTokens": 133 │ │ }, │ │ "inputTokens": 133, @@ -1857,6 +1892,7 @@ span_tree: │ │ "raw": { │ │ "input_tokens": 133, │ │ "input_tokens_details": { + │ │ "cache_write_tokens": 0, │ │ "cached_tokens": 0 │ │ }, │ │ "output_tokens": 8, @@ -1877,6 +1913,7 @@ span_tree: │ │ } │ │ metrics: { │ │ "completion_tokens": 8, + │ │ "prompt_cache_creation_tokens": 0, │ │ "prompt_cached_tokens": 0, │ │ "prompt_tokens": 133, │ │ "tokens": 141 @@ -2020,6 +2057,7 @@ span_tree: │ │ "usage": { │ │ "inputTokenDetails": { │ │ "cacheReadTokens": 0, + │ │ "cacheWriteTokens": 0, │ │ "noCacheTokens": 172 │ │ }, │ │ "inputTokens": 172, @@ -2031,6 +2069,7 @@ span_tree: │ │ "raw": { │ │ "input_tokens": 172, │ │ "input_tokens_details": { + │ │ "cache_write_tokens": 0, │ │ "cached_tokens": 0 │ │ }, │ │ "output_tokens": 8, @@ -2051,6 +2090,7 @@ span_tree: │ │ } │ │ metrics: { │ │ "completion_tokens": 8, + │ │ "prompt_cache_creation_tokens": 0, │ │ "prompt_cached_tokens": 0, │ │ "prompt_tokens": 172, │ │ "tokens": 180 @@ -2229,6 +2269,7 @@ span_tree: │ │ "usage": { │ │ "inputTokenDetails": { │ │ "cacheReadTokens": 0, + │ │ "cacheWriteTokens": 0, │ │ "noCacheTokens": 211 │ │ }, │ │ "inputTokens": 211, @@ -2240,6 +2281,7 @@ span_tree: │ │ "raw": { │ │ "input_tokens": 211, │ │ "input_tokens_details": { + │ │ "cache_write_tokens": 0, │ │ "cached_tokens": 0 │ │ }, │ │ "output_tokens": 8, @@ -2260,6 +2302,7 @@ span_tree: │ │ } │ │ metrics: { │ │ "completion_tokens": 8, + │ │ "prompt_cache_creation_tokens": 0, │ │ "prompt_cached_tokens": 0, │ │ "prompt_tokens": 211, │ │ "tokens": 219 @@ -2325,6 +2368,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 38 │ }, │ "inputTokens": 38, @@ -2336,6 +2380,7 @@ span_tree: │ "raw": { │ "input_tokens": 38, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 6, @@ -2386,6 +2431,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 38 │ }, │ "inputTokens": 38, @@ -2397,6 +2443,7 @@ span_tree: │ "raw": { │ "input_tokens": 38, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 6, @@ -2418,6 +2465,7 @@ span_tree: │ } │ metrics: { │ "completion_tokens": 6, + │ "prompt_cache_creation_tokens": 0, │ "prompt_cached_tokens": 0, │ "prompt_tokens": 38, │ "tokens": 44 @@ -2470,6 +2518,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 38 │ }, │ "inputTokens": 38, @@ -2481,6 +2530,7 @@ span_tree: │ "raw": { │ "input_tokens": 38, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 6, @@ -2530,6 +2580,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 38 │ }, │ "inputTokens": 38, @@ -2541,6 +2592,7 @@ span_tree: │ "raw": { │ "input_tokens": 38, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 6, @@ -2562,6 +2614,7 @@ span_tree: │ } │ metrics: { │ "completion_tokens": 6, + │ "prompt_cache_creation_tokens": 0, │ "prompt_cached_tokens": 0, │ "prompt_tokens": 38, │ "tokens": 44 @@ -2678,6 +2731,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 26 │ }, │ "inputTokens": 26, @@ -2689,6 +2743,7 @@ span_tree: │ "raw": { │ "input_tokens": 26, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 3, @@ -2707,6 +2762,7 @@ span_tree: │ "totalUsage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 26 │ }, │ "inputTokens": 26, @@ -2720,6 +2776,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 26 │ }, │ "inputTokens": 26, @@ -2772,6 +2829,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 26 │ }, │ "inputTokens": 26, @@ -2783,6 +2841,7 @@ span_tree: │ "raw": { │ "input_tokens": 26, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 3, @@ -2803,6 +2862,7 @@ span_tree: │ } │ metrics: { │ "completion_tokens": 3, + │ "prompt_cache_creation_tokens": 0, │ "prompt_cached_tokens": 0, │ "prompt_tokens": 26, │ "tokens": 29 @@ -2919,6 +2979,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 27 │ }, │ "inputTokens": 27, @@ -2930,6 +2991,7 @@ span_tree: │ "raw": { │ "input_tokens": 27, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 4, @@ -2948,6 +3010,7 @@ span_tree: │ "totalUsage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 27 │ }, │ "inputTokens": 27, @@ -2961,6 +3024,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 27 │ }, │ "inputTokens": 27, @@ -3016,6 +3080,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 27 │ }, │ "inputTokens": 27, @@ -3027,6 +3092,7 @@ span_tree: │ "raw": { │ "input_tokens": 27, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 4, @@ -3047,6 +3113,7 @@ span_tree: │ } │ metrics: { │ "completion_tokens": 4, + │ "prompt_cache_creation_tokens": 0, │ "prompt_cached_tokens": 0, │ "prompt_tokens": 27, │ "tokens": 31 @@ -3397,6 +3464,7 @@ span_tree: "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 173 }, "inputTokens": 173, @@ -3408,6 +3476,7 @@ span_tree: "raw": { "input_tokens": 173, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 59, @@ -3510,6 +3579,7 @@ span_tree: "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 260 }, "inputTokens": 260, @@ -3521,6 +3591,7 @@ span_tree: "raw": { "input_tokens": 260, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 21, @@ -3582,6 +3653,7 @@ span_tree: "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 308 }, "inputTokens": 308, @@ -3593,6 +3665,7 @@ span_tree: "raw": { "input_tokens": 308, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 62, @@ -3697,6 +3770,7 @@ span_tree: "totalUsage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 741 }, "inputTokens": 741, @@ -3710,6 +3784,7 @@ span_tree: "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 741 }, "inputTokens": 741, @@ -3838,6 +3913,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 173 │ }, │ "inputTokens": 173, @@ -3849,6 +3925,7 @@ span_tree: │ "raw": { │ "input_tokens": 173, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 59, @@ -3869,6 +3946,7 @@ span_tree: │ } │ metrics: { │ "completion_tokens": 59, + │ "prompt_cache_creation_tokens": 0, │ "prompt_cached_tokens": 0, │ "prompt_tokens": 173, │ "tokens": 232 @@ -4056,6 +4134,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 260 │ }, │ "inputTokens": 260, @@ -4067,6 +4146,7 @@ span_tree: │ "raw": { │ "input_tokens": 260, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 21, @@ -4087,6 +4167,7 @@ span_tree: │ } │ metrics: { │ "completion_tokens": 21, + │ "prompt_cache_creation_tokens": 0, │ "prompt_cached_tokens": 0, │ "prompt_tokens": 260, │ "tokens": 281 @@ -4293,6 +4374,7 @@ span_tree: "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 308 }, "inputTokens": 308, @@ -4304,6 +4386,7 @@ span_tree: "raw": { "input_tokens": 308, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 62, @@ -4324,6 +4407,7 @@ span_tree: } metrics: { "completion_tokens": 62, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 308, "tokens": 370 diff --git a/e2e/scenarios/ai-sdk-instrumentation/__snapshots__/ai-sdk-v7-latest-explicit.span-tree.json b/e2e/scenarios/ai-sdk-instrumentation/__snapshots__/ai-sdk-v7-latest-explicit.span-tree.json index 8603131c4..096e62c03 100644 --- a/e2e/scenarios/ai-sdk-instrumentation/__snapshots__/ai-sdk-v7-latest-explicit.span-tree.json +++ b/e2e/scenarios/ai-sdk-instrumentation/__snapshots__/ai-sdk-v7-latest-explicit.span-tree.json @@ -46,6 +46,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 18 }, "inputTokens": 18, @@ -57,6 +58,7 @@ "raw": { "input_tokens": 18, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 3, @@ -77,6 +79,7 @@ }, "metrics": { "completion_tokens": 3, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 18, "tokens": 21 @@ -189,6 +192,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 18 }, "inputTokens": 18, @@ -200,6 +204,7 @@ "raw": { "input_tokens": 18, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 3, @@ -218,6 +223,7 @@ "totalUsage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 18 }, "inputTokens": 18, @@ -231,6 +237,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 18 }, "inputTokens": 18, @@ -308,6 +315,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 45 }, "inputTokens": 45, @@ -319,6 +327,7 @@ "raw": { "input_tokens": 45, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 6, @@ -339,6 +348,7 @@ }, "metrics": { "completion_tokens": 6, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 45, "tokens": 51 @@ -469,6 +479,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 45 }, "inputTokens": 45, @@ -480,6 +491,7 @@ "raw": { "input_tokens": 45, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 6, @@ -498,6 +510,7 @@ "totalUsage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 45 }, "inputTokens": 45, @@ -511,6 +524,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 45 }, "inputTokens": 45, @@ -580,6 +594,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 22 }, "inputTokens": 22, @@ -591,6 +606,7 @@ "raw": { "input_tokens": 22, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 7, @@ -611,6 +627,7 @@ }, "metrics": { "completion_tokens": 7, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 22, "tokens": 29 @@ -723,6 +740,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 22 }, "inputTokens": 22, @@ -734,6 +752,7 @@ "raw": { "input_tokens": 22, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 7, @@ -752,6 +771,7 @@ "totalUsage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 22 }, "inputTokens": 22, @@ -765,6 +785,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 22 }, "inputTokens": 22, @@ -999,6 +1020,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 94 }, "inputTokens": 94, @@ -1010,6 +1032,7 @@ "raw": { "input_tokens": 94, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 8, @@ -1030,6 +1053,7 @@ }, "metrics": { "completion_tokens": 8, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 94, "tokens": 102 @@ -1146,6 +1170,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 133 }, "inputTokens": 133, @@ -1157,6 +1182,7 @@ "raw": { "input_tokens": 133, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 8, @@ -1177,6 +1203,7 @@ }, "metrics": { "completion_tokens": 8, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 133, "tokens": 141 @@ -1328,6 +1355,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 172 }, "inputTokens": 172, @@ -1339,6 +1367,7 @@ "raw": { "input_tokens": 172, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 8, @@ -1359,6 +1388,7 @@ }, "metrics": { "completion_tokens": 8, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 172, "tokens": 180 @@ -1545,6 +1575,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 211 }, "inputTokens": 211, @@ -1556,6 +1587,7 @@ "raw": { "input_tokens": 211, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 8, @@ -1576,6 +1608,7 @@ }, "metrics": { "completion_tokens": 8, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 211, "tokens": 219 @@ -1879,6 +1912,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 94 }, "inputTokens": 94, @@ -1890,6 +1924,7 @@ "raw": { "input_tokens": 94, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 8, @@ -1989,6 +2024,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 133 }, "inputTokens": 133, @@ -2000,6 +2036,7 @@ "raw": { "input_tokens": 133, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 8, @@ -2099,6 +2136,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 172 }, "inputTokens": 172, @@ -2110,6 +2148,7 @@ "raw": { "input_tokens": 172, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 8, @@ -2209,6 +2248,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 211 }, "inputTokens": 211, @@ -2220,6 +2260,7 @@ "raw": { "input_tokens": 211, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 8, @@ -2344,6 +2385,7 @@ "totalUsage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 610 }, "inputTokens": 610, @@ -2357,6 +2399,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 610 }, "inputTokens": 610, @@ -2425,6 +2468,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 38 }, "inputTokens": 38, @@ -2436,6 +2480,7 @@ "raw": { "input_tokens": 38, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 6, @@ -2457,6 +2502,7 @@ }, "metrics": { "completion_tokens": 6, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 38, "tokens": 44 @@ -2506,6 +2552,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 38 }, "inputTokens": 38, @@ -2517,6 +2564,7 @@ "raw": { "input_tokens": 38, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 6, @@ -2583,6 +2631,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 38 }, "inputTokens": 38, @@ -2594,6 +2643,7 @@ "raw": { "input_tokens": 38, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 6, @@ -2615,6 +2665,7 @@ }, "metrics": { "completion_tokens": 6, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 38, "tokens": 44 @@ -2663,6 +2714,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 38 }, "inputTokens": 38, @@ -2674,6 +2726,7 @@ "raw": { "input_tokens": 38, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 6, @@ -2742,6 +2795,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 26 }, "inputTokens": 26, @@ -2753,6 +2807,7 @@ "raw": { "input_tokens": 26, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 3, @@ -2773,6 +2828,7 @@ }, "metrics": { "completion_tokens": 3, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 26, "tokens": 29 @@ -2885,6 +2941,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 26 }, "inputTokens": 26, @@ -2896,6 +2953,7 @@ "raw": { "input_tokens": 26, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 3, @@ -2914,6 +2972,7 @@ "totalUsage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 26 }, "inputTokens": 26, @@ -2927,6 +2986,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 26 }, "inputTokens": 26, @@ -2996,6 +3056,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 27 }, "inputTokens": 27, @@ -3007,6 +3068,7 @@ "raw": { "input_tokens": 27, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 4, @@ -3027,6 +3089,7 @@ }, "metrics": { "completion_tokens": 4, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 27, "tokens": 31 @@ -3139,6 +3202,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 27 }, "inputTokens": 27, @@ -3150,6 +3214,7 @@ "raw": { "input_tokens": 27, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 4, @@ -3168,6 +3233,7 @@ "totalUsage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 27 }, "inputTokens": 27, @@ -3181,6 +3247,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 27 }, "inputTokens": 27, @@ -3329,6 +3396,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 173 }, "inputTokens": 173, @@ -3340,6 +3408,7 @@ "raw": { "input_tokens": 173, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 59, @@ -3360,6 +3429,7 @@ }, "metrics": { "completion_tokens": 59, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 173, "tokens": 232 @@ -3559,6 +3629,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 260 }, "inputTokens": 260, @@ -3570,6 +3641,7 @@ "raw": { "input_tokens": 260, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 21, @@ -3590,6 +3662,7 @@ }, "metrics": { "completion_tokens": 21, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 260, "tokens": 281 @@ -3804,6 +3877,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 308 }, "inputTokens": 308, @@ -3815,6 +3889,7 @@ "raw": { "input_tokens": 308, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 62, @@ -3835,6 +3910,7 @@ }, "metrics": { "completion_tokens": 62, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 308, "tokens": 370 @@ -4181,6 +4257,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 173 }, "inputTokens": 173, @@ -4192,6 +4269,7 @@ "raw": { "input_tokens": 173, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 59, @@ -4294,6 +4372,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 260 }, "inputTokens": 260, @@ -4305,6 +4384,7 @@ "raw": { "input_tokens": 260, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 21, @@ -4366,6 +4446,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 308 }, "inputTokens": 308, @@ -4377,6 +4458,7 @@ "raw": { "input_tokens": 308, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 62, @@ -4481,6 +4563,7 @@ "totalUsage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 741 }, "inputTokens": 741, @@ -4494,6 +4577,7 @@ "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 741 }, "inputTokens": 741, diff --git a/e2e/scenarios/ai-sdk-instrumentation/__snapshots__/ai-sdk-v7-latest-explicit.span-tree.txt b/e2e/scenarios/ai-sdk-instrumentation/__snapshots__/ai-sdk-v7-latest-explicit.span-tree.txt index 4f0dfb281..61f1961d2 100644 --- a/e2e/scenarios/ai-sdk-instrumentation/__snapshots__/ai-sdk-v7-latest-explicit.span-tree.txt +++ b/e2e/scenarios/ai-sdk-instrumentation/__snapshots__/ai-sdk-v7-latest-explicit.span-tree.txt @@ -117,6 +117,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 18 │ }, │ "inputTokens": 18, @@ -128,6 +129,7 @@ span_tree: │ "raw": { │ "input_tokens": 18, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 3, @@ -146,6 +148,7 @@ span_tree: │ "totalUsage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 18 │ }, │ "inputTokens": 18, @@ -159,6 +162,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 18 │ }, │ "inputTokens": 18, @@ -211,6 +215,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 18 │ }, │ "inputTokens": 18, @@ -222,6 +227,7 @@ span_tree: │ "raw": { │ "input_tokens": 18, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 3, @@ -242,6 +248,7 @@ span_tree: │ } │ metrics: { │ "completion_tokens": 3, + │ "prompt_cache_creation_tokens": 0, │ "prompt_cached_tokens": 0, │ "prompt_tokens": 18, │ "tokens": 21 @@ -381,6 +388,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 45 │ }, │ "inputTokens": 45, @@ -392,6 +400,7 @@ span_tree: │ "raw": { │ "input_tokens": 45, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 6, @@ -410,6 +419,7 @@ span_tree: │ "totalUsage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 45 │ }, │ "inputTokens": 45, @@ -423,6 +433,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 45 │ }, │ "inputTokens": 45, @@ -475,6 +486,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 45 │ }, │ "inputTokens": 45, @@ -486,6 +498,7 @@ span_tree: │ "raw": { │ "input_tokens": 45, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 6, @@ -506,6 +519,7 @@ span_tree: │ } │ metrics: { │ "completion_tokens": 6, + │ "prompt_cache_creation_tokens": 0, │ "prompt_cached_tokens": 0, │ "prompt_tokens": 45, │ "tokens": 51 @@ -622,6 +636,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 22 │ }, │ "inputTokens": 22, @@ -633,6 +648,7 @@ span_tree: │ "raw": { │ "input_tokens": 22, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 7, @@ -651,6 +667,7 @@ span_tree: │ "totalUsage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 22 │ }, │ "inputTokens": 22, @@ -664,6 +681,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 22 │ }, │ "inputTokens": 22, @@ -719,6 +737,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 22 │ }, │ "inputTokens": 22, @@ -730,6 +749,7 @@ span_tree: │ "raw": { │ "input_tokens": 22, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 7, @@ -750,6 +770,7 @@ span_tree: │ } │ metrics: { │ "completion_tokens": 7, + │ "prompt_cache_creation_tokens": 0, │ "prompt_cached_tokens": 0, │ "prompt_tokens": 22, │ "tokens": 29 @@ -1152,6 +1173,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 94 │ }, │ "inputTokens": 94, @@ -1163,6 +1185,7 @@ span_tree: │ "raw": { │ "input_tokens": 94, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 8, @@ -1262,6 +1285,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 133 │ }, │ "inputTokens": 133, @@ -1273,6 +1297,7 @@ span_tree: │ "raw": { │ "input_tokens": 133, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 8, @@ -1372,6 +1397,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 172 │ }, │ "inputTokens": 172, @@ -1383,6 +1409,7 @@ span_tree: │ "raw": { │ "input_tokens": 172, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 8, @@ -1482,6 +1509,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 211 │ }, │ "inputTokens": 211, @@ -1493,6 +1521,7 @@ span_tree: │ "raw": { │ "input_tokens": 211, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 8, @@ -1617,6 +1646,7 @@ span_tree: │ "totalUsage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 610 │ }, │ "inputTokens": 610, @@ -1630,6 +1660,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 610 │ }, │ "inputTokens": 610, @@ -1707,6 +1738,7 @@ span_tree: │ │ "usage": { │ │ "inputTokenDetails": { │ │ "cacheReadTokens": 0, + │ │ "cacheWriteTokens": 0, │ │ "noCacheTokens": 94 │ │ }, │ │ "inputTokens": 94, @@ -1718,6 +1750,7 @@ span_tree: │ │ "raw": { │ │ "input_tokens": 94, │ │ "input_tokens_details": { + │ │ "cache_write_tokens": 0, │ │ "cached_tokens": 0 │ │ }, │ │ "output_tokens": 8, @@ -1738,6 +1771,7 @@ span_tree: │ │ } │ │ metrics: { │ │ "completion_tokens": 8, + │ │ "prompt_cache_creation_tokens": 0, │ │ "prompt_cached_tokens": 0, │ │ "prompt_tokens": 94, │ │ "tokens": 102 @@ -1846,6 +1880,7 @@ span_tree: │ │ "usage": { │ │ "inputTokenDetails": { │ │ "cacheReadTokens": 0, + │ │ "cacheWriteTokens": 0, │ │ "noCacheTokens": 133 │ │ }, │ │ "inputTokens": 133, @@ -1857,6 +1892,7 @@ span_tree: │ │ "raw": { │ │ "input_tokens": 133, │ │ "input_tokens_details": { + │ │ "cache_write_tokens": 0, │ │ "cached_tokens": 0 │ │ }, │ │ "output_tokens": 8, @@ -1877,6 +1913,7 @@ span_tree: │ │ } │ │ metrics: { │ │ "completion_tokens": 8, + │ │ "prompt_cache_creation_tokens": 0, │ │ "prompt_cached_tokens": 0, │ │ "prompt_tokens": 133, │ │ "tokens": 141 @@ -2020,6 +2057,7 @@ span_tree: │ │ "usage": { │ │ "inputTokenDetails": { │ │ "cacheReadTokens": 0, + │ │ "cacheWriteTokens": 0, │ │ "noCacheTokens": 172 │ │ }, │ │ "inputTokens": 172, @@ -2031,6 +2069,7 @@ span_tree: │ │ "raw": { │ │ "input_tokens": 172, │ │ "input_tokens_details": { + │ │ "cache_write_tokens": 0, │ │ "cached_tokens": 0 │ │ }, │ │ "output_tokens": 8, @@ -2051,6 +2090,7 @@ span_tree: │ │ } │ │ metrics: { │ │ "completion_tokens": 8, + │ │ "prompt_cache_creation_tokens": 0, │ │ "prompt_cached_tokens": 0, │ │ "prompt_tokens": 172, │ │ "tokens": 180 @@ -2229,6 +2269,7 @@ span_tree: │ │ "usage": { │ │ "inputTokenDetails": { │ │ "cacheReadTokens": 0, + │ │ "cacheWriteTokens": 0, │ │ "noCacheTokens": 211 │ │ }, │ │ "inputTokens": 211, @@ -2240,6 +2281,7 @@ span_tree: │ │ "raw": { │ │ "input_tokens": 211, │ │ "input_tokens_details": { + │ │ "cache_write_tokens": 0, │ │ "cached_tokens": 0 │ │ }, │ │ "output_tokens": 8, @@ -2260,6 +2302,7 @@ span_tree: │ │ } │ │ metrics: { │ │ "completion_tokens": 8, + │ │ "prompt_cache_creation_tokens": 0, │ │ "prompt_cached_tokens": 0, │ │ "prompt_tokens": 211, │ │ "tokens": 219 @@ -2325,6 +2368,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 38 │ }, │ "inputTokens": 38, @@ -2336,6 +2380,7 @@ span_tree: │ "raw": { │ "input_tokens": 38, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 6, @@ -2386,6 +2431,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 38 │ }, │ "inputTokens": 38, @@ -2397,6 +2443,7 @@ span_tree: │ "raw": { │ "input_tokens": 38, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 6, @@ -2418,6 +2465,7 @@ span_tree: │ } │ metrics: { │ "completion_tokens": 6, + │ "prompt_cache_creation_tokens": 0, │ "prompt_cached_tokens": 0, │ "prompt_tokens": 38, │ "tokens": 44 @@ -2470,6 +2518,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 38 │ }, │ "inputTokens": 38, @@ -2481,6 +2530,7 @@ span_tree: │ "raw": { │ "input_tokens": 38, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 6, @@ -2530,6 +2580,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 38 │ }, │ "inputTokens": 38, @@ -2541,6 +2592,7 @@ span_tree: │ "raw": { │ "input_tokens": 38, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 6, @@ -2562,6 +2614,7 @@ span_tree: │ } │ metrics: { │ "completion_tokens": 6, + │ "prompt_cache_creation_tokens": 0, │ "prompt_cached_tokens": 0, │ "prompt_tokens": 38, │ "tokens": 44 @@ -2678,6 +2731,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 26 │ }, │ "inputTokens": 26, @@ -2689,6 +2743,7 @@ span_tree: │ "raw": { │ "input_tokens": 26, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 3, @@ -2707,6 +2762,7 @@ span_tree: │ "totalUsage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 26 │ }, │ "inputTokens": 26, @@ -2720,6 +2776,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 26 │ }, │ "inputTokens": 26, @@ -2772,6 +2829,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 26 │ }, │ "inputTokens": 26, @@ -2783,6 +2841,7 @@ span_tree: │ "raw": { │ "input_tokens": 26, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 3, @@ -2803,6 +2862,7 @@ span_tree: │ } │ metrics: { │ "completion_tokens": 3, + │ "prompt_cache_creation_tokens": 0, │ "prompt_cached_tokens": 0, │ "prompt_tokens": 26, │ "tokens": 29 @@ -2919,6 +2979,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 27 │ }, │ "inputTokens": 27, @@ -2930,6 +2991,7 @@ span_tree: │ "raw": { │ "input_tokens": 27, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 4, @@ -2948,6 +3010,7 @@ span_tree: │ "totalUsage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 27 │ }, │ "inputTokens": 27, @@ -2961,6 +3024,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 27 │ }, │ "inputTokens": 27, @@ -3016,6 +3080,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 27 │ }, │ "inputTokens": 27, @@ -3027,6 +3092,7 @@ span_tree: │ "raw": { │ "input_tokens": 27, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 4, @@ -3047,6 +3113,7 @@ span_tree: │ } │ metrics: { │ "completion_tokens": 4, + │ "prompt_cache_creation_tokens": 0, │ "prompt_cached_tokens": 0, │ "prompt_tokens": 27, │ "tokens": 31 @@ -3397,6 +3464,7 @@ span_tree: "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 173 }, "inputTokens": 173, @@ -3408,6 +3476,7 @@ span_tree: "raw": { "input_tokens": 173, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 59, @@ -3510,6 +3579,7 @@ span_tree: "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 260 }, "inputTokens": 260, @@ -3521,6 +3591,7 @@ span_tree: "raw": { "input_tokens": 260, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 21, @@ -3582,6 +3653,7 @@ span_tree: "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 308 }, "inputTokens": 308, @@ -3593,6 +3665,7 @@ span_tree: "raw": { "input_tokens": 308, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 62, @@ -3697,6 +3770,7 @@ span_tree: "totalUsage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 741 }, "inputTokens": 741, @@ -3710,6 +3784,7 @@ span_tree: "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 741 }, "inputTokens": 741, @@ -3838,6 +3913,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 173 │ }, │ "inputTokens": 173, @@ -3849,6 +3925,7 @@ span_tree: │ "raw": { │ "input_tokens": 173, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 59, @@ -3869,6 +3946,7 @@ span_tree: │ } │ metrics: { │ "completion_tokens": 59, + │ "prompt_cache_creation_tokens": 0, │ "prompt_cached_tokens": 0, │ "prompt_tokens": 173, │ "tokens": 232 @@ -4056,6 +4134,7 @@ span_tree: │ "usage": { │ "inputTokenDetails": { │ "cacheReadTokens": 0, + │ "cacheWriteTokens": 0, │ "noCacheTokens": 260 │ }, │ "inputTokens": 260, @@ -4067,6 +4146,7 @@ span_tree: │ "raw": { │ "input_tokens": 260, │ "input_tokens_details": { + │ "cache_write_tokens": 0, │ "cached_tokens": 0 │ }, │ "output_tokens": 21, @@ -4087,6 +4167,7 @@ span_tree: │ } │ metrics: { │ "completion_tokens": 21, + │ "prompt_cache_creation_tokens": 0, │ "prompt_cached_tokens": 0, │ "prompt_tokens": 260, │ "tokens": 281 @@ -4293,6 +4374,7 @@ span_tree: "usage": { "inputTokenDetails": { "cacheReadTokens": 0, + "cacheWriteTokens": 0, "noCacheTokens": 308 }, "inputTokens": 308, @@ -4304,6 +4386,7 @@ span_tree: "raw": { "input_tokens": 308, "input_tokens_details": { + "cache_write_tokens": 0, "cached_tokens": 0 }, "output_tokens": 62, @@ -4324,6 +4407,7 @@ span_tree: } metrics: { "completion_tokens": 62, + "prompt_cache_creation_tokens": 0, "prompt_cached_tokens": 0, "prompt_tokens": 308, "tokens": 370 diff --git a/e2e/scenarios/ai-sdk-instrumentation/package.json b/e2e/scenarios/ai-sdk-instrumentation/package.json index 3403a2b51..30f83675f 100644 --- a/e2e/scenarios/ai-sdk-instrumentation/package.json +++ b/e2e/scenarios/ai-sdk-instrumentation/package.json @@ -58,8 +58,7 @@ }, "ai-sdk-openai-v7-latest": { "package": "@ai-sdk/openai", - "range": "4.0.0-beta.44", - "allowPrerelease": true + "range": "4" } } } @@ -93,8 +92,8 @@ "ai-sdk-cohere-v6-latest": "npm:@ai-sdk/cohere@3.0.49", "ai-sdk-v7": "npm:ai@7.0.0", "ai-sdk-v7-latest": "npm:ai@7.0.0", - "ai-sdk-openai-v7": "npm:@ai-sdk/openai@4.0.0-beta.44", - "ai-sdk-openai-v7-latest": "npm:@ai-sdk/openai@4.0.0-beta.44", + "ai-sdk-openai-v7": "npm:@ai-sdk/openai@4.0.0", + "ai-sdk-openai-v7-latest": "npm:@ai-sdk/openai@4.0.16", "ai-sdk-workflow-v1": "npm:@ai-sdk/workflow@1.0.8" }, "pnpm": { diff --git a/e2e/scenarios/ai-sdk-instrumentation/pnpm-lock.yaml b/e2e/scenarios/ai-sdk-instrumentation/pnpm-lock.yaml index 1f36305fa..2afdcead6 100644 --- a/e2e/scenarios/ai-sdk-instrumentation/pnpm-lock.yaml +++ b/e2e/scenarios/ai-sdk-instrumentation/pnpm-lock.yaml @@ -65,11 +65,11 @@ importers: specifier: npm:@ai-sdk/openai@3.0.86 version: '@ai-sdk/openai@3.0.86(zod@3.25.76)' ai-sdk-openai-v7: - specifier: npm:@ai-sdk/openai@4.0.0-beta.44 - version: '@ai-sdk/openai@4.0.0-beta.44(zod@3.25.76)' + specifier: npm:@ai-sdk/openai@4.0.0 + version: '@ai-sdk/openai@4.0.0(zod@3.25.76)' ai-sdk-openai-v7-latest: - specifier: npm:@ai-sdk/openai@4.0.0-beta.44 - version: '@ai-sdk/openai@4.0.0-beta.44(zod@3.25.76)' + specifier: npm:@ai-sdk/openai@4.0.16 + version: '@ai-sdk/openai@4.0.16(zod@3.25.76)' ai-sdk-v3: specifier: npm:ai@3.4.33 version: ai@3.4.33(react@19.2.6)(sswr@2.2.0(svelte@5.55.9))(svelte@5.55.9)(vue@3.5.35)(zod@3.25.76) @@ -235,9 +235,15 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai@4.0.0-beta.44': - resolution: {integrity: sha512-kXdGA6vyh9SwL/B11UhODjbw0koFkDA/yD7hacBxMHSZx6l3T9hZLECEwOkn6OZDrQR+vno5Ka/pUyXrG82BkQ==} - engines: {node: '>=18'} + '@ai-sdk/openai@4.0.0': + resolution: {integrity: sha512-XcI/bJEG+Ymx8ZwQMY9GE9waHdEcSzT6wn2o+YW80hOQPf8IAGQvdNWKaD0mxLi6AmOM0L01y/p626w7rImblQ==} + engines: {node: '>=22'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/openai@4.0.16': + resolution: {integrity: sha512-Yh+PsXaf9NbN7oA3oKwOuyjTiHMPD75phf3SqGbDNNKQ3Yj3oTntp/WhO3nCHIPA6gr5/1lyridQokmOpPf9oQ==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -325,9 +331,9 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@5.0.0-beta.30': - resolution: {integrity: sha512-X3AxTsFJZr9Mw32SncWJA4/ShU8NA/XjhoallCYdcdQZ2gZZ/cIDyJJ6pNh1aBhicRNHv2ndgI6w/H2NGNIjOA==} - engines: {node: '>=18'} + '@ai-sdk/provider-utils@5.0.11': + resolution: {integrity: sha512-7/96wE+ZsKB35iS9ASyllrE4Ym/EolXEB7AkuJ5FI++fmS85BVTAs77890C+1Z2jwHfBKjBQSBmsliOsAh0iFQ==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -385,14 +391,14 @@ packages: resolution: {integrity: sha512-fr9Gs89prDWiuox/T+kCA+i2cJkHpxU5S+tr4megjTzRC27ZsvFhwjU/+XrqqMbvBUlfmXxTOYWy8ng45dsjIg==} engines: {node: '>=22'} - '@ai-sdk/provider@4.0.0-beta.14': - resolution: {integrity: sha512-SMijtjVHs38n0dMkTcNuGrnStiF76OhAqS0R+ZX4iXUnuPPyTxQoVcF8Xuf2AoBB5rqndTId5FVT05bgqD5KsA==} - engines: {node: '>=18'} - '@ai-sdk/provider@4.0.1': resolution: {integrity: sha512-6p3C/vGqVIjcptBu1DnVd/BZJ2wWmV9TUv9192vT6ZvT9KNED8EwRTqyqFpoQZKgSbMDSvBSq3dqR524Nt/Crw==} engines: {node: '>=22'} + '@ai-sdk/provider@4.0.3': + resolution: {integrity: sha512-e0CpNWJUY7OxAFAnCZkw+ri9QOHWwTs1tXP42782KFGCU07qt8NiXCrCVowyCB5dP2r5/Uls+g2oPd8kOJn9dw==} + engines: {node: '>=22'} + '@ai-sdk/react@0.0.70': resolution: {integrity: sha512-GnwbtjW4/4z7MleLiW+TOZC2M29eCg1tOUpuEiYFMmFNZK8mkrqM0PFZMo6UsYeUYMWqEOOcPOU9OQVJMJh7IQ==} engines: {node: '>=18'} @@ -937,10 +943,16 @@ snapshots: '@ai-sdk/provider-utils': 4.0.40(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/openai@4.0.0-beta.44(zod@3.25.76)': + '@ai-sdk/openai@4.0.0(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 4.0.0-beta.14 - '@ai-sdk/provider-utils': 5.0.0-beta.30(zod@3.25.76) + '@ai-sdk/provider': 4.0.0 + '@ai-sdk/provider-utils': 5.0.0(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/openai@4.0.16(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 4.0.3 + '@ai-sdk/provider-utils': 5.0.11(zod@3.25.76) zod: 3.25.76 '@ai-sdk/provider-utils@1.0.19(zod@3.25.76)': @@ -1039,9 +1051,9 @@ snapshots: eventsource-parser: 3.0.8 zod: 3.25.76 - '@ai-sdk/provider-utils@5.0.0-beta.30(zod@3.25.76)': + '@ai-sdk/provider-utils@5.0.11(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 4.0.0-beta.14 + '@ai-sdk/provider': 4.0.3 '@standard-schema/spec': 1.1.0 '@workflow/serde': 4.1.0 eventsource-parser: 3.0.8 @@ -1103,11 +1115,11 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/provider@4.0.0-beta.14': + '@ai-sdk/provider@4.0.1': dependencies: json-schema: 0.4.0 - '@ai-sdk/provider@4.0.1': + '@ai-sdk/provider@4.0.3': dependencies: json-schema: 0.4.0 diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/.gitignore b/e2e/scenarios/cloudflare-agents-instrumentation/.gitignore new file mode 100644 index 000000000..6bf8e87df --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/.gitignore @@ -0,0 +1,2 @@ +.dev.vars +.wrangler/ diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-auto.span-tree.json b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-auto.span-tree.json new file mode 100644 index 000000000..606ae1c69 --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-auto.span-tree.json @@ -0,0 +1,68 @@ +{ + "span_tree": [ + { + "name": "cloudflare-agents-e2e-root", + "type": "task", + "children": [ + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "concurrent-a", + "delayMs": 0, + "value": "allowed-a" + }, + "output": { + "case": "concurrent-a", + "echoed": "allowed-a" + } + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "concurrent-b", + "delayMs": 0, + "value": "allowed-b" + }, + "output": { + "case": "concurrent-b", + "echoed": "allowed-b" + } + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "error", + "delayMs": 0, + "value": "allowed-error" + }, + "error": "deterministic child failure" + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "success", + "delayMs": 0, + "value": "allowed-success" + }, + "output": { + "case": "success", + "echoed": "allowed-success" + } + } + ], + "metadata": { + "instrumentationMode": "auto", + "scenario": "cloudflare-agents-instrumentation", + "testRunId": "" + } + } + ] +} diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-auto.span-tree.txt b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-auto.span-tree.txt new file mode 100644 index 000000000..bdf5b6ed0 --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-auto.span-tree.txt @@ -0,0 +1,44 @@ +span_tree: +└── cloudflare-agents-e2e-root [task] + metadata: { + "instrumentationMode": "auto", + "scenario": "cloudflare-agents-instrumentation", + "testRunId": "" + } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "concurrent-a", + │ "delayMs": 0, + │ "value": "allowed-a" + │ } + │ output: { + │ "case": "concurrent-a", + │ "echoed": "allowed-a" + │ } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "concurrent-b", + │ "delayMs": 0, + │ "value": "allowed-b" + │ } + │ output: { + │ "case": "concurrent-b", + │ "echoed": "allowed-b" + │ } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "error", + │ "delayMs": 0, + │ "value": "allowed-error" + │ } + │ error: "deterministic child failure" + └── DeterministicToolAgent [tool] + input: { + "case": "success", + "delayMs": 0, + "value": "allowed-success" + } + output: { + "case": "success", + "echoed": "allowed-success" + } diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-latest-auto.span-tree.json b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-latest-auto.span-tree.json new file mode 100644 index 000000000..606ae1c69 --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-latest-auto.span-tree.json @@ -0,0 +1,68 @@ +{ + "span_tree": [ + { + "name": "cloudflare-agents-e2e-root", + "type": "task", + "children": [ + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "concurrent-a", + "delayMs": 0, + "value": "allowed-a" + }, + "output": { + "case": "concurrent-a", + "echoed": "allowed-a" + } + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "concurrent-b", + "delayMs": 0, + "value": "allowed-b" + }, + "output": { + "case": "concurrent-b", + "echoed": "allowed-b" + } + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "error", + "delayMs": 0, + "value": "allowed-error" + }, + "error": "deterministic child failure" + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "success", + "delayMs": 0, + "value": "allowed-success" + }, + "output": { + "case": "success", + "echoed": "allowed-success" + } + } + ], + "metadata": { + "instrumentationMode": "auto", + "scenario": "cloudflare-agents-instrumentation", + "testRunId": "" + } + } + ] +} diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-latest-auto.span-tree.txt b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-latest-auto.span-tree.txt new file mode 100644 index 000000000..bdf5b6ed0 --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-latest-auto.span-tree.txt @@ -0,0 +1,44 @@ +span_tree: +└── cloudflare-agents-e2e-root [task] + metadata: { + "instrumentationMode": "auto", + "scenario": "cloudflare-agents-instrumentation", + "testRunId": "" + } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "concurrent-a", + │ "delayMs": 0, + │ "value": "allowed-a" + │ } + │ output: { + │ "case": "concurrent-a", + │ "echoed": "allowed-a" + │ } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "concurrent-b", + │ "delayMs": 0, + │ "value": "allowed-b" + │ } + │ output: { + │ "case": "concurrent-b", + │ "echoed": "allowed-b" + │ } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "error", + │ "delayMs": 0, + │ "value": "allowed-error" + │ } + │ error: "deterministic child failure" + └── DeterministicToolAgent [tool] + input: { + "case": "success", + "delayMs": 0, + "value": "allowed-success" + } + output: { + "case": "success", + "echoed": "allowed-success" + } diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-latest-wrapped.span-tree.json b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-latest-wrapped.span-tree.json new file mode 100644 index 000000000..d3467fca3 --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-latest-wrapped.span-tree.json @@ -0,0 +1,68 @@ +{ + "span_tree": [ + { + "name": "cloudflare-agents-e2e-root", + "type": "task", + "children": [ + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "concurrent-a", + "delayMs": 0, + "value": "allowed-a" + }, + "output": { + "case": "concurrent-a", + "echoed": "allowed-a" + } + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "concurrent-b", + "delayMs": 0, + "value": "allowed-b" + }, + "output": { + "case": "concurrent-b", + "echoed": "allowed-b" + } + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "error", + "delayMs": 0, + "value": "allowed-error" + }, + "error": "deterministic child failure" + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "success", + "delayMs": 0, + "value": "allowed-success" + }, + "output": { + "case": "success", + "echoed": "allowed-success" + } + } + ], + "metadata": { + "instrumentationMode": "wrapped", + "scenario": "cloudflare-agents-instrumentation", + "testRunId": "" + } + } + ] +} diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-latest-wrapped.span-tree.txt b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-latest-wrapped.span-tree.txt new file mode 100644 index 000000000..53d7a1240 --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-latest-wrapped.span-tree.txt @@ -0,0 +1,44 @@ +span_tree: +└── cloudflare-agents-e2e-root [task] + metadata: { + "instrumentationMode": "wrapped", + "scenario": "cloudflare-agents-instrumentation", + "testRunId": "" + } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "concurrent-a", + │ "delayMs": 0, + │ "value": "allowed-a" + │ } + │ output: { + │ "case": "concurrent-a", + │ "echoed": "allowed-a" + │ } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "concurrent-b", + │ "delayMs": 0, + │ "value": "allowed-b" + │ } + │ output: { + │ "case": "concurrent-b", + │ "echoed": "allowed-b" + │ } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "error", + │ "delayMs": 0, + │ "value": "allowed-error" + │ } + │ error: "deterministic child failure" + └── DeterministicToolAgent [tool] + input: { + "case": "success", + "delayMs": 0, + "value": "allowed-success" + } + output: { + "case": "success", + "echoed": "allowed-success" + } diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-wrapped.span-tree.json b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-wrapped.span-tree.json new file mode 100644 index 000000000..d3467fca3 --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-wrapped.span-tree.json @@ -0,0 +1,68 @@ +{ + "span_tree": [ + { + "name": "cloudflare-agents-e2e-root", + "type": "task", + "children": [ + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "concurrent-a", + "delayMs": 0, + "value": "allowed-a" + }, + "output": { + "case": "concurrent-a", + "echoed": "allowed-a" + } + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "concurrent-b", + "delayMs": 0, + "value": "allowed-b" + }, + "output": { + "case": "concurrent-b", + "echoed": "allowed-b" + } + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "error", + "delayMs": 0, + "value": "allowed-error" + }, + "error": "deterministic child failure" + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "success", + "delayMs": 0, + "value": "allowed-success" + }, + "output": { + "case": "success", + "echoed": "allowed-success" + } + } + ], + "metadata": { + "instrumentationMode": "wrapped", + "scenario": "cloudflare-agents-instrumentation", + "testRunId": "" + } + } + ] +} diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-wrapped.span-tree.txt b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-wrapped.span-tree.txt new file mode 100644 index 000000000..53d7a1240 --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-17-wrapped.span-tree.txt @@ -0,0 +1,44 @@ +span_tree: +└── cloudflare-agents-e2e-root [task] + metadata: { + "instrumentationMode": "wrapped", + "scenario": "cloudflare-agents-instrumentation", + "testRunId": "" + } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "concurrent-a", + │ "delayMs": 0, + │ "value": "allowed-a" + │ } + │ output: { + │ "case": "concurrent-a", + │ "echoed": "allowed-a" + │ } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "concurrent-b", + │ "delayMs": 0, + │ "value": "allowed-b" + │ } + │ output: { + │ "case": "concurrent-b", + │ "echoed": "allowed-b" + │ } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "error", + │ "delayMs": 0, + │ "value": "allowed-error" + │ } + │ error: "deterministic child failure" + └── DeterministicToolAgent [tool] + input: { + "case": "success", + "delayMs": 0, + "value": "allowed-success" + } + output: { + "case": "success", + "echoed": "allowed-success" + } diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/assertions.ts b/e2e/scenarios/cloudflare-agents-instrumentation/assertions.ts new file mode 100644 index 000000000..bba5b0b90 --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/assertions.ts @@ -0,0 +1,223 @@ +import { beforeAll, describe, expect, test } from "vitest"; +import type { CapturedLogEvent } from "../../helpers/mock-braintrust-server"; +import { resolveFileSnapshotPath } from "../../helpers/file-snapshot"; +import { + effectiveScenarioTimeoutMs, + withScenarioHarness, + type ScenarioRunContext, +} from "../../helpers/scenario-harness"; +import { findChildSpans, findLatestSpan } from "../../helpers/trace-selectors"; +import { + matchSpanTreeSnapshot, + spanTreeFields, + type SpanTreeEntry, +} from "../../helpers/span-tree"; + +const ROOT_NAME = "cloudflare-agents-e2e-root"; +const TOOL_NAME = "DeterministicToolAgent"; +const FORBIDDEN_MARKERS = [ + "forbidden-run-id-marker", + "forbidden-parent-tool-call-marker", + "forbidden-input-preview-marker", + "forbidden-display-marker", + "secret-summary", + "secret-agent-type", +]; + +type RunCloudflareAgentsScenario = (harness: { + runScenarioDir: (options: { + entry: string; + env: Record; + runContext?: ScenarioRunContext; + scenarioDir: string; + timeoutMs: number; + }) => Promise; +}) => Promise; + +function toolSpans(events: CapturedLogEvent[]) { + const root = findLatestSpan(events, ROOT_NAME); + return findChildSpans(events, TOOL_NAME, root?.span.id); +} + +function toolByCase(events: CapturedLogEvent[], caseName: string) { + return toolSpans(events).find( + (event) => isRecord(event.input) && event.input.case === caseName, + ); +} + +function summarize(events: CapturedLogEvent[]): SpanTreeEntry[] { + const root = findLatestSpan(events, ROOT_NAME); + const tools = toolSpans(events).sort((left, right) => + String(isRecord(left.input) ? left.input.case : "").localeCompare( + String(isRecord(right.input) ? right.input.case : ""), + ), + ); + return [root, ...tools].flatMap((event) => + event + ? [ + { + event, + fields: { + ...spanTreeFields(event), + context: event.context, + }, + }, + ] + : [], + ); +} + +export function defineCloudflareAgentsAssertions(options: { + name: string; + runScenario: RunCloudflareAgentsScenario; + snapshotName: string; + testFileUrl: string; + timeoutMs: number; +}): void { + const snapshotPath = resolveFileSnapshotPath( + options.testFileUrl, + `${options.snapshotName}.span-tree.json`, + ); + const timeoutMs = effectiveScenarioTimeoutMs(options.timeoutMs); + const testConfig = { timeout: timeoutMs }; + + describe(options.name, () => { + let events: CapturedLogEvent[] = []; + let setupError: string | undefined; + + beforeAll(async () => { + try { + await withScenarioHarness(async (harness) => { + await options.runScenario(harness); + events = harness.events(); + }); + } catch (error) { + setupError = error instanceof Error ? error.stack : String(error); + } + }, timeoutMs); + + test("captures awaited child runs as exact tool spans", testConfig, () => { + expect(setupError).toBeUndefined(); + const root = findLatestSpan(events, ROOT_NAME); + const tools = toolSpans(events); + + expect(root).toBeDefined(); + expect(root?.metadata).toMatchObject({ + scenario: "cloudflare-agents-instrumentation", + testRunId: expect.any(String), + }); + expect(tools).toHaveLength(4); + + for (const tool of tools) { + expect(tool.span.name).toBe(TOOL_NAME); + expect(tool.span.type).toBe("tool"); + expect(tool.span.parentIds).toEqual([root?.span.id]); + expect(tool.span.rootId).toBe(root?.span.rootId); + expect(tool.span.started).toBe(true); + expect(tool.span.ended).toBe(true); + expect(tool.metrics?.start).toEqual(expect.any(Number)); + expect(tool.metrics?.end).toEqual(expect.any(Number)); + expect(Number(tool.metrics?.end)).toBeGreaterThanOrEqual( + Number(tool.metrics?.start), + ); + expect(tool.context).toMatchObject({ + span_origin: { + name: "braintrust.sdk.javascript", + instrumentation: { name: "cloudflare-agents" }, + environment: { + type: "server", + name: "cloudflare_workers", + }, + }, + }); + } + }); + + test( + "records exact inputs, completed outputs, and returned errors", + testConfig, + () => { + expect(setupError).toBeUndefined(); + const success = toolByCase(events, "success"); + const failure = toolByCase(events, "error"); + const concurrentA = toolByCase(events, "concurrent-a"); + const concurrentB = toolByCase(events, "concurrent-b"); + + expect(success?.input).toEqual({ + case: "success", + delayMs: 10, + value: "allowed-success", + }); + expect(success?.output).toEqual({ + case: "success", + echoed: "allowed-success", + }); + expect(success?.row.error).toBeUndefined(); + + expect(failure?.input).toEqual({ + case: "error", + delayMs: 10, + value: "allowed-error", + }); + expect(failure?.output).toBeUndefined(); + expect(failure?.row.error).toBe("deterministic child failure"); + + expect(concurrentA?.output).toEqual({ + case: "concurrent-a", + echoed: "allowed-a", + }); + expect(concurrentB?.output).toEqual({ + case: "concurrent-b", + echoed: "allowed-b", + }); + expect(toolByCase(events, "detached")).toBeUndefined(); + }, + ); + + test( + "keeps concurrent child spans as overlapping siblings", + testConfig, + () => { + expect(setupError).toBeUndefined(); + const concurrentA = toolByCase(events, "concurrent-a"); + const concurrentB = toolByCase(events, "concurrent-b"); + + expect(concurrentA).toBeDefined(); + expect(concurrentB).toBeDefined(); + expect(concurrentA?.span.parentIds).toEqual( + concurrentB?.span.parentIds, + ); + expect(Number(concurrentA?.metrics?.start)).toBeLessThan( + Number(concurrentB?.metrics?.end), + ); + expect(Number(concurrentB?.metrics?.start)).toBeLessThan( + Number(concurrentA?.metrics?.end), + ); + }, + ); + + test("does not leak framework control fields", testConfig, () => { + expect(setupError).toBeUndefined(); + const serialized = JSON.stringify(toolSpans(events)); + for (const marker of FORBIDDEN_MARKERS) { + expect(serialized).not.toContain(marker); + } + for (const tool of toolSpans(events)) { + const metadata = tool.metadata ?? {}; + expect(metadata).not.toHaveProperty("runId"); + expect(metadata).not.toHaveProperty("agentType"); + expect(metadata).not.toHaveProperty("summary"); + expect(metadata).not.toHaveProperty("status"); + } + }); + + test("matches the span tree snapshot", testConfig, async () => { + expect(setupError).toBeUndefined(); + await matchSpanTreeSnapshot(summarize(events), snapshotPath); + }); + }); +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/package.json b/e2e/scenarios/cloudflare-agents-instrumentation/package.json new file mode 100644 index 000000000..c86a79c2d --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/package.json @@ -0,0 +1,27 @@ +{ + "name": "@braintrust/e2e-cloudflare-agents-instrumentation", + "private": true, + "type": "module", + "braintrustScenario": { + "bump": { + "dependencies": { + "agents-v0-17-latest": { + "package": "agents", + "range": ">=0.17.0 <0.18.0" + } + } + } + }, + "dependencies": { + "@cloudflare/vite-plugin": "1.45.1", + "@cloudflare/workers-types": "5.20260719.1", + "agents-v0-17": "npm:agents@0.17.0", + "agents-v0-17-latest": "npm:agents@0.17.4", + "ai": "6.0.82", + "dc-browser": "1.0.4", + "react": "19.2.3", + "vite": "6.4.3", + "wrangler": "4.112.0", + "zod": "4.3.6" + } +} diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/pnpm-lock.yaml b/e2e/scenarios/cloudflare-agents-instrumentation/pnpm-lock.yaml new file mode 100644 index 000000000..86c7804a0 --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/pnpm-lock.yaml @@ -0,0 +1,3492 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@cloudflare/vite-plugin': + specifier: 1.45.1 + version: 1.45.1(vite@6.4.3(lightningcss@1.33.0)(yaml@2.9.0))(wrangler@4.112.0(@cloudflare/workers-types@5.20260719.1)) + '@cloudflare/workers-types': + specifier: 5.20260719.1 + version: 5.20260719.1 + agents-v0-17: + specifier: npm:agents@0.17.0 + version: agents@0.17.0(@babel/core@8.0.1)(@babel/runtime@7.29.7)(@cloudflare/workers-types@5.20260719.1)(ai@6.0.82(zod@4.3.6))(react@19.2.3)(rolldown@1.2.0)(vite@6.4.3(lightningcss@1.33.0)(yaml@2.9.0))(zod@4.3.6) + agents-v0-17-latest: + specifier: npm:agents@0.17.4 + version: agents@0.17.4(@babel/core@8.0.1)(@babel/runtime@7.29.7)(@cloudflare/workers-types@5.20260719.1)(ai@6.0.82(zod@4.3.6))(react@19.2.3)(rolldown@1.2.0)(vite@6.4.3(lightningcss@1.33.0)(yaml@2.9.0))(zod@4.3.6) + ai: + specifier: 6.0.82 + version: 6.0.82(zod@4.3.6) + dc-browser: + specifier: 1.0.4 + version: 1.0.4 + react: + specifier: 19.2.3 + version: 19.2.3 + vite: + specifier: 6.4.3 + version: 6.4.3(lightningcss@1.33.0)(yaml@2.9.0) + wrangler: + specifier: 4.112.0 + version: 4.112.0(@cloudflare/workers-types@5.20260719.1) + zod: + specifier: 4.3.6 + version: 4.3.6 + +packages: + + '@ai-sdk/gateway@3.0.42': + resolution: {integrity: sha512-Il9lZWPUQMX59H5yJvA08gxfL2Py8oHwvAYRnK0Mt91S+JgPcyk/yEmXNDZG9ghJrwSawtK5Yocy8OnzsTOGsw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@4.0.14': + resolution: {integrity: sha512-7bzKd9lgiDeXM7O4U4nQ8iTxguAOkg8LZGD9AfDVZYjO5cKYRwBPwVjboFcVrxncRHu0tYxZtXZtiLKpG4pEng==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider@3.0.8': + resolution: {integrity: sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==} + engines: {node: '>=18'} + + '@babel/code-frame@8.0.0': + resolution: {integrity: sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/compat-data@8.0.0': + resolution: {integrity: sha512-DOjnob/cXOUgDOozCDeq/aK2p5y8dUIVdf6tNhEV1HQRd6I8aQ4f4fbtHRVEvb6lP3BGomrKHiS8ICAASSVQSw==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/core@8.0.1': + resolution: {integrity: sha512-5FgxM4dLQpMJHSiVATk8foW263dVHQHBVpXYiimNECVWG01f4nFyEbQixeT6Mwvg7TayREJ2gpKl3o2RoMdnqw==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/generator@8.0.0': + resolution: {integrity: sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-annotate-as-pure@8.0.0': + resolution: {integrity: sha512-NSpMkMsvvZqzThJ0p1B02cbtA2ObEyfBvq950bmNkyxsxvcxwhvvCB036rKhlEnuBBo30bOrk13u3FzlKSoRrw==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-compilation-targets@8.0.0': + resolution: {integrity: sha512-JwculLABZvyPvyLBpwU/E/IbH2uM3mnxNtIJpxnIfb24y1PrdVxK5Dqjle4DpgqpGRnwgC7G8IkzPdSXZrO1Ew==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-create-class-features-plugin@8.0.1': + resolution: {integrity: sha512-++t3ZktzlLmASAxIlxeXQK9Z2YwUafYGYcvGBFevqOqt16HozVHStUoQvWD09fzAZOb/uJGpUTBuGK41AJAuOA==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + + '@babel/helper-globals@8.0.0': + resolution: {integrity: sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-member-expression-to-functions@8.0.0': + resolution: {integrity: sha512-xkXrMbtk87Gk7+oKBVmBc6EORg/Qwx++AHESldmHkpvG8wgccdhJJFwrzqlF382Fk8wfXhJHWE/g/43QvEGNPQ==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-optimise-call-expression@8.0.0': + resolution: {integrity: sha512-3W6satvtPuCUkUx63S2jMoW9EQNYkADgs1HTfufmL7gCmAulHMKupA/12WNz4A0GMMFn/YnWWwqOT9IZrJHQjg==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-plugin-utils@8.0.1': + resolution: {integrity: sha512-3PKFgjTyPlhFhorfP+SjKQxLViIL++zWjFOO4hGriYU+Bsm983DxEM1JmDRJVWXV0O9npu+xXRqz7Pbd3mh70g==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + + '@babel/helper-replace-supers@8.0.1': + resolution: {integrity: sha512-B1SZADIcy3tmH8CmWvj4SHi/oAPom4UL3uknTc2QRNsPVLFk/sPnZvQL/8kj7Y5omvjMqie0vklvs6XM4OLW5Q==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@8.0.0': + resolution: {integrity: sha512-xmCA9kP3IhySsqhzwIdWGlDN/1A4cCKNBO/uwZx/3YzmDoMePwno2Q5/Bq0q+tYaKbeF940YiKV/kaW8Mzvpjw==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-string-parser@8.0.0': + resolution: {integrity: sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-validator-identifier@8.0.4': + resolution: {integrity: sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-validator-option@8.0.0': + resolution: {integrity: sha512-U4Dybxh4WESWHt5XhBeExi4DrY0/DNK1aHpQbsrQXCUbFHuMweT0TpLEWKvaraV2Y6fS+ZXunsZ8zIuZIgvF2Q==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helpers@8.0.0': + resolution: {integrity: sha512-wfbi91pM3py96oIiJEz7qIpyXDytgr9zQC1HEWwlGNVRAEmItuU/0a41ZUKu1sJGyhhOIpc4t5vk4PYzt8wpsg==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/parser@8.0.4': + resolution: {integrity: sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==} + engines: {node: ^22.18.0 || >=24.11.0} + hasBin: true + + '@babel/plugin-proposal-decorators@8.0.2': + resolution: {integrity: sha512-+C6O6KKXU7BBq1GNaIkFJxrALUVGRcr+WeWm4OcuRl3h+l/CmNfcTLMrT2Lm3uvGBimBH/8pEBRrXJFLoO67Gg==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + + '@babel/plugin-syntax-decorators@8.0.1': + resolution: {integrity: sha512-NI+0S/6MvR6GlcQFwjDZ+WIc2qvG6TXN534lYs9llNldwW4b7Dh6KTtk030FA0xWdYGs4t1lWo+OEWN8wGB+Nw==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + + '@babel/runtime-corejs3@7.29.7': + resolution: {integrity: sha512-ppj9ouYku+RX0ljtgZd+KMO5mkM2bCqg8H2PYAFWnLsHEIKIdRojqbJ2i3eVHrisuxy7nOFCmngTDdWtUCdXUQ==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + + '@babel/template@8.0.0': + resolution: {integrity: sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/traverse@8.0.4': + resolution: {integrity: sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/types@8.0.4': + resolution: {integrity: sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@cfworker/json-schema@4.1.1': + resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} + + '@cloudflare/codemode@0.4.3': + resolution: {integrity: sha512-S6LIqj/NnmFRFxm3j0tPEGMF8HQF5DpV7sQg/W+U48YmnznTKOBcbS8eiV7SxBpIITLuMBcL4KpTDm1RDL20pA==} + peerDependencies: + '@modelcontextprotocol/sdk': ^1.25.0 + '@tanstack/ai': '>=0.8.0 <1.0.0' + ai: ^6.0.0 + zod: ^4.0.0 + peerDependenciesMeta: + '@modelcontextprotocol/sdk': + optional: true + '@tanstack/ai': + optional: true + ai: + optional: true + zod: + optional: true + + '@cloudflare/kv-asset-handler@0.5.0': + resolution: {integrity: sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==} + engines: {node: '>=22.0.0'} + + '@cloudflare/unenv-preset@2.16.1': + resolution: {integrity: sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw==} + peerDependencies: + unenv: 2.0.0-rc.24 + workerd: '>1.20260305.0 <2.0.0-0' + peerDependenciesMeta: + workerd: + optional: true + + '@cloudflare/vite-plugin@1.45.1': + resolution: {integrity: sha512-C+iDpO9pVH7IqrjdYtUV+obcTAdpiNk0OSinGEZZyd2ZWyGVjGk7iJ2p3xpMBpZuTa1I4hfAECNp0yN/8f3PIQ==} + hasBin: true + peerDependencies: + vite: ^6.1.0 || ^7.0.0 || ^8.0.0 + wrangler: ^4.112.0 + + '@cloudflare/workerd-darwin-64@1.20260714.1': + resolution: {integrity: sha512-ZWXqAN8G7Cx9hMRQuk+59ziJhR3j1F4iO+Qs8aHdfKZ3Dq5Yi/57xvkJTgCGBnW1YU/L78r8f6HEy51bwbTpNw==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + + '@cloudflare/workerd-darwin-arm64@1.20260714.1': + resolution: {integrity: sha512-tueWxWC3wyCbMG6zRAxsMXX0YLgrRWbiAPYFQ2uJ7dUH8G+5E7UTWaQS9B1HdJ0bpKFW1NWxhs1o2noKVFSUYg==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + + '@cloudflare/workerd-linux-64@1.20260714.1': + resolution: {integrity: sha512-1VChTZRb0l0F7R4e1G5RtLKV4oFi6x+rQgxh2+yu887j3l/3TLgatuv1L8/5zhc9gKEhATTxOh0e52Rtd9dDWQ==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + + '@cloudflare/workerd-linux-arm64@1.20260714.1': + resolution: {integrity: sha512-rMm3G+NirG2UdgHIRDdF1asNC6FqgIzZzkRG+VDhhDGcVxAQwvrMT1E38BivEvHr3G04MB4AfhcOczX0+GtRkQ==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + + '@cloudflare/workerd-windows-64@1.20260714.1': + resolution: {integrity: sha512-cGqnU3Hg2YZS/k3SAqrMp1DjpdsyFde72tWltdl6ZT9+SFz/Zrk/8gyTU1TcxC4YApXeNVH5TyU5cOGPgUJ0pg==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + + '@cloudflare/workers-types@5.20260719.1': + resolution: {integrity: sha512-DcGasbfUuczQilc80vhL2MPPdWcaxWkx0hN5IW9UdNDBdrRvWcal3akSJ6Ccm7e8+/OGeR+8tYrqkykA3YGSZw==} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@emnapi/core@1.11.2': + resolution: {integrity: sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==} + + '@emnapi/runtime@1.11.2': + resolution: {integrity: sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==} + + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@hono/node-server@1.19.14': + resolution: {integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: ^4 + + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@modelcontextprotocol/sdk@1.29.0': + resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + + '@napi-rs/wasm-runtime@1.1.6': + resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@oxc-project/types@0.140.0': + resolution: {integrity: sha512-h5LUOzGArYemnW1NMz/DuuQhBi96J6JL2Bk8zE4kvqxB5Sg3jxmCiH4uyOWHDkiKSt5vWlG4FIwCR/DbstcNRQ==} + + '@poppinss/colors@4.1.6': + resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} + + '@poppinss/dumper@0.6.5': + resolution: {integrity: sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==} + + '@poppinss/exception@1.2.3': + resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} + + '@rolldown/binding-android-arm64@1.2.0': + resolution: {integrity: sha512-9yB1l95IrJuNGDFdOYe79vdApdz6WWBCObE+rQ2LUliYUlcyFwSYIb2xb5/Ifw7dAtMy2ZqNyd8QTSOc7duAKw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.2.0': + resolution: {integrity: sha512-pexNaW9ACLUOaBITOpU6qVu4VrsOFIjTv6bzgu0YUATo4eUJx0V605PxwZfndpPOn0ilqGqvGQ0M8UW0IE24jg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.2.0': + resolution: {integrity: sha512-NqKYaq0355ZmNMG4QGpxtEDxsc7tGDhjhCm4PpE0cwnBW+5Il95LJyq414niEiaKLVjnVHBEjSo1wngKxJNiFw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.2.0': + resolution: {integrity: sha512-3vPoHzh6eBTz9IbB0/qZdSr0Qeks2echn+I4cHu2joV74VriPDdldswksEDzrl1mBB+oPRi+67+3Ib59paxIPQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.2.0': + resolution: {integrity: sha512-E6NNefZ1bUVmKJq2tJkf45J4Zyczj7qm9rUT7NY+Xo2474Y13qWAwc2tvBt0BAVbmtXR1llkxXg0Ou1jbDf2SQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.2.0': + resolution: {integrity: sha512-D+TgkdgM1vu+7/Fpf8+v0ARW+RXEP9Ccazgm8zQ4JFFd9Q7SrYQ2TakU5S5ihazQDgpKyAgZDOcIFsvoHmTZ8w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.2.0': + resolution: {integrity: sha512-wUqdwJBbAv0APN87GecstdMUtLjjNTs0hBALpxETD73mccFxdmt/XeizXDtN5RAlBwNKmI+Tg+blect2G+8IeQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.2.0': + resolution: {integrity: sha512-9DtF35qR9/NrfhM4oxLplCzVVjE+KKm8Pjemi0i/sdhAWkUasjmSo8WTTubNJClhSHCfyk2yeyoXDQEDPtDAAw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.2.0': + resolution: {integrity: sha512-RzuHrBh8X8Hntd2N4VR02QGEciq/9JhcZoTpR/Cee6otRrlILGCf3cg2ygHuih+ZebUnWmMrDX6ITI85btO6rQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.2.0': + resolution: {integrity: sha512-MK7L0018jjh1jR3mh21G2j1zAVcpscJBlPo2z19pRjv2XOYGRhaV4LyiD8HO6nCDdZln9IFgCMIV5yt4E3klGQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.2.0': + resolution: {integrity: sha512-gyrxLQ9NfGb/9LoVnC4kb9miUghw1mghnkfYvNHSnVIXriabnfgGPUP4RLcJm87q3KgYz4FYUG8IDiWUT+CpSw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.2.0': + resolution: {integrity: sha512-/6VFMQGRmrhP77KXDC+StIxGzcNp5JOIyYtw0CQ8gPlzhpiIRucYfoM5FaFamHd5BJYIdH86yfP46l1p3WdrFA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.2.0': + resolution: {integrity: sha512-rwdbUL465kisF24WEJLvP3JrEG6E5GRuIHt5wpMwHGERtHe4Wm2CIvtf5gTBgr2tGOHKh5NdKEAFS2VkOPE91g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.2.0': + resolution: {integrity: sha512-+5suHwRiKGmhwyUaNT8a5QbrBvLFh2DbO910TEmGRH1aSxwrCezodvGQnulv4uiWEIv1Kq4ypRsJ5+O+ry1DiA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.2.0': + resolution: {integrity: sha512-WfFv6/qGufotqBSBzBYwgpCkJBk8Nj7697LL9vTz/XWc67e0r3oewu8iMRwQj3AUL45GVD7wVsPjCsAAtW66Wg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/plugin-babel@0.2.3': + resolution: {integrity: sha512-+zEk16yGlz1F9STiRr6uG9hmIXb6nprjLczV/htGptYuLoCuxb+itZ03RKCEeOhBpDDd1NU7qF6x1VLMUp62bw==} + engines: {node: '>=22.12.0 || ^24.0.0'} + peerDependencies: + '@babel/core': ^7.29.0 || ^8.0.0-rc.1 + '@babel/plugin-transform-runtime': ^7.29.0 || ^8.0.0-rc.1 + '@babel/runtime': ^7.27.0 || ^8.0.0-rc.1 + rolldown: ^1.0.0-rc.5 + vite: ^8.0.0 + peerDependenciesMeta: + '@babel/plugin-transform-runtime': + optional: true + '@babel/runtime': + optional: true + vite: + optional: true + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@rollup/rollup-android-arm-eabi@4.62.2': + resolution: {integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.62.2': + resolution: {integrity: sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.62.2': + resolution: {integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.62.2': + resolution: {integrity: sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.62.2': + resolution: {integrity: sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.62.2': + resolution: {integrity: sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + resolution: {integrity: sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.62.2': + resolution: {integrity: sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.62.2': + resolution: {integrity: sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.62.2': + resolution: {integrity: sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.62.2': + resolution: {integrity: sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.62.2': + resolution: {integrity: sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.62.2': + resolution: {integrity: sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.62.2': + resolution: {integrity: sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.62.2': + resolution: {integrity: sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.62.2': + resolution: {integrity: sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.62.2': + resolution: {integrity: sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.62.2': + resolution: {integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.62.2': + resolution: {integrity: sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.62.2': + resolution: {integrity: sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.62.2': + resolution: {integrity: sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.62.2': + resolution: {integrity: sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.62.2': + resolution: {integrity: sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.62.2': + resolution: {integrity: sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.62.2': + resolution: {integrity: sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==} + cpu: [x64] + os: [win32] + + '@sindresorhus/is@7.2.0': + resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} + engines: {node: '>=18'} + + '@speed-highlight/core@1.2.17': + resolution: {integrity: sha512-Z92FwKpCtfaW1V0jTU/fh3QzYEZN8wDwrzRIBoADCJfn4mJCNcJN/XegifX7BDrQ8/h9Xh/JnbyMchL0FqXrkg==} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/gensync@1.0.5': + resolution: {integrity: sha512-MbsRCT7mTikHwKZ0X+LVUTLRrZZRLipTuXEO9qOYO+zmjMVk81axyClMROf6uoPD9MRVu46bx8zoR0Ad9q3NAg==} + + '@types/jsesc@2.5.1': + resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@vercel/oidc@3.1.0': + resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==} + engines: {node: '>= 20'} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agents@0.17.0: + resolution: {integrity: sha512-4BpspOmDRsSndgi/DMVWmdq2WGW/85hJWrX6WvMksd1RYAZ2/fNtvRc4DMiqettak8+J9Dcmshn1ImR/tKT1yA==} + hasBin: true + peerDependencies: + '@ai-sdk/react': ^3.0.204 + '@tanstack/ai': '>=0.10.2 <1.0.0' + '@x402/core': ^2.0.0 + '@x402/evm': ^2.0.0 + ai: ^6.0.0 + chat: ^4.29.0 + just-bash: ^3.0.0 + react: ^19.0.0 + vite: '>=6.0.0 <9.0.0' + zod: ^4.0.0 + peerDependenciesMeta: + '@ai-sdk/react': + optional: true + '@tanstack/ai': + optional: true + '@x402/core': + optional: true + '@x402/evm': + optional: true + ai: + optional: true + chat: + optional: true + just-bash: + optional: true + vite: + optional: true + + agents@0.17.4: + resolution: {integrity: sha512-K6YRbpD3VcwdTOPBlDgI4dILAwkhXo5cdxTlVF0IvUwQEKfMPawmH8E/QMXTN8CPGHqVYgYFACxTyk6nKlK+vg==} + hasBin: true + peerDependencies: + '@ai-sdk/react': ^3.0.204 + '@tanstack/ai': '>=0.10.2 <1.0.0' + '@x402/core': ^2.0.0 + '@x402/evm': ^2.0.0 + ai: ^6.0.0 + chat: ^4.29.0 + just-bash: ^3.0.0 + react: ^19.0.0 + vite: '>=6.0.0 <9.0.0' + zod: ^4.0.0 + peerDependenciesMeta: + '@ai-sdk/react': + optional: true + '@tanstack/ai': + optional: true + '@x402/core': + optional: true + '@x402/evm': + optional: true + ai: + optional: true + chat: + optional: true + just-bash: + optional: true + vite: + optional: true + + ai@6.0.82: + resolution: {integrity: sha512-WLml1ab2IXtREgkxrq2Pl6lFO6NKgC17MqTzmK5mO1UO6tMAJiVjkednw9p0j4+/LaUIZQoRiIT8wA37LswZ9Q==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + baseline-browser-mapping@2.10.43: + resolution: {integrity: sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + blake3-wasm@2.1.5: + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} + + body-parser@2.3.0: + resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} + engines: {node: '>=18'} + + browserslist@4.28.6: + resolution: {integrity: sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + caniuse-lite@1.0.30001806: + resolution: {integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==} + + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + + content-disposition@1.1.0: + resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + content-type@2.0.0: + resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} + engines: {node: '>=18'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + + core-js-pure@3.49.0: + resolution: {integrity: sha512-XM4RFka59xATyJv/cS3O3Kml72hQXUeGRuuTmMYFxwzc9/7C8OYTaIR/Ji+Yt8DXzsFLNhat15cE/JP15HrCgw==} + + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + + cron-schedule@6.0.0: + resolution: {integrity: sha512-BoZaseYGXOo5j5HUwTaegIog3JJbuH4BbrY9A1ArLjXpy+RWb3mV28F/9Gv1dDA7E2L8kngWva4NWisnLTyfgQ==} + engines: {node: '>=20'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + dc-browser@1.0.4: + resolution: {integrity: sha512-7oEtnzNlcE+hr4OvO3GR6Gndgw8BhW+wKOEwMqSleyY7N29jbAxzyW5BaJl7qBCw+6OIxfMWtY0T+6dxq8RWLw==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.393: + resolution: {integrity: sha512-kiDJdIUawuEIcp9XoICKp1iTYDEbgguIPq526N1Q7jIQDeQ3CqoMx71025PI/7E48Ddtw2HuWsVjY7afEgNxmg==} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + empathic@2.0.1: + resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} + engines: {node: '>=14'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-target-polyfill@0.0.4: + resolution: {integrity: sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==} + + eventsource-parser@3.1.0: + resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + + express-rate-limit@8.6.0: + resolution: {integrity: sha512-XKJXDsASUOo0LLtFwW5hCcQGH0N4WQc/Rn8/Pvoia+TJFOkkFPvrtW9lZOeeNcxQJspvOIERMwiRLsVFlhHEkA==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-uri@3.1.4: + resolution: {integrity: sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + hono@4.12.31: + resolution: {integrity: sha512-zJIHFrl6bq3RDd2YusFNCDlM8qUprxKswyi/OPzPyzKDdyBXDqWx8bZlZ7R+saTdSTatUmb3O7K4SspGPaEOQg==} + engines: {node: '>=16.9.0'} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} + + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ip-address@10.2.0: + resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jose@6.2.3: + resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} + + js-base64@3.9.1: + resolution: {integrity: sha512-U73qptcvf/HIOauFOmqT3a0mDUp0MYlfd15oqoe9kqZt5XhiXVb+HG09sLvI9PQ9tZIBFS4nlErai8zbWazP0g==} + + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} + + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + engines: {node: 20 || >=22} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + mimetext@3.0.28: + resolution: {integrity: sha512-eQXpbNrtxLCjUtiVbR/qR09dbPgZ2o+KR1uA7QKqGhbn8QV7HIL16mXXsobBL4/8TqoYh1us31kfz+dNfCev9g==} + + miniflare@4.20260714.0: + resolution: {integrity: sha512-MYlTCLdWCPqvrYY2uLwOjXwmglXuiHE3TGGkbOW4BwjUPa1r07E0iuHwrNDIs/sxK21r+o90Jx58AV2KeNdJZw==} + engines: {node: '>=22.0.0'} + hasBin: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.16: + resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.1.16: + resolution: {integrity: sha512-kVrnsrJqMR8+oLJnGEmSWw9BivK5mt7H3FZatVRjrc5wGqFYuBxX1yG7+A7Gi5AefkX6t/oCkizcQgpu0cY1dQ==} + engines: {node: ^18 || >=20} + hasBin: true + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + node-releases@2.0.51: + resolution: {integrity: sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==} + engines: {node: '>=18'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + obug@2.1.4: + resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} + engines: {node: '>=12.20.0'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + partyserver@0.5.8: + resolution: {integrity: sha512-htgSwiBcBu9zIYLrsxBAOvdkjukHvncbTk0nDrJgfruvZ08rxtEN1Ab4T7j9osykP80Bq3zA2oWFd3ngc4Z9uw==} + peerDependencies: + '@cloudflare/workers-types': ^4.20260424.1 + + partysocket@1.3.0: + resolution: {integrity: sha512-1zToNyolZFK/7nuAw/K2bZrNzFqaZyRoCEkS+9vG6WSC5ikrN6qWRe96q6ImU51uptz2r+dAwSkwhJVdQi4LiA==} + peerDependencies: + react: '>=17' + peerDependenciesMeta: + react: + optional: true + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + + postcss@8.5.20: + resolution: {integrity: sha512-lW616l85ucIQL+FocMmL7pQFPqBmwejrCMg+iPxyImlrANNJG9NHq/RkyCZopDhd8C3LA03PHRJDjkbGu8vvug==} + engines: {node: ^10 || ^12 || >=14} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + qs@6.15.3: + resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} + engines: {node: '>=0.6'} + + range-parser@1.3.0: + resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} + engines: {node: '>= 0.6'} + + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + + react@19.2.3: + resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + rolldown@1.2.0: + resolution: {integrity: sha512-u7tgm5l4Yw1iTqUL4EcYOAt7fFvCgQMLeidrnD4GALlC6aOznCjezYajgxeyKw27u0Q5N7fwgCzjVyPIWzwuBA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rollup@4.62.2: + resolution: {integrity: sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} + + undici@7.28.0: + resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} + engines: {node: '>=20.18.1'} + + unenv@2.0.0-rc.24: + resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite@6.4.3: + resolution: {integrity: sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + workerd@1.20260714.1: + resolution: {integrity: sha512-oIbQzfdyl9UQUnG6XLegcSq0Mgt/7WKDbFOoqGgOWCS+/fhyGB460uKEgdAQQ9RHCO/ttcNCX/KiMIQzdoeu3Q==} + engines: {node: '>=16'} + hasBin: true + + wrangler@4.112.0: + resolution: {integrity: sha512-5H+XUD0TySCv1LuktFHDIEOkboH2nTfQs+35L+USt3MtntjDTMVIJprLgQcL2WBjulOyjxpd1vyTiSTJVW5MjQ==} + engines: {node: '>=22.0.0'} + hasBin: true + peerDependencies: + '@cloudflare/workers-types': ^5.20260714.1 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yargs@18.0.0: + resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + youch-core@0.3.3: + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} + + youch@4.1.0-beta.10: + resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} + + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + +snapshots: + + '@ai-sdk/gateway@3.0.42(zod@4.3.6)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.14(zod@4.3.6) + '@vercel/oidc': 3.1.0 + zod: 4.3.6 + + '@ai-sdk/provider-utils@4.0.14(zod@4.3.6)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.1.0 + zod: 4.3.6 + + '@ai-sdk/provider@3.0.8': + dependencies: + json-schema: 0.4.0 + + '@babel/code-frame@8.0.0': + dependencies: + '@babel/helper-validator-identifier': 8.0.4 + js-tokens: 10.0.0 + + '@babel/compat-data@8.0.0': {} + + '@babel/core@8.0.1': + dependencies: + '@babel/code-frame': 8.0.0 + '@babel/generator': 8.0.0 + '@babel/helper-compilation-targets': 8.0.0 + '@babel/helpers': 8.0.0 + '@babel/parser': 8.0.4 + '@babel/template': 8.0.0 + '@babel/traverse': 8.0.4 + '@babel/types': 8.0.4 + '@types/gensync': 1.0.5 + convert-source-map: 2.0.0 + empathic: 2.0.1 + gensync: 1.0.0-beta.2 + import-meta-resolve: 4.2.0 + json5: 2.2.3 + obug: 2.1.4 + semver: 7.8.5 + + '@babel/generator@8.0.0': + dependencies: + '@babel/parser': 8.0.4 + '@babel/types': 8.0.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@types/jsesc': 2.5.1 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@8.0.0': + dependencies: + '@babel/types': 8.0.4 + + '@babel/helper-compilation-targets@8.0.0': + dependencies: + '@babel/compat-data': 8.0.0 + '@babel/helper-validator-option': 8.0.0 + browserslist: 4.28.6 + lru-cache: 11.5.2 + semver: 7.8.5 + + '@babel/helper-create-class-features-plugin@8.0.1(@babel/core@8.0.1)': + dependencies: + '@babel/core': 8.0.1 + '@babel/helper-annotate-as-pure': 8.0.0 + '@babel/helper-member-expression-to-functions': 8.0.0 + '@babel/helper-optimise-call-expression': 8.0.0 + '@babel/helper-replace-supers': 8.0.1(@babel/core@8.0.1) + '@babel/helper-skip-transparent-expression-wrappers': 8.0.0 + '@babel/traverse': 8.0.4 + semver: 7.8.5 + + '@babel/helper-globals@8.0.0': {} + + '@babel/helper-member-expression-to-functions@8.0.0': + dependencies: + '@babel/traverse': 8.0.4 + '@babel/types': 8.0.4 + + '@babel/helper-optimise-call-expression@8.0.0': + dependencies: + '@babel/types': 8.0.4 + + '@babel/helper-plugin-utils@8.0.1(@babel/core@8.0.1)': + dependencies: + '@babel/core': 8.0.1 + + '@babel/helper-replace-supers@8.0.1(@babel/core@8.0.1)': + dependencies: + '@babel/core': 8.0.1 + '@babel/helper-member-expression-to-functions': 8.0.0 + '@babel/helper-optimise-call-expression': 8.0.0 + '@babel/traverse': 8.0.4 + + '@babel/helper-skip-transparent-expression-wrappers@8.0.0': + dependencies: + '@babel/traverse': 8.0.4 + '@babel/types': 8.0.4 + + '@babel/helper-string-parser@8.0.0': {} + + '@babel/helper-validator-identifier@8.0.4': {} + + '@babel/helper-validator-option@8.0.0': {} + + '@babel/helpers@8.0.0': + dependencies: + '@babel/template': 8.0.0 + '@babel/types': 8.0.4 + + '@babel/parser@8.0.4': + dependencies: + '@babel/types': 8.0.4 + + '@babel/plugin-proposal-decorators@8.0.2(@babel/core@8.0.1)': + dependencies: + '@babel/core': 8.0.1 + '@babel/helper-create-class-features-plugin': 8.0.1(@babel/core@8.0.1) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-syntax-decorators': 8.0.1(@babel/core@8.0.1) + + '@babel/plugin-syntax-decorators@8.0.1(@babel/core@8.0.1)': + dependencies: + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + + '@babel/runtime-corejs3@7.29.7': + dependencies: + core-js-pure: 3.49.0 + + '@babel/runtime@7.29.7': {} + + '@babel/template@8.0.0': + dependencies: + '@babel/code-frame': 8.0.0 + '@babel/parser': 8.0.4 + '@babel/types': 8.0.4 + + '@babel/traverse@8.0.4': + dependencies: + '@babel/code-frame': 8.0.0 + '@babel/generator': 8.0.0 + '@babel/helper-globals': 8.0.0 + '@babel/parser': 8.0.4 + '@babel/template': 8.0.0 + '@babel/types': 8.0.4 + obug: 2.1.4 + + '@babel/types@8.0.4': + dependencies: + '@babel/helper-string-parser': 8.0.0 + '@babel/helper-validator-identifier': 8.0.4 + + '@cfworker/json-schema@4.1.1': {} + + '@cloudflare/codemode@0.4.3(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(ai@6.0.82(zod@4.3.6))(zod@4.3.6)': + dependencies: + '@types/json-schema': 7.0.15 + acorn: 8.17.0 + optionalDependencies: + '@modelcontextprotocol/sdk': 1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6) + ai: 6.0.82(zod@4.3.6) + zod: 4.3.6 + + '@cloudflare/kv-asset-handler@0.5.0': {} + + '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260714.1)': + dependencies: + unenv: 2.0.0-rc.24 + optionalDependencies: + workerd: 1.20260714.1 + + '@cloudflare/vite-plugin@1.45.1(vite@6.4.3(lightningcss@1.33.0)(yaml@2.9.0))(wrangler@4.112.0(@cloudflare/workers-types@5.20260719.1))': + dependencies: + '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260714.1) + miniflare: 4.20260714.0 + unenv: 2.0.0-rc.24 + vite: 6.4.3(lightningcss@1.33.0)(yaml@2.9.0) + workerd: 1.20260714.1 + wrangler: 4.112.0(@cloudflare/workers-types@5.20260719.1) + ws: 8.21.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@cloudflare/workerd-darwin-64@1.20260714.1': + optional: true + + '@cloudflare/workerd-darwin-arm64@1.20260714.1': + optional: true + + '@cloudflare/workerd-linux-64@1.20260714.1': + optional: true + + '@cloudflare/workerd-linux-arm64@1.20260714.1': + optional: true + + '@cloudflare/workerd-windows-64@1.20260714.1': + optional: true + + '@cloudflare/workers-types@5.20260719.1': {} + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@emnapi/core@1.11.2': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.11.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/aix-ppc64@0.28.1': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.28.1': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-arm@0.28.1': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/android-x64@0.28.1': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.28.1': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.28.1': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.28.1': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.28.1': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.28.1': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-arm@0.28.1': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.28.1': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.28.1': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.28.1': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.28.1': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.28.1': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.28.1': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/linux-x64@0.28.1': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.28.1': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.28.1': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.28.1': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.28.1': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.28.1': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.28.1': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.28.1': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.28.1': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@esbuild/win32-x64@0.28.1': + optional: true + + '@hono/node-server@1.19.14(hono@4.12.31)': + dependencies: + hono: 4.12.31 + + '@img/colour@1.1.0': {} + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.11.2 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': + optional: true + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6)': + dependencies: + '@hono/node-server': 1.19.14(hono@4.12.31) + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.1.0 + express: 5.2.1 + express-rate-limit: 8.6.0(express@5.2.1) + hono: 4.12.31 + jose: 6.2.3 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 4.3.6 + zod-to-json-schema: 3.25.2(zod@4.3.6) + optionalDependencies: + '@cfworker/json-schema': 4.1.1 + transitivePeerDependencies: + - supports-color + + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + dependencies: + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@opentelemetry/api@1.9.0': {} + + '@oxc-project/types@0.140.0': {} + + '@poppinss/colors@4.1.6': + dependencies: + kleur: 4.1.5 + + '@poppinss/dumper@0.6.5': + dependencies: + '@poppinss/colors': 4.1.6 + '@sindresorhus/is': 7.2.0 + supports-color: 10.2.2 + + '@poppinss/exception@1.2.3': {} + + '@rolldown/binding-android-arm64@1.2.0': + optional: true + + '@rolldown/binding-darwin-arm64@1.2.0': + optional: true + + '@rolldown/binding-darwin-x64@1.2.0': + optional: true + + '@rolldown/binding-freebsd-x64@1.2.0': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.2.0': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.2.0': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.2.0': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.2.0': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.2.0': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.2.0': + optional: true + + '@rolldown/binding-linux-x64-musl@1.2.0': + optional: true + + '@rolldown/binding-openharmony-arm64@1.2.0': + optional: true + + '@rolldown/binding-wasm32-wasi@1.2.0': + dependencies: + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.2.0': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.2.0': + optional: true + + '@rolldown/plugin-babel@0.2.3(@babel/core@8.0.1)(@babel/runtime@7.29.7)(rolldown@1.2.0)(vite@6.4.3(lightningcss@1.33.0)(yaml@2.9.0))': + dependencies: + '@babel/core': 8.0.1 + picomatch: 4.0.5 + rolldown: 1.2.0 + optionalDependencies: + '@babel/runtime': 7.29.7 + vite: 6.4.3(lightningcss@1.33.0)(yaml@2.9.0) + + '@rolldown/pluginutils@1.0.1': {} + + '@rollup/rollup-android-arm-eabi@4.62.2': + optional: true + + '@rollup/rollup-android-arm64@4.62.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.62.2': + optional: true + + '@rollup/rollup-darwin-x64@4.62.2': + optional: true + + '@rollup/rollup-freebsd-arm64@4.62.2': + optional: true + + '@rollup/rollup-freebsd-x64@4.62.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.62.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.62.2': + optional: true + + '@rollup/rollup-openbsd-x64@4.62.2': + optional: true + + '@rollup/rollup-openharmony-arm64@4.62.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.62.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.62.2': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.62.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.62.2': + optional: true + + '@sindresorhus/is@7.2.0': {} + + '@speed-highlight/core@1.2.17': {} + + '@standard-schema/spec@1.1.0': {} + + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/estree@1.0.9': {} + + '@types/gensync@1.0.5': {} + + '@types/jsesc@2.5.1': {} + + '@types/json-schema@7.0.15': {} + + '@vercel/oidc@3.1.0': {} + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.0.0 + + acorn@8.17.0: {} + + agents@0.17.0(@babel/core@8.0.1)(@babel/runtime@7.29.7)(@cloudflare/workers-types@5.20260719.1)(ai@6.0.82(zod@4.3.6))(react@19.2.3)(rolldown@1.2.0)(vite@6.4.3(lightningcss@1.33.0)(yaml@2.9.0))(zod@4.3.6): + dependencies: + '@babel/plugin-proposal-decorators': 8.0.2(@babel/core@8.0.1) + '@cfworker/json-schema': 4.1.1 + '@cloudflare/codemode': 0.4.3(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(ai@6.0.82(zod@4.3.6))(zod@4.3.6) + '@modelcontextprotocol/sdk': 1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6) + '@rolldown/plugin-babel': 0.2.3(@babel/core@8.0.1)(@babel/runtime@7.29.7)(rolldown@1.2.0)(vite@6.4.3(lightningcss@1.33.0)(yaml@2.9.0)) + cron-schedule: 6.0.0 + esbuild: 0.28.1 + mimetext: 3.0.28 + nanoid: 5.1.16 + partyserver: 0.5.8(@cloudflare/workers-types@5.20260719.1) + partysocket: 1.3.0(react@19.2.3) + react: 19.2.3 + yaml: 2.9.0 + yargs: 18.0.0 + zod: 4.3.6 + optionalDependencies: + ai: 6.0.82(zod@4.3.6) + vite: 6.4.3(lightningcss@1.33.0)(yaml@2.9.0) + transitivePeerDependencies: + - '@babel/core' + - '@babel/plugin-transform-runtime' + - '@babel/runtime' + - '@cloudflare/workers-types' + - rolldown + - supports-color + + agents@0.17.4(@babel/core@8.0.1)(@babel/runtime@7.29.7)(@cloudflare/workers-types@5.20260719.1)(ai@6.0.82(zod@4.3.6))(react@19.2.3)(rolldown@1.2.0)(vite@6.4.3(lightningcss@1.33.0)(yaml@2.9.0))(zod@4.3.6): + dependencies: + '@babel/plugin-proposal-decorators': 8.0.2(@babel/core@8.0.1) + '@cfworker/json-schema': 4.1.1 + '@cloudflare/codemode': 0.4.3(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(ai@6.0.82(zod@4.3.6))(zod@4.3.6) + '@modelcontextprotocol/sdk': 1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6) + '@rolldown/plugin-babel': 0.2.3(@babel/core@8.0.1)(@babel/runtime@7.29.7)(rolldown@1.2.0)(vite@6.4.3(lightningcss@1.33.0)(yaml@2.9.0)) + cron-schedule: 6.0.0 + esbuild: 0.28.1 + mimetext: 3.0.28 + nanoid: 5.1.16 + partyserver: 0.5.8(@cloudflare/workers-types@5.20260719.1) + partysocket: 1.3.0(react@19.2.3) + react: 19.2.3 + yaml: 2.9.0 + yargs: 18.0.0 + zod: 4.3.6 + optionalDependencies: + ai: 6.0.82(zod@4.3.6) + vite: 6.4.3(lightningcss@1.33.0)(yaml@2.9.0) + transitivePeerDependencies: + - '@babel/core' + - '@babel/plugin-transform-runtime' + - '@babel/runtime' + - '@cloudflare/workers-types' + - rolldown + - supports-color + + ai@6.0.82(zod@4.3.6): + dependencies: + '@ai-sdk/gateway': 3.0.42(zod@4.3.6) + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.14(zod@4.3.6) + '@opentelemetry/api': 1.9.0 + zod: 4.3.6 + + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.4 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-regex@6.2.2: {} + + ansi-styles@6.2.3: {} + + baseline-browser-mapping@2.10.43: {} + + blake3-wasm@2.1.5: {} + + body-parser@2.3.0: + dependencies: + bytes: 3.1.2 + content-type: 2.0.0 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + on-finished: 2.4.1 + qs: 6.15.3 + raw-body: 3.0.2 + type-is: 2.1.0 + transitivePeerDependencies: + - supports-color + + browserslist@4.28.6: + dependencies: + baseline-browser-mapping: 2.10.43 + caniuse-lite: 1.0.30001806 + electron-to-chromium: 1.5.393 + node-releases: 2.0.51 + update-browserslist-db: 1.2.3(browserslist@4.28.6) + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + caniuse-lite@1.0.30001806: {} + + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 + + content-disposition@1.1.0: {} + + content-type@1.0.5: {} + + content-type@2.0.0: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + cookie@1.1.1: {} + + core-js-pure@3.49.0: {} + + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cron-schedule@6.0.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + dc-browser@1.0.4: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + depd@2.0.0: {} + + detect-libc@2.1.2: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.393: {} + + emoji-regex@10.6.0: {} + + empathic@2.0.1: {} + + encodeurl@2.0.0: {} + + error-stack-parser-es@1.0.5: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + esbuild@0.28.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + etag@1.8.1: {} + + event-target-polyfill@0.0.4: {} + + eventsource-parser@3.1.0: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.1.0 + + express-rate-limit@8.6.0(express@5.2.1): + dependencies: + debug: 4.4.3 + express: 5.2.1 + ip-address: 10.2.0 + transitivePeerDependencies: + - supports-color + + express@5.2.1: + dependencies: + accepts: 2.0.0 + body-parser: 2.3.0 + content-disposition: 1.1.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.15.3 + range-parser: 1.3.0 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.1.0 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-uri@3.1.4: {} + + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + + finalhandler@2.1.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + forwarded@0.2.0: {} + + fresh@2.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.6.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + gopd@1.2.0: {} + + has-symbols@1.1.0: {} + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + hono@4.12.31: {} + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + iconv-lite@0.7.3: + dependencies: + safer-buffer: 2.1.2 + + import-meta-resolve@4.2.0: {} + + inherits@2.0.4: {} + + ip-address@10.2.0: {} + + ipaddr.js@1.9.1: {} + + is-promise@4.0.0: {} + + isexe@2.0.0: {} + + jose@6.2.3: {} + + js-base64@3.9.1: {} + + js-tokens@10.0.0: {} + + jsesc@3.1.0: {} + + json-schema-traverse@1.0.0: {} + + json-schema-typed@8.0.2: {} + + json-schema@0.4.0: {} + + json5@2.2.3: {} + + kleur@4.1.5: {} + + lightningcss-android-arm64@1.33.0: + optional: true + + lightningcss-darwin-arm64@1.33.0: + optional: true + + lightningcss-darwin-x64@1.33.0: + optional: true + + lightningcss-freebsd-x64@1.33.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true + + lightningcss-linux-arm64-gnu@1.33.0: + optional: true + + lightningcss-linux-arm64-musl@1.33.0: + optional: true + + lightningcss-linux-x64-gnu@1.33.0: + optional: true + + lightningcss-linux-x64-musl@1.33.0: + optional: true + + lightningcss-win32-arm64-msvc@1.33.0: + optional: true + + lightningcss-win32-x64-msvc@1.33.0: + optional: true + + lightningcss@1.33.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 + optional: true + + lru-cache@11.5.2: {} + + math-intrinsics@1.1.0: {} + + media-typer@1.1.0: {} + + merge-descriptors@2.0.0: {} + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + + mimetext@3.0.28: + dependencies: + '@babel/runtime': 7.29.7 + '@babel/runtime-corejs3': 7.29.7 + js-base64: 3.9.1 + mime-types: 2.1.35 + + miniflare@4.20260714.0: + dependencies: + '@cspotcode/source-map-support': 0.8.1 + sharp: 0.34.5 + undici: 7.28.0 + workerd: 1.20260714.1 + ws: 8.21.0 + youch: 4.1.0-beta.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + ms@2.1.3: {} + + nanoid@3.3.16: {} + + nanoid@5.1.16: {} + + negotiator@1.0.0: {} + + node-releases@2.0.51: {} + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + obug@2.1.4: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + parseurl@1.3.3: {} + + partyserver@0.5.8(@cloudflare/workers-types@5.20260719.1): + dependencies: + '@cloudflare/workers-types': 5.20260719.1 + nanoid: 5.1.16 + + partysocket@1.3.0(react@19.2.3): + dependencies: + event-target-polyfill: 0.0.4 + optionalDependencies: + react: 19.2.3 + + path-key@3.1.1: {} + + path-to-regexp@6.3.0: {} + + path-to-regexp@8.4.2: {} + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@4.0.5: {} + + pkce-challenge@5.0.1: {} + + postcss@8.5.20: + dependencies: + nanoid: 3.3.16 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + qs@6.15.3: + dependencies: + es-define-property: 1.0.1 + side-channel: 1.1.1 + + range-parser@1.3.0: {} + + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + unpipe: 1.0.0 + + react@19.2.3: {} + + require-from-string@2.0.2: {} + + rolldown@1.2.0: + dependencies: + '@oxc-project/types': 0.140.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.2.0 + '@rolldown/binding-darwin-arm64': 1.2.0 + '@rolldown/binding-darwin-x64': 1.2.0 + '@rolldown/binding-freebsd-x64': 1.2.0 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.0 + '@rolldown/binding-linux-arm64-gnu': 1.2.0 + '@rolldown/binding-linux-arm64-musl': 1.2.0 + '@rolldown/binding-linux-ppc64-gnu': 1.2.0 + '@rolldown/binding-linux-s390x-gnu': 1.2.0 + '@rolldown/binding-linux-x64-gnu': 1.2.0 + '@rolldown/binding-linux-x64-musl': 1.2.0 + '@rolldown/binding-openharmony-arm64': 1.2.0 + '@rolldown/binding-wasm32-wasi': 1.2.0 + '@rolldown/binding-win32-arm64-msvc': 1.2.0 + '@rolldown/binding-win32-x64-msvc': 1.2.0 + + rollup@4.62.2: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.62.2 + '@rollup/rollup-android-arm64': 4.62.2 + '@rollup/rollup-darwin-arm64': 4.62.2 + '@rollup/rollup-darwin-x64': 4.62.2 + '@rollup/rollup-freebsd-arm64': 4.62.2 + '@rollup/rollup-freebsd-x64': 4.62.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.2 + '@rollup/rollup-linux-arm-musleabihf': 4.62.2 + '@rollup/rollup-linux-arm64-gnu': 4.62.2 + '@rollup/rollup-linux-arm64-musl': 4.62.2 + '@rollup/rollup-linux-loong64-gnu': 4.62.2 + '@rollup/rollup-linux-loong64-musl': 4.62.2 + '@rollup/rollup-linux-ppc64-gnu': 4.62.2 + '@rollup/rollup-linux-ppc64-musl': 4.62.2 + '@rollup/rollup-linux-riscv64-gnu': 4.62.2 + '@rollup/rollup-linux-riscv64-musl': 4.62.2 + '@rollup/rollup-linux-s390x-gnu': 4.62.2 + '@rollup/rollup-linux-x64-gnu': 4.62.2 + '@rollup/rollup-linux-x64-musl': 4.62.2 + '@rollup/rollup-openbsd-x64': 4.62.2 + '@rollup/rollup-openharmony-arm64': 4.62.2 + '@rollup/rollup-win32-arm64-msvc': 4.62.2 + '@rollup/rollup-win32-ia32-msvc': 4.62.2 + '@rollup/rollup-win32-x64-gnu': 4.62.2 + '@rollup/rollup-win32-x64-msvc': 4.62.2 + fsevents: 2.3.3 + + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.4.2 + transitivePeerDependencies: + - supports-color + + safer-buffer@2.1.2: {} + + semver@7.8.5: {} + + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.3.0 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + sharp@0.34.5: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.8.5 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + source-map-js@1.2.1: {} + + statuses@2.0.2: {} + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + + supports-color@10.2.2: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + + toidentifier@1.0.1: {} + + tslib@2.8.1: + optional: true + + type-is@2.1.0: + dependencies: + content-type: 2.0.0 + media-typer: 1.1.0 + mime-types: 3.0.2 + + undici@7.28.0: {} + + unenv@2.0.0-rc.24: + dependencies: + pathe: 2.0.3 + + unpipe@1.0.0: {} + + update-browserslist-db@1.2.3(browserslist@4.28.6): + dependencies: + browserslist: 4.28.6 + escalade: 3.2.0 + picocolors: 1.1.1 + + vary@1.1.2: {} + + vite@6.4.3(lightningcss@1.33.0)(yaml@2.9.0): + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + postcss: 8.5.20 + rollup: 4.62.2 + tinyglobby: 0.2.17 + optionalDependencies: + fsevents: 2.3.3 + lightningcss: 1.33.0 + yaml: 2.9.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + workerd@1.20260714.1: + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20260714.1 + '@cloudflare/workerd-darwin-arm64': 1.20260714.1 + '@cloudflare/workerd-linux-64': 1.20260714.1 + '@cloudflare/workerd-linux-arm64': 1.20260714.1 + '@cloudflare/workerd-windows-64': 1.20260714.1 + + wrangler@4.112.0(@cloudflare/workers-types@5.20260719.1): + dependencies: + '@cloudflare/kv-asset-handler': 0.5.0 + '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260714.1) + blake3-wasm: 2.1.5 + esbuild: 0.28.1 + miniflare: 4.20260714.0 + path-to-regexp: 6.3.0 + unenv: 2.0.0-rc.24 + workerd: 1.20260714.1 + optionalDependencies: + '@cloudflare/workers-types': 5.20260719.1 + fsevents: 2.3.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 + + wrappy@1.0.2: {} + + ws@8.21.0: {} + + y18n@5.0.8: {} + + yaml@2.9.0: {} + + yargs-parser@22.0.0: {} + + yargs@18.0.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 7.2.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 + + youch-core@0.3.3: + dependencies: + '@poppinss/exception': 1.2.3 + error-stack-parser-es: 1.0.5 + + youch@4.1.0-beta.10: + dependencies: + '@poppinss/colors': 4.1.6 + '@poppinss/dumper': 0.6.5 + '@speed-highlight/core': 1.2.17 + cookie: 1.1.1 + youch-core: 0.3.3 + + zod-to-json-schema@3.25.2(zod@4.3.6): + dependencies: + zod: 4.3.6 + + zod@4.3.6: {} diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/scenario.test.ts b/e2e/scenarios/cloudflare-agents-instrumentation/scenario.test.ts new file mode 100644 index 000000000..09929d559 --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/scenario.test.ts @@ -0,0 +1,63 @@ +import { describe } from "vitest"; +import { + prepareScenarioDir, + readInstalledPackageVersion, + resolveScenarioDir, +} from "../../helpers/scenario-harness"; +import { defineCloudflareAgentsAssertions } from "./assertions"; + +const originalScenarioDir = resolveScenarioDir(import.meta.url); +const scenarioDir = await prepareScenarioDir({ + scenarioDir: originalScenarioDir, +}); +const TIMEOUT_MS = 240_000; +const scenarios = await Promise.all( + [ + { + dependencyName: "agents-v0-17", + label: "v0.17 pinned", + variantKey: "cloudflare-agents-v0-17", + }, + { + dependencyName: "agents-v0-17-latest", + label: "v0.17 latest", + variantKey: "cloudflare-agents-v0-17-latest", + }, + ].map(async (scenario) => ({ + ...scenario, + version: await readInstalledPackageVersion( + scenarioDir, + scenario.dependencyName, + ), + })), +); + +describe.concurrent("Cloudflare Agents versions", () => { + for (const scenario of scenarios) { + describe.sequential(`${scenario.label} (${scenario.version})`, () => { + for (const mode of ["wrapped", "auto"] as const) { + defineCloudflareAgentsAssertions({ + name: `${mode} instrumentation`, + runScenario: async ({ runScenarioDir }) => { + await runScenarioDir({ + entry: "scenario.ts", + env: { + CLOUDFLARE_AGENTS_INSTRUMENTATION_MODE: mode, + CLOUDFLARE_AGENTS_PACKAGE_NAME: scenario.dependencyName, + }, + runContext: { + cassette: false, + variantKey: scenario.variantKey, + }, + scenarioDir, + timeoutMs: TIMEOUT_MS, + }); + }, + snapshotName: `${scenario.variantKey}-${mode}`, + testFileUrl: import.meta.url, + timeoutMs: TIMEOUT_MS, + }); + } + }); + } +}); diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/scenario.ts b/e2e/scenarios/cloudflare-agents-instrumentation/scenario.ts new file mode 100644 index 000000000..3714c453c --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/scenario.ts @@ -0,0 +1,168 @@ +import { spawn, type ChildProcessWithoutNullStreams } from "node:child_process"; +import { once } from "node:events"; +import { writeFile } from "node:fs/promises"; +import net from "node:net"; +import path from "node:path"; +import { + getTestRunId, + runMain, + scopedName, +} from "../../helpers/scenario-runtime"; + +async function main() { + const port = await getFreePort(); + const viteBin = path.join( + process.cwd(), + "node_modules", + ".bin", + process.platform === "win32" ? "vite.cmd" : "vite", + ); + await writeWorkerDevVars(); + await buildWorker(viteBin); + const server = spawn( + viteBin, + ["preview", "--host", "127.0.0.1", "--port", String(port), "--strictPort"], + { + cwd: process.cwd(), + env: process.env, + stdio: ["ignore", "pipe", "pipe"], + }, + ); + const output = captureOutput(server); + + try { + const baseUrl = `http://127.0.0.1:${port}`; + await waitForServer(baseUrl, server, output); + const testRunId = getTestRunId(); + const projectName = scopedName( + "e2e-cloudflare-agents-instrumentation", + testRunId, + ); + const response = await fetch(`${baseUrl}/run`, { + body: JSON.stringify({ projectName, testRunId }), + headers: { "content-type": "application/json" }, + method: "POST", + }); + if (!response.ok) { + throw new Error( + `Cloudflare Agents worker failed with ${response.status}: ${await response.text()}\n${output()}`, + ); + } + + const result = (await response.json()) as { + concurrent?: Array<{ status?: string }>; + detached?: { status?: string }; + failure?: { error?: string; status?: string }; + success?: { status?: string }; + }; + if ( + result.success?.status !== "completed" || + result.failure?.status !== "error" || + result.failure.error !== "deterministic child failure" || + result.concurrent?.some((entry) => entry.status !== "completed") || + result.concurrent?.length !== 2 || + result.detached?.status !== "running" + ) { + throw new Error(`Unexpected scenario result: ${JSON.stringify(result)}`); + } + } finally { + await stopServer(server); + } +} + +async function writeWorkerDevVars(): Promise { + const names = [ + "BRAINTRUST_API_KEY", + "BRAINTRUST_API_URL", + "BRAINTRUST_APP_PUBLIC_URL", + "BRAINTRUST_APP_URL", + "BRAINTRUST_E2E_RUN_ID", + "BRAINTRUST_ORG_NAME", + "BRAINTRUST_PROXY_URL", + ]; + const contents = names + .map((name) => `${name}=${JSON.stringify(process.env[name] ?? "")}`) + .join("\n"); + await writeFile(path.join(process.cwd(), ".dev.vars"), `${contents}\n`); +} + +async function buildWorker(viteBin: string): Promise { + const build = spawn(viteBin, ["build"], { + cwd: process.cwd(), + env: process.env, + stdio: ["ignore", "pipe", "pipe"], + }); + const output = captureOutput(build); + const [exitCode] = (await once(build, "close")) as [number | null]; + if (exitCode !== 0) { + throw new Error(`Vite build failed with code ${exitCode}\n${output()}`); + } +} + +async function getFreePort(): Promise { + const server = net.createServer(); + await new Promise((resolve, reject) => { + server.once("error", reject); + server.listen(0, "127.0.0.1", resolve); + }); + const address = server.address(); + await new Promise((resolve, reject) => { + server.close((error) => (error ? reject(error) : resolve())); + }); + if (!address || typeof address === "string") { + throw new Error("Could not allocate a Vite preview-server port"); + } + return address.port; +} + +function captureOutput(child: ChildProcessWithoutNullStreams): () => string { + let stdout = ""; + let stderr = ""; + child.stdout.on("data", (chunk) => { + stdout += String(chunk); + }); + child.stderr.on("data", (chunk) => { + stderr += String(chunk); + }); + return () => `STDOUT:\n${stdout}\nSTDERR:\n${stderr}`; +} + +async function waitForServer( + baseUrl: string, + server: ChildProcessWithoutNullStreams, + output: () => string, +): Promise { + const startedAt = Date.now(); + while (Date.now() - startedAt < 60_000) { + if (server.exitCode !== null) { + throw new Error( + `Vite exited early with code ${server.exitCode}\n${output()}`, + ); + } + try { + const response = await fetch(`${baseUrl}/health`); + if (response.ok) { + return; + } + } catch { + // Continue until workerd accepts requests. + } + await new Promise((resolve) => setTimeout(resolve, 250)); + } + throw new Error(`Timed out waiting for Vite/workerd\n${output()}`); +} + +async function stopServer(server: ChildProcessWithoutNullStreams) { + if (server.exitCode !== null) { + return; + } + server.kill("SIGTERM"); + const timeout = setTimeout(() => server.kill("SIGKILL"), 5_000); + try { + await once(server, "close"); + } finally { + clearTimeout(timeout); + } +} + +runMain(main); diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/tsconfig.json b/e2e/scenarios/cloudflare-agents-instrumentation/tsconfig.json new file mode 100644 index 000000000..e645dd96e --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "lib": ["ES2022", "DOM"], + "module": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "target": "ES2022", + "types": ["@cloudflare/workers-types"] + } +} diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/vite.config.ts b/e2e/scenarios/cloudflare-agents-instrumentation/vite.config.ts new file mode 100644 index 000000000..1a959a55f --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/vite.config.ts @@ -0,0 +1,30 @@ +import { cloudflare } from "@cloudflare/vite-plugin"; +import { defineConfig } from "vite"; +import { braintrustVitePlugin } from "braintrust/vite"; + +const agentsPackageName = + process.env.CLOUDFLARE_AGENTS_PACKAGE_NAME ?? "agents-v0-17-latest"; +const instrumentationMode = + process.env.CLOUDFLARE_AGENTS_INSTRUMENTATION_MODE ?? "auto"; +const braintrustPlugins = + instrumentationMode === "auto" + ? braintrustVitePlugin({ useDiagnosticChannelCompatShim: true }) + : []; + +export default defineConfig({ + define: { + __CLOUDFLARE_AGENTS_INSTRUMENTATION_MODE__: + JSON.stringify(instrumentationMode), + }, + plugins: [ + cloudflare(), + ...(Array.isArray(braintrustPlugins) + ? braintrustPlugins + : [braintrustPlugins]), + ], + resolve: { + alias: { + agents: agentsPackageName, + }, + }, +}); diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/worker.ts b/e2e/scenarios/cloudflare-agents-instrumentation/worker.ts new file mode 100644 index 000000000..f02b0c156 --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/worker.ts @@ -0,0 +1,208 @@ +import { Agent, getAgentByName } from "agents"; +import { initLogger, wrapCloudflareAgent } from "braintrust/workerd"; + +declare const __CLOUDFLARE_AGENTS_INSTRUMENTATION_MODE__: string; + +type ToolInput = { + case: "success" | "error" | "concurrent-a" | "concurrent-b" | "detached"; + delayMs: number; + value: string; +}; + +type StoredRun = { + completed_at: number | null; + error_message: string | null; + output_json: string | null; + run_id: string; + started_at: number; + status: "aborted" | "completed" | "error"; +}; + +const BaseParentAgent = + __CLOUDFLARE_AGENTS_INSTRUMENTATION_MODE__ === "wrapped" + ? wrapCloudflareAgent(Agent) + : Agent; + +export class DeterministicToolAgent extends Agent { + async onStart() { + this.sql` + CREATE TABLE IF NOT EXISTS deterministic_tool_runs ( + run_id TEXT PRIMARY KEY, + status TEXT NOT NULL, + output_json TEXT, + error_message TEXT, + started_at INTEGER NOT NULL, + completed_at INTEGER + ) + `; + } + + async startAgentToolRun(input: ToolInput, options: { runId: string }) { + const startedAt = Date.now(); + await new Promise((resolve) => setTimeout(resolve, input.delayMs)); + const completedAt = Date.now(); + const isError = input.case === "error"; + const output = isError + ? undefined + : { case: input.case, echoed: input.value }; + const error = isError ? "deterministic child failure" : undefined; + + this.sql` + INSERT OR REPLACE INTO deterministic_tool_runs ( + run_id, status, output_json, error_message, started_at, completed_at + ) VALUES ( + ${options.runId}, ${isError ? "error" : "completed"}, + ${output === undefined ? null : JSON.stringify(output)}, + ${error ?? null}, ${startedAt}, ${completedAt} + ) + `; + + return { + runId: options.runId, + status: isError ? ("error" as const) : ("completed" as const), + ...(output === undefined ? {} : { output }), + ...(error === undefined ? {} : { error }), + startedAt, + completedAt, + }; + } + + async cancelAgentToolRun(runId: string, reason?: unknown) { + const error = + reason instanceof Error ? reason.message : String(reason ?? "cancelled"); + this.sql` + UPDATE deterministic_tool_runs + SET status = 'aborted', error_message = ${error}, completed_at = ${Date.now()} + WHERE run_id = ${runId} + `; + } + + async inspectAgentToolRun(runId: string) { + const row = this.sql` + SELECT run_id, status, output_json, error_message, started_at, completed_at + FROM deterministic_tool_runs + WHERE run_id = ${runId} + `[0]; + if (!row) { + return null; + } + + return { + runId: row.run_id, + status: row.status, + ...(row.output_json === null + ? {} + : { output: JSON.parse(row.output_json) as unknown }), + ...(row.error_message === null ? {} : { error: row.error_message }), + startedAt: row.started_at, + ...(row.completed_at === null ? {} : { completedAt: row.completed_at }), + }; + } + + async getAgentToolChunks( + _runId: string, + _options?: { afterSequence?: number }, + ) { + return []; + } + + async tailAgentToolRun(runId: string, options?: { afterSequence?: number }) { + const chunks = await this.getAgentToolChunks(runId, options); + const encoder = new TextEncoder(); + return new ReadableStream({ + start(controller) { + for (const chunk of chunks) { + controller.enqueue(encoder.encode(`${JSON.stringify(chunk)}\n`)); + } + controller.close(); + }, + }); + } +} + +export class ParentAgent extends BaseParentAgent { + async runInstrumentationScenario(testRunId: string, projectName: string) { + const logger = initLogger({ projectName }); + const result = await logger.traced( + async () => { + const success = await this.runAgentTool(DeterministicToolAgent, { + input: { case: "success", delayMs: 10, value: "allowed-success" }, + runId: "forbidden-run-id-marker", + parentToolCallId: "forbidden-parent-tool-call-marker", + displayOrder: 91, + inputPreview: "forbidden-input-preview-marker", + display: { name: "forbidden-display-marker" }, + }); + const failure = await this.runAgentTool(DeterministicToolAgent, { + input: { case: "error", delayMs: 10, value: "allowed-error" }, + runId: "returned-error-run", + }); + const concurrent = await Promise.all([ + this.runAgentTool(DeterministicToolAgent, { + input: { + case: "concurrent-a", + delayMs: 75, + value: "allowed-a", + }, + runId: "concurrent-a-run", + }), + this.runAgentTool(DeterministicToolAgent, { + input: { + case: "concurrent-b", + delayMs: 75, + value: "allowed-b", + }, + runId: "concurrent-b-run", + }), + ]); + const detached = await this.runAgentTool(DeterministicToolAgent, { + input: { case: "detached", delayMs: 5, value: "allowed-detached" }, + runId: "detached-run", + detached: true, + }); + await new Promise((resolve) => setTimeout(resolve, 50)); + + return { concurrent, detached, failure, success }; + }, + { + name: "cloudflare-agents-e2e-root", + event: { + metadata: { + instrumentationMode: __CLOUDFLARE_AGENTS_INSTRUMENTATION_MODE__, + scenario: "cloudflare-agents-instrumentation", + testRunId, + }, + }, + }, + ); + await logger.flush(); + return result; + } +} + +type WorkerEnv = { + PARENT_AGENT: DurableObjectNamespace; +}; + +export default { + async fetch(request: Request, env: WorkerEnv): Promise { + const url = new URL(request.url); + if (url.pathname === "/health") { + return Response.json({ ok: true }); + } + if (url.pathname !== "/run" || request.method !== "POST") { + return new Response("Not found", { status: 404 }); + } + + const body = (await request.json()) as { + projectName: string; + testRunId: string; + }; + const parent = await getAgentByName(env.PARENT_AGENT, body.testRunId); + const result = await parent.runInstrumentationScenario( + body.testRunId, + body.projectName, + ); + return Response.json(result); + }, +}; diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/wrangler.jsonc b/e2e/scenarios/cloudflare-agents-instrumentation/wrangler.jsonc new file mode 100644 index 000000000..4bc94bb96 --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/wrangler.jsonc @@ -0,0 +1,25 @@ +{ + "$schema": "./node_modules/wrangler/config-schema.json", + "name": "braintrust-cloudflare-agents-e2e", + "main": "worker.ts", + "compatibility_date": "2026-06-11", + "compatibility_flags": [ + "nodejs_compat", + "nodejs_compat_populate_process_env", + "enable_nodejs_process_v2", + ], + "durable_objects": { + "bindings": [ + { + "name": "PARENT_AGENT", + "class_name": "ParentAgent", + }, + ], + }, + "migrations": [ + { + "tag": "v1", + "new_sqlite_classes": ["ParentAgent"], + }, + ], +} diff --git a/js/src/auto-instrumentations/configs/all.ts b/js/src/auto-instrumentations/configs/all.ts index b2d778960..0e23834e0 100644 --- a/js/src/auto-instrumentations/configs/all.ts +++ b/js/src/auto-instrumentations/configs/all.ts @@ -8,6 +8,7 @@ import { aiSDKConfigs } from "./ai-sdk"; import { anthropicConfigs } from "./anthropic"; import { bedrockRuntimeConfigs } from "./bedrock-runtime"; import { claudeAgentSDKConfigs } from "./claude-agent-sdk"; +import { cloudflareAgentsConfigs } from "./cloudflare-agents"; import { cohereConfigs } from "./cohere"; import { cursorSDKConfigs } from "./cursor-sdk"; import { flueConfigs } from "./flue"; @@ -53,6 +54,10 @@ const defaultInstrumentationConfigGroups: readonly InstrumentationConfigGroup[] integrations: ["claudeAgentSDK"], configs: claudeAgentSDKConfigs, }, + { + integrations: ["cloudflareAgents"], + configs: cloudflareAgentsConfigs, + }, { integrations: ["cursor", "cursorSDK"], configs: cursorSDKConfigs }, { integrations: ["openAIAgents"], diff --git a/js/src/auto-instrumentations/configs/cloudflare-agents.ts b/js/src/auto-instrumentations/configs/cloudflare-agents.ts new file mode 100644 index 000000000..0b655bb78 --- /dev/null +++ b/js/src/auto-instrumentations/configs/cloudflare-agents.ts @@ -0,0 +1,20 @@ +import type { InstrumentationConfig } from "../orchestrion-js"; +import { cloudflareAgentsChannels } from "../../instrumentation/plugins/cloudflare-agents-channels"; + +const cloudflareAgentsVersionRange = ">=0.17.0 <0.18.0"; + +export const cloudflareAgentsConfigs: InstrumentationConfig[] = [ + { + channelName: cloudflareAgentsChannels.runAgentTool.channelName, + module: { + name: "agents", + versionRange: cloudflareAgentsVersionRange, + filePath: "dist/index.js", + }, + functionQuery: { + className: "Agent", + methodName: "runAgentTool", + kind: "Async", + }, + }, +]; diff --git a/js/src/auto-instrumentations/index.ts b/js/src/auto-instrumentations/index.ts index ea0533ac6..e6d8d24b2 100644 --- a/js/src/auto-instrumentations/index.ts +++ b/js/src/auto-instrumentations/index.ts @@ -34,6 +34,7 @@ export { anthropicConfigs } from "./configs/anthropic"; export { bedrockRuntimeConfigs } from "./configs/bedrock-runtime"; export { aiSDKConfigs } from "./configs/ai-sdk"; export { claudeAgentSDKConfigs } from "./configs/claude-agent-sdk"; +export { cloudflareAgentsConfigs } from "./configs/cloudflare-agents"; export { cursorSDKConfigs } from "./configs/cursor-sdk"; export { openAIAgentsCoreConfigs } from "./configs/openai-agents"; export { googleGenAIConfigs } from "./configs/google-genai"; diff --git a/js/src/exports.ts b/js/src/exports.ts index 36a38946a..d02aa5394 100644 --- a/js/src/exports.ts +++ b/js/src/exports.ts @@ -210,6 +210,7 @@ export { wrapClaudeAgentSDK } from "./wrappers/claude-agent-sdk/claude-agent-sdk export { wrapOpenAICodexSDK } from "./wrappers/openai-codex"; export { wrapCursorSDK } from "./wrappers/cursor-sdk"; export { wrapPiCodingAgentSDK } from "./wrappers/pi-coding-agent"; +export { wrapCloudflareAgent } from "./wrappers/cloudflare-agent"; export { wrapStrandsAgentSDK } from "./wrappers/strands-agent-sdk"; export { wrapGoogleGenAI } from "./wrappers/google-genai"; export { wrapGoogleADK } from "./wrappers/google-adk"; diff --git a/js/src/instrumentation/braintrust-plugin.test.ts b/js/src/instrumentation/braintrust-plugin.test.ts index fdce9dc99..4796409fa 100644 --- a/js/src/instrumentation/braintrust-plugin.test.ts +++ b/js/src/instrumentation/braintrust-plugin.test.ts @@ -18,6 +18,7 @@ import { LangChainPlugin } from "./plugins/langchain-plugin"; import { LangSmithPlugin } from "./plugins/langsmith-plugin"; import { PiCodingAgentPlugin } from "./plugins/pi-coding-agent-plugin"; import { StrandsAgentSDKPlugin } from "./plugins/strands-agent-sdk-plugin"; +import { CloudflareAgentsPlugin } from "./plugins/cloudflare-agents-plugin"; function createPluginClassMock() { return vi.fn(function MockPlugin(this: { @@ -111,6 +112,10 @@ vi.mock("./plugins/strands-agent-sdk-plugin", () => ({ StrandsAgentSDKPlugin: createPluginClassMock(), })); +vi.mock("./plugins/cloudflare-agents-plugin", () => ({ + CloudflareAgentsPlugin: createPluginClassMock(), +})); + describe("BraintrustPlugin", () => { beforeEach(() => { vi.clearAllMocks(); @@ -265,6 +270,16 @@ describe("BraintrustPlugin", () => { expect(mockInstance.enable).toHaveBeenCalledTimes(1); }); + it("should create and enable Cloudflare Agents plugin by default", () => { + const plugin = new BraintrustPlugin(); + plugin.enable(); + + expect(CloudflareAgentsPlugin).toHaveBeenCalledTimes(1); + const mockInstance = vi.mocked(CloudflareAgentsPlugin).mock.results[0] + .value; + expect(mockInstance.enable).toHaveBeenCalledTimes(1); + }); + it("should create all plugins when enabled with no config", () => { const plugin = new BraintrustPlugin(); plugin.enable(); @@ -615,6 +630,7 @@ describe("BraintrustPlugin", () => { langsmith: false, piCodingAgent: false, strandsAgentSDK: false, + cloudflareAgents: false, }, }); plugin.enable(); @@ -637,6 +653,7 @@ describe("BraintrustPlugin", () => { expect(LangSmithPlugin).not.toHaveBeenCalled(); expect(PiCodingAgentPlugin).not.toHaveBeenCalled(); expect(StrandsAgentSDKPlugin).not.toHaveBeenCalled(); + expect(CloudflareAgentsPlugin).not.toHaveBeenCalled(); }); it("should not create Pi Coding Agent plugin when piCodingAgent: false", () => { @@ -660,6 +677,16 @@ describe("BraintrustPlugin", () => { expect(OpenAIPlugin).toHaveBeenCalledTimes(1); }); + it("should not create Cloudflare Agents plugin when cloudflareAgents: false", () => { + const plugin = new BraintrustPlugin({ + integrations: { cloudflareAgents: false }, + }); + plugin.enable(); + + expect(CloudflareAgentsPlugin).not.toHaveBeenCalled(); + expect(OpenAIPlugin).toHaveBeenCalledTimes(1); + }); + it("should allow selective enabling of plugins", () => { const plugin = new BraintrustPlugin({ integrations: { @@ -820,6 +847,8 @@ describe("BraintrustPlugin", () => { vi.mocked(PiCodingAgentPlugin).mock.results[0].value; const strandsAgentSDKMock = vi.mocked(StrandsAgentSDKPlugin).mock .results[0].value; + const cloudflareAgentsMock = vi.mocked(CloudflareAgentsPlugin).mock + .results[0].value; const langChainMock = vi.mocked(LangChainPlugin).mock.results[0].value; expect(openaiMock.enable).toHaveBeenCalledTimes(1); @@ -837,6 +866,7 @@ describe("BraintrustPlugin", () => { expect(groqMock.enable).toHaveBeenCalledTimes(1); expect(piCodingAgentMock.enable).toHaveBeenCalledTimes(1); expect(strandsAgentSDKMock.enable).toHaveBeenCalledTimes(1); + expect(cloudflareAgentsMock.enable).toHaveBeenCalledTimes(1); expect(langChainMock.enable).toHaveBeenCalledTimes(1); }); @@ -867,6 +897,8 @@ describe("BraintrustPlugin", () => { vi.mocked(PiCodingAgentPlugin).mock.results[0].value; const strandsAgentSDKMock = vi.mocked(StrandsAgentSDKPlugin).mock .results[0].value; + const cloudflareAgentsMock = vi.mocked(CloudflareAgentsPlugin).mock + .results[0].value; const langChainMock = vi.mocked(LangChainPlugin).mock.results[0].value; plugin.disable(); @@ -886,6 +918,7 @@ describe("BraintrustPlugin", () => { expect(groqMock.disable).toHaveBeenCalledTimes(1); expect(piCodingAgentMock.disable).toHaveBeenCalledTimes(1); expect(strandsAgentSDKMock.disable).toHaveBeenCalledTimes(1); + expect(cloudflareAgentsMock.disable).toHaveBeenCalledTimes(1); expect(langChainMock.disable).toHaveBeenCalledTimes(1); }); diff --git a/js/src/instrumentation/braintrust-plugin.ts b/js/src/instrumentation/braintrust-plugin.ts index d5435f2b0..8a8cadf27 100644 --- a/js/src/instrumentation/braintrust-plugin.ts +++ b/js/src/instrumentation/braintrust-plugin.ts @@ -22,6 +22,7 @@ import { LangChainPlugin } from "./plugins/langchain-plugin"; import { LangSmithPlugin } from "./plugins/langsmith-plugin"; import { PiCodingAgentPlugin } from "./plugins/pi-coding-agent-plugin"; import { StrandsAgentSDKPlugin } from "./plugins/strands-agent-sdk-plugin"; +import { CloudflareAgentsPlugin } from "./plugins/cloudflare-agents-plugin"; import type { InstrumentationIntegrationsConfig } from "./config"; export interface BraintrustPluginConfig { @@ -70,6 +71,7 @@ export class BraintrustPlugin extends BasePlugin { private langSmithPlugin: LangSmithPlugin | null = null; private piCodingAgentPlugin: PiCodingAgentPlugin | null = null; private strandsAgentSDKPlugin: StrandsAgentSDKPlugin | null = null; + private cloudflareAgentsPlugin: CloudflareAgentsPlugin | null = null; constructor(config: BraintrustPluginConfig = {}) { super(); @@ -192,6 +194,11 @@ export class BraintrustPlugin extends BasePlugin { this.strandsAgentSDKPlugin.enable(); } + if (integrations.cloudflareAgents !== false) { + this.cloudflareAgentsPlugin = new CloudflareAgentsPlugin(); + this.cloudflareAgentsPlugin.enable(); + } + if (integrations.flue !== false) { this.fluePlugin = new FluePlugin(); this.fluePlugin.enable(); @@ -317,6 +324,11 @@ export class BraintrustPlugin extends BasePlugin { this.strandsAgentSDKPlugin = null; } + if (this.cloudflareAgentsPlugin) { + this.cloudflareAgentsPlugin.disable(); + this.cloudflareAgentsPlugin = null; + } + if (this.fluePlugin) { this.fluePlugin.disable(); this.fluePlugin = null; diff --git a/js/src/instrumentation/config.ts b/js/src/instrumentation/config.ts index 8a2d43373..b58212fd3 100644 --- a/js/src/instrumentation/config.ts +++ b/js/src/instrumentation/config.ts @@ -26,6 +26,7 @@ export interface InstrumentationIntegrationsConfig { openaiCodexSDK?: boolean; piCodingAgent?: boolean; strandsAgentSDK?: boolean; + cloudflareAgents?: boolean; langchain?: boolean; langgraph?: boolean; langsmith?: boolean; @@ -58,6 +59,9 @@ const envIntegrationAliases: Record< strandsagentsdk: "strandsAgentSDK", "strands-agent-sdk": "strandsAgentSDK", "@strands-agents/sdk": "strandsAgentSDK", + agents: "cloudflareAgents", + "cloudflare-agents": "cloudflareAgents", + cloudflareagents: "cloudflareAgents", anthropic: "anthropic", aisdk: "aisdk", "ai-sdk": "aisdk", @@ -141,6 +145,7 @@ export function getDefaultInstrumentationIntegrations(): Record< langsmith: true, piCodingAgent: true, strandsAgentSDK: true, + cloudflareAgents: true, }; } diff --git a/js/src/instrumentation/plugins/cloudflare-agents-channels.ts b/js/src/instrumentation/plugins/cloudflare-agents-channels.ts new file mode 100644 index 000000000..2f12705e1 --- /dev/null +++ b/js/src/instrumentation/plugins/cloudflare-agents-channels.ts @@ -0,0 +1,26 @@ +import { channel, defineChannels } from "../core/channel-definitions"; +import { INSTRUMENTATION_NAMES } from "../../span-origin"; +import type { + CloudflareAgentToolClass, + CloudflareRunAgentToolOptions, + CloudflareRunAgentToolResult, +} from "../../vendor-sdk-types/cloudflare-agents"; + +type CloudflareAgentsChannelContext = { + self?: unknown; +}; + +export const cloudflareAgentsChannels = defineChannels( + "agents", + { + runAgentTool: channel< + [CloudflareAgentToolClass, CloudflareRunAgentToolOptions], + CloudflareRunAgentToolResult, + CloudflareAgentsChannelContext + >({ + channelName: "Agent.runAgentTool", + kind: "async", + }), + }, + { instrumentationName: INSTRUMENTATION_NAMES.CLOUDFLARE_AGENTS }, +); diff --git a/js/src/instrumentation/plugins/cloudflare-agents-plugin.test.ts b/js/src/instrumentation/plugins/cloudflare-agents-plugin.test.ts new file mode 100644 index 000000000..d6d2de7de --- /dev/null +++ b/js/src/instrumentation/plugins/cloudflare-agents-plugin.test.ts @@ -0,0 +1,211 @@ +import { + afterEach, + beforeEach, + describe, + expect, + expectTypeOf, + it, + vi, +} from "vitest"; +import type { StartSpanArgs } from "../../logger"; +import { + getSpanInstrumentationName, + INSTRUMENTATION_NAMES, +} from "../../span-origin"; + +const { mockStartSpan } = vi.hoisted(() => ({ + mockStartSpan: vi.fn(), +})); + +vi.mock("../../logger", () => ({ + _internalStartSpanWithContext: (...args: unknown[]) => mockStartSpan(...args), +})); + +vi.mock("../../isomorph", () => ({ + default: { + getEnv: vi.fn(), + newTracingChannel: vi.fn(), + }, +})); + +import iso from "../../isomorph"; +import { CloudflareAgentsPlugin } from "./cloudflare-agents-plugin"; + +const mockNewTracingChannel = iso.newTracingChannel as ReturnType; + +describe("CloudflareAgentsPlugin", () => { + let handlers: any; + let subscribe: ReturnType; + let unsubscribe: ReturnType; + let spans: Array<{ + args: any; + context: any; + end: ReturnType; + log: ReturnType; + }>; + + beforeEach(() => { + spans = []; + subscribe = vi.fn((nextHandlers) => { + handlers = nextHandlers; + }); + unsubscribe = vi.fn(); + mockNewTracingChannel.mockReturnValue({ subscribe, unsubscribe }); + mockStartSpan.mockImplementation((args: any, context: any) => { + const span = { args, context, end: vi.fn(), log: vi.fn() }; + spans.push(span); + return span; + }); + }); + + afterEach(() => { + vi.clearAllMocks(); + }); + + it("subscribes idempotently to Agent.runAgentTool", () => { + const plugin = new CloudflareAgentsPlugin(); + plugin.enable(); + plugin.enable(); + + expect(mockNewTracingChannel).toHaveBeenCalledWith( + "orchestrion:agents:Agent.runAgentTool", + ); + expect(subscribe).toHaveBeenCalledTimes(1); + + plugin.disable(); + plugin.disable(); + expect(unsubscribe).toHaveBeenCalledTimes(1); + }); + + it("keeps SDK-controlled context out of the public start-span arguments", () => { + type HasPublicContext = "context" extends keyof StartSpanArgs + ? true + : false; + + expectTypeOf().toEqualTypeOf(); + }); + + it("records only the child class name, input, and completed output", () => { + new CloudflareAgentsPlugin().enable(); + class ResearchAgent {} + const event = { + arguments: [ + ResearchAgent, + { + input: { query: "cloudflare" }, + runId: "secret-run-id", + inputPreview: "secret-preview", + display: { name: "secret-display" }, + }, + ], + }; + + handlers.start(event); + handlers.asyncEnd( + Object.assign(event, { + result: { + status: "completed", + output: { answer: 42 }, + runId: "secret-result-run-id", + agentType: "secret-agent-type", + summary: "secret-summary", + }, + }), + ); + + expect(spans).toHaveLength(1); + expect(spans[0].args).toMatchObject({ + name: "ResearchAgent", + spanAttributes: { type: "tool" }, + event: { + input: { query: "cloudflare" }, + }, + }); + expect(Object.keys(spans[0].args).sort()).toEqual([ + "event", + "name", + "spanAttributes", + ]); + expect(spans[0].args).not.toHaveProperty("context"); + expect(getSpanInstrumentationName(spans[0].args)).toBe( + INSTRUMENTATION_NAMES.CLOUDFLARE_AGENTS, + ); + expect(spans[0].context).toEqual({ + span_origin: { + environment: { type: "server", name: "cloudflare_workers" }, + }, + }); + expect(spans[0].log).toHaveBeenCalledExactlyOnceWith({ + output: { answer: 42 }, + }); + expect(spans[0].end).toHaveBeenCalledTimes(1); + }); + + it("records returned terminal error strings", () => { + new CloudflareAgentsPlugin().enable(); + class FailingAgent {} + const event = { arguments: [FailingAgent, { input: "fail" }] }; + + handlers.start(event); + handlers.asyncEnd( + Object.assign(event, { + result: { + status: "error", + error: "child failed", + reason: "do not record", + }, + }), + ); + + expect(spans[0].log).toHaveBeenCalledExactlyOnceWith({ + error: "child failed", + }); + expect(spans[0].end).toHaveBeenCalledTimes(1); + }); + + it("records the original rejection and preserves concurrent span state", () => { + new CloudflareAgentsPlugin().enable(); + class FirstAgent {} + class SecondAgent {} + const first = { arguments: [FirstAgent, { input: 1 }] }; + const second = { arguments: [SecondAgent, { input: 2 }] }; + const rejection = new Error("rejected"); + + handlers.start(first); + handlers.start(second); + handlers.error(Object.assign(second, { error: rejection })); + handlers.asyncEnd( + Object.assign(first, { + result: { status: "completed", output: "first" }, + }), + ); + + expect(spans).toHaveLength(2); + expect(spans[0].log).toHaveBeenCalledWith({ output: "first" }); + expect(spans[1].log).toHaveBeenCalledWith({ error: rejection }); + expect(spans[0].end).toHaveBeenCalledTimes(1); + expect(spans[1].end).toHaveBeenCalledTimes(1); + }); + + it("skips detached runs and does not invoke getters", () => { + new CloudflareAgentsPlugin().enable(); + const nameGetter = vi.fn(() => "GetterAgent"); + const inputGetter = vi.fn(() => "getter-input"); + const AgentWithGetter = Object.defineProperty(function () {}, "name", { + get: nameGetter, + }); + const options = Object.defineProperties( + {}, + { + detached: { value: true }, + input: { get: inputGetter }, + }, + ); + + handlers.start({ arguments: [AgentWithGetter, options] }); + + expect(spans).toHaveLength(0); + expect(nameGetter).not.toHaveBeenCalled(); + expect(inputGetter).not.toHaveBeenCalled(); + }); +}); diff --git a/js/src/instrumentation/plugins/cloudflare-agents-plugin.ts b/js/src/instrumentation/plugins/cloudflare-agents-plugin.ts new file mode 100644 index 000000000..d9813f419 --- /dev/null +++ b/js/src/instrumentation/plugins/cloudflare-agents-plugin.ts @@ -0,0 +1,140 @@ +import { debugLogger } from "../../debug-logger"; +import type { IsoChannelHandlers } from "../../isomorph"; +import { _internalStartSpanWithContext } from "../../logger"; +import type { Span } from "../../logger"; +import { + INSTRUMENTATION_NAMES, + withSpanInstrumentationName, +} from "../../span-origin"; +import { SpanTypeAttribute } from "../../../util/index"; +import { BasePlugin } from "../core"; +import type { ChannelMessage } from "../core/channel-definitions"; +import { cloudflareAgentsChannels } from "./cloudflare-agents-channels"; + +const CLOUDFLARE_WORKERS_CONTEXT = { + span_origin: { + environment: { type: "server", name: "cloudflare_workers" }, + }, +}; + +export class CloudflareAgentsPlugin extends BasePlugin { + protected onEnable(): void { + const channel = cloudflareAgentsChannels.runAgentTool.tracingChannel(); + const spans = new WeakMap(); + const handlers: IsoChannelHandlers< + ChannelMessage + > = { + start: (event) => { + try { + const agentClass = event.arguments[0]; + const options = event.arguments[1]; + if (ownValue(options, "detached")) { + return; + } + + const name = ownValue(agentClass, "name"); + if (typeof name !== "string" || name.length === 0) { + debugLogger.warn( + "Skipping Cloudflare Agents runAgentTool span because the child agent class has no name.", + ); + return; + } + + const span = _internalStartSpanWithContext( + withSpanInstrumentationName( + { + name, + spanAttributes: { type: SpanTypeAttribute.TOOL }, + event: { + input: ownValue(options, "input"), + }, + }, + INSTRUMENTATION_NAMES.CLOUDFLARE_AGENTS, + ), + CLOUDFLARE_WORKERS_CONTEXT, + ); + spans.set(event, span); + } catch (error) { + logInstrumentationError("start", error); + } + }, + asyncEnd: (event) => { + const span = spans.get(event); + if (!span) { + return; + } + spans.delete(event); + + try { + const status = ownValue(event.result, "status"); + if (status === "completed") { + span.log({ output: ownValue(event.result, "output") }); + } else { + const error = ownValue(event.result, "error"); + if (typeof error === "string") { + span.log({ error }); + } + } + } catch (error) { + logInstrumentationError("completion", error); + } finally { + safelyEndSpan(span); + } + }, + error: (event) => { + const span = spans.get(event); + if (!span) { + return; + } + spans.delete(event); + + try { + span.log({ error: event.error }); + } catch (error) { + logInstrumentationError("rejection", error); + } finally { + safelyEndSpan(span); + } + }, + }; + + channel.subscribe(handlers); + this.unsubscribers.push(() => channel.unsubscribe(handlers)); + } + + protected onDisable(): void { + for (const unsubscribe of this.unsubscribers) { + unsubscribe(); + } + this.unsubscribers = []; + } +} + +function ownValue(value: unknown, key: PropertyKey): unknown { + if (!isObjectLike(value)) { + return undefined; + } + const descriptor = Object.getOwnPropertyDescriptor(value, key); + return descriptor && "value" in descriptor ? descriptor.value : undefined; +} + +function isObjectLike(value: unknown): value is object { + return ( + (typeof value === "object" && value !== null) || typeof value === "function" + ); +} + +function safelyEndSpan(span: Span): void { + try { + span.end(); + } catch (error) { + logInstrumentationError("span end", error); + } +} + +function logInstrumentationError(operation: string, error: unknown): void { + debugLogger.error( + `Failed to process Cloudflare Agents ${operation} instrumentation:`, + error, + ); +} diff --git a/js/src/instrumentation/plugins/instrumentation-names.test.ts b/js/src/instrumentation/plugins/instrumentation-names.test.ts index 6b149444c..d07c67950 100644 --- a/js/src/instrumentation/plugins/instrumentation-names.test.ts +++ b/js/src/instrumentation/plugins/instrumentation-names.test.ts @@ -9,6 +9,7 @@ import { smithyCoreChannels, } from "./bedrock-runtime-channels"; import { claudeAgentSDKChannels } from "./claude-agent-sdk-channels"; +import { cloudflareAgentsChannels } from "./cloudflare-agents-channels"; import { cohereChannels } from "./cohere-channels"; import { cursorSDKChannels } from "./cursor-sdk-channels"; import { flueChannels } from "./flue-channels"; @@ -38,6 +39,10 @@ describe("built-in instrumentation provenance names", () => { [smithyCoreChannels.clientSend, INSTRUMENTATION_NAMES.BEDROCK_RUNTIME], [smithyClientChannels.clientSend, INSTRUMENTATION_NAMES.BEDROCK_RUNTIME], [claudeAgentSDKChannels.query, INSTRUMENTATION_NAMES.CLAUDE_AGENT_SDK], + [ + cloudflareAgentsChannels.runAgentTool, + INSTRUMENTATION_NAMES.CLOUDFLARE_AGENTS, + ], [cohereChannels.chat, INSTRUMENTATION_NAMES.COHERE], [cursorSDKChannels.create, INSTRUMENTATION_NAMES.CURSOR_SDK], [flueChannels.createContext, INSTRUMENTATION_NAMES.FLUE], diff --git a/js/src/instrumentation/registry.test.ts b/js/src/instrumentation/registry.test.ts index 4fa54be93..6cea7c672 100644 --- a/js/src/instrumentation/registry.test.ts +++ b/js/src/instrumentation/registry.test.ts @@ -161,6 +161,7 @@ describe("configureInstrumentation API", () => { cohere: false, mastra: false, strandsAgentSDK: false, + cloudflareAgents: false, }, }); }); diff --git a/js/src/logger.ts b/js/src/logger.ts index fab3b3ead..7eb5d337d 100644 --- a/js/src/logger.ts +++ b/js/src/logger.ts @@ -272,11 +272,16 @@ type StartSpanEventArgs = ExperimentLogPartialArgs & Partial; const INITIAL_SPAN_WRITE_AS_MERGE = Symbol( "braintrust.initial-span-write-as-merge", ); +const INTERNAL_SPAN_CONTEXT = Symbol("braintrust.internal-span-context"); type InitialSpanWriteAsMergeArg = { readonly [INITIAL_SPAN_WRITE_AS_MERGE]?: true; }; +type InternalSpanContextArg = { + readonly [INTERNAL_SPAN_CONTEXT]?: Record; +}; + export type StartSpanArgs = { name?: string; type?: SpanType; @@ -6323,6 +6328,19 @@ export function _internalStartSpanWithInitialMerge< InitialSpanWriteAsMergeArg).span; } +/** @internal Start a span with SDK-controlled context fields. */ +export function _internalStartSpanWithContext< + IsAsyncFlush extends boolean = true, +>( + args: StartSpanArgs & AsyncFlushArg & OptionalStateArg, + context: Record, +): Span { + return startSpanAndIsLogger({ + ...args, + [INTERNAL_SPAN_CONTEXT]: context, + }).span; +} + /** * Flush any pending rows to the server. */ @@ -6342,7 +6360,10 @@ export function setFetch(fetch: typeof globalThis.fetch): void { } function startSpanAndIsLogger( - args?: StartSpanArgs & AsyncFlushArg & OptionalStateArg, + args?: StartSpanArgs & + AsyncFlushArg & + OptionalStateArg & + InternalSpanContextArg, ): { span: Span; isSyncFlushLogger: boolean } { const state = args?.state ?? _globalState; @@ -7616,7 +7637,8 @@ export class SpanImpl implements Span { spanId?: string; propagatedState?: PropagatedState | undefined; } & Omit & - InitialSpanWriteAsMergeArg, + InitialSpanWriteAsMergeArg & + InternalSpanContextArg, ) { this._state = args.state; this._propagatedState = args.propagatedState; @@ -7663,7 +7685,7 @@ export class SpanImpl implements Span { start: args.startTime ?? getCurrentUnixTimestamp(), }, context: mergeSpanOriginContext( - { ...callerLocation }, + { ...callerLocation, ...args[INTERNAL_SPAN_CONTEXT] }, instrumentationName, this._state.spanOriginEnvironment, ), diff --git a/js/src/span-origin.ts b/js/src/span-origin.ts index 0a6a938b6..5ff62482d 100644 --- a/js/src/span-origin.ts +++ b/js/src/span-origin.ts @@ -13,6 +13,7 @@ export const INSTRUMENTATION_NAMES = { BEDROCK_RUNTIME: "bedrock-runtime", BRAINTRUST_JS_LOGGER: "braintrust-js-logger", CLAUDE_AGENT_SDK: "claude-agent-sdk", + CLOUDFLARE_AGENTS: "cloudflare-agents", COHERE: "cohere", CURSOR_SDK: "cursor-sdk", EVE: "eve", diff --git a/js/src/vendor-sdk-types/cloudflare-agents.ts b/js/src/vendor-sdk-types/cloudflare-agents.ts new file mode 100644 index 000000000..34166eef8 --- /dev/null +++ b/js/src/vendor-sdk-types/cloudflare-agents.ts @@ -0,0 +1,32 @@ +/** + * Minimal types for the Cloudflare Agents APIs used by our instrumentation. + * + * Keep this file intentionally narrow so `braintrust` does not take a runtime + * or type dependency on `agents`. + */ + +export interface CloudflareAgentToolClass { + readonly name: string; + [key: PropertyKey]: unknown; +} + +export interface CloudflareRunAgentToolOptions { + input: unknown; + detached?: boolean | Record; + [key: string]: unknown; +} + +export interface CloudflareRunAgentToolResult { + status: unknown; + output?: unknown; + error?: unknown; + [key: string]: unknown; +} + +export interface CloudflareAgent { + runAgentTool( + cls: CloudflareAgentToolClass, + options: CloudflareRunAgentToolOptions, + ): Promise; + [key: PropertyKey]: unknown; +} diff --git a/js/src/wrappers/cloudflare-agent.test.ts b/js/src/wrappers/cloudflare-agent.test.ts new file mode 100644 index 000000000..54805fe8f --- /dev/null +++ b/js/src/wrappers/cloudflare-agent.test.ts @@ -0,0 +1,108 @@ +import { afterEach, describe, expect, it, vi } from "vitest"; + +const { tracePromise } = vi.hoisted(() => ({ + tracePromise: vi.fn((fn: () => Promise, _event?: unknown) => fn()), +})); + +vi.mock("../isomorph", () => ({ + default: { + getEnv: vi.fn(), + newTracingChannel: vi.fn(() => ({ + subscribe: vi.fn(), + tracePromise, + unsubscribe: vi.fn(), + })), + }, +})); + +import { wrapCloudflareAgent } from "./cloudflare-agent"; + +describe("wrapCloudflareAgent", () => { + afterEach(() => { + vi.clearAllMocks(); + }); + + it("wraps runAgentTool and preserves its result and receiver", async () => { + class Agent { + value = "receiver"; + + async runAgentTool(cls: unknown, options: unknown) { + return { cls, options, receiver: this.value, status: "completed" }; + } + } + class ChildAgent {} + const options = { input: { query: "hello" } }; + + expect(wrapCloudflareAgent(Agent)).toBe(Agent); + const agent = new Agent(); + await expect(agent.runAgentTool(ChildAgent, options)).resolves.toEqual({ + cls: ChildAgent, + options, + receiver: "receiver", + status: "completed", + }); + expect(tracePromise).toHaveBeenCalledTimes(1); + expect(tracePromise.mock.calls[0][1]).toEqual({ + arguments: [ChildAgent, options], + self: agent, + }); + }); + + it("patches each Agent class only once", async () => { + class Agent { + async runAgentTool() { + return { status: "completed" }; + } + } + + wrapCloudflareAgent(Agent); + wrapCloudflareAgent(Agent); + await new Agent().runAgentTool(); + + expect(tracePromise).toHaveBeenCalledTimes(1); + }); + + it("preserves rejections", async () => { + const rejection = new Error("child rejected"); + class Agent { + async runAgentTool() { + throw rejection; + } + } + + wrapCloudflareAgent(Agent); + + await expect(new Agent().runAgentTool()).rejects.toBe(rejection); + expect(tracePromise).toHaveBeenCalledTimes(1); + }); + + it("does not trace detached runs", async () => { + class Agent { + async runAgentTool(_cls: unknown, options: unknown) { + return options; + } + } + const inputGetter = vi.fn(() => "do not read"); + const options = Object.defineProperties( + {}, + { + detached: { value: { waitUntil: vi.fn() } }, + input: { get: inputGetter }, + }, + ); + + wrapCloudflareAgent(Agent); + await expect(new Agent().runAgentTool(class {}, options)).resolves.toBe( + options, + ); + + expect(tracePromise).not.toHaveBeenCalled(); + expect(inputGetter).not.toHaveBeenCalled(); + }); + + it("returns unsupported values unchanged", () => { + expect(wrapCloudflareAgent(undefined)).toBeUndefined(); + expect(wrapCloudflareAgent(class Unsupported {})).toBeDefined(); + expect(tracePromise).not.toHaveBeenCalled(); + }); +}); diff --git a/js/src/wrappers/cloudflare-agent.ts b/js/src/wrappers/cloudflare-agent.ts new file mode 100644 index 000000000..c34bb6134 --- /dev/null +++ b/js/src/wrappers/cloudflare-agent.ts @@ -0,0 +1,88 @@ +import { debugLogger } from "../debug-logger"; +import { cloudflareAgentsChannels } from "../instrumentation/plugins/cloudflare-agents-channels"; +import type { CloudflareAgent } from "../vendor-sdk-types/cloudflare-agents"; + +const WRAPPED_RUN_AGENT_TOOL = Symbol.for( + "braintrust.cloudflare-agents.wrapped-run-agent-tool", +); + +/** + * Adds Braintrust tracing to a Cloudflare Agents base `Agent` class. + * + * The returned value is the same class, patched in place so existing Durable + * Object exports and inheritance continue to work unchanged. + */ +export function wrapCloudflareAgent(Agent: T): T { + if (typeof Agent !== "function") { + warnUnsupportedAgent(); + return Agent; + } + + const prototypeDescriptor = Object.getOwnPropertyDescriptor( + Agent, + "prototype", + ); + const prototype = + prototypeDescriptor && "value" in prototypeDescriptor + ? prototypeDescriptor.value + : undefined; + if (!isObjectLike(prototype)) { + warnUnsupportedAgent(); + return Agent; + } + + if (ownValue(prototype, WRAPPED_RUN_AGENT_TOOL) === true) { + return Agent; + } + + const descriptor = Object.getOwnPropertyDescriptor(prototype, "runAgentTool"); + if (!descriptor || typeof descriptor.value !== "function") { + warnUnsupportedAgent(); + return Agent; + } + + const originalRunAgentTool: CloudflareAgent["runAgentTool"] = + descriptor.value; + Object.defineProperty(prototype, "runAgentTool", { + ...descriptor, + value: function wrappedRunAgentTool( + this: CloudflareAgent, + ...args: Parameters + ) { + const options = args[1]; + if (ownValue(options, "detached")) { + return Reflect.apply(originalRunAgentTool, this, args); + } + + return cloudflareAgentsChannels.runAgentTool.tracePromise( + () => Reflect.apply(originalRunAgentTool, this, args), + { arguments: args, self: this }, + ); + }, + }); + Object.defineProperty(prototype, WRAPPED_RUN_AGENT_TOOL, { + configurable: false, + enumerable: false, + value: true, + }); + + return Agent; +} + +function ownValue(value: unknown, key: PropertyKey): unknown { + if (!isObjectLike(value)) { + return undefined; + } + const descriptor = Object.getOwnPropertyDescriptor(value, key); + return descriptor && "value" in descriptor ? descriptor.value : undefined; +} + +function isObjectLike(value: unknown): value is object { + return ( + (typeof value === "object" && value !== null) || typeof value === "function" + ); +} + +function warnUnsupportedAgent(): void { + debugLogger.warn("Unsupported Cloudflare Agents Agent class. Not wrapping."); +}