Releases: ThinkOffApp/ide-agent-kit
v0.9.0: user-intent-kit embedded
Added
- user-intent-kit embedded: the UIK codebase now lives at
packages/user-intent-kit(JS client + adapters + Python/Swift/Kotlin ports), wired in as afile:dependency. It remains independently publishable. src/intent.mjs: single construction point for intent clients/adapters from theintentconfig block (camelCase and snake_case keys both accepted), with a 30s intent cache shared by enrichment and nudge gating.intentCLI command:ide-agent-kit intent <get|profile|derived|state|patch|heartbeat|daemon>.stateshows the two-level user state plus the background gate verdict;daemonis the embedded equivalent ofuik-daemon, driven byconfig.intent.*instead of env vars.- Nudge suppression in
rooms watch: whenconfig.intentis set and the user'surgency_modeisemergency-only, the poller still writes notification files but skips the tmux/command nudge. Opt out withintent.suppress_nudges: false. Fails open on API errors.
Fixed
- Intent enrichment never worked:
enrichment.mjsauthenticated withAuthorization: Bearerbut the intent API expectsX-API-Key, so every event carried the placeholder intent. Now uses the embedded IntentClient (correct auth) plus the shared cache, so message bursts cost one API call instead of one per event. loadConfigdropped theintent,memory_api, andmoltbookblocks: it rebuilds the config from an allowlist of known sections and these three were missing, so their settings silently never reached consumers through any CLI entry point. All three now pass through, with a regression test.
Changed
fetchIntentGateinbackground.mjsis built on the embedded IntentClient instead of a hand-rolled fetch. Same gate rules, same return shape, same fail-open behavior.npm testnow also runs the embedded user-intent-kit suite (101 tests).
Also includes ClaudeMB's MCP room tools, secure /wake endpoint, wake-script config canonicalization, and multi-agent routing docs (#12).
v0.8.2 — text-area-content wake skip (replaces frontmost over-skip)
@claudemm caught that v0.7.5's frontmost-app skip over-fired and made agents look offline whenever the user had Claude.app focused. Replaced with the precise text-area accessibility check claudemm originally proposed — skip only when prompt input is non-empty (user actively typing). Applied to all three osascript wake scripts.
v0.8.1 — per-agent author attribution
Per-agent API key map for the GroupMind announcer + from_handle override on POST /intent. Confirmation chat posts now show the originating agent (claudemm, CodexMB, etc.) rather than always the daemon owner. Configure via mcp.confirmations.api_keys = { '@handle': 'xfb_...', ... }.
v0.7.5 — skip wake when target app frontmost
@claudemm caught: auto-wake injected keystrokes mid-typing if user was already in the target Claude app, garbling the in-flight prompt. Fix: AppleScript checks if frontmost is the target before sending; skip if yes. The user's eventual submit will surface queued /tmp messages via UserPromptSubmit hook.
v0.7.4 — wake: 250ms delay between text and Enter
@Petrus reported 'tmux check rooms with no Enter' — typed text appears in Claude desktop app's prompt input but Enter doesn't actually submit the turn. Same class of bug @claudemm fixed in Feb 2026 for the CLI tmux Claude TUI: keystroke text and key code 36 (Return) fired back-to-back inside a single AppleScript tell-block sometimes meant the Enter landed before the typed text was processed.
Fix: split into two tell-blocks with a 250ms delay between. Applied across all three osascript wake scripts (claudemb-wake, codex_gui_nudge, gemini_gui_nudge).
v0.8.0 — wake-on-mention auto-path
Per @Petrus's ask: when a new room message contains @<peer> for any handle in mcp.confirmations.peers, the poller automatically fires POST /wake on that peer's daemon URL. Sub-second cross-machine nudge with no manual MCP call needed.
Configure in ide-agent-kit.json:
"mcp": {
"confirmations": {
"peers": {
"@claudemm": "http://192.168.50.105:8788",
"@CodexMB": "http://192.168.50.105:8788"
}
}
}And set IAK_SELF_HANDLE=@claudeMB (or your handle) on the poller to skip self-mentions.
Logs to /tmp/iak-wake-on-mention.log.
v0.7.3 — wake fix coverage for tools/codex_gui_nudge.sh
Final straggler from the grep — tools/codex_gui_nudge.sh had the same osascript race bug as the other two wake scripts. Same fix pattern. All three are now consistent.
v0.7.2 — wake fix coverage for tools/gemini_gui_nudge.sh
v0.7.1 — fix silent osascript wake keystroke race
Patch release.
Bug: claudemb-wake.sh used tell application "System Events" to keystroke which routes to whichever process is frontmost at execution time. If Claude.app didn't fully take focus during the 0.3s activation delay (multi-window, focus contention), keystrokes landed in the user's actual foreground app with NO error logged. @claudemm observed ~10 lost wakes in a 16-min window on the mini.
Fix: bind the keystroke target to the process explicitly via tell process "$APP_NAME" / set frontmost to true / keystroke. Plus a post-keystroke verify check that logs WARN when finalFront != target for any remaining edge cases.
Affected: anyone using the AppleScript wake path (claudemb-wake.sh in the IAK poller). The Stop hook path (claudecode-stop-resume.sh) was unaffected — it uses exit code 2 + stderr, no keystroke.
v0.7.0 — MCP server + confirmations + easy install
First release with the full IAK confirmation pipeline + the matching CodeWatch app integration.
Highlights
MCP server
New iak-mcp-server (stdio) and long-running iak-mcp-daemon (HTTP). Tools:
wake_ide,wake_all,wake_remote— nudge agent sessions locally and across machines.request_confirmation— block until the user approves / denies, surfaced via GroupMind chat, the daemon's web UI on port 8788, and CodeWatch on Android.tmux_run,read_session,list_sessions,list_intents,approve_intent,deny_intent.
Confirmation registry
- HTTP server on port 8788:
POST /intent,GET /intents,POST /intent/<id>/decision,POST /wake. - Browser UI at
/with Approve/Deny buttons (works on Wear OS / phone / Mac). - Chat-reply poller catches
/approve <id>and/deny <id>from any subscribed room member. - GroupMind announcements include
metadata.actions+metadata.intent_idso the chat UI renders inline buttons (matching antfarm PR #13).
One-shot macOS installer
curl -fsSL https://raw.githubusercontent.com/ThinkOffApp/ide-agent-kit/main/scripts/install.sh | bash
Idempotent. Installs prereqs via brew, clones, npm install, writes starter config, wires UserPromptSubmit + Stop hooks into ~/.claude/settings.json, starts daemon in tmux, prints LAN URL to paste into CodeWatch.
Auto-wake mechanisms
scripts/claudemb-poll.sh— room poller that drops new messages into/tmp/iak-new-messages.txt.scripts/claudemb-wake.sh— osascript injector that typescheck roomsinto the Claude desktop app (focus-preserving).scripts/claudecode-stop-resume.sh— Stop hook that resumes a turn with new messages, no Accessibility permission required.scripts/check-rooms-hook.sh— UserPromptSubmit hook that prepends new room messages to user prompts.
Docs
docs/auto-wake.md — full setup with ASCII diagram and troubleshooting.
Companion repos
- CodeWatch — phone app, Settings + Setup card + notification action buttons end-to-end.
- antfarm (GroupMind) PR #13 — inline Approve/Deny buttons on chat messages.
Tests
76 / 76 passing across 13 suites on Node 18, 20, 22.