Simulator Reactions logo

Simulator Reactions

Organization
corezoid
simulator-reactions

Simulator.Company reactions specialist — comments, events, approvals, ratings and other feedback attached under an actor. Use when the user wants to comment on an actor, reply in a thread, read/like/pin the discussion, mark comments read, or get reaction stats. Activate when the user says "comment on this actor", "leave a note", "reply to", "show the comments/discussion", "pin this comment", "mark as read", "прокоментуй актор", "залиш коментар", "відповісти на коментар", "закріпи коментар", "оставь комментарий", "ответь в треде", "закрепи комментарий". For attaching FILES to a reaction use `simulator-attachments`; for the actor's own fields use `simulator-actors`.

Overview

Publishercorezoid
Repositorysimulator-ai-plugin
Skill namesimulator-reactions
Stars
61
Forks
13
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by corezoid on GitHub. Read the source before you install it.

Installation

Install the Simulator Reactions AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/corezoid/simulator-ai-plugin/tree/main/plugins/simulator/skills/simulator-reactions
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/corezoid/simulator-ai-plugin.git /tmp/simulator-ai-plugin
mkdir -p .claude/skills
cp -r /tmp/simulator-ai-plugin/plugins/simulator/skills/simulator-reactions .claude/skills/simulator-reactions
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Simulator Reactions in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Simulator Reactions on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Simulator Reactions is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Curated tool names (v2 server): createReaction, updateReaction, deleteReaction, getReactions, getReactionsStats, markReactionsRead, getPinnedReactions, togglePinnedReaction. Call them by these exact names.

Simulator.Company Reactions Specialist

Reactions are the comments / events / approvals / ratings that live under an actor. They are themselves actors, organised as a hierarchical (threaded) tree, so a reaction can reply to another reaction.

Relationship to the other skills

  • simulator-actors — the actor's own data fields (a reaction is about an actor, not its data).
  • simulator-attachments — files attached to a reaction or actor (a reaction can carry attachments).
  • simulator-graph — graph structure (links/layers), unrelated to reactions.

The one rule that trips everyone up: actorId vs reactionId

Every reaction path is addressed by the parent (root) actor, while the reaction's own id travels separately:

  • actorId (path) = the parent actor whose reaction tree you are working in.
  • reactionId (body, on update/delete/pin) = the specific reaction to act on.
  • parentId (on create) = the reaction you are replying to (omit for a top-level comment).

The tools expose these as distinct arguments, so you never collide the two.

Workspace context

Reactions are addressed by actorId (a UUID), so no accId is needed. Make sure you have the target actor's UUID (use simulator-actors / searchActors to find it) before commenting.


Comment on an actor

createReaction(
  type="comment",                 # everyday note; other types: view, rating, sign, ds, done, reject, freeze; ai = agent reply (see below)
  actorId="<parent actor UUID>",
  description="Looks good to me",  # the comment text
  notify=true)                     # default true; set false to post quietly

Reply in a thread — pass the parent reaction's id as parentId:

createReaction(type="comment", actorId="<parent actor UUID>",
  description="Agreed", parentId="<reaction UUID being replied to>")

Attach files by passing attachments (ids from uploadBase64 / getAttachments, see simulator-attachments):

createReaction(type="comment", actorId="<actor UUID>", description="see attached",
  attachments=[{ "attachId": 5521 }])

Edit / delete a reaction

updateReaction(actorId="<parent actor UUID>", reactionId="<reaction UUID>",
  description="Updated note")
deleteReaction(actorId="<parent actor UUID>", reactionId="<reaction UUID>")   # irreversible — confirm first

Read reactions

getReactions(actorId="<parent actor UUID>", view="tree", limit=30)   # view: tree | flat | thread
getReactionsStats(actorId="<parent actor UUID>")                     # counts by type, etc.
  • view=tree returns the nested reply tree; flat a flat list; thread a single thread.
  • parentId narrows to the replies under one reaction; from/to filter by created time.

AI agent reactions (extra.mcp)

A reaction can be handed to the platform's AI agent by creating it with extra.mcp = true. The platform then runs the agent on that reaction under the requesting user's access (the agent uses this same MCP server, so it can only read/write what the user can) and posts the answer back as a child ai reaction.

createReaction(type="comment", actorId="<actor UUID>",
  description="Summarize this actor and flag anything unusual",
  extra={ "mcp": true })            # → triggers the AI agent; its reply appears as a child `ai` reaction

The ai reply carries a reasoning object that the agent streams while it works:

  • reasoning.inProgress — true while the agent is still producing the answer.
  • reasoning.thoughts — [{ id, text, createdAt }], a step log (e.g. tools it used).
  • description — fills with the answer text (streamed live over WebSocket, then finalized).

So when reading a discussion (getReactions), an ai reaction with reasoning.inProgress = true is still being written; treat its description as partial.

