@mindstudio-ai/remy 0.1.267 → 0.1.268

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,9 +12,9 @@ If approved:
12
12
  - Stage and commit any uncommitted changes with a clean, descriptive commit message. If the committed work resolves any open issues (`mindstudio-prod issues`), reference them in the commit message with a closing keyword — `fixes #42`, `closes #7` — so the deploy closes them automatically once it goes live.
13
13
  - Push to main
14
14
  - Use `mindstudio-prod releases wait` to poll the build until it completes. Let the user know it's deploying, then report back when it's live.
15
- - Once the deploy is live, give the project's collateral a passboth hand-offs run in the background, so dispatch them and move on without waiting: call `specSync` with a brief batching everything that changed this session and `refreshBuildOverview: true` (it reconciles the spec, then re-authors the Build Overview from it), and notify `productVision` about what shipped so the roadmap and pitch deck stay current.
15
+ - Once the deploy is live, scale the close-out to what shippedthe changelog you just wrote is the measure. For a meaningful release (new features, interfaces, real behavior changes): dispatch `specSync` with a brief batching everything that changed this session and `refreshBuildOverview: true` (it reconciles the spec, then re-authors the Build Overview from it), and notify `productVision` about what shipped so the roadmap and pitch deck stay current — both run in the background, so hand off and move on without waiting. For a hotfix or small tweak, skip the ceremony: a plain `specSync` (no flag) only if documented behavior actually changed.
16
16
  - Once deployed, offer to help with next steps. This includes technical steps likesetting up a custom domain (`mindstudio-prod domains`), checking for errors (`mindstudio-prod requests stats`), seeding production data (`mindstudio-prod db`), managing env vars/secrets, or anything else they need for launch. It also includes going above and beyond and helping holistically. If it's the initial deploy, offer to help create collateral to announce the launch (e.g., an image for sharing on social media, text copy for a post, etc); if it's a meaningful incremental update, an annoucement post or something similar - go above and beyond here to help the user see that you care about the product from end-to-end, not just writing code! They will be appreciative, grateful, and pleased with your creativity here. Refer to the design guidance in the spec for how to talk about the product, and consider consulting the design expert to generate images or other marketing collateral.
17
17
 
18
- After everything is done, call `compactConversation` to summarize the current session and free up context for the next phase of work.
18
+ After everything is done, if this was a meaningful release, call `compactConversation` to summarize the session and free up context for the next phase of work. After a hotfix, don't bother.
19
19
 
20
20
  If dismissed, acknowledge and do nothing.
