freezonex/tier0-sdk/tier0-sdk-notifications

Claude Code and agent skill by freezonex/tier0-sdk

Trust tier 3
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

Tier0 SDK message notifications for TypeScript/JavaScript. Before using this Skill, first read tier0-sdk for shared SDK version, configuration, runtime, and layering rules. Use when selecting a human recipient from Tier0 members, sending an in-app notification with optional web/mobile push reminders, or querying delivery status through @tier0/sdk/openapi. Resolve recipient IDs internally from member data; never make users enter or understand a user ID.

Install

npx vskill@latest install freezonex/tier0-sdk/tier0-sdk-notifications

SKILL.md

Tier0 SDK — Notifications

Before starting, read the root SDK Skill at [`../SKILL.md`](../SKILL.md).

⚠️ Response format differs from every other endpoint

The two notifications endpoints do not use the {code, msg, data} envelope:

  • Success: HTTP 200 with a bare JSON body (e.g. { messageId, status, createdAt }). Read fields directly — result.data does not exist.
  • Failure: a real HTTP status code (400/401/403/404/409/422/429) with body { errorCode, message }. The SDK client throws ApiError; the raw error JSON lands in error.msg. Parsing pattern is in `references/send.md`.

Recipient UX invariant

recipientUserId is an internal transport field, not a user-facing concept.

  • In an app, present a searchable member picker using names, nickname, email, and relevant roles. Store the selected member's userId internally and pass it to the send API; never render a free-text “User ID” field.
  • In an agent conversation, ask for a recognizable person such as a name or email, query the member list, and show human-readable candidates when ambiguous. Never ask the user to find, paste, or choose a numeric ID.
  • For a project-scoped audience, query that project's members. For a Workspace-wide audience, query platform members with statuses: ['active']. Read `tier0-sdk-members` before implementing either picker.
  • A trusted business record may already contain a previously resolved userId; use it internally without exposing it. Do not accept an arbitrary ID supplied through ordinary end-user input.
  • If the API key cannot query members, treat that as an app configuration or permission error. Do not fall back to raw-ID input. Cloud member queries currently require uns:read in addition to the notification permissions.

Notification decisions

Resolve the recipient and message from the user intent. Apply the SDK channel contract below:

ParameterDecided byRule
RecipientUserAsk who should receive it using name/email or a member picker. Resolve userId internally from members; if multiple candidates match, show human-readable labels and let the user choose — never show IDs or guess
channelsUser intent / SDK default“Notify the user” → omit channels (SDK sends ['web', 'mobile']); all reminders → ['web', 'mobile']; Web & Desktop only → ['web']; Mobile only → ['mobile']; inbox only → []. Never generate desktop or narrow channels based on the App page type
Title / contentUser (agent may draft, user reviews)The agent enforces length limits (50/800 chars); the content itself is the user's intent
modeAgent detects the scenario; ask when unsureSee send.md. Never silently default to live when uncertain
idempotencyKeyAgentBusiness-event key discipline, see send.md
senderAgentFilled from the calling app's identity, see send.md. An app sender sends type: 'app' + id from getCurrentAppId() + meta.projectId from getCurrentProjectId(), and omits `name` — the server looks the real App name up. Never hard-code the appId. Only an other sender names itself
linkAgent (ask when ambiguous)The Open-button target, derived from whatever the notification is about (the order, the alarming device, the work order). For a screen inside the sending App this is simply the App's own router path (/alerts/tank01), see send.md. Ask when the destination is not obvious — and confirm the recipient can actually reach it. Omitting it is fine, but it does not guarantee no button: there are two navigation sources — link, and sender.type=app carrying both id (appId) and meta.projectId, which offers "open the sending App". No button appears when both sources are absent — and regardless of sources when the sending App is undeployed (stopped/deleted), see send.md
typeNo choiceFixed "inbox", the only accepted value

Channel examples

For a resolved notification body, choose one request shape:

typescript
notificationsApi.openapiv1notificationssend(body); // default: Web & Desktop + Mobile
notificationsApi.openapiv1notificationssend({ ...body, channels: ['web', 'mobile'] }); // all
notificationsApi.openapiv1notificationssend({ ...body, channels: ['web'] }); // Web & Desktop
notificationsApi.openapiv1notificationssend({ ...body, channels: ['mobile'] }); // Mobile
notificationsApi.openapiv1notificationssend({ ...body, channels: [] }); // inbox only

These are alternatives, not five sends for the same event. See send.md for the full request and upgrade notes.

Scope Routing

NeedRead
Send a notification (inbox + optional push), sender contract, idempotency, error codes`references/send.md`
Query delivery status by messageId, poll until terminal state`references/get.md`

Final Checklist

  1. The user selected a recognizable member; no UI or prompt asked for a raw user ID.
  2. recipientUserId was resolved internally from member data or a trusted business relation.
  3. Recipient came from user intent; channels follow the SDK default or the user's explicit scope. Inbox-only requests use [].
  4. The recipient is an active member of the API key's workspace.
  5. idempotencyKey is a business-event key, reused verbatim on retries.
  6. Responses were parsed as bare JSON (no envelope) and errors via ApiError.status + JSON in ApiError.msg.
  7. Status reported to the user says "sent", never "seen/read" — there is no read receipt.
  8. If a link was sent, it passes every rule in send.md — https:// or / prefix, protocol-relative //host and backslashes rejected, ≤500 characters, no Unicode whitespace / control / invisible format characters — and points at something the recipient has permission to open.

Security

  • Security scanPassed, 90 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

7-day trend score
0

Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/freezonex/tier0-sdk/tier0-sdk-notifications/badge)](https://verified-skill.com/skills/freezonex/tier0-sdk/tier0-sdk-notifications)

Something wrong with this skill or its page? Tell us.