Don't loop: the agent already replies on its own. Only set extra.mcp on a human request you want the agent to handle — not on the agent's own output. The platform bounds runaway chains, but creating extra.mcp reactions from agent output wastes turns.

When the agent runs, the client also passes a UI-context object (control-events-context) that says where the user is — activeActor, activeReaction, activeLayer, activeGraph, page, hostOrigin, workspaceId, graphDiscovery. Read it to resolve "here" / "this actor" / "this layer" and to default ids the user left implicit. See $CLAUDE_PLUGIN_ROOT/docs/entities/ui-context.md.

Attachments: actor vs. message are two different sets. Attachments are a per-actor linked collection, and a reaction is itself an actor — so there are two places a file can live, each read with getActorAttachments(<id>) → readAttachment:

  • The actor's own files ("files on this actor / the attachments tab") → getActorAttachments(activeActor).
  • A file the user attached to their message ("do you see the file I sent?") → the triggering message is a reaction under activeActor, so its file lives on that reaction, not on the actor. Use the reaction's id: prefer activeReaction from the UI context; if absent, find the trigger via getReactions(actorId=activeActor, view="flat", orderValue="DESC") — the newest human reaction (the one with extra.mcp) — and pass its id to getActorAttachments.

Pick the set the user means; if it's ambiguous, check both (the actor and the triggering reaction).

Embed a smart form, an actor card, or chips

A reaction can carry more than text:

  • Run a Smart Form (script) in the reaction — set appId to a Smart Form (CDU/Script app) actor id (+ optional appSettings {autorun, expired, users, groups, fullWidth}): createReaction(type="comment", actorId="<actor>", appId="<smartFormActorId>", appSettings={autorun:true}). (The same appId/appSettings embed a smart form into a regular actor — see simulator-smart-forms.)
  • Nested actor card — extra.linkedActorId embeds another actor as a preview card: createReaction(..., extra={ "linkedActorId": "<otherActorId>" }).
  • Inline chips / rich text — description renders BBCode: chips [actor=<id>]Label[/actor], [application=<smartFormId>]Label[/application], [user=…], [event=…]; formatting [b], [color=…], [h2], [ul][*]…[/ul], [url=…]; and [md]…[/md] for markdown. Fetch the environment's exact tag set with getBbcodeTags. BBCode works only OUTSIDE [md] blocks — keep chips/BBCode out of any [md]…[/md] section. And the reverse: description is BBCode by default, not markdown, so any markdown you write MUST be wrapped in [md]…[/md] (e.g. [md]## Title\n- item[/md]) or it renders as literal text. See docs/entities/reactions.md.

Pin & read state

getPinnedReactions(actorId="<parent actor UUID>")
togglePinnedReaction(actorId="<parent actor UUID>", reactionId="<reaction UUID>", pinned=true)
markReactionsRead(actorId="<parent actor UUID>", count=12)   # clears the unread badge

Reference Documents

PathWhen to read
$CLAUDE_PLUGIN_ROOT/docs/entities/reactions.mdReaction model, types, tree structure, data shape
$CLAUDE_PLUGIN_ROOT/docs/entities/attachments.mdAttaching files to a reaction

Tips

  • actorId is always the parent actor; the reaction's own id is reactionId (update/delete/pin).
  • type="comment" is the default note; the full set is view/comment/ai/rating/sign/ds/done/reject/freeze — reserve sign/ds/done/reject for real approval / sign-off / completion flows (there is no approve type).
  • Reply by setting parentId; omit it for a top-level comment.
  • notify=false posts without sending notifications (it is honoured — sent explicitly).
  • deleteReaction is irreversible — confirm with the user first.
  • To attach a file, upload it first (uploadBase64 → attachId) then pass attachments:[{attachId}] — see simulator-attachments.

Frequently asked questions

What does the Simulator Reactions AI skill do?

Simulator.Company reactions specialist — comments, events, approvals, ratings and other feedback attached under an actor. Use when the user wants to comment on an actor, reply in a thread, read/like/pin the discussion, mark comments read, or get reaction stats. Activate when the user says "comment on this actor", "leave a note", "reply to", "show the comments/discussion", "pin this comment", "mark as read", "прокоментуй актор", "залиш коментар", "відповісти на коментар", "закріпи коментар", "оставь комментарий", "ответь в треде", "закрепи комментарий". For attaching FILES to a reaction use...

Why use Simulator Reactions on TypingMind?

Because you install it once and use it with any model. Simulator Reactions is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Simulator Reactions in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/corezoid/simulator-ai-plugin/tree/main/plugins/simulator/skills/simulator-reactions. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Simulator Reactions?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Simulator Reactions?

As many as you like. As long as a model supports skills, you can use Simulator Reactions with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Simulator Reactions AI skill free?

Yes. It is published on GitHub by corezoid under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