[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-96715":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":16,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":17,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":29,"readmeContent":30,"aiSummary":10,"trendingCount":15,"starSnapshotCount":15,"syncStatus":31,"lastSyncTime":32,"discoverSource":33},96715,"jev-webmcp-extension","sdras\u002Fjev-webmcp-extension","sdras","A small extension that demos the combination of Jev x WebMCP","https:\u002F\u002Fchromewebstore.google.com\u002Fdetail\u002Fjev-%C3%97-webmcp\u002Fgglnhcbhjfbmcpgccnmolbhejloflgkb?authuser=0&hl=en",null,"JavaScript",115,7,1,0,5,15,55.86,"Apache License 2.0",false,"main",true,[24,25,26,27,28],"chrome","extension","extension-chrome","jev","webmcp","2026-09-25 04:01:33","# Jev × WebMCP Chrome Extension\n\nA Chrome extension that uses **Jev**, TypeSafe's System One model, to select and populate **WebMCP tool calls** from user input. The side panel discovers tools exposed by the current page and displays predicted calls, confidence scores, and latency as the user types. Tool selection is derived from the page's schemas, without site-specific configuration.\n\n```\n\"got anything gluten free in the bakery aisle?\"\n\nsearch_products({ department: \"Bakery\", dietary: [\"gluten-free\"] })     98%   164 ms\n```\n\n![Jev side panel predicting an add_to_cart call alongside the Basketful grocery demo](icons\u002Fscreenshot.jpg)\n\n## How schema conversion works\n\nWebMCP exposes named tools with descriptions, parameter schemas, enums, and annotations. Jev accepts state and typed questions (Choice, Score, Noul) and returns typed answers with probabilities. It answers the questions in parallel and does not generate text.\n\nThe panel converts tool schemas into questions as follows:\n\n| In the tool's schema | Becomes |\n| --- | --- |\n| the list of tools | one Choice over `name -> description`, plus \"none of these\" |\n| `enum`, `const`, `oneOf` of consts | Choice over the allowed values |\n| `boolean` | Noul |\n| array of enum | one Noul per member |\n| integer with a small `minimum`..`maximum` | Choice over the range |\n| free-text `string` | Choice over spans of the user's own words |\n| other numbers | Choice over the numbers the user stated (parsed in code) |\n| anything optional | an extra \"is it stated?\" Noul, so the tool's default stands when it isn't |\n\n## Set it up\n\n1. Chrome 149 or newer with WebMCP available (a site in the origin trial, or `chrome:\u002F\u002Fflags\u002F#enable-webmcp-testing`).\n2. `chrome:\u002F\u002Fextensions` → turn on Developer mode → **Load unpacked** → choose this folder.\n3. Click the extension's toolbar button to open the side panel.\n4. Open settings (the sliders icon), paste a key from [console.typesafe.ai\u002Fkeys](https:\u002F\u002Fconsole.typesafe.ai\u002Fkeys), Save. The key is checked against the API and kept in `chrome.storage.local`.\n5. Go to a site with WebMCP tools and press **Enable on (site)**. Host access is granted one site at a time.\n\nThere is no build step. Edit a file, press the reload arrow on `chrome:\u002F\u002Fextensions`, reopen the panel.\n\n## Demo walkthrough\n\nOpen the [Basketful live demo](https:\u002F\u002Fshopping-webmcp-demo.netlify.app\u002F), or run the [shopping cart demo repository](https:\u002F\u002Fgithub.com\u002Fsdras\u002Fshopping-cart-webmcp) locally with `npm run dev`, then follow these steps:\n\n1. **Tool discovery.** Open the panel to view the discovered tools and the questions generated from their schemas. Expand a tool to inspect its description and question count.\n2. **Predictions while typing.** Enter `got anything gluten free in the bakery aisle?` to see the predicted tool, arguments, and latency update. Confident calls to `search_products` can run automatically because the tool has a `readOnlyHint` annotation.\n3. **Ambiguous input.** Enter `the cheap one` to inspect alternative argument predictions and changes in confidence.\n4. **Manual tool selection.** Click a candidate tool to select it for execution. Arguments for all candidate tools are predicted in the same request. From the keyboard, press ↓ at the end of the input to move through candidates and Enter to run the selected tool, subject to confirmation requirements. The selection persists while typing; press ↑ back to the top to return to automatic tool selection.\n5. **Missing arguments.** Enter `make it three of those instead`. The quantity can be resolved, but the product field remains blank for manual entry when the model cannot identify it.\n6. **Execution and confirmation.** Enter `add two oat milks`. Calls that change state require Enter. At checkout, `ok buy it` selects `place_order`, whose consequential annotation requires a second Enter regardless of confidence.\n7. **Unmatched requests.** Enter `tell me a joke` to see the “no tool fits” result. Such requests could be handled by a separate System Two model.\n8. **Inspecting requests in the playground.** Select “Open in playground” to load the request's state and questions into the TypeSafe playground.\n\n## Safety model\n\nFollows Chrome's [agent security guidance for WebMCP](https:\u002F\u002Fdeveloper.chrome.com\u002Fdocs\u002Fagents\u002Fsecurity).\n\n- **Per-site access.** The panel requests `optional_host_permissions` when you enable a site. The extension accesses only enabled sites.\n- **Execution controls.** Tools are treated as state-changing unless they declare `readOnlyHint`. Only confident, read-only calls can run automatically, and automatic execution can be disabled. Consequential or destructive annotations always require a second Enter. Clicking a candidate selects the tool; low-confidence arguments, flagged manifests, and consequential annotations still require confirmation with a second click. The second click of a double-click does not count as confirmation.\n- **Manifest screening.** When tools load, Jev evaluates each tool description for instructions directed at an agent. Flagged tools receive a badge and cannot run automatically.\n- **Model input boundary.** Tool results are displayed in the panel and are not included in model requests. Page-provided tool descriptions and schemas remain untrusted inputs and may influence tool selection or arguments. Manifest screening and execution confirmation provide additional checks.\n- **Text rendering.** Tool names, descriptions, and results are rendered as text nodes, rather than HTML.\n\n## Working on it\n\n```\nnpm test          # core: schema -> questions, answers -> call, policy (no network)\nnpm run harness   # the panel as a plain web page on fixtures, with a labeled mock model\nnpm run eval      # real API, Basketful's manifest: accuracy + latency (needs TYPESAFE_API_KEY)\n```\n\n```\nsrc\u002Fcore\u002F        pure JavaScript, no chrome.*, no DOM\n  questions.js   tools + utterance -> Jev questions and a decode plan\n  spans.js       candidate spans and numbers from the user's words\n  decode.js      answers -> { name, args, confidence, per-argument detail }\n  policy.js      auto \u002F ready \u002F confirm \u002F incomplete \u002F none\n  screen.js      manifest screening\nsrc\u002Fjev.js       fetch client for api.typesafe.ai\u002Fv1\u002Fsystemone\nsrc\u002Fplatform\u002F    chrome.js (real: scripting, permissions, storage) and mock.js (harness)\nsrc\u002Fpanel\u002F       the side panel\nevals\u002Frun.js     sentences -> expected calls, against the real model\n```\n\nThe page bridge (`pageListTools` \u002F `pageCallTool` in `src\u002Fplatform\u002Fchrome.js`) runs in the page's main world through `chrome.scripting`. The bridge handles two API requirements: Chrome returns `inputSchema` as a JSON **string**, and `executeTool` wants the `RegisteredTool` object plus arguments as a JSON string.\n\n## Limitations\n\n- Array arguments, including `items: [...]`, currently populate only the first element.\n- Prediction quality depends on the question wording in `src\u002Fcore\u002Fquestions.js`. Evaluation failures may require changes to these questions.\n\nLicensed under [Apache 2.0](LICENSE). The vendored `vendor\u002Flz-string.min.js` is third-party and stays under its own MIT license (`vendor\u002Flz-string.LICENSE`).\n",2,"2026-09-24 02:30:07","CREATED_QUERY"]