Simulator Access logo

Simulator Access

Organization
corezoid
simulator-access

Simulator.Company access-control specialist — who can view/modify/remove/sign/execute an object (actor, form, account, template, tree layer). Use when the user wants to share or unshare an object, grant or revoke permissions, list who has access, or bulk-share. Activate when the user says "share this with", "give access to", "grant permission", "revoke access", "who can see/edit this", "set permissions", "make read-only", "поділись з", "надай доступ", "забери доступ", "хто має доступ", "права доступу", "дай доступ", "открой доступ", "отзови доступ", "кто имеет доступ", "права доступа". Also activate when a tool fails because the caller has NO access to an object — "request access", "I can't see this actor", "access denied", "403", "no permission", "запроси доступ", "немає доступу", "немає прав", "відмовлено в доступі", "запроси доступ", "нет доступа", "доступ запрещён". For the object's own data use the domain skill (`simulator-actors` / `simulator-forms` / `simulator-finance`).

Overview

Publishercorezoid
Repositorysimulator-ai-plugin
Skill namesimulator-access
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 Access 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-access
  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-access .claude/skills/simulator-access
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Simulator Access 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 Access 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 Access 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): getAccessRules, saveAccessRules, getTemplateActorsAccess, saveTemplateActorsAccess, getTreeLayerAccess, saveTreeLayerAccess, bulkSaveAccessRules, bulkSaveAccountPairsAccessRules, requestAccess. Call them by these exact names.

Simulator.Company Access-Control Specialist

Access rules say who (a user, SA user, or group) can do what (view / modify / remove / sign / ds / execute) to an object. Grants are applied asynchronously — save calls return a taskId.

The model

  • objType — one of actor, form, account, formTemplate, templateActors, treeLayer.
  • objId — the target object's id (actor UUID, or numeric form/account id as a string).
  • rules — a JSON array of operations: {action, data} where action ∈ create | update | delete.
  • data — identifies the grantee by exactly one of userId | saId | groupId, plus:
    • privs — {view, modify, remove (required booleans), sign?, ds?, execute?}. view is implied when any other privilege is set.
    • reactionOrders? — {sign, ds, execute} positive integers ordering those reactions (same number = parallel, higher waits for lower). Optional — pass it only to set a sequence. A user holding sign/ds/execute without an order still counts toward task completion; once anyone on the object has an order, such a user acts after the ordered users of that stage. On update of an actor's own access, resend reactionOrders to keep the sequence — omitting it clears the stored order. A graph/layer cascade never touches sign/ds/execute or their orders on the actors inside.
  • recursive (default true) — cascade to child objects. Set false to apply to this object only.
  • notify (default true) — send access-change notifications. Set false to apply quietly.

recursive/notify default to true; the tools send an explicit false when you set it, so an opt-out is honoured. "Grant but don't cascade to children" ⇒ recursive=false.

Workspace context

Objects are addressed by their own id (objId), so most tools need no accId. Only bulkSaveAccountPairsAccessRules takes an accId (defaults to the configured workspace).

Finding the grantee (userId / groupId)

A rule's grantee is identified by a real userId (or saId / groupId) — resolve it first, never guess:

  • searchUsers(accId, query) — find a workspace member by name/email (the quickest path).
  • getUsers(accId) — list all members.
  • getUser(accId, userId, type="group") — resolve a group id when sharing with a group.

Share onto the user, never their twin actor. Each user has a 1:1 digital-twin actor, but access is granted to the userId — pass userId in the rule's data, not the twin actor's id. The twin actor is for transactions / accounts / graph placement (getSystemActor), not for sharing. See $CLAUDE_PLUGIN_ROOT/docs/entities/users.md.


Read who has access

getAccessRules(objType="actor", objId="<actor UUID>")      # actor | form | account | formTemplate | treeLayer
getTemplateActorsAccess(objId="<form-template id>")        # the actors of a form template
getTreeLayerAccess(objId="<layer / root actor id>")        # the actors on a tree layer

