Blinks a red bar around the prompt when this session cannot continue without you (go-gate block, permission request, question)


Language / Sprache / Idioma: English · Deutsch · Português
<b>The operating system for AI agent harnesses.</b><br/> One install: the same skills in nine harnesses. Subagents and the hook-enforced GO gate on Claude Code, Antigravity, Codex and OpenCode.
Built for <b>event and media technicians</b>, <b>designers</b> and <b>managers</b>, for <b>builders of custom installations</b> (show control, 3D, PCB and enclosure), and just as much for <b>everyday coding</b> of apps, tools and plugins. The skill library and the MCP servers cover both worlds.
AOS installs a curated skill library, a subagent roster, gate hooks and a runnable multi-agent build pipeline into every coding-agent harness on your machine.
npx -y @hybridlabor-api/aos@latest
<img alt="Claude Code" src="https://img.shields.io/badge/Claude%20Code-D97757?logo=anthropic&logoColor=white"> <img alt="Antigravity" src="https://img.shields.io/badge/Google%20Antigravity-4285F4?logo=google&logoColor=white"> <img alt="Codex CLI" src="https://img.shields.io/badge/Codex%20CLI-412991?logo=openai&logoColor=white"> <img alt="OpenCode" src="https://img.shields.io/badge/OpenCode-111827"> <img alt="Cursor" src="https://img.shields.io/badge/Cursor-000000?logo=cursor&logoColor=white"> <img alt="Windsurf" src="https://img.shields.io/badge/Windsurf-0B100F"> <img alt="Roo Code / Cline" src="https://img.shields.io/badge/Roo%20Code%20%2F%20Cline-5B21B6"> <img alt="Aider" src="https://img.shields.io/badge/Aider-14B814"> <img alt="AOS CLI" src="https://img.shields.io/badge/AOS%20CLI-pi--based-0d1117">
<sub>Recommended: the full installer above. Alternatively, use the skills CLI:</sub>
<table> <tr> <td width="100%" valign="top" align="left"><b>Install skills only</b><br/><br/><code>npx skills add hybridlabor-api/aos</code><br/><br/><sub>Gate hooks and MCP servers require the full installer. Plugin marketplace route is in progress; see <a href="#plugins-and-marketplace">Plugins and marketplace</a>.</sub></td> </tr> </table>
<sub>Skills use the open <a href="https://agentskills.io">Agent Skills</a> format (<code>SKILL.md</code>). AOS installs them for <b>Claude Code, Google Antigravity, Codex CLI, OpenCode, Cursor, Windsurf, Roo Code / Cline, Aider and the AOS CLI</b>, so all of them behave the same way.</sub>
<img src="docs/assets/readme/architecture-hero.svg" alt="How AOS fits together: nine harnesses feed one kernel of 270 skills, 45 subagents, gate hooks and 21 MCP servers, which drives three pipelines, session-to-session messaging and local tools, with the GO gate in front of every release command" width="100%">
| Harness default | With AOS | |
|---|---|---|
| Skills | Each harness has its own skill folder and its own copies. | <!-- count:skills -->270<!-- /count --> skills in eight categories, written as <name>/SKILL.md into every harness you have. One source tree. |
| Subagents | Agent files written by hand, per harness, in that harness's format. | <!-- count:agents -->45<!-- /count --> subagents compiled into each harness's native agent format (Claude Code, Antigravity, Codex, OpenCode only; others use rules in AGENTS.md). |
| Release safety | A rule in a prompt that the agent is asked to respect. | A PreToolUse hook (Claude Code, Antigravity, Codex, OpenCode) or rules in AGENTS.md (others) that blocks git push, npm publish, npm version and recursive rm until your own message is the literal word GO. |
| Multi-agent builds | Agents that call agents, with the routing inside their prompts. | A dispatcher graph: nodes never invoke each other, state is durable, a repair loop has a no-progress guard, escalation goes to you. |
| Plans | Scroll back through the chat to find what was agreed. | Plan Canvas: annotate the plan in a browser, then approve it before any agent builds. |
| Visibility | Read logs in several terminals. | agenttrail live map per repo, and a fleet band in Claude Code with gate mode, token-weather and who waits for your GO. |
| Sessions | Each session is alone in its terminal. | A2A between live Claude Code, OpenCode, agy and Codex sessions on localhost. An inbound message is never a GO. |
| Beyond code | Coding assistants know code. | 19 media-eventtech skills and MCP servers for grandMA3, Resolume, TouchDesigner, Unreal, DaVinci, After Effects, Blender and Rhino; godmode-hardware-pcb for KiCad and OpenSCAD; playbooks for offers, invoices, crew call sheets and event trackers. |
<table> <tr> <td width="33%" valign="top">🎯 <b>Skills</b><br/>270 curated skills in eight categories, discoverable by every harness as <code><name>/SKILL.md</code>.<br/>→ <a href="#skills-at-a-glance">Skills at a glance</a></td> <td width="33%" valign="top">👥 <b>Subagents</b><br/>45 subagents: Architect, TechLead, Reviewer, Godmodes and specialist reviewers.<br/>→ <a href="#the-dispatcher-graph">The dispatcher graph</a></td> <td width="33%" valign="top">🔌 <b>MCP servers</b><br/>21 servers for creative software, OS control, memory and cross-harness delegation.<br/>→ <a href="#mcp-servers">MCP servers</a></td> </tr> <tr> <td width="33%" valign="top">🚀 <b>Pipelines & GO gate</b><br/><code>/startcycle</code>, <code>/startcycle-graph</code>, <code>/startcycle-graph-user</code>, and hook-enforced release gate.<br/>→ <a href="#the-pipelines">The pipelines</a></td> <td width="33%" valign="top">💬 <b>Sessions that talk</b><br/>A2A between Claude Code, OpenCode, agy and Codex sessions on localhost.<br/>→ <a href="#a2a-sessions-that-talk-to-each-other">A2A</a></td> <td width="33%" valign="top">🛠️ <b>Tools</b><br/>Plan Canvas, agenttrail, archify, AOS Store, AOS Hub, aos sessions, fleet band, aos doctor.<br/>→ <a href="#skills-at-a-glance">Tools</a></td> </tr> </table>
<table> <tr> <td width="20%" valign="top"><b>Event & media tech</b><br/>• Live show control: grandMA3, Resolume, TouchDesigner<br/>• Media production: Unreal, DaVinci, After Effects</td> <td width="20%" valign="top"><b>Design</b><br/>• UI/UX design system and brand discovery<br/>• Landing pages, app redesigns, Plan Canvas</td> <td width="20%" valign="top"><b>Management</b><br/>• Offers, invoices, budget tracking<br/>• Crew sheets, event planning, meeting actions</td> <td width="20%" valign="top"><b>Custom builds</b><br/>• PCB design and OpenSCAD enclosures<br/>• 3D assets, Rhino, Blender modeling</td> <td width="20%" valign="top"><b>General dev</b><br/>• Backend, frontend, testing, and shipping<br/>• 45 subagents, three pipelines, library skills</td> </tr> </table>
See Playbooks for guided workflows across these domains.
| I want to... | Run |
|---|---|
| Install for every harness I have | npx -y @hybridlabor-api/aos@latest |
| Install with low context overhead | npx -y @hybridlabor-api/aos@latest --profile=minimal |
| Refresh only the gates and hooks | npx -y @hybridlabor-api/aos@latest --hooks-only |
| See what would change first | npx -y @hybridlabor-api/aos@latest --dry-run |
| Check a broken setup | aos doctor |
| Open the local control page (services, catalog, store, plans) | aos hub |
| Browse and add skills and agents | aos store ui |
| Add the code knowledge graph | npx -y @hybridlabor-api/aos@latest -y --modules=codebase-memory |
| Plan a feature, then build it | /plan, then /startcycle-graph |
<img src="docs/assets/readme/agenttrail-live.gif" alt="agenttrail live plan map of a running multi-agent build" width="100%"><br/> <sub><b>agenttrail.</b> The live map of a multi-agent build while it runs. <a href="docs/assets/readme/agenttrail-live.mp4">▶ Full-quality video</a></sub>
<table> <tr> <td width="50%" valign="top" align="center"> <img src="docs/assets/readme/plan-canvas.png" alt="Plan Canvas with an annotation on a plan element" width="100%"><br/> <sub><b>Plan Canvas.</b> Annotate the plan in the browser, then approve it before any agent builds.</sub> </td> <td width="50%" valign="top" align="center"> <img src="docs/assets/readme/ao-pipeline.png" alt="AO workspace: the AOS Pipeline monitor with plan, gate, build, review and ship stages and the role-to-model routing" width="100%"><br/> <sub><b>AO workspace.</b> The pipeline monitor, plan to ship, with role and model routing per node.</sub> </td> </tr> <tr> <td width="50%" valign="top" align="center"> <img src="docs/assets/readme/aos-store.png" alt="AOS Store web UI: skills, agents and playbooks by scope, category and source" width="100%"><br/> <sub><b>AOS Store.</b> Skills, agents and playbooks on 127.0.0.1:4322.</sub> </td> <td width="50%" valign="top" align="center"> <img src="docs/assets/readme/codenotch-usage.png" alt="Codenotch: agents running and busy per harness, AOS and AO versions" width="100%"><br/> <sub><b>Codenotch.</b> Agents running and busy per harness.</sub> </td> </tr> </table>
<img src="docs/assets/readme/fleet-band.png" alt="Fleet band in Claude Code showing gate mode, context use and sessions with their GO counts" width="100%"><br/> <sub><b>Fleet band.</b> In Claude Code: gate mode, token-weather, and the sessions that wait for your GO.</sub>
<img src="docs/assets/readme/aos-installer.gif" alt="AOS installer: boot animation, pre-flight telemetry and the setup menu" width="100%"><br/> <sub><b>Installer.</b> <code>npx -y @hybridlabor-api/aos@latest</code>: boot, pre-flight telemetry, then the setup menu. <a href="docs/assets/readme/aos-installer.mp4">▶ Full-quality video</a></sub>
/startcycle - linear build pipeline (Architect, TechLead, parallel build, Reviewer) with file hand-offs in production_artifacts//startcycle-graph - dispatcher graph with durable state.json, Reviewer repair loop, quality gate and escalationarchitect, techlead, godmode-ui-ux, godmode-engineering, godmode-media-eventtech, reviewer and godmode-shipping; they never call each other/startcycle-graph-user - throwaway 2-4 node fan-out for any project, nothing persistent left behind/plan - draft, render in a browser canvas, annotate, await approval, then hand offplan-canvas - local canvas where you annotate elements, chat and approve or request changesplan-arbiter - compare competing plans from several agents and produce one recommended plan/bdbrainstorm - multi-agent brainstorm that ends in a hand-off to /startcycle-graph/grill-me - relentless interview to sharpen a plan or designbdbmediastorm - brainstorming for live event tech, show control and real-time media/playbooks - list every pb-* playbook with duration, difficulty and requirements, and start onepb-bug-fix - GitHub issue to tested fix and PR; push and PR only after GOpb-ship - triage, review and gate the day's PRs; merge only after GOpb-release-aos - release AOS to npm through the release-please PRpb-show-build - build a show across grandMA3, Resolume and TouchDesigner, offline firstpb-offer - draft a client offer priced from your price list; send only after GOfactory-collect - Factory: collect and triage feedback, telemetry, errors and issue reportsfactory-lookback - audit recurring problems across sources for systemic fixesfactory-review-prs - review a configured PR queue; approve and merge stay with youfactory-human-digest - read-only digest of what still needs a human decisiongogate - show or explain the go-gate mode (hard, soft, off) and the time-limited grants; CLI: aos-gogateaos-a2a - list, send to and reply to live harness peers over A2A on localhostmaster-session - supervise several sessions: roster, status requests, GO board; workers can be spawned through aos-acpmcsc - delegate a task to another installed CLI harness (agy, OpenCode, Codex)agenttrail - live browser map of a multi-agent build; CLI: aos-trailaos-store - browse, preview and install skills and agents from a local web UI (aos store)memb-skill - local-first long-term memory engine (memB)memb-ingest - ingest project files and conversation logs into memBopenwiki-skill - initialize, update and visualize codebase wikis with OpenWikisynapse-integration-skill - BDB Synapse 3D codebase visualizer integration/doctor - check the machine and the current project, print suggested permissions.allow entries, write no settingsaos-setup - bring a machine to a complete, verified AOS installationaos-project-init - set up a project folder: slug, wiki, memory, Synapse map, AGENTS.mdgodmode-engineering - strict DDD, TypeScript strictness, Clean Architecture, 5-step debugging triagegodmode-ui-ux - brand discovery, Anti-Slop rules, DTCG design tokens, fluid motiongodmode-eventtech - show-control execution for grandMA3, Resolume, Unreal, Rhino, Vectorworks and Adobe MCPgodmode-hardware-pcb - schematics, PCB layout, KiCad and OpenSCAD enclosures with DFM/DRC/ERC sign-offgodmode-shipping - final gatekeeper: pre-launch checks, feature-flag rollouts, rollback planningread-the-damn-docs - forces a docs pass before coding third-party APIs from memorystay-within-limits - respect 5-hour and weekly usage limits in long or parallel runsquick-recap - end each response with a red/yellow/green status lineFull catalogs (every skill, subagent, playbook and MCP server) are in the collapsible lists under What's included.
v5 changes how AOS gets onto a machine and how its parts talk to each other.
| Area | What changed |
|---|---|
| Installer | Rebuilt flow: Kernel, Harnesses, Packages, Optional, Verify. Profiles minimal, standard, full; --no-hooks, --hooks-only, --without=<ids>; repair and uninstall from the manifest; one version check at the start with Update as the default. See Install and docs/install-options.md. |
| MCP gateway | aos-gateway: one local endpoint (1mcp behind a token-checking forwarder) in front of an allow list of shipped servers, aos-gateway adopt for your own stdio servers, and one MCP per app (Blender, Resolume, After Effects). Installed with the default profile; opt out with aos-gateway direct, --without=gateway or --profile=minimal. docs/mcp-gateway.md. |
| A2A | Live Claude Code, OpenCode, agy and Codex sessions message each other with aos-a2a. An inbound message is never a GO. Any MCP-capable harness can join through the aos-a2a MCP server. docs/a2a.md. |
| Native agents | Subagents are compiled into the formats and paths each harness really reads, including OpenCode and agy. No model is pinned unless you set one: docs/agent-models.md. |
| Fleet mod | A band in Claude Code: gate mode, token-weather (context percent as a weather word plus a sparkline), and which sessions work or wait for you with their GO counts. aos-gogate shows gate state read-only. |
| AOS Hub | One local page for everything AOS runs on demand, on 127.0.0.1:7900: Services, Catalog, Store and Plans. aos hub, aos services, aos restart. It replaces the old Launchpad HTTP server; aos-dashboard is now a thin alias. docs/hub.md. |
| agenttrail | One live map per repo, started automatically, with a link in your session. A v2 control room is in progress. |
| Plan Canvas | Plans open in a local canvas; annotations are dispatched back to the agent. |
| go-gate | Read, test and build commands with no write or network effect pass without a GO; deny logs mask credentials; hooks in four harnesses; a machine-wide gate profile (strict, work, off) narrows or widens it. |
| Playbooks and Factory | 35 pb-* playbooks, the nine factory-* skills and plan-arbiter. |
| Orchestrator chain | master session, project orchestrator, package orchestrator, mapped to real mechanisms. |
In progress, not claimed as shipped. agenttrail v2 control room, A2A intercom and a2abook, A2A spawn mode, skill-create and instinct-*.
The graph is harness-neutral and runs on Claude Code's Dynamic Workflows, Antigravity's parallel execution, and any compatible agent harness.
%%{init: {"theme": "base", "themeVariables": {"lineColor": "#6e7681", "edgeLabelBackground": "#f6f1e8", "textColor": "#15171A", "clusterBkg": "#F7F4EC", "clusterBorder": "#B9B5AA", "titleColor": "#15171A", "primaryColor": "#FFFFFF", "primaryBorderColor": "#15171A", "primaryTextColor": "#15171A"}}}%%
flowchart TB
subgraph SG[" "]
direction TB
U(["User"])
A["<b>Architect</b><br/>System Plan"]
T["<b>TechLead</b><br/>Capability Map"]
UX["<b>UI_UX</b><br/>Frontend"]
EN["<b>Engineering</b><br/>Backend"]
ME["<b>Media_EventTech</b><br/>Creative"]
R["<b>Reviewer</b><br/>QA"]
S["<b>Shipping</b><br/>Gate"]
U --> A --> T
T --> UX & EN & ME
UX & EN & ME --> R
R --> S
T -.->|reject| A
R -.->|findings| UX
S -.->|gate fail| EN
R -.->|escalate| U
end
classDef plan fill:#E6F4EA,stroke:#1A7F3C,color:#15171A
classDef build fill:#FFFFFF,stroke:#15171A,color:#15171A
classDef gate fill:#1A7F3C,stroke:#1A7F3C,color:#FFFFFF
classDef human fill:#F7F4EC,stroke:#5B6168,color:#15171A
classDef store fill:#F7F4EC,stroke:#B9B5AA,color:#15171A
linkStyle default stroke:#6e7681,stroke-width:2px
style SG fill:#F7F4EC,stroke:#B9B5AA,color:#15171A
class A,T plan
class UX,EN,ME build
class R,S gate
class U human
Requirements. Node.js >= 20. macOS, Linux and Windows (PowerShell).
npx -y @hybridlabor-api/aos@latest
First run. The installer detects which harnesses are present, asks which to target and which tier (Pro MEDIA or Basic), copies the skills into each harness's skill directory, compiles the subagents, wires the hooks, merges the MCP configuration into each harness's own config file (existing entries are kept), and offers the optional modules listed below.
Every later run opens a menu instead:
| Menu item | What it does |
|---|---|
| Quick Update | Refreshes skills, templates, hooks and installed modules to the version you just ran |
| Run System Checkup / Doctor | Runs aos doctor: dependencies, file placement, daemons, hooks |
| Drop Local Project Harness | Copies the dispatcher contract into the current directory (see below) |
| Reconfigure System | Change targets, tier, profile or options |
| Uninstall AOS | Removes what the installer placed; your data stays |
| Flag | Effect |
|---|---|
--profile=standard (default) | Skills, agents, rules, all hooks, MCPs, OpenWiki, fleet. Token Saver is off by default (use --profile=full to include it); for CLI output compression install rtk yourself, AOS does not install it. |
--profile=minimal | Skills, agents and harness rules only. No context-injection hooks, OpenWiki, Token Saver, Codenotch, optional modules, gateway or fleet. The low-context choice. |
--profile=full | standard plus every optional module (same as --modules=all with -y). |
| --no-hooks | Skips only the cont
hooks/register.tsx 152 lines1import { atom, read, update } from 'claude-code'
2import type { EngineInterface, Register } from 'claude-code'
3
4import type { AlertState } from '../types'
5
6const CMD_MAX = 60
7const BLINK_MS = 600
8const STEADY_AFTER_MS = 30_000
9const TEST_MS = 6_000
10const IDLE: AlertState = { active: false, reason: '', since: 0 }
11
12const alert_ = atom({ plugin: 'bdb-aos-alert', key: 'alert' } as const, IDLE)
13const frame_ = atom({ plugin: 'bdb-aos-alert', key: 'frame' } as const, 0)
14
15export const maskCommand = (cmd: string) => {
16 const s = cmd
17 .replace(/\b(?:sk-[A-Za-z0-9_-]{8,}|ghp_[A-Za-z0-9]{8,}|gho_[A-Za-z0-9]{8,}|github_pat_[A-Za-z0-9_]{8,}|xox[bp]-[A-Za-z0-9-]{8,}|AKIA[A-Z0-9]{12,})/g, '***')
18 .replace(/\bBearer\s+[^\s"']+/gi, 'Bearer ***')
19 .replace(/(--(?:token|password|secret|api-key)[= ])[^\s&"']+/gi, '$1***')
20 .replace(/\b[A-Za-z0-9_]*(?:KEY|TOKEN|SECRET|PASSWORD)=[^\s&"']+/gi, m => `${m.split('=')[0]}=***`)
21 .replace(/\b[A-Za-z0-9]{32,}\b/g, '***')
22 return s.length > CMD_MAX ? `${s.slice(0, CMD_MAX - 1)}…` : s
23}
24
25export const isReleaseClassBlock = (text: string) => text.includes('release class')
26
27export type Phase = 'on' | 'off' | 'steady'
28
29export const blinkPhase = (frame: number, elapsedMs: number): Phase =>
30 elapsedMs >= STEADY_AFTER_MS ? 'steady' : frame % 2 === 1 ? 'on' : 'off'
31
32export const barText = (reason: string, width: number) =>
33 ` ▲ ACTION NEEDED · ${reason} · type GO / answer in this window `.padEnd(width, ' ')
34
35const isElement = (node: unknown): node is { type: string } =>
36 !!node && typeof node === 'object' && 'type' in node
37
38async function activate($: EngineInterface, reason: string) {
39 const now = await $.clock.now()
40 await update($, alert_, a => (a.active && a.reason === reason ? a : { active: true, reason, since: now }))
41 await update($, frame_, () => 1)
42}
43
44async function clear($: EngineInterface) {
45 if ((await read($, alert_)).active) await update($, alert_, () => IDLE)
46}
47
48async function tick($: EngineInterface) {
49 if ((await read($, alert_)).active) await update($, frame_, f => f + 1)
50}
51
52async function sampleReason($: EngineInterface) {
53 return (await $.env.get('AOS_FLEET_DEMO')) === '1' ? 'GO needed: git push origin feat/demo-landing' : 'test alarm'
54}
55
56async function startTest($: EngineInterface) {
57 await activate($, await sampleReason($))
58 $.clock.after(TEST_MS, () => void clear($))
59}
60
61async function statusText($: EngineInterface) {
62 const a = await read($, alert_)
63 return a.active ? `ALERT active: ${a.reason}` : 'No alert. /aos-alert test shows a sample, /aos-alert off clears.'
64}
65
66async function view($: EngineInterface) {
67 const a = await read($, alert_)
68 const frame = await read($, frame_)
69 const now = await $.clock.now()
70 return { a, phase: blinkPhase(frame, now - a.since) }
71}
72
73async function renderBar($: EngineInterface, e: Parameters<EngineInterface['ui']['resolve']>[0], width: number) {
74 const { a, phase } = await view($)
75 const { Text } = $.ui.resolve(e)
76 const text = barText(a.reason, width)
77 return phase === 'off' ? (
78 <Text key="alert" color="red" dimColor wrap="truncate-end">{text}</Text>
79 ) : (
80 <Text key="alert" bold color="white" backgroundColor="red" wrap="truncate-end">{text}</Text>
81 )
82}
83
84export const register: Register = on => {
85 on('session.start', async ($, e, next) => {
86 const result = await next(e)
87 await $.command.register({ name: 'aos-alert', description: 'Show the alert bar status; "off" clears it, "test" shows a sample' })
88 $.clock.every(BLINK_MS, () => void tick($))
89 return result
90 })
91
92 on('session.end', async ($, e, next) => {
93 await clear($)
94 return next(e)
95 })
96
97 on('turn.start', async ($, e, next) => {
98 await clear($)
99 return next(e)
100 })
101
102 on('classic.PermissionRequest', async ($, e, next) => {
103 await activate($, `allow? ${e.tool_name}`)
104 return next(e)
105 })
106
107 on('tool.call', async ($, e, next) => {
108 if (e.tool === 'AskUserQuestion') await activate($, 'question')
109 const result = await next(e)
110 if (result.isError && result.text && /go-gate/i.test(result.text)) {
111 const label = isReleaseClassBlock(result.text) ? 'GO needed (release class)' : 'GO needed'
112 await activate($, `${label}: ${e.tool === 'Bash' ? maskCommand(e.command) : String(e.tool)}`)
113 } else if (!result.isError) {
114 await clear($)
115 }
116 return result
117 })
118
119 on('command.run', { command: 'aos-alert' }, async ($, e) => {
120 const arg = e.args.trim()
121 if (arg === 'off') {
122 await clear($)
123 return { text: 'Alert cleared.' }
124 }
125 if (arg === 'test') {
126 await startTest($)
127 return { text: `Test alarm for ${TEST_MS / 1000} s.` }
128 }
129 return { text: await statusText($) }
130 })
131
132 on('ui.render', { component: 'AbovePrompt' }, async ($, e, next) => {
133 const below = await next(e)
134 if (!(await read($, alert_)).active) return below
135 const { Box } = $.ui.resolve(e)
136 const bar = await renderBar($, e, e.props.bodyColumns)
137 return (
138 <Box flexDirection="column">
139 {bar}
140 {isElement(below) ? below : null}
141 </Box>
142 )
143 })
144
145 on('ui.render', { component: 'PromptHint' }, async ($, e, next) => {
146 const a = await read($, alert_)
147 if (!a.active) return next(e)
148 if (e.props.isDraft) return next({ ...e, props: { ...e.props, tail: ` ▲ ${a.reason}` } })
149 return renderBar($, e, 0)
150 })
151}
152types/index.d.ts 11 lines1export type AlertState = { active: boolean; reason: string; since: number }
2
3declare module 'claude-code' {
4 interface PluginState {
5 'bdb-aos-alert': {
6 alert: AlertState
7 frame: number
8 }
9 }
10}
11