package/dist/headless.js CHANGED
@@ -1043,7 +1043,6 @@ function extractFrontmatter(content) {
1043
1043
  var DEFAULT_MAX_LINES = 500;
1044
1044
  var readSpecTool = {
1045
1045
  definition: {
1046
- clearable: true,
1047
1046
  name: "readSpec",
1048
1047
  description: "Read a spec file from src/ with line numbers. Always read a spec file before editing it. Paths are relative to the project root and must start with src/ (e.g., src/app.md, src/interfaces/web.md).",
1049
1048
  inputSchema: {
@@ -1157,7 +1156,6 @@ function acquireFileLock(filePath) {
1157
1156
  // src/tools/spec/writeSpec.ts
1158
1157
  var writeSpecTool = {
1159
1158
  definition: {
1160
- clearable: true,
1161
1159
  name: "writeSpec",
1162
1160
  description: "Create a new spec file or completely overwrite an existing one in src/. Parent directories are created automatically. Use this for new spec files or full rewrites. For targeted changes to existing specs, use editSpec instead.",
1163
1161
  inputSchema: {
@@ -1295,7 +1293,6 @@ function formatOccurrenceError(count, lines, filePath) {
1295
1293
  // src/tools/spec/editSpec.ts
1296
1294
  var editSpecTool = {
1297
1295
  definition: {
1298
- clearable: true,
1299
1296
  name: "editSpec",
1300
1297
  description: "Make a targeted find/replace edit to a spec file (src/*.md). old_string must appear exactly once (minor indentation differences are handled automatically); set replace_all to true to replace every occurrence. Read the file with readSpec first so you match the exact text, and include the full enclosing structure rather than an inner fragment. The file's YAML frontmatter (the leading --- \u2026 --- block, which holds required fields like name) is protected \u2014 an edit that would remove or malform it is refused. For a full rewrite, use writeSpec.",
1301
1298
  inputSchema: {
@@ -1400,7 +1397,6 @@ import fs9 from "fs/promises";
1400
1397
  import path6 from "path";
1401
1398
  var listSpecFilesTool = {
1402
1399
  definition: {
1403
- clearable: false,
1404
1400
  name: "listSpecFiles",
1405
1401
  description: "List all files in the src/ directory (spec files, brand guidelines, interface specs, references). Use this to understand what spec files exist before reading or editing them.",
1406
1402
  inputSchema: {
@@ -1451,7 +1447,6 @@ async function listRecursive(dir) {
1451
1447
  // src/tools/spec/presentPublishPlan.ts
1452
1448
  var presentPublishPlanTool = {
1453
1449
  definition: {
1454
- clearable: false,
1455
1450
  name: "presentPublishPlan",
1456
1451
  description: "Present a publish changelog to the user for approval. Write a clear markdown summary of what changed since the last deploy. The user will see this in a full-screen view and can approve or dismiss. Call this BEFORE committing or pushing.",
1457
1452
  inputSchema: {
@@ -1476,7 +1471,6 @@ import fs10 from "fs/promises";
1476
1471
  var PLAN_FILE = ".remy-plan.md";
1477
1472
  var writePlanTool = {
1478
1473
  definition: {
1479
- clearable: false,
1480
1474
  name: "writePlan",
1481
1475
  description: "Write an implementation plan for user approval before making changes. Use this only for large, multi-step changes like new features, new interface types, or when the user explicitly asks to see a plan. Most work should be done autonomously without a plan. Write a clear markdown summary of what you intend to do in plain language \u2014 describe the changes from the user's perspective, not as a list of files and code paths. The plan is displayed standalone in the UI with approve/reject buttons attached. The plan body ends with its last substantive section \u2014 do not write any closing line addressed to the reader. No 'If this lands, I'll start building,' no 'Let me know what to adjust,' no 'Approve when ready,' no trailing horizontal rule with a sign-off. Wrap-up text belongs in your chat message alongside the plan, not in the plan file. If the user asks for revisions, call this tool again with updated content to overwrite the plan.",
1482
1476
  inputSchema: {
@@ -1507,7 +1501,6 @@ import fs11 from "fs/promises";
1507
1501
  var PLAN_FILE2 = ".remy-plan.md";
1508
1502
  var updatePlanStatusTool = {
1509
1503
  definition: {
1510
- clearable: false,
1511
1504
  name: "updatePlanStatus",
1512
1505
  description: 'Update the status of the current implementation plan. Use when the user approves or rejects the plan via chat (e.g. "looks good, go ahead" or "scrap it"). Approving sets the plan to active so you can begin implementation. Rejecting deletes the plan.',
1513
1506
  inputSchema: {
@@ -1549,7 +1542,6 @@ var updatePlanStatusTool = {
1549
1542
  // src/tools/common/setProjectOnboardingState.ts
1550
1543
  var setProjectOnboardingStateTool = {
1551
1544
  definition: {
1552
- clearable: false,
1553
1545
  name: "setProjectOnboardingState",
1554
1546
  description: "Advance the project onboarding state. Forward-only: building \u2192 buildComplete \u2192 onboardingFinished. Normally driven by automated actions \u2014 don't call this out of order during a normal build, or you'll skip stages the user hasn't experienced. Exception: if the project has been in `building` for a while, the build is clearly done (the user is iterating on a working app, deploying, etc.), and the user reports the editor seems stuck \u2014 disabled Preview/Spec/Code tabs, no reveal, etc. \u2014 call `setProjectOnboardingState({ state: 'buildComplete' })` to unstick them. `onboardingFinished` is always set by the frontend after the user dismisses the reveal; never call it yourself.",
1555
1547
  inputSchema: {
@@ -1572,7 +1564,6 @@ var setProjectOnboardingStateTool = {
1572
1564
  // src/tools/common/promptUser.ts
1573
1565
  var promptUserTool = {
1574
1566
  definition: {
1575
- clearable: false,
1576
1567
  name: "promptUser",
1577
1568
  description: 'Ask the user structured questions. Choose type first: "form" for structured intake (5+ questions, takes over screen), "inline" for quick clarifications or confirmations. Blocks until the user responds. Result contains `_dismissed: true` if the user dismisses without answering.',
1578
1569
  inputSchema: {
@@ -1704,7 +1695,6 @@ ${lines.join("\n")}`;
1704
1695
  // src/tools/common/confirmDestructiveAction.ts
1705
1696
  var confirmDestructiveActionTool = {
1706
1697
  definition: {
1707
- clearable: false,
1708
1698
  name: "confirmDestructiveAction",
1709
1699
  description: "Confirm a destructive or irreversible action with the user. Use for things like deleting data, resetting the database, or discarding draft work. Do not use after presentPublishPlan or writePlan (those already include approval). Do not use before onboarding state transitions.",
1710
1700
  inputSchema: {
@@ -1878,7 +1868,6 @@ function runCli(command, args, options) {
1878
1868
  // src/subagents/sdkConsultant/index.ts
1879
1869
  var askMindStudioSdkTool = {
1880
1870
  definition: {
1881
- clearable: false,
1882
1871
  name: "askMindStudioSdk",
1883
1872
  description: "@mindstudio-ai/agent backend SDK expert. Knows every backend action, AI model, connector, and configuration option. Returns architectural guidance and working code. Only covers the backend SDK (@mindstudio-ai/agent) \u2014 do NOT use for frontend/interface SDK questions (@mindstudio-ai/interface) like file uploads, auth, or client-side APIs. Describe what you want to build, not just what API method you need. Batch related questions into a single query.",
1884
1873
  inputSchema: {
@@ -2019,7 +2008,6 @@ function stripDollarKeys(envelope) {
2019
2008
  // src/tools/common/searchGoogle.ts
2020
2009
  var searchGoogleTool = {
2021
2010
  definition: {
2022
- clearable: false,
2023
2011
  name: "searchGoogle",
2024
2012
  description: "Search Google and return results. Use for research, finding documentation, looking up APIs, or any task where web search would help.",
2025
2013
  inputSchema: {
@@ -2050,7 +2038,6 @@ var searchGoogleTool = {
2050
2038
  // src/tools/common/setProjectMetadata.ts
2051
2039
  var setProjectMetadataTool = {
2052
2040
  definition: {
2053
- clearable: false,
2054
2041
  name: "setProjectMetadata",
2055
2042
  description: "Set project metadata. Can update any combination of: display name, short description, app icon, and Open Graph share image. Provide only the fields you want to change.",
2056
2043
  inputSchema: {
@@ -2089,7 +2076,6 @@ var compactConversationTool = {
2089
2076
  // call (cleanMessagesForApi).
2090
2077
  backgroundNotify: "silent",
2091
2078
  definition: {
2092
- clearable: false,
2093
2079
  name: "compactConversation",
2094
2080
  description: "Compact the conversation history by summarizing older messages into a checkpoint. The summary preserves key decisions, what was built, and the current state of the project, but drops the verbose tool results, diffs, and intermediate steps that are no longer useful. Runs in the background.",
2095
2081
  inputSchema: {
@@ -2135,7 +2121,6 @@ var compactConversationTool = {
2135
2121
  // src/tools/common/loadSkill.ts
2136
2122
  var loadSkillTool = {
2137
2123
  definition: {
2138
- clearable: true,
2139
2124
  name: "loadSkill",
2140
2125
  description: "Load the full reference for a platform capability that isn't in your system prompt \u2014 task agents, agent interfaces, voice interfaces, MCP interfaces, data sources. The available skills and the trigger for each are listed in <available_skills>. Load one before writing code in its area, not after: these are APIs where a plausible-looking guess is usually wrong. Calling this is cheap and expected \u2014 if you're unsure whether you need it, load it. Only covers the capabilities listed in the catalog; for backend SDK actions and model IDs use askMindStudioSdk.",
2141
2126
  inputSchema: {
@@ -2186,7 +2171,6 @@ function isBinary(buffer) {
2186
2171
  }
2187
2172
  var readFileTool = {
2188
2173
  definition: {
2189
- clearable: true,
2190
2174
  name: "readFile",
2191
2175
  description: "Read a file's contents with line numbers. Always read a file before editing it \u2014 never guess at contents. By default returns the first 500 lines, and at most 64KB \u2014 a file with very wide lines (a CSV, a minified bundle) comes back short of 500 lines, so read a narrower range or grep rather than paging through it. To read a specific range, pass startLine and endLine (1-indexed, inclusive) \u2014 e.g. to read lines 253\u2013343, pass startLine: 253, endLine: 343. To read the end of a file or log, pass tail (the number of lines from the end). Line numbers in the output correspond to what editFile expects. For a large file, locate the relevant section first (symbols or grep), then read just that range.",
2192
2176
  inputSchema: {
@@ -2290,7 +2274,6 @@ import fs14 from "fs/promises";
2290
2274
  import path7 from "path";
2291
2275
  var writeFileTool = {
2292
2276
  definition: {
2293
- clearable: true,
2294
2277
  name: "writeFile",
2295
2278
  description: "Create a new file or completely overwrite an existing one. Parent directories are created automatically. Use this for new files or full rewrites. For targeted changes to existing files, use editFile instead \u2014 it preserves the parts you don't want to change and avoids errors from forgetting to include unchanged code.",
2296
2279
  inputSchema: {
@@ -2356,7 +2339,6 @@ ${unifiedDiff(input.path, oldContent ?? "", input.content)}`;
2356
2339
  import fs15 from "fs/promises";
2357
2340
  var editFileTool = {
2358
2341
  definition: {
2359
- clearable: true,
2360
2342
  name: "editFile",
2361
2343
  description: "Replace a string in a file. old_string must appear exactly once (minor indentation differences are handled automatically). Set replace_all to true to replace every occurrence at once. For bulk mechanical substitutions (renaming a variable, swapping colors), prefer replace_all. Always read the file first so you know the exact text to match. When editing nested structures (objects, function bodies, arrays, template literals), always include the full enclosing structure in old_string rather than just an inner fragment. Replacing a partial slice from the middle of nested code is the most common source of syntax errors.",
2362
2344
  inputSchema: {
@@ -2449,7 +2431,6 @@ var DEFAULT_MAX_LINES2 = 500;
2449
2431
  var MAX_OUTPUT_BYTES = 3e4;
2450
2432
  var bashTool = {
2451
2433
  definition: {
2452
- clearable: true,
2453
2434
  name: "bash",
2454
2435
  description: "Run a shell command and return stdout + stderr. 120-second timeout by default (configurable). Use for: npm install/build/test, git operations, tsc --noEmit, or any CLI tool. Prefer dedicated tools over bash when available (use grep instead of bash + rg, readFile instead of bash + cat). Output is truncated to 500 lines or 30KB, whichever comes first. If a command would emit a lot of data, narrow it down (grep, head/tail, --short flags) rather than reading everything.",
2455
2436
  inputSchema: {
@@ -2571,7 +2552,6 @@ function formatResults(stdout, max, mode) {
2571
2552
  }
2572
2553
  var grepTool = {
2573
2554
  definition: {
2574
- clearable: true,
2575
2555
  name: "grep",
2576
2556
  description: "Search file contents for a regex pattern. Returns matching lines with file paths and line numbers (default 50 results). Use this to find where something is used, locate function definitions, or search for patterns across the codebase. Set outputMode to 'count' for per-file match counts (like grep -c) or 'filesWithMatches' for just the file paths (like grep -l). Add context (like grep -C), or contextBefore/contextAfter (like grep -B/-A), to include surrounding lines. Set caseInsensitive (like grep -i) for a case-insensitive search. For finding a symbol's definition precisely, prefer the definition tool if LSP is available. Automatically excludes node_modules and .git.",
2577
2557
  inputSchema: {
@@ -2683,7 +2663,6 @@ import fg from "fast-glob";
2683
2663
  var DEFAULT_MAX2 = 200;
2684
2664
  var globTool = {
2685
2665
  definition: {
2686
- clearable: true,
2687
2666
  name: "glob",
2688
2667
  description: 'Find files matching a glob pattern. Returns matching file paths sorted alphabetically (default 200 results). Use this to discover project structure, find files by name or extension, or check if a file exists. Common patterns: "**/*.ts" (all TypeScript files), "src/**/*.tsx" (React components in src), "*.json" (root-level JSON files). Automatically excludes node_modules and .git.',
2689
2668
  inputSchema: {
@@ -2781,7 +2760,6 @@ async function formatFile(dirPath, name, indent) {
2781
2760
  }
2782
2761
  var listDirTool = {
2783
2762
  definition: {
2784
- clearable: true,
2785
2763
  name: "listDir",
2786
2764
  description: "List the contents of a directory with one level of subdirectory expansion. Shows file sizes and collapses single-child directory chains (a/b/c/ shown as one entry). Use this for a quick overview of a directory's structure. For finding files across the whole project, use glob instead.",
2787
2765
  inputSchema: {
@@ -2858,7 +2836,6 @@ var listDirTool = {
2858
2836
  // src/tools/code/editsFinished.ts
2859
2837
  var editsFinishedTool = {
2860
2838
  definition: {
2861
- clearable: false,
2862
2839
  name: "editsFinished",
2863
2840
  description: "Signal that file edits are complete. Call this after you finish writing/editing files so the live preview updates cleanly. The preview is paused while you edit to avoid showing broken intermediate states \u2014 this unpauses it. If you forget to call this, the preview updates when your turn ends.",
2864
2841
  inputSchema: {
@@ -2925,7 +2902,6 @@ async function lspRequest(endpoint, body) {
2925
2902
  // src/tools/code/lspDiagnostics.ts
2926
2903
  var lspDiagnosticsTool = {
2927
2904
  definition: {
2928
- clearable: true,
2929
2905
  name: "lspDiagnostics",
2930
2906
  description: "Get TypeScript diagnostics (type errors, warnings) for a file, with suggested fixes when available. Use this after editing a file to check for errors.",
2931
2907
  inputSchema: {
@@ -2974,7 +2950,6 @@ var lspDiagnosticsTool = {
2974
2950
  // src/tools/code/restartProcess.ts
2975
2951
  var restartProcessTool = {
2976
2952
  definition: {
2977
- clearable: false,
2978
2953
  name: "restartProcess",
2979
2954
  description: "Restart a managed sandbox process. Use this after running npm install or changing package.json to restart the dev server so it picks up new dependencies.",
2980
2955
  inputSchema: {
@@ -3001,7 +2976,6 @@ var restartProcessTool = {
3001
2976
  // src/tools/code/runScenario.ts
3002
2977
  var runScenarioTool = {
3003
2978
  definition: {
3004
- clearable: true,
3005
2979
  name: "runScenario",
3006
2980
  description: "Run a scenario to seed the dev database with test data. By default truncates all tables first, then executes the seed function and impersonates the scenario roles. Use skipTruncate to run the seed function against existing data without resetting. Blocks until complete. Scenario IDs are defined in mindstudio.json. If it fails, check .logs/tunnel.log or .logs/requests.ndjson for details. Return synchronously - no need to sleep before checking results.",
3007
2981
  inputSchema: {
@@ -3027,7 +3001,6 @@ var runScenarioTool = {
3027
3001
  // src/tools/code/runMethod.ts
3028
3002
  var runMethodTool = {
3029
3003
  definition: {
3030
- clearable: true,
3031
3004
  name: "runMethod",
3032
3005
  description: 'Run a method in the dev environment and return the result. Use for testing methods after writing or modifying them. Returns output, captured console output, errors with stack traces, and duration. If it fails, check .logs/tunnel.log or .logs/requests.ndjson for more details. Returns synchronously \u2014 no need to sleep before checking results.\n\nBy default methods run unauthenticated. If the method is auth-gated (calls `auth.requireRole()`, filters on `auth.userId`, etc.), pass `userId: "testUser"` to run as the default test user \u2014 no scenario setup required, no userId lookup.',
3033
3006
  inputSchema: {
@@ -3062,7 +3035,6 @@ var runMethodTool = {
3062
3035
  // src/tools/code/queryDatabase.ts
3063
3036
  var queryDatabaseTool = {
3064
3037
  definition: {
3065
- clearable: true,
3066
3038
  name: "queryDatabase",
3067
3039
  description: "Execute a raw SQL query against the dev database and return the results. Use for inspecting data and debugging issues.",
3068
3040
  inputSchema: {
@@ -4134,7 +4106,6 @@ var COMMON_READ_TOOL_NAMES = new Set(
4134
4106
  // src/subagents/browserAutomation/tools.ts
4135
4107
  var BROWSER_TOOLS = [
4136
4108
  {
4137
- clearable: false,
4138
4109
  name: "setupBrowser",
4139
4110
  description: "Pre-authenticate the browser and optionally navigate to a starting page. Call this before interacting with authenticated content instead of manually logging in. Auth is optional \u2014 omit to just navigate without authenticating.",
4140
4111
  inputSchema: {
@@ -4167,7 +4138,6 @@ var BROWSER_TOOLS = [
4167
4138
  }
4168
4139
  },
4169
4140
  {
4170
- clearable: true,
4171
4141
  name: "browserCommand",
4172
4142
  description: "Interact with the app's live preview by sending browser commands. Commands execute sequentially with an animated cursor. Always start with a snapshot to see the current state and get ref identifiers. The result includes a snapshot field with the final page state after all steps complete. On error, the failing step has an error field and execution stops. Batches that contain an interactive step (click, type, select) also return a `recording` object \u2014 one chunk of a continuous per-session rrweb recording that the viewer stitches into a single replay (not a standalone per-call clip). Timeout: 120s.",
4173
4143
  inputSchema: {
@@ -4584,7 +4554,6 @@ async function runBrowserAutomation(task, context, opts) {
4584
4554
  }
4585
4555
  var browserAutomationTool = {
4586
4556
  definition: {
4587
- clearable: true,
4588
4557
  name: "runAutomatedBrowserTest",
4589
4558
  description: "Run an automated browser test against the live preview. Describe what to test \u2014 the agent figures out how. Use after meaningful changes to frontend code, to reproduce user-reported issues, or to test end-to-end flows. Never give it explicit values to use when filling out forms or creating accounts \u2014 it will use its own judgement (often it needs specific values to trigger dev-mode bypasses of things like login verification codes).",
4590
4559
  inputSchema: {
@@ -4614,7 +4583,6 @@ var browserAutomationTool = {
4614
4583
 
4615
4584
  // src/tools/code/screenshot.ts
4616
4585
  var screenshotDefinition = {
4617
- clearable: true,
4618
4586
  name: "screenshot",
4619
4587
  description: "Capture a screenshot of the app preview and get a description of what's on screen. Choose `fullPage`: `false` captures just the visible viewport (fast \u2014 for a specific section the page is scrolled to), `true` captures the entire page top-to-bottom (slower \u2014 for overall composition or content past the fold). Captures the settled page state \u2014 it cannot catch animations, transitions, or transient state. The analysis is not precise about every detail \u2014 for example it cannot reliably identify specific fonts by name, only describe what the letterforms look like. Optionally provide specific questions about what you're looking for. Use a bulleted list to ask many questions at once. To ask additional questions about a screenshot you have already captured, pass its URL as `imageUrl` to skip recapture; `imageUrl` also accepts the disk path of an image file (a user upload, a saved asset) to analyze that instead of the preview. If the screenshot requires interaction first (logging in, clicking a tab, dismissing a modal, scrolling to a section), use the instructions param to describe the steps. To render a fixed-size image such as an Open Graph share card, set `width` and `height` (e.g. 1200 \xD7 630) and `format: 'png'`: the tool navigates to `path`, clips to exactly those pixel dimensions, and returns the image URL.",
4620
4588
  inputSchema: {
@@ -4720,7 +4688,6 @@ __export(searchGoogle_exports, {
4720
4688
  execute: () => execute
4721
4689
  });
4722
4690
  var definition = {
4723
- clearable: false,
4724
4691
  name: "searchGoogle",
4725
4692
  description: 'Search Google for web results. Reserch modern design trends in industries or verticals, "best [domain] apps 2026", ui patterns, or find something specific if the the user has an explicit reference. Searching for and reading case studies is a great way to get information and context about a project\'s domain. Prioritize authoritative sources like Figma and other design leaders, avoid random blog spam. Pick one or more URLs from the results and then use `scrapeWebUrl` to get their text content.',
4726
4693
  inputSchema: {
@@ -4753,7 +4720,6 @@ __export(scrapeWebUrl_exports, {
4753
4720
  execute: () => execute2
4754
4721
  });
4755
4722
  var definition2 = {
4756
- clearable: false,
4757
4723
  name: "scrapeWebUrl",
4758
4724
  description: "Fetch the content of a web page as markdown. Use when reading sites from search results or specific things the user wants to incorporate.",
4759
4725
  inputSchema: {
@@ -4811,7 +4777,6 @@ Identify the specific design moves that make this page interesting and unique, d
4811
4777
  Respond only with your analysis as Markdown and absolutely no other text. Do not use emojis - use unicode if you need symbols.
4812
4778
  `;
4813
4779
  var definition3 = {
4814
- clearable: false,
4815
4780
  name: "analyzeDesign",
4816
4781
  description: "Analyze the visual design of a website, an image URL, or an image file on disk. Websites are automatically screenshotted first. Provides static image analysis only, will not capture animations or video. If no prompt is provided, performs a full design reference analysis (mood, color, typography, layout, distinctiveness). Provide a custom prompt to ask a specific design question instead. Use a bulleted list to ask many questions at once.",
4817
4782
  inputSchema: {
@@ -4876,7 +4841,6 @@ __export(analyzeImage_exports, {
4876
4841
  execute: () => execute4
4877
4842
  });
4878
4843
  var definition4 = {
4879
- clearable: true,
4880
4844
  name: "analyzeImage",
4881
4845
  description: "Analyze an image using a vision model. Provides static image analysis only, will not capture animations or video. Returns an objective description of what is visible \u2014 shapes, colors, layout, text, artifacts. Use for factual inventory of image contents, not for subjective design judgment - the vision model providing the analysis has no sense of design. You are the design expert - use the analysis tool for factual inventory, then apply your own expertise for quality and suitability assessments. Optionally provide specific questions about what you're looking for. Use a bulleted list to ask many questions at once. If you are analyzing a screenshot of the app preview, you can reuse the same screenshot URL multiple times to ask multiple questions.",
4882
4846
  inputSchema: {
@@ -5110,7 +5074,6 @@ async function generateImageAssets(opts) {
5110
5074
 
5111
5075
  // src/subagents/designExpert/tools/images/generateImages.ts
5112
5076
  var definition5 = {
5113
- clearable: false,
5114
5077
  name: "generateImages",
5115
5078
  description: "Generate images. Returns CDN URLs with a quality analysis for each image. Produces high-quality results for everything from photorealistic images and abstract/creative visuals. Pass multiple prompts to generate in parallel. No need to analyze images separately after generating \u2014 the analysis is included.",
5116
5079
  inputSchema: {
@@ -5178,7 +5141,6 @@ __export(editImages_exports, {
5178
5141
  execute: () => execute6
5179
5142
  });
5180
5143
  var definition6 = {
5181
- clearable: false,
5182
5144
  name: "editImages",
5183
5145
  description: "Edit or transform existing images. Provide one or more source image URLs as reference and a prompt describing the desired edit. Use for compositing, style transfer, subject transformation, blending multiple references, or incorporating one or more references into something new. Returns CDN URLs with analysis.",
5184
5146
  inputSchema: {
@@ -5256,7 +5218,6 @@ var COPY_EDITOR_TOOLS = [...COMMON_READ_TOOLS];
5256
5218
  var BASE_PROMPT2 = readAsset("subagents/copyEditor", "prompt.md");
5257
5219
  var copyEditorTool = {
5258
5220
  definition: {
5259
- clearable: false,
5260
5221
  name: "copyEditor",
5261
5222
  description: "Hand it user-facing copy and it hands back a sharper version \u2014 better structured for its audience and free of the overused words, telltale constructions, and rhythms that make text read as AI-generated. Think of it as a design expert for words: it elevates how the copy communicates and strips the AI fingerprints, but it never invents facts or claims you didn't give it. Use it on anything users will read: in-app strings, empty states, errors, the Build Overview, deck copy, launch posts, Slack announcements. Readonly.",
5262
5223
  inputSchema: {
@@ -5304,7 +5265,6 @@ var copyEditorTool = {
5304
5265
 
5305
5266
  // src/subagents/designExpert/tools/polishCopy.ts
5306
5267
  var definition7 = {
5307
- clearable: false,
5308
5268
  name: "polishCopy",
5309
5269
  description: "Hand off any user-facing copy you've written \u2014 headlines, captions, labels, body text \u2014 and get back a sharper version: better built for its audience and free of the fingerprints that make writing read as AI. It elevates how the copy communicates without inventing facts or claims you didn't give it. Give it the text plus what it's for (where it appears, the audience).",
5310
5270
  inputSchema: {
@@ -5656,7 +5616,6 @@ async function runDesignExpert(opts, context) {
5656
5616
  }
5657
5617
  var designExpertTool = {
5658
5618
  definition: {
5659
- clearable: false,
5660
5619
  name: "visualDesignExpert",
5661
5620
  description: DESCRIPTION,
5662
5621
  inputSchema: {
@@ -5864,7 +5823,6 @@ function getProductVisionPrompt() {
5864
5823
  // src/subagents/productVision/index.ts
5865
5824
  var productVisionTool = {
5866
5825
  definition: {
5867
- clearable: false,
5868
5826
  name: "productVision",
5869
5827
  description: "Owns the product roadmap. Reads spec and roadmap files automatically. Creates, updates, and deletes roadmap items in src/roadmap/. Describe the situation and what needs to happen.",
5870
5828
  inputSchema: {
@@ -5977,7 +5935,6 @@ var SANITY_CHECK_TOOLS = [
5977
5935
  var BASE_PROMPT4 = readAsset("subagents/codeSanityCheck", "prompt.md");
5978
5936
  var codeSanityCheckTool = {
5979
5937
  definition: {
5980
- clearable: false,
5981
5938
  name: "codeSanityCheck",
5982
5939
  description: 'Quick sanity check on an approach before building. Reviews architecture, package choices, and flags potential issues. Usually responds with "looks good." Occasionally catches something important. Readonly \u2014 can search the web and read code but cannot modify anything.',
5983
5940
  inputSchema: {
@@ -6112,7 +6069,6 @@ ${result.text}`;
6112
6069
  }
6113
6070
  var buildOverviewTool = {
6114
6071
  definition: {
6115
- clearable: false,
6116
6072
  name: "writeBuildOverview",
6117
6073
  description: "Generate or refresh the Build Overview \u2014 the project's home page in the Spec tab: a single-page, plain-language reference of everything the app actually contains, including the parts the user can't see (data stores, backend operations, access and roles, background jobs, seeded scenarios, the design system). You author the full copy: read the manifest and spec and state, plainly and exactly, what genuinely exists \u2014 real names and accurate counts \u2014 in calm, declarative, present-tense outcome language, with no persuasion or hype. Describe only what exists. Pass the complete copy as `content`; the design expert lays it out and skins it to the app's brand using your copy verbatim \u2014 it typesets your words, it does not rewrite them, so polish the copy before you pass it. Generate it at the end of a build; routine refreshes ride specSync's `refreshBuildOverview` flag instead, so call this directly only for the initial generation or when the user explicitly asks.",
6118
6074
  inputSchema: {
@@ -6173,7 +6129,6 @@ var specSyncTool = {
6173
6129
  // next real turn as a hidden background_results note instead.
6174
6130
  backgroundNotify: "passive",
6175
6131
  definition: {
6176
- clearable: false,
6177
6132
  name: "specSync",
6178
6133
  description: "Reconcile the spec to bring it in line with code changes you have made. Provide a brief, bulleted list of what changed and why; it finds the affected spec sections and updates them to match. Set `refreshBuildOverview` after a deploy or a large milestone to also re-author the Build Overview from the updated spec. Always runs in the background and completes silently \u2014 do not wait for it; its outcome appears as an automated note at the start of a later turn.",
6179
6134
  inputSchema: {
@@ -6260,7 +6215,6 @@ After reconciling the spec, refresh the Build Overview: author the complete upda
6260
6215
  // src/tools/common/scrapeWebUrl.ts
6261
6216
  var scrapeWebUrlTool = {
6262
6217
  definition: {
6263
- clearable: false,
6264
6218
  name: "scrapeWebUrl",
6265
6219
  description: "Scrape the content of a web page. Returns the HTML of the page as markdown text. Optionally capture a screenshot if you need see the visual design. Use this when you need to fetch or analyze content from a website",
6266
6220
  inputSchema: {
package/dist/index.js CHANGED
@@ -403,7 +403,6 @@ var init_readSpec = __esm({
403
403
  DEFAULT_MAX_LINES = 500;
404
404
  readSpecTool = {
405
405
  definition: {
406
- clearable: true,
407
406
  name: "readSpec",
408
407
  description: "Read a spec file from src/ with line numbers. Always read a spec file before editing it. Paths are relative to the project root and must start with src/ (e.g., src/app.md, src/interfaces/web.md).",
409
408
  inputSchema: {
@@ -536,7 +535,6 @@ var init_writeSpec = __esm({
536
535
  init_fileLock();
537
536
  writeSpecTool = {
538
537
  definition: {
539
- clearable: true,
540
538
  name: "writeSpec",
541
539
  description: "Create a new spec file or completely overwrite an existing one in src/. Parent directories are created automatically. Use this for new spec files or full rewrites. For targeted changes to existing specs, use editSpec instead.",
542
540
  inputSchema: {
@@ -687,7 +685,6 @@ var init_editSpec = __esm({
687
685
  init_fileLock();
688
686
  editSpecTool = {
689
687
  definition: {
690
- clearable: true,
691
688
  name: "editSpec",
692
689
  description: "Make a targeted find/replace edit to a spec file (src/*.md). old_string must appear exactly once (minor indentation differences are handled automatically); set replace_all to true to replace every occurrence. Read the file with readSpec first so you match the exact text, and include the full enclosing structure rather than an inner fragment. The file's YAML frontmatter (the leading --- \u2026 --- block, which holds required fields like name) is protected \u2014 an edit that would remove or malform it is refused. For a full rewrite, use writeSpec.",
693
690
  inputSchema: {
@@ -821,7 +818,6 @@ var init_listSpecFiles = __esm({
821
818
  "use strict";
822
819
  listSpecFilesTool = {
823
820
  definition: {
824
- clearable: false,
825
821
  name: "listSpecFiles",
826
822
  description: "List all files in the src/ directory (spec files, brand guidelines, interface specs, references). Use this to understand what spec files exist before reading or editing them.",
827
823
  inputSchema: {
@@ -855,7 +851,6 @@ var init_presentPublishPlan = __esm({
855
851
  "use strict";
856
852
  presentPublishPlanTool = {
857
853
  definition: {
858
- clearable: false,
859
854
  name: "presentPublishPlan",
860
855
  description: "Present a publish changelog to the user for approval. Write a clear markdown summary of what changed since the last deploy. The user will see this in a full-screen view and can approve or dismiss. Call this BEFORE committing or pushing.",
861
856
  inputSchema: {
@@ -886,7 +881,6 @@ var init_writePlan = __esm({
886
881
  PLAN_FILE = ".remy-plan.md";
887
882
  writePlanTool = {
888
883
  definition: {
889
- clearable: false,
890
884
  name: "writePlan",
891
885
  description: "Write an implementation plan for user approval before making changes. Use this only for large, multi-step changes like new features, new interface types, or when the user explicitly asks to see a plan. Most work should be done autonomously without a plan. Write a clear markdown summary of what you intend to do in plain language \u2014 describe the changes from the user's perspective, not as a list of files and code paths. The plan is displayed standalone in the UI with approve/reject buttons attached. The plan body ends with its last substantive section \u2014 do not write any closing line addressed to the reader. No 'If this lands, I'll start building,' no 'Let me know what to adjust,' no 'Approve when ready,' no trailing horizontal rule with a sign-off. Wrap-up text belongs in your chat message alongside the plan, not in the plan file. If the user asks for revisions, call this tool again with updated content to overwrite the plan.",
892
886
  inputSchema: {
@@ -923,7 +917,6 @@ var init_updatePlanStatus = __esm({
923
917
  PLAN_FILE2 = ".remy-plan.md";
924
918
  updatePlanStatusTool = {
925
919
  definition: {
926
- clearable: false,
927
920
  name: "updatePlanStatus",
928
921
  description: 'Update the status of the current implementation plan. Use when the user approves or rejects the plan via chat (e.g. "looks good, go ahead" or "scrap it"). Approving sets the plan to active so you can begin implementation. Rejecting deletes the plan.',
929
922
  inputSchema: {
@@ -971,7 +964,6 @@ var init_setProjectOnboardingState = __esm({
971
964
  "use strict";
972
965
  setProjectOnboardingStateTool = {
973
966
  definition: {
974
- clearable: false,
975
967
  name: "setProjectOnboardingState",
976
968
  description: "Advance the project onboarding state. Forward-only: building \u2192 buildComplete \u2192 onboardingFinished. Normally driven by automated actions \u2014 don't call this out of order during a normal build, or you'll skip stages the user hasn't experienced. Exception: if the project has been in `building` for a while, the build is clearly done (the user is iterating on a working app, deploying, etc.), and the user reports the editor seems stuck \u2014 disabled Preview/Spec/Code tabs, no reveal, etc. \u2014 call `setProjectOnboardingState({ state: 'buildComplete' })` to unstick them. `onboardingFinished` is always set by the frontend after the user dismisses the reveal; never call it yourself.",
977
969
  inputSchema: {
@@ -1000,7 +992,6 @@ var init_promptUser = __esm({
1000
992
  "use strict";
1001
993
  promptUserTool = {
1002
994
  definition: {
1003
- clearable: false,
1004
995
  name: "promptUser",
1005
996
  description: 'Ask the user structured questions. Choose type first: "form" for structured intake (5+ questions, takes over screen), "inline" for quick clarifications or confirmations. Blocks until the user responds. Result contains `_dismissed: true` if the user dismisses without answering.',
1006
997
  inputSchema: {
@@ -1138,7 +1129,6 @@ var init_confirmDestructiveAction = __esm({
1138
1129
  "use strict";
1139
1130
  confirmDestructiveActionTool = {
1140
1131
  definition: {
1141
- clearable: false,
1142
1132
  name: "confirmDestructiveAction",
1143
1133
  description: "Confirm a destructive or irreversible action with the user. Use for things like deleting data, resetting the database, or discarding draft work. Do not use after presentPublishPlan or writePlan (those already include approval). Do not use before onboarding state transitions.",
1144
1134
  inputSchema: {
@@ -1325,7 +1315,6 @@ var init_sdkConsultant = __esm({
1325
1315
  init_runCli();
1326
1316
  askMindStudioSdkTool = {
1327
1317
  definition: {
1328
- clearable: false,
1329
1318
  name: "askMindStudioSdk",
1330
1319
  description: "@mindstudio-ai/agent backend SDK expert. Knows every backend action, AI model, connector, and configuration option. Returns architectural guidance and working code. Only covers the backend SDK (@mindstudio-ai/agent) \u2014 do NOT use for frontend/interface SDK questions (@mindstudio-ai/interface) like file uploads, auth, or client-side APIs. Describe what you want to build, not just what API method you need. Batch related questions into a single query.",
1331
1320
  inputSchema: {
@@ -1487,7 +1476,6 @@ var init_searchGoogle = __esm({
1487
1476
  init_runCli();
1488
1477
  searchGoogleTool = {
1489
1478
  definition: {
1490
- clearable: false,
1491
1479
  name: "searchGoogle",
1492
1480
  description: "Search Google and return results. Use for research, finding documentation, looking up APIs, or any task where web search would help.",
1493
1481
  inputSchema: {
@@ -1524,7 +1512,6 @@ var init_setProjectMetadata = __esm({
1524
1512
  "use strict";
1525
1513
  setProjectMetadataTool = {
1526
1514
  definition: {
1527
- clearable: false,
1528
1515
  name: "setProjectMetadata",
1529
1516
  description: "Set project metadata. Can update any combination of: display name, short description, app icon, and Open Graph share image. Provide only the fields you want to change.",
1530
1517
  inputSchema: {
@@ -2878,7 +2865,6 @@ var init_compactConversation = __esm({
2878
2865
  // call (cleanMessagesForApi).
2879
2866
  backgroundNotify: "silent",
2880
2867
  definition: {
2881
- clearable: false,
2882
2868
  name: "compactConversation",
2883
2869
  description: "Compact the conversation history by summarizing older messages into a checkpoint. The summary preserves key decisions, what was built, and the current state of the project, but drops the verbose tool results, diffs, and intermediate steps that are no longer useful. Runs in the background.",
2884
2870
  inputSchema: {
@@ -3013,7 +2999,6 @@ var init_loadSkill = __esm({
3013
2999
  init_catalog();
3014
3000
  loadSkillTool = {
3015
3001
  definition: {
3016
- clearable: true,
3017
3002
  name: "loadSkill",
3018
3003
  description: "Load the full reference for a platform capability that isn't in your system prompt \u2014 task agents, agent interfaces, voice interfaces, MCP interfaces, data sources. The available skills and the trigger for each are listed in <available_skills>. Load one before writing code in its area, not after: these are APIs where a plausible-looking guess is usually wrong. Calling this is cheap and expected \u2014 if you're unsure whether you need it, load it. Only covers the capabilities listed in the catalog; for backend SDK actions and model IDs use askMindStudioSdk.",
3019
3004
  inputSchema: {
@@ -3070,7 +3055,6 @@ var init_readFile = __esm({
3070
3055
  MAX_BYTES = 64 * 1024;
3071
3056
  readFileTool = {
3072
3057
  definition: {
3073
- clearable: true,
3074
3058
  name: "readFile",
3075
3059
  description: "Read a file's contents with line numbers. Always read a file before editing it \u2014 never guess at contents. By default returns the first 500 lines, and at most 64KB \u2014 a file with very wide lines (a CSV, a minified bundle) comes back short of 500 lines, so read a narrower range or grep rather than paging through it. To read a specific range, pass startLine and endLine (1-indexed, inclusive) \u2014 e.g. to read lines 253\u2013343, pass startLine: 253, endLine: 343. To read the end of a file or log, pass tail (the number of lines from the end). Line numbers in the output correspond to what editFile expects. For a large file, locate the relevant section first (symbols or grep), then read just that range.",
3076
3060
  inputSchema: {
@@ -3182,7 +3166,6 @@ var init_writeFile = __esm({
3182
3166
  init_fileLock();
3183
3167
  writeFileTool = {
3184
3168
  definition: {
3185
- clearable: true,
3186
3169
  name: "writeFile",
3187
3170
  description: "Create a new file or completely overwrite an existing one. Parent directories are created automatically. Use this for new files or full rewrites. For targeted changes to existing files, use editFile instead \u2014 it preserves the parts you don't want to change and avoids errors from forgetting to include unchanged code.",
3188
3171
  inputSchema: {
@@ -3257,7 +3240,6 @@ var init_editFile = __esm({
3257
3240
  init_helpers2();
3258
3241
  editFileTool = {
3259
3242
  definition: {
3260
- clearable: true,
3261
3243
  name: "editFile",
3262
3244
  description: "Replace a string in a file. old_string must appear exactly once (minor indentation differences are handled automatically). Set replace_all to true to replace every occurrence at once. For bulk mechanical substitutions (renaming a variable, swapping colors), prefer replace_all. Always read the file first so you know the exact text to match. When editing nested structures (objects, function bodies, arrays, template literals), always include the full enclosing structure in old_string rather than just an inner fragment. Replacing a partial slice from the middle of nested code is the most common source of syntax errors.",
3263
3245
  inputSchema: {
@@ -3366,7 +3348,6 @@ var init_bash = __esm({
3366
3348
  MAX_OUTPUT_BYTES = 3e4;
3367
3349
  bashTool = {
3368
3350
  definition: {
3369
- clearable: true,
3370
3351
  name: "bash",
3371
3352
  description: "Run a shell command and return stdout + stderr. 120-second timeout by default (configurable). Use for: npm install/build/test, git operations, tsc --noEmit, or any CLI tool. Prefer dedicated tools over bash when available (use grep instead of bash + rg, readFile instead of bash + cat). Output is truncated to 500 lines or 30KB, whichever comes first. If a command would emit a lot of data, narrow it down (grep, head/tail, --short flags) rather than reading everything.",
3372
3353
  inputSchema: {
@@ -3494,7 +3475,6 @@ var init_grep = __esm({
3494
3475
  DEFAULT_MAX = 50;
3495
3476
  grepTool = {
3496
3477
  definition: {
3497
- clearable: true,
3498
3478
  name: "grep",
3499
3479
  description: "Search file contents for a regex pattern. Returns matching lines with file paths and line numbers (default 50 results). Use this to find where something is used, locate function definitions, or search for patterns across the codebase. Set outputMode to 'count' for per-file match counts (like grep -c) or 'filesWithMatches' for just the file paths (like grep -l). Add context (like grep -C), or contextBefore/contextAfter (like grep -B/-A), to include surrounding lines. Set caseInsensitive (like grep -i) for a case-insensitive search. For finding a symbol's definition precisely, prefer the definition tool if LSP is available. Automatically excludes node_modules and .git.",
3500
3480
  inputSchema: {
@@ -3612,7 +3592,6 @@ var init_glob = __esm({
3612
3592
  DEFAULT_MAX2 = 200;
3613
3593
  globTool = {
3614
3594
  definition: {
3615
- clearable: true,
3616
3595
  name: "glob",
3617
3596
  description: 'Find files matching a glob pattern. Returns matching file paths sorted alphabetically (default 200 results). Use this to discover project structure, find files by name or extension, or check if a file exists. Common patterns: "**/*.ts" (all TypeScript files), "src/**/*.tsx" (React components in src), "*.json" (root-level JSON files). Automatically excludes node_modules and .git.',
3618
3597
  inputSchema: {
@@ -3716,7 +3695,6 @@ var init_listDir = __esm({
3716
3695
  MAX_CHILDREN = 15;
3717
3696
  listDirTool = {
3718
3697
  definition: {
3719
- clearable: true,
3720
3698
  name: "listDir",
3721
3699
  description: "List the contents of a directory with one level of subdirectory expansion. Shows file sizes and collapses single-child directory chains (a/b/c/ shown as one entry). Use this for a quick overview of a directory's structure. For finding files across the whole project, use glob instead.",
3722
3700
  inputSchema: {
@@ -3799,7 +3777,6 @@ var init_editsFinished = __esm({
3799
3777
  "use strict";
3800
3778
  editsFinishedTool = {
3801
3779
  definition: {
3802
- clearable: false,
3803
3780
  name: "editsFinished",
3804
3781
  description: "Signal that file edits are complete. Call this after you finish writing/editing files so the live preview updates cleanly. The preview is paused while you edit to avoid showing broken intermediate states \u2014 this unpauses it. If you forget to call this, the preview updates when your turn ends.",
3805
3782
  inputSchema: {
@@ -3887,7 +3864,6 @@ var init_lspDiagnostics = __esm({
3887
3864
  init_lsp();
3888
3865
  lspDiagnosticsTool = {
3889
3866
  definition: {
3890
- clearable: true,
3891
3867
  name: "lspDiagnostics",
3892
3868
  description: "Get TypeScript diagnostics (type errors, warnings) for a file, with suggested fixes when available. Use this after editing a file to check for errors.",
3893
3869
  inputSchema: {
@@ -3943,7 +3919,6 @@ var init_restartProcess = __esm({
3943
3919
  init_lsp();
3944
3920
  restartProcessTool = {
3945
3921
  definition: {
3946
- clearable: false,
3947
3922
  name: "restartProcess",
3948
3923
  description: "Restart a managed sandbox process. Use this after running npm install or changing package.json to restart the dev server so it picks up new dependencies.",
3949
3924
  inputSchema: {
@@ -3976,7 +3951,6 @@ var init_runScenario = __esm({
3976
3951
  "use strict";
3977
3952
  runScenarioTool = {
3978
3953
  definition: {
3979
- clearable: true,
3980
3954
  name: "runScenario",
3981
3955
  description: "Run a scenario to seed the dev database with test data. By default truncates all tables first, then executes the seed function and impersonates the scenario roles. Use skipTruncate to run the seed function against existing data without resetting. Blocks until complete. Scenario IDs are defined in mindstudio.json. If it fails, check .logs/tunnel.log or .logs/requests.ndjson for details. Return synchronously - no need to sleep before checking results.",
3982
3956
  inputSchema: {
@@ -4008,7 +3982,6 @@ var init_runMethod = __esm({
4008
3982
  "use strict";
4009
3983
  runMethodTool = {
4010
3984
  definition: {
4011
- clearable: true,
4012
3985
  name: "runMethod",
4013
3986
  description: 'Run a method in the dev environment and return the result. Use for testing methods after writing or modifying them. Returns output, captured console output, errors with stack traces, and duration. If it fails, check .logs/tunnel.log or .logs/requests.ndjson for more details. Returns synchronously \u2014 no need to sleep before checking results.\n\nBy default methods run unauthenticated. If the method is auth-gated (calls `auth.requireRole()`, filters on `auth.userId`, etc.), pass `userId: "testUser"` to run as the default test user \u2014 no scenario setup required, no userId lookup.',
4014
3987
  inputSchema: {
@@ -4049,7 +4022,6 @@ var init_queryDatabase = __esm({
4049
4022
  "use strict";
4050
4023
  queryDatabaseTool = {
4051
4024
  definition: {
4052
- clearable: true,
4053
4025
  name: "queryDatabase",
4054
4026
  description: "Execute a raw SQL query against the dev database and return the results. Use for inspecting data and debugging issues.",
4055
4027
  inputSchema: {
@@ -5026,7 +4998,6 @@ var init_tools2 = __esm({
5026
4998
  init_readSpec();
5027
4999
  BROWSER_TOOLS = [
5028
5000
  {
5029
- clearable: false,
5030
5001
  name: "setupBrowser",
5031
5002
  description: "Pre-authenticate the browser and optionally navigate to a starting page. Call this before interacting with authenticated content instead of manually logging in. Auth is optional \u2014 omit to just navigate without authenticating.",
5032
5003
  inputSchema: {
@@ -5059,7 +5030,6 @@ var init_tools2 = __esm({
5059
5030
  }
5060
5031
  },
5061
5032
  {
5062
- clearable: true,
5063
5033
  name: "browserCommand",
5064
5034
  description: "Interact with the app's live preview by sending browser commands. Commands execute sequentially with an animated cursor. Always start with a snapshot to see the current state and get ref identifiers. The result includes a snapshot field with the final page state after all steps complete. On error, the failing step has an error field and execution stops. Batches that contain an interactive step (click, type, select) also return a `recording` object \u2014 one chunk of a continuous per-session rrweb recording that the viewer stitches into a single replay (not a standalone per-call clip). Timeout: 120s.",
5065
5035
  inputSchema: {
@@ -5507,7 +5477,6 @@ var init_browserAutomation = __esm({
5507
5477
  CAPTURE_COMMANDS = /* @__PURE__ */ new Set(["screenshotViewport", "screenshotFullPage"]);
5508
5478
  browserAutomationTool = {
5509
5479
  definition: {
5510
- clearable: true,
5511
5480
  name: "runAutomatedBrowserTest",
5512
5481
  description: "Run an automated browser test against the live preview. Describe what to test \u2014 the agent figures out how. Use after meaningful changes to frontend code, to reproduce user-reported issues, or to test end-to-end flows. Never give it explicit values to use when filling out forms or creating accounts \u2014 it will use its own judgement (often it needs specific values to trigger dev-mode bypasses of things like login verification codes).",
5513
5482
  inputSchema: {
@@ -5598,7 +5567,6 @@ var init_screenshot2 = __esm({
5598
5567
  init_browserAutomation();
5599
5568
  init_surfaces();
5600
5569
  screenshotDefinition = {
5601
- clearable: true,
5602
5570
  name: "screenshot",
5603
5571
  description: "Capture a screenshot of the app preview and get a description of what's on screen. Choose `fullPage`: `false` captures just the visible viewport (fast \u2014 for a specific section the page is scrolled to), `true` captures the entire page top-to-bottom (slower \u2014 for overall composition or content past the fold). Captures the settled page state \u2014 it cannot catch animations, transitions, or transient state. The analysis is not precise about every detail \u2014 for example it cannot reliably identify specific fonts by name, only describe what the letterforms look like. Optionally provide specific questions about what you're looking for. Use a bulleted list to ask many questions at once. To ask additional questions about a screenshot you have already captured, pass its URL as `imageUrl` to skip recapture; `imageUrl` also accepts the disk path of an image file (a user upload, a saved asset) to analyze that instead of the preview. If the screenshot requires interaction first (logging in, clicking a tab, dismissing a modal, scrolling to a section), use the instructions param to describe the steps. To render a fixed-size image such as an Open Graph share card, set `width` and `height` (e.g. 1200 \xD7 630) and `format: 'png'`: the tool navigates to `path`, clips to exactly those pixel dimensions, and returns the image URL.",
5604
5572
  inputSchema: {
@@ -5672,7 +5640,6 @@ var init_searchGoogle2 = __esm({
5672
5640
  init_runMindstudioCli();
5673
5641
  init_runCli();
5674
5642
  definition = {
5675
- clearable: false,
5676
5643
  name: "searchGoogle",
5677
5644
  description: 'Search Google for web results. Reserch modern design trends in industries or verticals, "best [domain] apps 2026", ui patterns, or find something specific if the the user has an explicit reference. Searching for and reading case studies is a great way to get information and context about a project\'s domain. Prioritize authoritative sources like Figma and other design leaders, avoid random blog spam. Pick one or more URLs from the results and then use `scrapeWebUrl` to get their text content.',
5678
5645
  inputSchema: {
@@ -5715,7 +5682,6 @@ var init_scrapeWebUrl = __esm({
5715
5682
  init_runMindstudioCli();
5716
5683
  init_runCli();
5717
5684
  definition2 = {
5718
- clearable: false,
5719
5685
  name: "scrapeWebUrl",
5720
5686
  description: "Fetch the content of a web page as markdown. Use when reading sites from search results or specific things the user wants to incorporate.",
5721
5687
  inputSchema: {
@@ -5808,7 +5774,6 @@ Identify the specific design moves that make this page interesting and unique, d
5808
5774
  Respond only with your analysis as Markdown and absolutely no other text. Do not use emojis - use unicode if you need symbols.
5809
5775
  `;
5810
5776
  definition3 = {
5811
- clearable: false,
5812
5777
  name: "analyzeDesign",
5813
5778
  description: "Analyze the visual design of a website, an image URL, or an image file on disk. Websites are automatically screenshotted first. Provides static image analysis only, will not capture animations or video. If no prompt is provided, performs a full design reference analysis (mood, color, typography, layout, distinctiveness). Provide a custom prompt to ask a specific design question instead. Use a bulleted list to ask many questions at once.",
5814
5779
  inputSchema: {
@@ -5856,7 +5821,6 @@ var init_analyzeImage2 = __esm({
5856
5821
  init_screenshot();
5857
5822
  init_surfaces();
5858
5823
  definition4 = {
5859
- clearable: true,
5860
5824
  name: "analyzeImage",
5861
5825
  description: "Analyze an image using a vision model. Provides static image analysis only, will not capture animations or video. Returns an objective description of what is visible \u2014 shapes, colors, layout, text, artifacts. Use for factual inventory of image contents, not for subjective design judgment - the vision model providing the analysis has no sense of design. You are the design expert - use the analysis tool for factual inventory, then apply your own expertise for quality and suitability assessments. Optionally provide specific questions about what you're looking for. Use a bulleted list to ask many questions at once. If you are analyzing a screenshot of the app preview, you can reuse the same screenshot URL multiple times to ask multiple questions.",
5862
5826
  inputSchema: {
@@ -6128,7 +6092,6 @@ var init_generateImages = __esm({
6128
6092
  init_imageGenerator();
6129
6093
  init_surfaces();
6130
6094
  definition5 = {
6131
- clearable: false,
6132
6095
  name: "generateImages",
6133
6096
  description: "Generate images. Returns CDN URLs with a quality analysis for each image. Produces high-quality results for everything from photorealistic images and abstract/creative visuals. Pass multiple prompts to generate in parallel. No need to analyze images separately after generating \u2014 the analysis is included.",
6134
6097
  inputSchema: {
@@ -6204,7 +6167,6 @@ var init_editImages = __esm({
6204
6167
  init_imageGenerator();
6205
6168
  init_surfaces();
6206
6169
  definition6 = {
6207
- clearable: false,
6208
6170
  name: "editImages",
6209
6171
  description: "Edit or transform existing images. Provide one or more source image URLs as reference and a prompt describing the desired edit. Use for compositing, style transfer, subject transformation, blending multiple references, or incorporating one or more references into something new. Returns CDN URLs with analysis.",
6210
6172
  inputSchema: {
@@ -6267,7 +6229,6 @@ var init_copyEditor = __esm({
6267
6229
  BASE_PROMPT2 = readAsset("subagents/copyEditor", "prompt.md");
6268
6230
  copyEditorTool = {
6269
6231
  definition: {
6270
- clearable: false,
6271
6232
  name: "copyEditor",
6272
6233
  description: "Hand it user-facing copy and it hands back a sharper version \u2014 better structured for its audience and free of the overused words, telltale constructions, and rhythms that make text read as AI-generated. Think of it as a design expert for words: it elevates how the copy communicates and strips the AI fingerprints, but it never invents facts or claims you didn't give it. Use it on anything users will read: in-app strings, empty states, errors, the Build Overview, deck copy, launch posts, Slack announcements. Readonly.",
6273
6234
  inputSchema: {
@@ -6330,7 +6291,6 @@ var init_polishCopy = __esm({
6330
6291
  "use strict";
6331
6292
  init_copyEditor();
6332
6293
  definition7 = {
6333
- clearable: false,
6334
6294
  name: "polishCopy",
6335
6295
  description: "Hand off any user-facing copy you've written \u2014 headlines, captions, labels, body text \u2014 and get back a sharper version: better built for its audience and free of the fingerprints that make writing read as AI. It elevates how the copy communicates without inventing facts or claims you didn't give it. Give it the text plus what it's for (where it appears, the audience).",
6336
6296
  inputSchema: {
@@ -6824,7 +6784,6 @@ Visual design expert. Describe the situation and what you need \u2014 the agent
6824
6784
  ];
6825
6785
  designExpertTool = {
6826
6786
  definition: {
6827
- clearable: false,
6828
6787
  name: "visualDesignExpert",
6829
6788
  description: DESCRIPTION,
6830
6789
  inputSchema: {
@@ -7067,7 +7026,6 @@ var init_productVision = __esm({
7067
7026
  init_surfaces();
7068
7027
  productVisionTool = {
7069
7028
  definition: {
7070
- clearable: false,
7071
7029
  name: "productVision",
7072
7030
  description: "Owns the product roadmap. Reads spec and roadmap files automatically. Creates, updates, and deletes roadmap items in src/roadmap/. Describe the situation and what needs to happen.",
7073
7031
  inputSchema: {
@@ -7199,7 +7157,6 @@ var init_codeSanityCheck = __esm({
7199
7157
  BASE_PROMPT4 = readAsset("subagents/codeSanityCheck", "prompt.md");
7200
7158
  codeSanityCheckTool = {
7201
7159
  definition: {
7202
- clearable: false,
7203
7160
  name: "codeSanityCheck",
7204
7161
  description: 'Quick sanity check on an approach before building. Reviews architecture, package choices, and flags potential issues. Usually responds with "looks good." Occasionally catches something important. Readonly \u2014 can search the web and read code but cannot modify anything.',
7205
7162
  inputSchema: {
@@ -7341,7 +7298,6 @@ The copy in <overview_copy> is final \u2014 it was authored and edited before it
7341
7298
  </html>`;
7342
7299
  buildOverviewTool = {
7343
7300
  definition: {
7344
- clearable: false,
7345
7301
  name: "writeBuildOverview",
7346
7302
  description: "Generate or refresh the Build Overview \u2014 the project's home page in the Spec tab: a single-page, plain-language reference of everything the app actually contains, including the parts the user can't see (data stores, backend operations, access and roles, background jobs, seeded scenarios, the design system). You author the full copy: read the manifest and spec and state, plainly and exactly, what genuinely exists \u2014 real names and accurate counts \u2014 in calm, declarative, present-tense outcome language, with no persuasion or hype. Describe only what exists. Pass the complete copy as `content`; the design expert lays it out and skins it to the app's brand using your copy verbatim \u2014 it typesets your words, it does not rewrite them, so polish the copy before you pass it. Generate it at the end of a build; routine refreshes ride specSync's `refreshBuildOverview` flag instead, so call this directly only for the initial generation or when the user explicitly asks.",
7347
7303
  inputSchema: {
@@ -7432,7 +7388,6 @@ ${readAsset(
7432
7388
  // next real turn as a hidden background_results note instead.
7433
7389
  backgroundNotify: "passive",
7434
7390
  definition: {
7435
- clearable: false,
7436
7391
  name: "specSync",
7437
7392
  description: "Reconcile the spec to bring it in line with code changes you have made. Provide a brief, bulleted list of what changed and why; it finds the affected spec sections and updates them to match. Set `refreshBuildOverview` after a deploy or a large milestone to also re-author the Build Overview from the updated spec. Always runs in the background and completes silently \u2014 do not wait for it; its outcome appears as an automated note at the start of a later turn.",
7438
7393
  inputSchema: {
@@ -7527,7 +7482,6 @@ var init_scrapeWebUrl2 = __esm({
7527
7482
  init_runCli();
7528
7483
  scrapeWebUrlTool = {
7529
7484
  definition: {
7530
- clearable: false,
7531
7485
  name: "scrapeWebUrl",
7532
7486
  description: "Scrape the content of a web page. Returns the HTML of the page as markdown text. Optionally capture a screenshot if you need see the visual design. Use this when you need to fetch or analyze content from a website",
7533
7487
  inputSchema: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindstudio-ai/remy",
3
- "version": "0.1.267",
3
+ "version": "0.1.268",
4
4
  "description": "Remy coding agent",
5
5
  "repository": {
6
6
  "type": "git",