Documentation
What's new in v0.7.1
A notifications SDK and a managed Telegram control plane: get action-needed signals out of any session and answer or steer from your phone, without scraping the terminal or running RPC.
๐ฒ Notifications SDK & Telegram control plane
Every running session can expose one loopback WebSocket endpoint that emits action-needed signals and accepts replies over a small, transport-agnostic JSON protocol. Telegram, Discord, Slack, or your own client all speak the same contract โ no upstream change is needed for a new integration.
gjc notify setup # one-time: pair a private Telegram chat
# sessions then auto-connect when notifications are enabledFollow the Telegram onboarding guide โ
- Configure-once Telegram UX. A managed reference daemon pairs exactly one private chat, enforces one
getUpdatespoller per bot token (no Telegram 409 conflicts), and routes replies back to the exact session. - Threaded per-session surface. Each session gets its own topic with an identity header, streamed context updates (last message, task, goal, token/model usage, diff), live turn output, typing indicators, and agent image streaming.
- Answer asks remotely. Tap an inline button or reply in the thread; the first valid answer wins in both interactive and unattended modes. Markdown tables render natively and button labels are clean (no double-numbering).
- Daemon control plane with safe reload. New sessions attach to the existing daemon owner, and the control plane reloads without dropping in-flight sessions or losing connection-drop recovery.
- Strict, fail-closed trust model. Only the paired chat receives anything; groups/channels never see session names or actions. Redaction strips idle summaries and streamed content, while asks stay readable so remote prompts remain answerable.
๐ฌ Research mode โ gjc rlm
A Jupyter-notebook-style research session layered over the existing agent loop, backed by the shared persistent Python kernel. It is built for exploring data and questions, not mutating your repository.
gjc rlm # interactive research session
gjc rlm "What drives the spike in orders?" # seed an initial question
gjc rlm --data ./datasets/DATA.md # point at a data description
- Hard-gated toolset. Only
python,read, andweb_searchare exposed (plus inspection-onlybashprefixes,goal, and acomplete_researchtool). The allowlist is asserted after the tool registry is assembled, so a leakededit/write/task/browsertool fails the launch loudly instead of silently mutating your repo. - Live notebook. Every executed cell streams into
.gjc/rlm/<session>/notebook.ipynbvia single-queue atomic temp-rename writes with post-write validation. - Synthesized report. A
.gjc/rlm/<session>/report.mdis generated on session exit. - Optional data context. Auto-loads a project-root
DATA.md(override with--data <path>).
--resume, managed per-workspace venv provisioning, and an optional completion gate are deferred follow-ups.๐ฅ๏ธ Desktop control โ the computer tool (experimental)
A model-agnostic tool that lets the agent drive a real macOS desktop using the OpenAI computer-use action set: screenshot, click, double_click, move, drag, scroll, type, keypress, and wait.
- Native + HiDPI-safe. Backed by fresh Rust
pi-nativesbindings (ComputerController/computerScreenshot). The returned screenshot's pixel dimensions are the action coordinate space; Rust owns the transform to macOS logical points. - Apple Silicon macOS. v1 is macOS-only; Linux/Windows are deferred behind the same tool schema.
- User-only kill-switch. A supervisor-enforced global hotkey (default
Control+Option+Command+Escape) aborts queued actions, releases held keys/buttons, and suspends further input outside model control. Reset is user-only. - TCC preflighted. Accessibility + Screen Recording grants are checked up front; a missing grant returns a clear "grant then retry" error rather than a silent black frame.
Off by default. Enable per session with computer.enabled=true on a supported host. This surface is an experimental preview and is still stabilizing.
๐ง Interaction & lifecycle
- Steer-by-default while busy.
busyPromptModedefaults tosteer: pressing Enter on a normal prompt interrupts the active turn. Queueing for the next turn moves to the explicit Ctrl+Enter follow-up keystroke (orbusyPromptMode: "queue"). goal({op:"pause"}). The agent can now park a goal whose remaining work is blocked on human input, instead of dropping it or leaving it re-firing the autonomous-continuation steer every turn.- Release unblock. Deprecated GitHub Actions Intel macOS (
macos-13/darwin-x64) release binaries are excluded from CI; Intel macOS users should install through npm/Bun or build from source.
Upgrade
bun install -g gajae-code # or: @gajae-code/coding-agent
gjc --version && gjc --smoke-test
See the full v0.7.1 release notes on GitHub.