Claude Modsunofficial directory

Automation·terminal·MIT

typesafe-mod

TypeSafe's Jev scores the agent's this-or-that questions, or answers them for you.

typesafe-mod has no screenshot yet: a placeholder terminal with the band above the prompt highlighted

typesafe-mod puts a second, smaller model between Claude Code and the choices it stops to make. When Claude asks you a this-or-that question through the AskUserQuestion tool, the mod sends the question and its options to TypeSafe’s Jev model and draws a probability bar per option above the dialog. One switch lets Jev answer in your place. A second, optional router ranks your installed skills against every prompt you type. Both routers send data to TypeSafe’s API, so read How it works before you install.

What it does

  • Decision router, on by default. Each single-choice question in an AskUserQuestion dialog gets a distribution over its options and a confidence score. The dialog opens as usual with a panel above it, and the same numbers go to the transcript as a typesafe-mod: line. You still pick.
  • Auto-answer, opt-in. With TYPESAFE_AUTO_ANSWER=1, a dialog with a single question whose confidence reaches 0.75 never opens: the mod answers it and Claude carries on. Below the floor, or with several questions in one dialog, you get asked.
  • Skill router, opt-in. With TYPESAFE_SKILL_ROUTER=1, one request per prompt ranks every installed skill against what you typed and asks whether the turn needs a procedure at all. A confident winner becomes one advisory line in the model’s context; the skill list itself is not changed, so prefix caching still holds.
  • Fails open. A missing key, an HTTP error, an unparseable body or a call over 4 seconds let the turn continue as if the mod were not there.

According to the README, Jev returns typed answers (a choice, a yes/no score) with probabilities instead of prose. The README says nothing more about what TypeSafe is, beyond a hosted API with its own key and per-token billing.

Install

Needs Claude Code 2.1.287 or later and a TypeSafe API key, obtained at console.typesafe.ai/keys and exported as TYPESAFE_API_KEY in the environment Claude Code runs in. Without the key the mod loads and does nothing. A comment in the code says the dialog panel was measured on 2.1.274.

claude plugin marketplace add BeLazy167/typesafe-mod
claude plugin install typesafe-mod@typesafe-mod

To try it for one session, start claude --plugin-dir /path/to/typesafe-mod from a checkout. Four environment variables control it:

  • TYPESAFE_API_KEY: unset, and neither router runs.
  • TYPESAFE_DECIDE_OFF: any value stops the decision router.
  • TYPESAFE_AUTO_ANSWER=1: Jev answers single questions outright instead of advising.
  • TYPESAFE_SKILL_ROUTER=1: turns the skill router on.

The same author publishes claude-mods-skill, a skill for building mods like this one.

How it works

Everything goes to one endpoint, https://api.typesafe.ai/v1/systemone, as a POST with your key as a bearer token and jev-latest as the model. No other network call is made.

On tool.call for AskUserQuestion, the mod reads the tool’s questions array. For each single-select step with two or more options it sends the question text, every option’s label and description, and the path of your working directory, framed as “a coding agent paused mid-task in ”. It does not send the conversation, your prompt or any file. Jev returns a chosen option, a probability per option and a confidence. The mod stores that result in Claude Code’s plugin store under last-decision.v1 and writes one transcript line per question. Multi-select steps are skipped with a note saying why.

With auto-answer on and exactly one question over the 0.75 floor, the hook answers the tool call itself, so a question meant for you is answered by a third-party model. It checks first that the label is one of the options offered. A hook can only answer a tool call through deny, which the model receives as an error result, so a successful decision renders in red and, in the author’s words, “the agent may argue with it rather than proceed.” That is why advice is the default.

On ui.render for AskUserQuestion, the mod reads the stored decision and wraps the engine’s own dialog in a box: a title, up to four bar rows and a footer saying whether the confidence cleared the floor. A dialog with several questions gets one row per question rather than one question’s bars, because the render event does not say which step is on screen.

On session.start, only when the skill router is on, the mod runs one shell command, find -L over ~/.claude/skills and ~/.claude/plugins for every SKILL.md, and reads the first 60 lines of each. It keeps the name and the first 80 characters of the description, up to 500 skills, in the plugin store under skill-roster.v1.

On prompt.submit, again only when the skill router is on, the mod sends your full prompt text together with the roster of skill names and truncated descriptions. Prompts under 12 characters and slash commands are skipped. If Jev names a skill with confidence 0.6 or more and judges that the turn needs a procedure, the mod appends a <skill_relevance> block naming that skill to the prompt’s context. This adds 166 to 420 ms to every prompt, which is why it is off by default.

Cost. Jev bills input tokens only, at $0.042 per million. The README measures one decision at 374 tokens and one skill-router call at 6,772 tokens on 194 skills, roughly $0.85 a month at 100 prompts a day. The decision router costs almost nothing because it fires only when Claude asks you something.

Limitations

  • The decision router judges from the question, its options and your working directory path, not from the conversation. Questions that depend on anything else route worse.
  • Skill names that appear in more than one plugin (54 of 194 in the author’s install) keep the first copy found, so the hint may name a different plugin’s version.
  • The skill scan runs through sh and find, so it needs a Unix-like shell. Every prompt pays for the whole roster in tokens.
  • The confidence floors (0.6 for skills, 0.75 for decisions) are constants in hooks/suggest.ts, not settings. Changing them means editing a checkout.