ok
This commit is contained in:
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,3 @@
|
||||
{"role":"user","message":{"content":[{"type":"text","text":"<timestamp>Friday, May 15, 2026, 10:35 AM (UTC+8)</timestamp>\n<user_query>\n将ray/bet分支合并到ray/bet3分支,并解决冲突\n</user_query>"}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"我会先检查当前仓库状态并切到 `ray/bet3`,然后执行把 `ray/bet` 合并进来;如果出现冲突,我会逐个文件解决并验证最终合并结果。随后把关键冲突点和处理方式告诉你。"},{"type":"tool_use","name":"Shell","input":{"command":"ls -1 \"/Users/ray/.cursor/projects/Users-ray-Documents-project-www-ray-slot-wallet/terminals\"","description":"List existing terminal session files"}},{"type":"tool_use","name":"Shell","input":{"command":"git status --short --branch","working_directory":"/Users/ray/Documents/project/www/ray/slot-wallet","description":"Check current git branch and status"}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"tool_use","name":"Shell","input":{"command":"git branch --list \"ray/bet\" \"ray/bet3\" && git merge --no-ff ray/bet","working_directory":"/Users/ray/Documents/project/www/ray/slot-wallet","description":"Merge ray/bet into current ray/bet3 branch"}}]}}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\n用户领取注册奖励之后,后端需要在指定的游戏中,随机一个游戏id给到前端,前端就可以直接打开这个游戏了。只考虑后端实现\n</user_query>"}]}}
|
||||
@@ -0,0 +1 @@
|
||||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nIn the slot-wallet repo at /Users/ray/Documents/project/www/ray/slot-wallet, search for game_id, gameId, random game, specified games, game list config related to rewards or registration. Also check README.md and doc/wallet.md for registration reward or game redirect mentions. Return relevant files, constants, config patterns, and whether game selection exists elsewhere.\n</user_query>"}]}}
|
||||
@@ -0,0 +1 @@
|
||||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nIn the slot-wallet repo at /Users/ray/Documents/project/www/ray/slot-wallet, find how registration rewards are claimed/handled. Search for: register reward, registration reward, 注册奖励, RegisterService, register bonus, claim reward. Return: key file paths, method names, flow from API to Logic/Service, what happens after claim succeeds, and any existing response fields related to games.\n</user_query>"}]}}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,14 @@
|
||||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\n请在仓库 /Users/ray/Documents/project/www/ray/slot-wallet 只读探索当前“派奖(win/payout)逻辑”的主实现方式,重点找:Controller入口、Logic编排、Service处理、Model落库。请返回:1) 关键文件路径列表;2) 每个文件里与派奖相关的方法名;3) 真实流程链路(从接口入参到账变落库);4) 任何与PRD不一致或风险点(若有)。不要做修改。\n</user_query>"}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"正在只读探索派奖(win/payout)相关实现,搜索入口与调用链。\n\n[REDACTED]"},{"type":"tool_use","name":"updateCurrentStep","input":{"current_step":"Searching win/payout implementation","final_summary":"Will be set at end.","completed_subtitle":"placeholder"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet","pattern":"payout|win|settle|派奖|WinService|winout","glob":"*.{php,md}","-i":true}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet","pattern":"round.*settle|settlement|Credit.*win|add.*win","glob":"*.php","-i":true}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet","pattern":"WinService|WalletWin|BIZ_TYPE_WIN|wallet.*win|processWin|finalSettlement","glob":"*.php"}},{"type":"tool_use","name":"Glob","input":{"target_directory":"/Users/ray/Documents/project/www/ray/slot-wallet","glob_pattern":"**/*Wallet*Controller*.php"}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/controller/WalletController.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/logic/WalletLogic.php","offset":1,"limit":120}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/logic/WalletLogic.php","offset":580,"limit":250}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/service/wallet/WinService.php"}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet","pattern":"wallet_game_round|GameRound|getWinAllocationByRound|lockUnallocatedFundingByRound","glob":"*.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/dto/request/wallet/WalletUpdateRequestDTO.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/validator/Wallet2Validator.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/model/multi/WalletAccountModel.php","offset":220,"limit":120}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/model/multi/WalletBetFundingModel.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/model/multi/WalletFundLotModel.php","offset":200,"limit":100}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","path":"/Users/ray/Documents/project/www/ray/slot-wallet","pattern":"round_event|RoundEvent|payout_amount"}},{"type":"tool_use","name":"Read","input":{"limit":200,"offset":1,"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/service/wallet/BetService.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/logic/WalletLogic.php","offset":900,"limit":120}},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/service/WalletService.php","pattern":"function win\\("}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet","pattern":"->inc\\(|'win'|BIZ_TYPE_WIN","glob":"*.php"}},{"type":"tool_use","name":"Read","input":{"limit":80,"offset":1,"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/service/WalletService.php"}},{"type":"tool_use","name":"Read","input":{"limit":120,"offset":380,"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/logic/WalletLogic.php"}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","path":"/Users/ray/Documents/project/www/ray/slot-wallet","pattern":"rememberBetSplit|getBetSplitRoundKey|betSplit"}},{"type":"tool_use","name":"Read","input":{"limit":120,"offset":240,"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/logic/WalletLogic.php"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/logic/WalletLogic.php","pattern":"function addLog"}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"limit":100,"offset":165,"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/logic/WalletLogic.php"}},{"type":"tool_use","name":"Read","input":{"limit":80,"offset":850,"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/logic/WalletLogic.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/dto/request/WalletWinRequestDTO.php"}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/logic/WalletLogic.php","pattern":"BetService|function bet\\("}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"limit":90,"offset":500,"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/logic/WalletLogic.php"}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","path":"/Users/ray/Documents/project/www/ray/slot-wallet","pattern":"->minus\\(|function minus"}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/service/WalletLogService.php","limit":80}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/model/multi/WalletLogModel.php","pattern":"findByBizIdAndType|create"}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/model/multi/WalletLogModel.php","limit":120}}]}}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,17 @@
|
||||
{"role":"user","message":{"content":[{"type":"text","text":"<timestamp>Monday, May 18, 2026, 11:15 AM (UTC+8)</timestamp>\n<user_query>\n创建cursor工作空间文件 在 /Users/ray/Documents/project/www/slot 位置, 然后将这个下面的所以文件夹都加入工作空间\n</user_query>"}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"我理解你想在 `/Users/ray/Documents/project/www/slot` 下生成一个 Cursor/VS Code 的 `.code-workspace` 文件,并把该目录下面的项目文件夹都加入 workspace。我先确认目录结构和需要加入的层级,再给你一个可执行计划。"},{"type":"tool_use","name":"Shell","input":{"command":"ls -la \"/Users/ray/Documents/project/www/slot\"","working_directory":"/Users/ray/Documents/project/www/ray/slot-wallet","block_until_ms":30000,"description":"List target slot directory"}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"**Clarifying folder inclusion**\n\nI need to determine if I should include the .vscode/backend/monitor folder. The user mentioned “all folders below,” but I wonder if that includes hidden or system folders like .vscode. \"所有文件夹\" could imply that all folders, including .vscode, are intended. I might need to ask two questions: one about including non-hidden directories versus recursive, and the other regarding .vscode's inclusion. If it's ambiguous, I must clarify further. I’ll use AskQuestion."},{"type":"tool_use","name":"AskQuestion","input":{"title":"确认 Workspace 范围","questions":[{"id":"folder_scope","prompt":"要加入 workspace 的文件夹范围是?","options":[{"id":"immediate_non_hidden","label":"只加入 `/Users/ray/Documents/project/www/slot` 下面的一级非隐藏文件夹(推荐)"},{"id":"immediate_all","label":"加入一级所有文件夹,包括 `.vscode`"},{"id":"recursive_all","label":"递归加入所有子文件夹(通常会太多,不推荐)"}]},{"id":"workspace_filename","prompt":"workspace 文件名使用哪个?","options":[{"id":"slot_code_workspace","label":"`slot.code-workspace`(推荐,放在 `/Users/ray/Documents/project/www/slot/`)"},{"id":"cursor_code_workspace","label":"`cursor.code-workspace`"},{"id":"custom","label":"我想指定其他文件名"}]}]}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"我会按默认做法规划:在目标目录内创建 `slot.code-workspace`,加入一级非隐藏文件夹,避免把 `.vscode` 这类配置目录当成 workspace 项目。"},{"type":"tool_use","name":"CreatePlan","input":{"name":"Create Cursor Workspace","overview":"在 `/Users/ray/Documents/project/www/slot` 创建一个 Cursor/VS Code workspace 文件,并把该目录下的一级项目文件夹加入 workspace。默认排除 `.vscode` 和普通文件。","plan":"# Create Slot Workspace\n\n将在 [`/Users/ray/Documents/project/www/slot/slot.code-workspace`](/Users/ray/Documents/project/www/slot/slot.code-workspace) 创建 workspace 文件,内容使用标准 `.code-workspace` JSON 格式。\n\n计划加入这些一级非隐藏文件夹:\n\n- [`backend`](/Users/ray/Documents/project/www/slot/backend)\n- [`monitor`](/Users/ray/Documents/project/www/slot/monitor)\n- [`slot-foundation`](/Users/ray/Documents/project/www/slot/slot-foundation)\n- [`slot_agent`](/Users/ray/Documents/project/www/slot/slot_agent)\n- [`slot_agent_vue`](/Users/ray/Documents/project/www/slot/slot_agent_vue)\n- [`slot_center`](/Users/ray/Documents/project/www/slot/slot_center)\n- [`slot_console`](/Users/ray/Documents/project/www/slot/slot_console)\n- [`slot_gateway`](/Users/ray/Documents/project/www/slot/slot_gateway)\n- [`slot_hub`](/Users/ray/Documents/project/www/slot/slot_hub)\n- [`slot_lib`](/Users/ray/Documents/project/www/slot/slot_lib)\n- [`slot_notification`](/Users/ray/Documents/project/www/slot/slot_notification)\n- [`slot_pay`](/Users/ray/Documents/project/www/slot/slot_pay)\n- [`slot_pwa`](/Users/ray/Documents/project/www/slot/slot_pwa)\n- [`slot_risk`](/Users/ray/Documents/project/www/slot/slot_risk)\n- [`slot_sdk`](/Users/ray/Documents/project/www/slot/slot_sdk)\n- [`slot_user`](/Users/ray/Documents/project/www/slot/slot_user)\n- [`slot_wallet`](/Users/ray/Documents/project/www/slot/slot_wallet)\n\nWorkspace 文件结构会类似:\n\n```json\n{\n \"folders\": [\n { \"path\": \"backend\" },\n { \"path\": \"monitor\" },\n { \"path\": \"slot-foundation\" }\n ],\n \"settings\": {}\n}\n```\n\n实施步骤:\n\n1. 检查目标文件是否已存在,避免覆盖已有 workspace 配置。\n2. 如果不存在,创建 [`slot.code-workspace`](/Users/ray/Documents/project/www/slot/slot.code-workspace)。\n3. 如果已存在,先读取现有内容,再合并缺失的文件夹,保留已有设置。\n4. 校验生成的 JSON 格式可被 Cursor 打开。","todos":[{"id":"check-existing","content":"检查 `/Users/ray/Documents/project/www/slot/slot.code-workspace` 是否已存在"},{"id":"write-workspace","content":"创建或合并 workspace folders 列表"},{"id":"validate-json","content":"校验 `.code-workspace` JSON 格式"}]}}]}}
|
||||
{"role":"user","message":{"content":[{"type":"text","text":"<timestamp>Monday, May 18, 2026, 11:18 AM (UTC+8)</timestamp>\n<user_query>\nCreate Slot Workspace\n\nImplement the plan as specified, it is attached for your reference. Do NOT edit the plan file itself.\n\nTo-do's from the plan have already been created. Do not create them again. Mark them as in_progress as you work, starting with the first one. Don't stop until you have completed all the to-dos.\n</user_query>"}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"我会按已确认的计划执行:先检查目标 workspace 文件是否存在,然后创建或合并 folders,最后验证 JSON。"},{"type":"tool_use","name":"TodoWrite","input":{"merge":true,"todos":[{"id":"check-existing","content":"检查 `/Users/ray/Documents/project/www/slot/slot.code-workspace` 是否已存在","status":"in_progress"},{"id":"write-workspace","content":"创建或合并 workspace folders 列表","status":"pending"},{"id":"validate-json","content":"校验 `.code-workspace` JSON 格式","status":"pending"}]}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"tool_use","name":"Shell","input":{"command":"if [ -f \"/Users/ray/Documents/project/www/slot/slot.code-workspace\" ]; then echo exists; else echo missing; fi","working_directory":"/Users/ray/Documents/project/www/ray/slot-wallet","block_until_ms":30000,"description":"Check workspace file exists"}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"目标文件不存在,我会直接创建 `slot.code-workspace`,内容包含目标目录下的一级非隐藏项目文件夹。\n\n**Writing file logic**\n\nI need to write a file and apply a patch to add it. I already know the contents, but I should verify that the parent exists first. I’ve done the directory listing, so that part should be taken care of. Now, I’ll proceed to use applypatch to ensure everything goes smoothly. Just want to avoid any mishaps while getting this done! Let’s keep things running smoothly."},{"type":"tool_use","name":"TodoWrite","input":{"merge":true,"todos":[{"id":"check-existing","content":"检查 `/Users/ray/Documents/project/www/slot/slot.code-workspace` 是否已存在","status":"completed"},{"id":"write-workspace","content":"创建或合并 workspace folders 列表","status":"in_progress"},{"id":"validate-json","content":"校验 `.code-workspace` JSON 格式","status":"pending"}]}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"tool_use","name":"ApplyPatch","input":"*** Begin Patch\n*** Add File: /Users/ray/Documents/project/www/slot/slot.code-workspace\n+{\n+ \"folders\": [\n+ {\n+ \"path\": \"backend\"\n+ },\n+ {\n+ \"path\": \"monitor\"\n+ },\n+ {\n+ \"path\": \"slot-foundation\"\n+ },\n+ {\n+ \"path\": \"slot_agent\"\n+ },\n+ {\n+ \"path\": \"slot_agent_vue\"\n+ },\n+ {\n+ \"path\": \"slot_center\"\n+ },\n+ {\n+ \"path\": \"slot_console\"\n+ },\n+ {\n+ \"path\": \"slot_gateway\"\n+ },\n+ {\n+ \"path\": \"slot_hub\"\n+ },\n+ {\n+ \"path\": \"slot_lib\"\n+ },\n+ {\n+ \"path\": \"slot_notification\"\n+ },\n+ {\n+ \"path\": \"slot_pay\"\n+ },\n+ {\n+ \"path\": \"slot_pwa\"\n+ },\n+ {\n+ \"path\": \"slot_risk\"\n+ },\n+ {\n+ \"path\": \"slot_sdk\"\n+ },\n+ {\n+ \"path\": \"slot_user\"\n+ },\n+ {\n+ \"path\": \"slot_wallet\"\n+ }\n+ ],\n+ \"settings\": {}\n+}\n*** End Patch\n"}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"tool_use","name":"ApplyPatch","input":"*** Begin Patch\n*** Add File: /Users/ray/Documents/project/www/slot/slot.code-workspace\n+{\n+ \"folders\": [\n+ {\n+ \"path\": \"backend\"\n+ },\n+ {\n+ \"path\": \"monitor\"\n+ },\n+ {\n+ \"path\": \"slot-foundation\"\n+ },\n+ {\n+ \"path\": \"slot_agent\"\n+ },\n+ {\n+ \"path\": \"slot_agent_vue\"\n+ },\n+ {\n+ \"path\": \"slot_center\"\n+ },\n+ {\n+ \"path\": \"slot_console\"\n+ },\n+ {\n+ \"path\": \"slot_gateway\"\n+ },\n+ {\n+ \"path\": \"slot_hub\"\n+ },\n+ {\n+ \"path\": \"slot_lib\"\n+ },\n+ {\n+ \"path\": \"slot_notification\"\n+ },\n+ {\n+ \"path\": \"slot_pay\"\n+ },\n+ {\n+ \"path\": \"slot_pwa\"\n+ },\n+ {\n+ \"path\": \"slot_risk\"\n+ },\n+ {\n+ \"path\": \"slot_sdk\"\n+ },\n+ {\n+ \"path\": \"slot_user\"\n+ },\n+ {\n+ \"path\": \"slot_wallet\"\n+ }\n+ ],\n+ \"settings\": {}\n+}\n*** End Patch\n"}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"Workspace 文件已创建。接下来我会验证它是合法 JSON,确保 Cursor 可以正常打开。\n\n**Validating JSON data**\n\nI'm looking to mark something as completed, but first, I need to validate that the current status is still in progress. To do this, I'll validate the JSON data. I could execute a command in the shell to read the file. That seems okay, but I need to confirm that everything is working well with Python's `json.load` to do the validation. It looks like I need to use the right tool for this."},{"type":"tool_use","name":"TodoWrite","input":{"merge":true,"todos":[{"id":"check-existing","content":"检查 `/Users/ray/Documents/project/www/slot/slot.code-workspace` 是否已存在","status":"completed"},{"id":"write-workspace","content":"创建或合并 workspace folders 列表","status":"completed"},{"id":"validate-json","content":"校验 `.code-workspace` JSON 格式","status":"in_progress"}]}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"tool_use","name":"Shell","input":{"command":"python3 -m json.tool \"/Users/ray/Documents/project/www/slot/slot.code-workspace\" >/dev/null && echo valid","working_directory":"/Users/ray/Documents/project/www/ray/slot-wallet","block_until_ms":30000,"description":"Validate workspace JSON format"}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"校验发现文件尾部有多余内容,我会读取生成文件并修正 JSON。\n\n**Investigating file**\n\nI need to take a closer look at the file, it seems important to understand its contents. I guess I should read it thoroughly to gather all necessary information. I wonder if there are specific details I should be focusing on or if I should just get a general sense of it first. Hm, hopefully, there’s nothing complicated in there! Let’s get started and see what I can find."},{"type":"tool_use","name":"ReadFile","input":{"path":"/Users/ray/Documents/project/www/slot/slot.code-workspace"}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"**Fixing file duplication**\n\nIt looks like there was a problem with a duplicated file due to an error. I need to update the file to remove the second instance. Should I use ApplyPatch for this? Maybe replacing the whole duplicate with a single, simpler entry would be easier, so I might consider writing a Python script to handle it. I should read the file and focus on patching lines 57-112 to remove the unnecessary parts. Let's get that sorted out!"},{"type":"tool_use","name":"ApplyPatch","input":"*** Begin Patch\n*** Update File: /Users/ray/Documents/project/www/slot/slot.code-workspace\n@@\n ],\n \"settings\": {}\n }\n-{\n- \"folders\": [\n- {\n- \"path\": \"backend\"\n- },\n- {\n- \"path\": \"monitor\"\n- },\n- {\n- \"path\": \"slot-foundation\"\n- },\n- {\n- \"path\": \"slot_agent\"\n- },\n- {\n- \"path\": \"slot_agent_vue\"\n- },\n- {\n- \"path\": \"slot_center\"\n- },\n- {\n- \"path\": \"slot_console\"\n- },\n- {\n- \"path\": \"slot_gateway\"\n- },\n- {\n- \"path\": \"slot_hub\"\n- },\n- {\n- \"path\": \"slot_lib\"\n- },\n- {\n- \"path\": \"slot_notification\"\n- },\n- {\n- \"path\": \"slot_pay\"\n- },\n- {\n- \"path\": \"slot_pwa\"\n- },\n- {\n- \"path\": \"slot_risk\"\n- },\n- {\n- \"path\": \"slot_sdk\"\n- },\n- {\n- \"path\": \"slot_user\"\n- },\n- {\n- \"path\": \"slot_wallet\"\n- }\n- ],\n- \"settings\": {}\n-}\n*** End Patch\n"}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"tool_use","name":"Shell","input":{"command":"python3 -m json.tool \"/Users/ray/Documents/project/www/slot/slot.code-workspace\" >/dev/null && echo valid","working_directory":"/Users/ray/Documents/project/www/ray/slot-wallet","block_until_ms":30000,"description":"Validate corrected workspace JSON"}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"**Considering next steps**\n\nI’m thinking that I might need to read the final file. That seems like it could be an important step moving forward! I’ll also need to mark it as completed afterward. It’s really about staying on top of tasks, right? I wanna make sure I’m organized so nothing slips through the cracks. Let’s figure out the best way to handle this next part."},{"type":"tool_use","name":"TodoWrite","input":{"merge":true,"todos":[{"id":"check-existing","content":"检查 `/Users/ray/Documents/project/www/slot/slot.code-workspace` 是否已存在","status":"completed"},{"id":"write-workspace","content":"创建或合并 workspace folders 列表","status":"completed"},{"id":"validate-json","content":"校验 `.code-workspace` JSON 格式","status":"completed"}]}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"已创建 Cursor workspace 文件:\n\n`/Users/ray/Documents/project/www/slot/slot.code-workspace`\n\n已加入 `/Users/ray/Documents/project/www/slot` 下的一级非隐藏文件夹,并已用 `python3 -m json.tool` 校验 JSON 格式通过。"}]}}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,10 @@
|
||||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\n出一份bet/win接口文档,我给到sdk服,方便封装统一的接口调用\n</user_query>"}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"整理 bet/win 接口文档,先查看控制器、DTO、校验与现有文档约定。\n\n[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"pattern":"function (bet|win)","path":"/Users/ray/Documents/project/www/ray/slot-wallet","glob":"**/*.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/controller/WalletController.php"}},{"type":"tool_use","name":"Grep","input":{"pattern":"bet|win","path":"/Users/ray/Documents/project/www/ray/slot-wallet/doc","glob":"**/*"}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/validator/Wallet2Validator.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/dto/request/wallet/WalletBetRequestDTO.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/dto/request/wallet/WalletWinRequestDTO.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/doc/register-bet-win-test.md"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/logic/WalletLogic.php","offset":480,"limit":200}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/logic/WalletLogic.php","offset":675,"limit":80}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/entity/WalletEntity.php"}},{"type":"tool_use","name":"Grep","input":{"pattern":"class OutputService|function ok|function error","path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/service"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/doc/wallet.md","offset":870,"limit":50}},{"type":"tool_use","name":"Grep","input":{"pattern":"PARAMS_ERROR|SYSTEM_ERROR|余额|insufficient","path":"/Users/ray/Documents/project/www/ray/slot-wallet","glob":"**/*.{php,md}","head_limit":40}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/service/OutputService.php"}},{"type":"tool_use","name":"Grep","input":{"pattern":"PARAMS_ERROR|SYSTEM_ERROR|WALLET_BALANCE","path":"/Users/ray/Documents/project/www/ray/slot-wallet/support"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/logic/WalletLogic.php","limit":100}},{"type":"tool_use","name":"Grep","input":{"pattern":"WalletException|BALANCE_NOT_ENOUGH","path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/service/wallet"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/tests/Feature/WalletRegisterBetWinTest.php","limit":120}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/support/ErrorCode.php"}},{"type":"tool_use","name":"Grep","input":{"pattern":"WalletException","path":"/Users/ray/Documents/project/www/ray/slot-wallet","glob":"**/*.php","head_limit":30}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/tests/Feature/WalletRegisterBetWinTest.php","offset":118,"limit":100}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/dto/request/wallet/WalletUpdateRequestDTO.php"}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"pattern":"WalletException","path":"/Users/ray/Documents/project/www/ray/slot-wallet/app","glob":"**/*"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/service/WalletException.php"}},{"type":"tool_use","name":"Grep","input":{"pattern":"SUCCESS|40003","path":"/Users/ray/Documents/project/www/ray/slot-wallet/README.md","head_limit":20}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"pattern":"WalletException","path":"/Users/ray/Documents/project/www/ray/slot-wallet","glob":"**/*"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/logic/WalletLogic.php","offset":1075,"limit":40}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/service/wallet/BetService.php","limit":80}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/service/wallet/WinService.php","limit":80}},{"type":"tool_use","name":"Glob","input":{"glob_pattern":"doc/*.md","target_directory":"/Users/ray/Documents/project/www/ray/slot-wallet"}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/doc/player-task-progress-api.md","limit":120}}]}}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
|
||||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\n请在仓库 /Users/ray/Documents/project/www/ray/slot-wallet 里做中等深入只读探索,目标:找出现有与 wallet 任务、bonus/deposit、打码进度、玩家可见详情相关的 Controller/Logic/Service/Model/DTO/Validator。重点查 app/api/controller、app/api/logic、app/service、app/model、app/api/dto。请返回:1) 已有可复用接口与方法(含路径);2) 关键入参与返回结构;3) 明显缺口与最小改动点建议。\n</user_query>"}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"正在系统性搜索与钱包任务、bonus/deposit、打码进度及玩家可见详情相关的代码。\n\n[REDACTED]"},{"type":"tool_use","name":"updateCurrentStep","input":{"current_step":"Searching wallet bonus/task/wagering code"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/controller","pattern":"task|bonus|deposit|打码|wagering|progress|milestone|lot","glob":"*.php","-i":true}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/logic","pattern":"task|Bonus|Deposit|打码|wagering|progress|WalletFund|lot","glob":"*.php","-i":true}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/app/service","pattern":"task|bonus|deposit|打码|wagering|progress|Register|BetService","glob":"*.php","-i":true}},{"type":"tool_use","name":"Glob","input":{"target_directory":"/Users/ray/Documents/project/www/ray/slot-wallet/app/api/controller","glob_pattern":"**/*Wallet*"}}]}}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,4 @@
|
||||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\n请在仓库 /Users/ray/Documents/project/www/ray/slot-wallet 里做中等深入只读探索,目标:找出 bonus/deposit 任务、打码进度、任务详情 在 PRD/README/doc 中的定义与字段口径。重点查看 README.md、doc/wallet.md 及相关文档。请返回:1) 关键规则与字段定义;2) 建议返回给玩家的最小字段集合;3) 涉及的文件路径列表。\n</user_query>"}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"正在仓库中检索 PRD/README 中与 bonus/deposit 任务、打码与任务详情相关的定义。\n\n[REDACTED]"},{"type":"tool_use","name":"updateCurrentStep","input":{"current_step":"Exploring PRD docs for tasks"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/README.md","limit":200}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/doc/wallet.md","pattern":"任务|打码|bonus|deposit|wager|turnover|progress|lot","-i":true}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/README.md","pattern":"任务|打码|bonus|deposit|wager|turnover","-i":true}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/doc/wallet.md","offset":300,"limit":250}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/doc/wallet.md","pattern":"wager|打码|有效投注|effective|progress|required|current_|task|Unlock|Conversion","-i":true}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/.cursor/rules/slot-wallet-prd-and-money.mdc"}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/doc/wallet.md","offset":550,"limit":250}},{"type":"tool_use","name":"Glob","input":{"target_directory":"/Users/ray/Documents/project/www/ray/slot-wallet/doc","glob_pattern":"**/*"}}]}}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,3 @@
|
||||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\n请在仓库 /Users/ray/Documents/project/www/ray/slot-wallet 里做中等深入只读探索,目标:找出 bonus/deposit 任务、打码进度、任务详情 在 PRD/README/doc 中的定义与字段口径。重点查看 README.md、doc/wallet.md 及相关文档。请返回:1) 关键规则与字段定义;2) 建议返回给玩家的最小字段集合;3) 涉及的文件路径列表。\n</user_query>"}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"正在搜索 PRD/README/doc 中关于 bonus/deposit 任务、打码进度与任务详情的定义。\n\n[REDACTED]"},{"type":"tool_use","name":"updateCurrentStep","input":{"current_step":"Exploring PRD docs for tasks","final_summary":"\n","completed_subtitle":"\n"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/README.md","limit":200}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/doc/wallet.md","limit":400}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet","pattern":"打码|bonus.*task|deposit.*task|任务|wagering|turnover|progress","glob":"*.md","-i":true}}]}}
|
||||
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/doc/wallet.md","offset":400,"limit":550}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/doc/win.md","limit":220}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/ray/slot-wallet/.cursor/rules/slot-wallet-prd-and-money.mdc"}}]}}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,51 @@
|
||||
The cursor-ide-browser is an MCP server that allows you to navigate the web and interact with the page. Use this for frontend/webapp development and testing code changes.
|
||||
|
||||
CORE WORKFLOW:
|
||||
1. Start by understanding the user's goal and what success looks like on the page.
|
||||
2. Use browser_tabs with action "list" to inspect open tabs and URLs before acting.
|
||||
3. Use browser_snapshot before any interaction to inspect the current page structure and obtain refs.
|
||||
4. Use browser_take_screenshot for standalone visual verification or screenshot-based coordinate clicks. For browser_mouse_click_xy, capture a fresh viewport screenshot for the same tab and then issue the click immediately using coordinates from that screenshot. Do not reuse older screenshot coordinates. If any other browser tool runs first, capture a new viewport screenshot before calling browser_mouse_click_xy.
|
||||
5. After any action that could change the page structure or URL (click, type, fill, fill_form, select, hover, press key, drag, browser_navigate, browser_navigate_back, wait, dialog response, or lazy-loaded scroll), take a fresh browser_snapshot before the next structural action unless you are certain the page did not change.
|
||||
|
||||
AGENTIC PAGE NAVIGATION:
|
||||
1. When you know the destination, use browser_navigate directly to that URL.
|
||||
2. Use browser_navigate_back for browser history. Keep track of the current URL from tool output or snapshot metadata so you can navigate directly when needed.
|
||||
3. Work top-down: identify the relevant page region, dialog, form, or menu in the snapshot first, then target a specific ref inside it.
|
||||
4. Prefer one deliberate action followed by verification over exploratory thrashing.
|
||||
5. Use browser_search to locate text before blindly scrolling through large pages.
|
||||
6. Use browser_hover to reveal tooltips, dropdown menus, or hidden content before interacting with revealed elements.
|
||||
7. Use browser_scroll with scrollIntoView: true before clicking elements that may be offscreen or obscured.
|
||||
8. Use browser_fill to replace existing content (works on both input fields and contenteditable elements) and browser_type to append text or trigger typing-related handlers.
|
||||
9. If multiple elements share the same role and name, choose the exact ref from the snapshot instead of guessing. Use [nth=N] only as a hint to tell duplicate elements apart.
|
||||
|
||||
AVOID RABBIT HOLES:
|
||||
1. Do not repeat the same failing action more than once without new evidence such as a fresh snapshot, a different ref, a changed page state, or a clear new hypothesis.
|
||||
2. IMPORTANT: If four attempts fail or progress stalls, stop acting and report what you observed, what blocked progress, and the most likely next step.
|
||||
3. Prefer gathering evidence over brute force. If the page is confusing, use browser_snapshot, browser_console_messages, browser_network_requests, or a screenshot to understand it before trying more actions.
|
||||
4. If you encounter a blocker such as login, passkey/manual user interaction, permissions, captchas, destructive confirmations, missing data, or an unexpected state, stop and report it instead of improvising repeated actions.
|
||||
5. Do not get stuck in wait-action-wait loops. Every retry should be justified by something newly observed.
|
||||
|
||||
CRITICAL - Lock/unlock workflow:
|
||||
1. browser_lock requires an existing browser tab - you CANNOT call browser_lock with action: "lock" before browser_navigate
|
||||
2. Correct order: browser_navigate -> browser_lock({ action: "lock" }) -> (interactions) -> browser_lock({ action: "unlock" })
|
||||
3. If a browser tab already exists (check with browser_tabs list), call browser_lock with action: "lock" FIRST before any interactions
|
||||
4. Only call browser_lock with action: "unlock" when completely done with ALL browser operations for this turn
|
||||
|
||||
IMPORTANT - Waiting strategy:
|
||||
When waiting for page changes (navigation, content loading, animations, etc.), prefer short incremental waits (1-3 seconds) with browser_snapshot checks in between rather than a single long wait. For example, instead of waiting 10 seconds, do: wait 2s -> snapshot -> check if ready -> if not, wait 2s more -> snapshot again. This allows you to proceed as soon as the page is ready rather than always waiting the maximum time.
|
||||
|
||||
PERFORMANCE PROFILING:
|
||||
- browser_profile_start/stop: CPU profiling with call stacks and timing data. Use to identify slow JavaScript functions.
|
||||
- Profile data is written to ~/.cursor/browser-logs/. Files: cpu-profile-{timestamp}.json (raw profile in Chrome DevTools format) and cpu-profile-{timestamp}-summary.md (human-readable summary).
|
||||
- IMPORTANT: When investigating performance issues, read the raw cpu-profile-*.json file to verify summary data. Key fields: profile.samples.length (total samples), profile.nodes[].hitCount (per-node hits), profile.nodes[].callFrame.functionName (function names). Cross-reference with the summary to confirm findings before making optimization recommendations.
|
||||
|
||||
VISION:
|
||||
- Snapshot and interaction tools can optionally attach a page screenshot by setting take_screenshot_afterwards: true. The screenshot provides visual context (layout, colors, state); the aria snapshot provides element refs required for targeting actions. Use both together: the screenshot shows what the page looks like, the snapshot tells you how to interact with it. Prefer refs from the snapshot for interactions; the one screenshot-based exception is browser_mouse_click_xy, which must use coordinates from a fresh viewport screenshot captured immediately before the click for that tab. Any other browser tool call invalidates that screenshot cache.
|
||||
|
||||
NOTES:
|
||||
- browser_snapshot returns snapshot YAML and is the main source of truth for page structure.
|
||||
- Refs are opaque handles tied to the latest browser_snapshot for that tab. If a ref stops working, take a fresh snapshot instead of guessing.
|
||||
- Native dialogs (alert/confirm/prompt) never block automation. By default, confirm() returns true and prompt() returns the default value. To test different responses, call browser_handle_dialog BEFORE the triggering action: use accept: false for "Cancel", or promptText: "value" for custom prompt input.
|
||||
- Iframe content is not accessible - only elements outside iframes can be interacted with.
|
||||
- For nested scroll containers, use browser_scroll with scrollIntoView: true before clicking elements that may be obscured.
|
||||
- When you stop to report a blocker, include the current page, the target you were trying to reach, the blocker you observed, and the best next action. If the blocker requires manual user interaction, ask the user to take over at that point rather than assuming it in advance.
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"serverIdentifier": "cursor-ide-browser",
|
||||
"serverName": "cursor-ide-browser"
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"name": "browser_click",
|
||||
"description": "Perform click on a web page. Supports single/double click, different mouse buttons, modifier keys, position offsets, and hold duration.",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"element": {
|
||||
"type": "string",
|
||||
"description": "Human-readable element description used to obtain permission to interact with the element"
|
||||
},
|
||||
"ref": {
|
||||
"type": "string",
|
||||
"description": "Exact target element reference from the page snapshot"
|
||||
},
|
||||
"doubleClick": {
|
||||
"type": "boolean",
|
||||
"description": "Whether to perform a double click instead of a single click"
|
||||
},
|
||||
"button": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"left",
|
||||
"right",
|
||||
"middle"
|
||||
],
|
||||
"description": "Mouse button to click. Defaults to \"left\"."
|
||||
},
|
||||
"modifiers": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"Control",
|
||||
"Shift",
|
||||
"Alt",
|
||||
"Meta",
|
||||
"ControlOrMeta"
|
||||
]
|
||||
},
|
||||
"description": "Modifier keys to hold during click. \"ControlOrMeta\" uses Ctrl on Windows/Linux and Cmd on Mac."
|
||||
},
|
||||
"offsetX": {
|
||||
"type": "number",
|
||||
"description": "Horizontal offset from element's left edge in pixels. If omitted, clicks at horizontal center."
|
||||
},
|
||||
"offsetY": {
|
||||
"type": "number",
|
||||
"description": "Vertical offset from element's top edge in pixels. If omitted, clicks at vertical center."
|
||||
},
|
||||
"holdDurationMs": {
|
||||
"type": "number",
|
||||
"description": "Duration to hold the mouse button down before releasing, in milliseconds. Useful for long-press interactions. Defaults to 0 (immediate release)."
|
||||
},
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"element",
|
||||
"ref"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "browser_console_messages",
|
||||
"description": "Returns all console messages",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"name": "browser_drag",
|
||||
"description": "Perform a drag and drop operation. Drags from a source element to a target element or coordinates.",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"sourceRef": {
|
||||
"type": "string",
|
||||
"description": "Reference of the element to drag from"
|
||||
},
|
||||
"targetRef": {
|
||||
"type": "string",
|
||||
"description": "Reference of the element to drop onto"
|
||||
},
|
||||
"targetX": {
|
||||
"type": "number",
|
||||
"description": "X coordinate to drop at (relative to viewport). Use with targetY instead of targetRef for coordinate-based drops."
|
||||
},
|
||||
"targetY": {
|
||||
"type": "number",
|
||||
"description": "Y coordinate to drop at (relative to viewport). Use with targetX instead of targetRef for coordinate-based drops."
|
||||
},
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"sourceRef"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"name": "browser_fill",
|
||||
"description": "Clear and fill a value into an input element. Unlike browser_type which appends text, this clears the existing value first and sets the new value atomically. Use this when you want to replace the entire content of an input field.",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"element": {
|
||||
"type": "string",
|
||||
"description": "Human-readable element description used to obtain permission to interact with the element"
|
||||
},
|
||||
"ref": {
|
||||
"type": "string",
|
||||
"description": "Exact target element reference from the page snapshot"
|
||||
},
|
||||
"value": {
|
||||
"type": "string",
|
||||
"description": "Value to fill into the element (replaces any existing content)"
|
||||
},
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"element",
|
||||
"ref",
|
||||
"value"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"name": "browser_fill_form",
|
||||
"description": "Fill multiple form fields at once. Each field uses ref + value. By default, each field is cleared before setting the new value.",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"fields": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"element": {
|
||||
"type": "string",
|
||||
"description": "Human-readable element description used to obtain permission to interact with the element"
|
||||
},
|
||||
"ref": {
|
||||
"type": "string",
|
||||
"description": "Exact target element reference from the page snapshot"
|
||||
},
|
||||
"value": {
|
||||
"type": "string",
|
||||
"description": "Value to fill into the field"
|
||||
},
|
||||
"clear": {
|
||||
"type": "boolean",
|
||||
"description": "Whether to clear existing content before filling. Defaults to true."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"element",
|
||||
"ref",
|
||||
"value"
|
||||
]
|
||||
}
|
||||
},
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
},
|
||||
"take_screenshot_afterwards": {
|
||||
"type": "boolean",
|
||||
"description": "When true, takes a screenshot after the fill completes. Defaults to false."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"fields"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"name": "browser_get_bounding_box",
|
||||
"description": "Get bounding box details for an element.",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"element": {
|
||||
"type": "string",
|
||||
"description": "Human-readable element description used to obtain permission to inspect the element"
|
||||
},
|
||||
"ref": {
|
||||
"type": "string",
|
||||
"description": "Exact target element reference from the page snapshot"
|
||||
},
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"element",
|
||||
"ref"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "browser_handle_dialog",
|
||||
"description": "Configure how native browser dialogs (alert, confirm, prompt) are handled. Dialogs are non-blocking in this environment - they return immediately without showing a visible dialog. Use this tool BEFORE triggering an action that shows a dialog to configure what value it should return. Also returns recent dialog history.",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"accept": {
|
||||
"type": "boolean",
|
||||
"description": "For confirm() dialogs: true to simulate clicking OK (returns true), false to simulate clicking Cancel (returns false). Default behavior is true."
|
||||
},
|
||||
"promptText": {
|
||||
"type": "string",
|
||||
"description": "For prompt() dialogs: the text value to return. If not specified, prompt() returns the default value provided by the page."
|
||||
},
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"accept"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"name": "browser_highlight",
|
||||
"description": "Temporarily highlight an element for visual debugging.",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"element": {
|
||||
"type": "string",
|
||||
"description": "Human-readable element description used to obtain permission to inspect the element"
|
||||
},
|
||||
"ref": {
|
||||
"type": "string",
|
||||
"description": "Exact target element reference from the page snapshot"
|
||||
},
|
||||
"durationMs": {
|
||||
"type": "number",
|
||||
"description": "Highlight duration in milliseconds. Defaults to 2000."
|
||||
},
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"element",
|
||||
"ref"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"name": "browser_hover",
|
||||
"description": "Hover over element on page",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"element": {
|
||||
"type": "string",
|
||||
"description": "Human-readable element description used to obtain permission to interact with the element"
|
||||
},
|
||||
"ref": {
|
||||
"type": "string",
|
||||
"description": "Exact target element reference from the page snapshot"
|
||||
},
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"element",
|
||||
"ref"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "browser_lock",
|
||||
"description": "Lock or unlock the browser to control whether the user can interact while you work. Set action to \"lock\" or \"unlock\". When locked, the user can still click \"Take Control\" to unlock if needed.",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"action": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"lock",
|
||||
"unlock"
|
||||
],
|
||||
"description": "Whether to lock or unlock the browser for user interaction."
|
||||
},
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"action"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"name": "browser_mouse_click_xy",
|
||||
"description": "Click left, middle, or right mouse button using coordinates from a fresh viewport screenshot captured immediately before this call for the same tab. Do not reuse older screenshot coordinates. If any other browser tool runs first, this call will fail until you capture a new viewport screenshot.",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"x": {
|
||||
"type": "number",
|
||||
"description": "X coordinate from the fresh viewport screenshot captured immediately before this call for this tab, measured in screenshot pixels."
|
||||
},
|
||||
"y": {
|
||||
"type": "number",
|
||||
"description": "Y coordinate from the fresh viewport screenshot captured immediately before this call for this tab, measured in screenshot pixels."
|
||||
},
|
||||
"button": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"left",
|
||||
"right",
|
||||
"middle"
|
||||
],
|
||||
"description": "Mouse button to click. Defaults to \"left\"."
|
||||
},
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"x",
|
||||
"y"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"name": "browser_navigate",
|
||||
"description": "Navigate to a URL. By default reuses an existing tab; set newTab: true to open in a new tab.",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"url": {
|
||||
"type": "string",
|
||||
"description": "The URL to navigate to"
|
||||
},
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
},
|
||||
"position": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"active",
|
||||
"side"
|
||||
],
|
||||
"description": "IMPORTANT: Set to \"side\" if user mentions \"side\", \"beside\", \"side panel\", or \"side by side\". Opens browser in side editor group. Defaults to \"active\" (current editor group)."
|
||||
},
|
||||
"take_screenshot_afterwards": {
|
||||
"type": "boolean",
|
||||
"description": "When true, takes a screenshot after navigation completes. Defaults to false."
|
||||
},
|
||||
"newTab": {
|
||||
"type": "boolean",
|
||||
"description": "When true, creates a new tab before navigating instead of reusing an existing tab. Defaults to false."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"url"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "browser_navigate_back",
|
||||
"description": "Go back to the previous page in browser history. Returns an error if there is no previous page to navigate to.",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "browser_network_requests",
|
||||
"description": "Returns all network requests since loading the page",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"name": "browser_press_key",
|
||||
"description": "Press a key on the keyboard. Supports key combinations with modifiers using \"+\" syntax.",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"key": {
|
||||
"type": "string",
|
||||
"description": "Key to press. Single keys: \"a\", \"Enter\", \"Escape\", \"Tab\", \"Backspace\", \"Delete\", \"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\", \"PageUp\", \"PageDown\", \"Home\", \"End\", \"F1\"-\"F12\", \"Space\". Key combinations with modifiers using \"+\": \"Control+s\", \"Ctrl+Shift+p\", \"Alt+Tab\", \"Meta+a\" (Cmd on Mac). Modifier aliases: Control/Ctrl, Shift, Alt/Option, Meta/Command/Cmd/Win."
|
||||
},
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"key"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "browser_profile_start",
|
||||
"description": "Start CPU profiling to capture call stack timing data. Use browser_profile_stop to end profiling and get results.",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "browser_profile_stop",
|
||||
"description": "Stop CPU profiling and return the profile data including call stacks, timing, and samples.",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"name": "browser_resize",
|
||||
"description": "Resize the browser window",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"width": {
|
||||
"type": "number",
|
||||
"description": "Width of the browser window"
|
||||
},
|
||||
"height": {
|
||||
"type": "number",
|
||||
"description": "Height of the browser window"
|
||||
},
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"width",
|
||||
"height"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"name": "browser_scroll",
|
||||
"description": "Scroll the page or a specific element. Use this to bring elements into view, scroll to content, or navigate long pages. Can scroll in any direction by specifying delta values or using directional shortcuts.",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"ref": {
|
||||
"type": "string",
|
||||
"description": "Element reference to scroll into view, or to scroll within (for scrollable containers)"
|
||||
},
|
||||
"direction": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"up",
|
||||
"down",
|
||||
"left",
|
||||
"right"
|
||||
],
|
||||
"description": "Direction to scroll. Shorthand for setting deltaX/deltaY."
|
||||
},
|
||||
"amount": {
|
||||
"type": "number",
|
||||
"description": "Amount to scroll in pixels when using direction. Defaults to 300."
|
||||
},
|
||||
"deltaX": {
|
||||
"type": "number",
|
||||
"description": "Horizontal scroll amount in pixels. Positive scrolls right, negative scrolls left."
|
||||
},
|
||||
"deltaY": {
|
||||
"type": "number",
|
||||
"description": "Vertical scroll amount in pixels. Positive scrolls down, negative scrolls up."
|
||||
},
|
||||
"scrollIntoView": {
|
||||
"type": "boolean",
|
||||
"description": "If true and ref is provided, scrolls the element into view instead of scrolling within it. Defaults to true when ref is provided without delta values."
|
||||
},
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"name": "browser_search",
|
||||
"description": "Search for text on the current page, similar to Cmd+F / Ctrl+F. Highlights all matches, scrolls to the first match, and returns a screenshot showing the match in context along with the count and positions of matches found.",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"query": {
|
||||
"type": "string",
|
||||
"description": "The text to search for on the page"
|
||||
},
|
||||
"caseSensitive": {
|
||||
"type": "boolean",
|
||||
"description": "Whether the search should be case-sensitive. Defaults to false."
|
||||
},
|
||||
"navigateToMatch": {
|
||||
"type": "number",
|
||||
"description": "Navigate to a specific match by index (0-based). If not provided, navigates to the first match."
|
||||
},
|
||||
"clearHighlights": {
|
||||
"type": "boolean",
|
||||
"description": "If true, clears all search highlights without performing a new search. Use this to remove previous search highlights."
|
||||
},
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"name": "browser_select_option",
|
||||
"description": "Select an option in a dropdown. Matching priority: exact value match, then exact label match, then partial label match. The snapshot now shows available options for select elements.",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"element": {
|
||||
"type": "string",
|
||||
"description": "Human-readable element description used to obtain permission to interact with the element"
|
||||
},
|
||||
"ref": {
|
||||
"type": "string",
|
||||
"description": "Exact target element reference from the page snapshot"
|
||||
},
|
||||
"values": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": "Array of values to select. Matches against option value first, then label text, then partial label. Use exact values from the snapshot options list when available."
|
||||
},
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"element",
|
||||
"ref",
|
||||
"values"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"name": "browser_snapshot",
|
||||
"description": "Capture accessibility snapshot of the current page, this is better than screenshot",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
},
|
||||
"interactive": {
|
||||
"type": "boolean",
|
||||
"description": "When true, only include interactive elements in the snapshot. Defaults to false."
|
||||
},
|
||||
"maxDepth": {
|
||||
"type": "number",
|
||||
"description": "Maximum depth for snapshot output. Defaults to 20."
|
||||
},
|
||||
"compact": {
|
||||
"type": "boolean",
|
||||
"description": "When true, outputs a more compact snapshot format. Defaults to false."
|
||||
},
|
||||
"selector": {
|
||||
"type": "string",
|
||||
"description": "Optional CSS selector to scope the snapshot to a subtree."
|
||||
},
|
||||
"includeDiff": {
|
||||
"type": "boolean",
|
||||
"description": "When true, include a diff vs the previous snapshot for this tab. Defaults to false."
|
||||
},
|
||||
"take_screenshot_afterwards": {
|
||||
"type": "boolean",
|
||||
"description": "When true, takes a screenshot after snapshot completes. Defaults to false."
|
||||
}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"name": "browser_tabs",
|
||||
"description": "List, create, close, or select a browser tab",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"action": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"list",
|
||||
"new",
|
||||
"close",
|
||||
"select"
|
||||
],
|
||||
"description": "Operation to perform"
|
||||
},
|
||||
"index": {
|
||||
"type": "number",
|
||||
"description": "Tab index. Required for \"select\". Optional for \"close\" (defaults to current tab)."
|
||||
},
|
||||
"position": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"active",
|
||||
"side"
|
||||
],
|
||||
"description": "IMPORTANT: Set to \"side\" if user mentions \"side\", \"beside\", \"side panel\", or \"side by side\". Opens browser in side editor group. Only for action \"new\". Defaults to \"active\"."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"action"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"name": "browser_take_screenshot",
|
||||
"description": "Take a screenshot of the current page. You can't perform actions based on the screenshot, use browser_snapshot for actions.",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"description": "Image format for the screenshot. Default is png."
|
||||
},
|
||||
"filename": {
|
||||
"type": "string",
|
||||
"description": "File name to save the screenshot to. Defaults to page-{timestamp}.{png|jpeg} if not specified."
|
||||
},
|
||||
"element": {
|
||||
"type": "string",
|
||||
"description": "Description of the element, if taking a screenshot of an element"
|
||||
},
|
||||
"ref": {
|
||||
"type": "string",
|
||||
"description": "CSS selector for the element, if taking a screenshot of an element"
|
||||
},
|
||||
"fullPage": {
|
||||
"type": "boolean",
|
||||
"description": "When true, takes a screenshot of the full scrollable page, instead of the currently visible viewport. Cannot be used with element screenshots."
|
||||
},
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"name": "browser_type",
|
||||
"description": "Type text into editable element",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"element": {
|
||||
"type": "string",
|
||||
"description": "Human-readable element description used to obtain permission to interact with the element"
|
||||
},
|
||||
"ref": {
|
||||
"type": "string",
|
||||
"description": "Exact target element reference from the page snapshot"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Text to type into the element"
|
||||
},
|
||||
"clear": {
|
||||
"type": "boolean",
|
||||
"description": "Whether to clear existing content before typing. Use this to replace the current value instead of appending to it. Defaults to false."
|
||||
},
|
||||
"submit": {
|
||||
"type": "boolean",
|
||||
"description": "Whether to submit entered text (press Enter after)"
|
||||
},
|
||||
"slowly": {
|
||||
"type": "boolean",
|
||||
"description": "Whether to type one character at a time. Useful for triggering key handlers in the page. By default entire text is filled in at once."
|
||||
},
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"element",
|
||||
"ref",
|
||||
"text"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"name": "browser_wait_for",
|
||||
"description": "Wait for text to appear or disappear, or wait a specified time. Note: time is in SECONDS, not milliseconds.",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"time": {
|
||||
"type": "number",
|
||||
"description": "Time to wait in SECONDS (e.g., 2 for 2 seconds, 0.5 for 500ms). Use for fixed delays."
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Wait for this text to appear on the page."
|
||||
},
|
||||
"textGone": {
|
||||
"type": "string",
|
||||
"description": "Wait for this text to disappear from the page."
|
||||
},
|
||||
"timeout": {
|
||||
"type": "number",
|
||||
"description": "Maximum time to wait for text conditions in MILLISECONDS. Defaults to 30000 (30 seconds)."
|
||||
},
|
||||
"viewId": {
|
||||
"type": "string",
|
||||
"description": "Target browser tab ID. If omitted, uses the last interacted tab."
|
||||
}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"serverIdentifier": "plugin-figma-figma",
|
||||
"serverName": "plugin-figma-figma"
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
The MCP server needs authentication. You must call the `mcp_auth` tool for server "plugin-figma-figma" through your MCP tool-calling interface using an empty arguments object `{}` soon so the user can access all of the tools this MCP server offers.
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"name": "mcp_auth",
|
||||
"description": "Authenticate this MCP server so the user can access all of its tools. When STATUS.md indicates this server needs authentication, you must call this tool soon through your MCP tool-calling interface.",
|
||||
"arguments": {
|
||||
"type": "object",
|
||||
"properties": {},
|
||||
"additionalProperties": false
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user