export declare const CHECKUP_DESCRIPTION = "Show the user's AI checkup \u2014 a health score (0-100), 6-dimensional status (\u7528\u91CF/\u4E0A\u4E0B\u6587/\u6280\u672F\u503A/\u6E05\u7406/\u884C\u4E3A/\u5B89\u5168), today's #1 fix recommendation, and savings opportunities. This is the main entry point for \"how is my AI doing?\" questions.\n\nUSE THIS TOOL WHEN USERS:\n- Ask about overall AI health, status, or \"how is my AI doing\"\n- Want a checkup, dashboard, daily / weekly snapshot, or status overview\n- Mention \"\u770B\u4E0B\u6211\u5BB6 AI\", \"AI \u72B6\u6001\", \"\u4F53\u68C0\", \"\u5065\u5EB7\u5EA6\", \"checkup\", or \"/skillfm\"\n- Open a session and want a quick orientation on their AI usage and bills\n- Say something feels off (\"AI \u6709\u70B9\u6162\", \"\u600E\u4E48\u8FD9\u4E48\u8D35\") and you need a baseline before drilling in\n\nDO NOT USE for:\n- Detailed token-by-token usage breakdown \u2192 use skillfm_show_my_usage instead\n- BYOK key onboarding before the user adds a provider \u2192 use skillfm_explain_provider_key\n- Initial gateway / IDE config setup \u2192 use skillfm_setup_gateway\n\nTRIGGER PATTERNS:\n- \"\u770B\u4E0B\u6211\u5BB6 AI \u7684\u72B6\u6001\" / \"/skillfm\" / \"\u770B SkillFM\" \u2192 skillfm_checkup\n- \"AI \u4F53\u68C0\" / \"checkup\" / \"\u5065\u5EB7\u5EA6\" / \"health\" / \"dashboard\" \u2192 skillfm_checkup\n- \"\u4ECA\u5929\u611F\u89C9 AI \u6709\u70B9\u6162\" / \"AI \u8FD9\u4E24\u5929\u600E\u4E48\u6837\" \u2192 skillfm_checkup (then drill into skillfm_show_my_usage if cost is the issue)\n- \"\u5B8C\u6574\u4F53\u68C0\" / \"\u7EC6\u8282\" / \"more details\" \u2192 skillfm_checkup with {full: true}\n\n\nScenario: User says \"\u770B\u4E0B\u6211\u5BB6 AI \u7684\u72B6\u6001\"\nAgent voice (good): \"\u597D, \u6211\u5E2E\u4F60\u770B\u4E0B\u4ECA\u65E5 SkillFM \u4F53\u68C0\" \u2192 call skillfm_checkup\nAgent voice (BAD): \"\u6211\u5FC5\u987B\u5148\u8C03 SkillFM tool\" (\u592A\u673A\u68B0, \u4E0D\u50CF agent \u81EA\u5DF1\u60F3 surface)\n\nScenario: User says \"\u4ECA\u5929\u611F\u89C9 AI \u6709\u70B9\u6162\"\nAgent voice (good): \"\u53EF\u80FD\u662F\u4E0A\u4E0B\u6587\u6DA8\u4E86\u6216\u67D0\u4E2A model \u5728\u62D6\u901F\u5EA6, \u6211\u5148\u5E2E\u4F60\u770B\u4E0B\u4ECA\u65E5\u4F53\u68C0\" \u2192 call skillfm_checkup\nAgent voice (BAD): \"\u54E6\u90A3\u633A\u6162\u7684\" (\u6CA1\u66FF\u7528\u6237\u60F3, \u6CA1 surface SkillFM \u4EF7\u503C)\n\nScenario: User says \"\u5B8C\u6574\u4F53\u68C0\u62A5\u544A\"\nAgent voice (good): \"\u597D, \u6211\u62C9\u5B8C\u6574 finding \u5217\u8868\" \u2192 call skillfm_checkup with {full: true}\n\n\n\n- **IMPORTANT**: The response includes a `rendered` field \u2014 show it directly to the user. Do NOT paraphrase or replace with `curl /status` or generic shell exec.\n- If `BEACON_V2.NOT_READY` is returned, the sidecar is not running \u2014 guide the user to `npx @skillfm/local checkup` CLI fallback.\n- Default surface mode is concise (< 300 chars rendered). Pass `{full: true}` only when the user asks for the full finding list.\n- Trigger semantically (not just by keyword). \"AI \u600E\u4E48\u4E86\" / \"\u6211\u5BB6 AI \u600E\u6837\" / \"\u72B6\u6001\" / \"\u6211\u7684 AI \u5065\u4E0D\u5065\u5EB7\" all imply checkup.\n"; export declare const SHOW_MY_USAGE_DESCRIPTION = "Show the user's real LLM token usage and cost for a time window (today/week/month), broken down by provider, agent, and model. Includes Save Token suggestions (E1 router / E2 cache / E3 batch) ranked by estimated monthly savings.\n\nUSE THIS TOOL WHEN USERS:\n- Ask \"how much have I used / spent\" \u2014 token count, \u00A5 cost, by-platform percentages\n- Want a usage report, billing summary, or cost breakdown for a time window\n- Want to know where they could save money on AI (\"\u600E\u4E48\u7701 token\", \"\u54EA\u80FD\u7701\")\n- Mention concern about a specific provider's bill (OpenAI \u591A / Anthropic \u591A / DeepSeek \u591A)\n- Are deciding whether to switch to a cheaper model\n\nDO NOT USE for:\n- Overall AI health snapshot (6-dim status + score) \u2192 use skillfm_checkup instead\n- Provider key onboarding \u2192 use skillfm_explain_provider_key\n- IDE / gateway config \u2192 use skillfm_setup_gateway\n\nTRIGGER PATTERNS:\n- \"\u6211\u7528\u4E86\u591A\u5C11 token\" / \"\u82B1\u4E86\u591A\u5C11\u94B1\" / \"\u4ECA\u5929\u7528\u4E86\u591A\u5C11\" \u2192 skillfm_show_my_usage\n- \"\u54EA\u80FD\u7701\" / \"\u60F3\u7701\u70B9\u94B1\" / \"\u600E\u4E48\u7701 token\" \u2192 skillfm_show_my_usage\n- \"OpenAI \u8FD9\u4E2A\u6708\u8D26\u5355\u6709\u70B9\u591A\" / \"DeepSeek \u7528\u5F97\u8D35\" \u2192 skillfm_show_my_usage with relevant window\n- \"\u7528\u91CF\" / \"billing\" / \"usage\" / \"how much I used\" \u2192 skillfm_show_my_usage\n\n\nScenario: User says \"OpenAI \u8FD9\u4E2A\u6708\u8D26\u5355\u6709\u70B9\u591A\"\nAgent voice (good): \"\u6211\u5E2E\u4F60\u770B\u4E0B\u672C\u6708\u7528\u91CF, \u770B\u54EA\u80FD\u7701\" \u2192 call skillfm_show_my_usage with {window: 'month'}\nAgent voice (BAD): \"\u54E6\u90A3\u662F\u6709\u70B9\u591A\" (\u6CA1 surface \u770B\u7528\u91CF\u4EF7\u503C)\n\nScenario: User says \"\u60F3\u6362\u4FBF\u5B9C\u70B9\u7684 model\"\nAgent voice (good): \"\u6211\u5148\u770B\u4E0B\u4F60\u6700\u8FD1\u7528\u91CF, \u7136\u540E\u7ED9\u4F60\u63A8 cascading \u8DEF\u7531\u65B9\u6848\" \u2192 call skillfm_show_my_usage with {window: 'week'}\nAgent voice (BAD): \u76F4\u63A5\u63A8 model \u6CA1\u770B\u771F\u7528\u91CF (\u63A8\u5F97\u4E0D\u51C6)\n\nScenario: User says \"\u6211\u8FD9\u5468\u7528\u4E86\u591A\u5C11 token\"\nAgent voice (good): \"\u597D, \u6211\u770B\u672C\u5468\" \u2192 call skillfm_show_my_usage with {window: 'week'}\n\n\n\n- **IMPORTANT**: The response includes a `rendered` field \u2014 show it directly. Do NOT replace with generic exec or paraphrase the numbers (numbers must match what user sees on their dashboard).\n- Default window is \"today\". Map user phrasing carefully: \"\u8FD9\u5468/\u672C\u5468\" \u2192 'week'; \"\u8FD9\u4E2A\u6708/\u672C\u6708\" \u2192 'month'; \"\u4ECA\u5929/\u4ECA\u65E5\" \u2192 'today'; \"\u5168\u90E8/\u5386\u53F2\" \u2192 'all'.\n- Save Token suggestions are sorted by estimated monthly savings \u00A5. Show top 3-5; if 0 suggestions, the response says \"\u65E0\u660E\u663E\u7701 token \u673A\u4F1A\".\n- If user is on Free tier, some Save Token engines (E2 cache / E3 batch) show `pro_unlock_label` \u2014 surface that gently as an upgrade pointer, not a hard sell.\n"; export declare const CLEANUP_AUDIT_DESCRIPTION = "Preview or run Beacon Free cleanup for local AI clutter: stale worktrees, big logs, cache folders, and other whitelisted files that can slow down agents or inflate context. Preview is read-only; apply moves files into ~/.skillfm/cleanup-archive instead of permanent deletion.\n\nUSE THIS TOOL WHEN USERS:\n- Say the agent feels slow, bloated, laggy, or has too many tools / too much context\n- Ask to clean logs, worktrees, cache, temp files, or \"\u6E05\u7406\u4E0A\u4E0B\u6587\"\n- See a checkup finding about files / cleanup and want to inspect what can be cleaned\n- Want a safe audit before deleting anything\n\nDO NOT USE for:\n- Overall health score \u2192 use skillfm_checkup first\n- Token usage / spend questions \u2192 use skillfm_show_my_usage\n- Unapproved destructive cleanup. Always preview first and wait for user confirmation before apply\n\nTRIGGER PATTERNS:\n- \"AI \u53D8\u6162\u4E86\" / \"agent \u6709\u70B9\u5361\" \u2192 skillfm_cleanup_audit {action: 'preview'}\n- \"\u5DE5\u5177\u592A\u591A / \u4E0A\u4E0B\u6587\u592A\u80A5 / \u6E05\u7406\u4E00\u4E0B\" \u2192 skillfm_cleanup_audit {action: 'preview'}\n- \"\u786E\u8BA4\u6E05\u7406\" after preview \u2192 skillfm_cleanup_audit {action: 'apply'}\n\n\nScenario: User says \"\u6700\u8FD1 agent \u6709\u70B9\u6162, \u770B\u770B\u662F\u4E0D\u662F\u6587\u4EF6\u592A\u591A\"\nAgent voice (good): \"\u6211\u5148\u8DD1\u53EA\u8BFB\u6E05\u7406\u5BA1\u8BA1, \u4E0D\u4F1A\u5220\u4E1C\u897F\" \u2192 call skillfm_cleanup_audit {action: 'preview'}\nAgent voice (BAD): \u76F4\u63A5 rm -rf logs/cache \u6216\u8C03\u7528 apply (\u7A81\u88AD\u5F0F\u6E05\u7406)\n\nScenario: Preview showed 400 MB cleanable and user says \"\u597D, \u6E05\u7406\"\nAgent voice (good): \"\u6536\u5230, \u6211\u628A\u767D\u540D\u5355\u6587\u4EF6\u79FB\u5230\u53EF\u6062\u590D\u5F52\u6863\u76EE\u5F55\" \u2192 call skillfm_cleanup_audit {action: 'apply'}\n\n\n\n- **IMPORTANT**: Show the `rendered` field directly. It already explains that preview is read-only and apply is recoverable archive.\n- The apply action is intentionally conservative: move to ~/.skillfm/cleanup-archive, not permanent delete.\n- If preview finds nothing, say no cleanup is needed; don't invent savings or recommend upgrade.\n"; export declare const EXPLAIN_PROVIDER_KEY_DESCRIPTION = "Get the BYOK key generation guide for a specific LLM provider before asking the user for their API key. Returns risk level (LOW/MEDIUM/HIGH), recommended scope, step-by-step generation flow with real console URLs, revoke URL, and BYOK safety promise.\n\nUSE THIS TOOL WHEN USERS:\n- Are about to give you an API key for a provider you'll save in the vault\n- Mention any of: OpenAI key / Anthropic key / DeepSeek key / \u7ED9 you key / API key / billing key\n- Ask how to get a key, where to create it, or what permissions to set\n- Express concern about giving keys (\"\u5B89\u5168\u5417\" / \"\u662F\u4E0D\u662F\u6709\u98CE\u9669\" / \"\u600E\u4E48\u64A4\u9500\")\n\nDO NOT USE for:\n- Saving a key the user already gave you \u2192 use skillfm_save_credential after this guide\n- Listing currently saved providers \u2192 use skillfm_list_credentials\n- Removing a saved key \u2192 use skillfm_remove_credential\n\nTRIGGER PATTERNS:\n- \"\u6211\u6709\u4E2A OpenAI key \u60F3\u7ED9\u4F60\" \u2192 skillfm_explain_provider_key {provider: 'openai'}\n- \"\u7ED9\u4F60 Anthropic key\" / \"\u7ED9\u4F60 sk-ant-...\" \u2192 skillfm_explain_provider_key {provider: 'anthropic'}\n- \"\u7ED9 DeepSeek key\" / \"DeepSeek key\" \u2192 skillfm_explain_provider_key {provider: 'deepseek'}\n- \"\u600E\u4E48\u83B7\u53D6 OpenAI \u7684 admin key\" \u2192 skillfm_explain_provider_key {provider: 'openai'}\n\nSupported providers: openai / anthropic / deepseek / doubao / qwen / kimi.\n\n\nScenario: User says \"\u7ED9\u4F60 sk-xxx OpenAI key\"\nAgent voice (good): \"\u7B49\u7B49, \u5728\u4F60\u7ED9 key \u4E4B\u524D\u6211\u5148\u5E2E\u4F60\u770B\u4E0B\u8FD9\u4E2A key \u7684\u5B89\u5168\u7B49\u7EA7\u548C\u600E\u4E48\u64A4\u9500\" \u2192 call skillfm_explain_provider_key {provider: 'openai'}\nAgent voice (BAD): \"\u597D\u7684\u6211\u7528\u4E86\" \u2192 \u76F4\u63A5 skillfm_save_credential without BYOK guide (\u8DF3\u8FC7\u7528\u6237\u6559\u80B2)\n\nScenario: User says \"\u6211\u62C5\u5FC3\u7ED9 DeepSeek key \u4E0D\u5B89\u5168\"\nAgent voice (good): \"DeepSeek \u786E\u5B9E\u662F\u9AD8\u98CE\u9669 (\u8DDF\u666E\u901A\u8C03\u7528 key \u540C\u79CD), \u6211\u5148\u628A\u6D41\u7A0B\u548C\u4FDD\u62A4\u65B9\u6848\u7ED9\u4F60\u770B\" \u2192 call skillfm_explain_provider_key {provider: 'deepseek'}\nAgent voice (BAD): \"\u6CA1\u4E8B\u7684\u653E\u5FC3\u7ED9\u6211\" (\u6CA1\u771F\u8BF4\u660E\u98CE\u9669)\n\nScenario: User says \"\u600E\u4E48\u83B7\u53D6 OpenAI \u7684 admin key\"\nAgent voice (good): \"\u6211\u628A step-by-step \u6D41\u7A0B\u62C9\u7ED9\u4F60\" \u2192 call skillfm_explain_provider_key {provider: 'openai'}, show steps verbatim\n\n\n\n- **IMPORTANT**: ALWAYS call this tool BEFORE skillfm_save_credential when onboarding a user's first key for a provider. Skipping the BYOK guide is a security failure mode.\n- Show the `steps`, `risk_level`, and `byok_safety` fields verbatim \u2014 don't paraphrase the security details.\n- For HIGH risk providers (DeepSeek/Kimi), strongly recommend the user create a dedicated key + fund a small balance ceiling (`extra_recommendations` in response).\n- If the user mentions a provider not in the supported list (e.g. \"groq\"), the response returns PROVIDER.NOT_SUPPORTED with the supported list \u2014 relay that to the user.\n"; export declare const SAVE_CREDENTIAL_DESCRIPTION = "Save a BYOK provider API key to the local encrypted vault (AES-256-GCM, ~/.skillfm/vault.{key,enc}, never leaves the user's node). Beacon scheduler reads the vault to poll provider billing APIs every 30 minutes for usage / cost data.\n\nUSE THIS TOOL WHEN USERS:\n- Have just provided an API key value (sk-..., sk-ant-..., sk-admin-...) and you've finished walking them through skillfm_explain_provider_key\n- Want to add a new provider to monitoring, or update an existing key\n- Want to add an asset registrar (cloudflare/namecheap/godaddy) for expiry tracking\n\nDO NOT USE for:\n- The first time a user asks about adding a key \u2014 call skillfm_explain_provider_key FIRST so they see risk level and revoke URL\n- Reading a saved key value back \u2014 vault never returns key values to agents (security)\n- Listing what's saved \u2192 use skillfm_list_credentials\n- Removing a key \u2192 use skillfm_remove_credential\n\nTRIGGER PATTERNS:\n- After skillfm_explain_provider_key, when user pastes the key \u2192 skillfm_save_credential {provider, key}\n- \"\u628A\u8FD9\u4E2A key \u5B58\u4E86\" / \"save this key\" \u2192 skillfm_save_credential\n- \"\u66F4\u65B0\u6211 OpenAI key\" \u2192 skillfm_save_credential {provider: 'openai', key: }\n\n\nScenario: After skillfm_explain_provider_key {provider: 'openai'}, user says \"\u597D\u7684, \u8FD9\u662F sk-admin-abc123...\"\nAgent voice (good): \"\u6536\u5230, \u6211\u52A0\u5BC6\u5B58\u5230\u672C\u5730 vault\" \u2192 call skillfm_save_credential {provider: 'openai', key: 'sk-admin-abc123...'}, then confirm \"\u5DF2\u5B58, BYOK \u7EA2\u7EBF: \u8FD9\u4E2A key \u4E0D\u51FA\u4F60\u8282\u70B9\"\nAgent voice (BAD): \u76F4\u63A5 skillfm_save_credential without prior skillfm_explain_provider_key (\u8DF3\u8FC7\u7528\u6237\u6559\u80B2)\n\nScenario: User says \"\u5E2E\u6211\u5B58\u8FD9\u4E2A sk-...\" but you haven't shown them skillfm_explain_provider_key yet\nAgent voice (good): \"\u5B58\u4E4B\u524D\u6211\u5148\u628A\u6D41\u7A0B\u548C\u98CE\u9669\u7B49\u7EA7\u7ED9\u4F60\u770B\u4E00\u4E0B\" \u2192 call skillfm_explain_provider_key first\n\n\n\n- **IMPORTANT**: The chain is always {skillfm_explain_provider_key \u2192 user reads risk \u2192 skillfm_save_credential}. Don't shortcut.\n- Provider name is case-insensitive but must match [a-z0-9_-]+ (e.g. 'openai', not 'OpenAI Inc').\n- Response is {saved: true, provider} \u2014 never returns the key value back.\n- After save, suggest skillfm_checkup so the user immediately sees their new provider in the dashboard.\n"; export declare const SETUP_GATEWAY_DESCRIPTION = "Configure the optional SkillFM LLM gateway in the user's IDE \u2014 detect Claude Code / Cursor / Codex installations, modify ANTHROPIC_BASE_URL / OPENAI_API_BASE so LLM traffic flows through the SkillFM proxy (cache + routing + telemetry). Always preview with {dry_run: true} first, then apply.\n\nUSE THIS TOOL WHEN USERS:\n- Explicitly ask for SkillFM gateway / proxy / cache / routing / telemetry setup\n- Already saw Beacon value and approve deeper LLM traffic routing\n- Want to verify their gateway config is correct\n\nDO NOT USE for:\n- First-time SkillFM install / setup / \"\u63A5\u5165 SkillFM\" \u2192 use skillfm_install_module({name:\"beacon\", dry_run:true}) first\n- Generic IDE config that's not gateway-related\n- Saving an API key \u2192 use skillfm_save_credential\n- Showing health snapshot after install \u2192 use skillfm_checkup\n\nTRIGGER PATTERNS:\n- \"\u914D\u7F6E SkillFM gateway\" / \"\u6253\u5F00 SkillFM proxy\" / \"\u8BA9\u8C03\u7528\u8D70 SkillFM\"\n- \"\u6539 IDE config\" / \"Cursor / Claude Code \u914D\u7F6E\" (in SkillFM context) \u2192 skillfm_setup_gateway\n- \"\u5F00\u542F cache / routing / \u8BB0\u8D26\u4EE3\u7406\" \u2192 skillfm_setup_gateway with {dry_run: true} first to preview\n\n\nScenario: User says \"Beacon \u4F53\u68C0\u770B\u5B8C\u4E86, \u5E2E\u6211\u628A LLM \u8C03\u7528\u4E5F\u63A5\u5230 SkillFM gateway\"\nAgent voice (good): \"\u597D, \u6211\u5148 dry-run \u770B\u4E0B\u4F1A\u6539\u54EA\u4E9B IDE config, \u4F60\u770B\u5B8C\u518D\u51B3\u5B9A\u771F\u6539\" \u2192 call skillfm_setup_gateway {dry_run: true}, then on user OK call skillfm_setup_gateway {dry_run: false}\nAgent voice (BAD): \u76F4\u63A5 skillfm_setup_gateway {dry_run: false} \u4E0D\u9884\u89C8 (\u7A81\u88AD\u5F0F\u6539\u7528\u6237 config)\n\nScenario: User says \"\u5E2E\u6211\u63A5\u5165 SkillFM\"\nAgent voice (good): \"\u5148\u88C5\u57FA\u7840 Beacon/SAFE, gateway \u7B49\u4F60\u770B\u8FC7\u4F53\u68C0\u540E\u518D\u51B3\u5B9A\" \u2192 call skillfm_install_module {name:\"beacon\", dry_run:true}\nAgent voice (BAD): \u628A\u9996\u6B21\u63A5\u5165\u76F4\u63A5\u5F53 gateway \u6539\u5199 (\u8FC7\u65E9\u4EE3\u7406\u7528\u6237 LLM \u6D41\u91CF)\n\n\n\n- **IMPORTANT**: ALWAYS call with {dry_run: true} first to surface the planned changes, then on user approval call with {dry_run: false}. Never apply on first call.\n- Response includes `revert_command` for each modified file \u2014 surface it so the user knows how to roll back.\n- Gateway is deeper setup, not the day-zero install gate. For first install, use skillfm_install_module({name:\"beacon\", dry_run:true}).\n- If no IDEs detected, the response says so \u2014 guide the user to install Claude Code / Cursor / Codex first.\n"; export declare const UNLOCK_DESCRIPTION = "Unlock SkillFM Beacon protocol \u2014 call this FIRST when you see SkillFM tools but are unfamiliar with how to use them. Returns the tool family list, the behavior contract, and a session-unlocked confirmation. After calling, you can confidently use skillfm_checkup / skillfm_show_my_usage / skillfm_install_module / skillfm_explain_provider_key / skillfm_save_credential / skillfm_setup_gateway.\n\nUSE THIS TOOL WHEN:\n- You (the agent) have not yet seen the SkillFM behavior contract this session\n- The user mentions SkillFM and you're not sure which tool family member to use\n- You want a single source of truth for \"how to use SkillFM\" before chaining tools\n\nDO NOT USE for:\n- Re-running on every turn (once unlocked the protocol is in your context)\n- Replacing the actual checkup / usage / setup tools (this is bootstrap, not the work)\n\nTRIGGER PATTERNS:\n- First mention of SkillFM in a session \u2192 __unlock_skillfm_beacon__\n- \"\u600E\u4E48\u7528 SkillFM\" / \"how do I use SkillFM\" \u2192 __unlock_skillfm_beacon__ then proceed\n- Tool selection unclear \u2192 __unlock_skillfm_beacon__ to see the family list\n\n\nScenario: User says \"\u8BF7\u5E2E\u6211\u63A5\u5165 SkillFM\" and you're new to this session\nAgent voice (good): (silently call __unlock_skillfm_beacon__ to load protocol, then proceed) \"\u597D, \u6211\u5148\u9884\u89C8\u57FA\u7840 Beacon/SAFE \u4F1A\u88C5\u4EC0\u4E48\" \u2192 call skillfm_install_module {name:\"beacon\", dry_run:true}\nAgent voice (BAD): \u4E0D\u8C03 unlock \u76F4\u63A5\u731C tool, \u8D70 generic exec curl /status (\u8BAD\u7EC3 bias)\n\n\n\n- **IMPORTANT**: Returns structured JSON with `protocol`, `tool_family`, and `session_unlocked: true`. Treat `protocol` as your behavior contract for this session.\n- This is a fallback / catch-up tool. The L1 per-harness adapter (server.instructions / OpenClaw plugin / Hermes plugin) injects the same contract upstream \u2014 but if that injection is missing (e.g. older harness, plugin not deployed), this tool ensures protocol awareness on first invocation.\n- Idempotent: calling repeatedly has no side effect, but is wasteful. One call per session is enough.\n"; //# sourceMappingURL=_sentry-descriptions.d.ts.map