Grant / change / revoke

# Give user 4210 view + modify on an actor, but not delete:
saveAccessRules(objType="actor", objId="<actor UUID>", rules=[
  { "action": "create", "data": {
      "userId": 4210,
      "privs": { "view": true, "modify": true, "remove": false } } }
])

# Revoke a group's access to an account entirely:
saveAccessRules(objType="account", objId="<account id>", rules=[
  { "action": "delete", "data": { "groupId": 88 } }
])

# Apply to this object only (don't cascade) and stay quiet:
saveAccessRules(objType="actor", objId="<UUID>", recursive=false, notify=false, rules=[ … ])

saveTemplateActorsAccess(objId=<form-template id>, rules=[…]) and saveTreeLayerAccess(objId=<layer id>, rules=[…]) take the same rules shape for the template-actor and tree-layer scopes.

Bulk

# Many objects at once (≤50), each with its own rules:
bulkSaveAccessRules(items=[
  { "objType": "form", "objId": "42", "rules": [ … ] },
  { "objType": "actor", "objId": "<UUID>", "rules": [ … ] }
])

# Share a whole account-name category across the workspace (every account named <prefix>_*):
bulkSaveAccountPairsAccessRules(accId="ws_xxx", items=[
  { "objId": "<account-name id prefix>", "rules": [ … ] }
])

Requesting access (when YOU can't see an object)

Mid-task a tool may fail with 403 / Access Denied (or getActor etc. returns not-found) because the current user has no view access to that object. Don't give up or guess — ask the owner for access with requestAccess:

requestAccess(objType="actor", objId="<actor UUID>")          # request view access
requestAccess(objType="actor", objId="<actor UUID>", modify=true)   # request view + edit
  • requestAccess does not grant access — it raises a request to the object's owner(s) (creates a REQUEST_ACCESS invite + a request-access event they can approve/decline). You then have to wait for approval before the blocked operation will work.
  • Idempotent: a pending request for the same object is reused, not duplicated — calling it again is safe and returns the existing invite + requestEventId.
  • You do not need access to the object to call it (it's the one access tool that works without view). objType is usually actor; it also accepts form / account / template / treeLayer.
  • This is the requesting side. Approving a request is the owner granting access — i.e. a normal saveAccessRules(... privs:{view:true}) on the object (or the owner acts on the request-access event in the UI).

When a read/write step is blocked by access, tell the user it's blocked, call requestAccess, and report that approval is pending — rather than failing silently or inventing data.


Tips

  • A save returns a taskId (applied async); the change may take a moment to fully propagate.
  • Identify the grantee by exactly one of userId / saId / groupId.
  • privs.view/modify/remove are required; sign/ds/execute optional. Setting any privilege implies view.
  • reactionOrders is optional — a single executor needs only execute:true.
  • recursive=false ⇒ this object only; notify=false ⇒ no notifications (both honoured).
  • Blocked by access? Use requestAccess(objType, objId) — it asks the owner (doesn't grant); approval is needed before retrying. It's the one access tool callable without view.
  • Use action:"delete" (grantee id only) to revoke; create/update to grant or change.
  • Resolve user/group ids first (don't guess) — grantees must belong to the workspace or the rule is rejected.

Frequently asked questions

What does the Simulator Access AI skill do?

Simulator.Company access-control specialist — who can view/modify/remove/sign/execute an object (actor, form, account, template, tree layer). Use when the user wants to share or unshare an object, grant or revoke permissions, list who has access, or bulk-share. Activate when the user says "share this with", "give access to", "grant permission", "revoke access", "who can see/edit this", "set permissions", "make read-only", "поділись з", "надай доступ", "забери доступ", "хто має доступ", "права доступу", "дай доступ", "открой доступ", "отзови доступ", "кто имеет доступ", "права доступа". Also...

Why use Simulator Access on TypingMind?

Because you install it once and use it with any model. Simulator Access 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 Access 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-access. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Simulator Access?

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 Access?

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

Is the Simulator Access 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 👇