๐Ÿฆ€ Gajae Code

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 enabled

Follow the Telegram onboarding guide โ†’

  • Configure-once Telegram UX. A managed reference daemon pairs exactly one private chat, enforces one getUpdates poller 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.
Off unless configured. No endpoint exists until notifications are enabled and a token is present. The Telegram daemon is a reference client of the generic SDK, not the upstream topology.

๐Ÿ”ฌ 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, and web_search are exposed (plus inspection-only bash prefixes, goal, and a complete_research tool). The allowlist is asserted after the tool registry is assembled, so a leaked edit/write/task/browser tool fails the launch loudly instead of silently mutating your repo.
  • Live notebook. Every executed cell streams into .gjc/rlm/<session>/notebook.ipynb via single-queue atomic temp-rename writes with post-write validation.
  • Synthesized report. A .gjc/rlm/<session>/report.md is generated on session exit.
  • Optional data context. Auto-loads a project-root DATA.md (override with --data <path>).
v1 scope: interactive sessions ship today. Autonomous goal-arg runs, --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-natives bindings (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. busyPromptMode defaults to steer: pressing Enter on a normal prompt interrupts the active turn. Queueing for the next turn moves to the explicit Ctrl+Enter follow-up keystroke (or busyPromptMode: "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.