You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/src/content/docs/reference/roadmap.mdx
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -88,11 +88,11 @@ jackin' is a functional proof of concept, not a stable product line. **`Claude C
88
88
89
89
### Reactive daemon program
90
90
91
-
-**[jackin' daemon — umbrella](/reference/roadmap/jackin-daemon/)** — introduce the long-running per-operator-user host process jackin' will use for reactive features. One umbrella item that decides lifecycle, install method, control socket, security posture, and log redaction once so each reactive feature plugs into one daemon shape. The full list of phase-2/phase-3 reactive adapters lives in the program doc and the sidebar under **Reference → Roadmap → Reactive daemon program** (status: open — design proposal)
92
-
-**[jackin' Desktop Agent Hub](/reference/roadmap/jackin-desktop-agent-hub/)** — native macOS menu bar and desktop companion for active jackin' workspaces, isolated agent sessions, PR jump links, and built-in-runtime account state (Claude, Codex, Amp, Kimi, OpenCode), with CodexBar and OpenUsage as scoped references for account quota surfaces. Keeps the agent TUIs as the primary agent UI while using the daemon as the shared state/event backend (status: open — design proposal)
91
+
-**[jackin' daemon — umbrella](/reference/roadmap/jackin-daemon/)** — long-running per-operator-user host process for reactive features. The base lifecycle, socket protocol, Desktop read/action methods, notification bridge, keep-awake reconciliation, and cache warmup are implemented; Capsule-backed live session indexing, real event streaming, live auth sync, quota telemetry, and approved host actions remain open. The full list of remaining reactive adapters lives in the program doc and the sidebar under **Reference → Roadmap → Reactive daemon program** (status: partially implemented)
92
+
-**[jackin' Desktop Agent Hub](/reference/roadmap/jackin-desktop-agent-hub/)** — native macOS menu bar and desktop companion for active jackin' workspaces, isolated agent sessions, PR jump links, and built-in-runtime account state (Claude, Codex, Amp, Kimi, OpenCode), with CodexBar and OpenUsage as scoped references for account quota surfaces. The menu bar foundation consumes the daemon; the full Desktop window, Capsule-backed live state, quota telemetry, and attention routes remain open (status: in progress)
93
93
-**[Live bidirectional auth sync](/reference/roadmap/live-auth-sync/)** — Phase 2 adapter. Keep host and every running container in lock-step on each auth axis (`gh`, Claude, Codex, Amp, …). Subsumes the launch-time `sync` mode's bidirectional follow-up; reconsiders the `sync` name in the process (status: open — design proposal)
94
94
-**[Agent runtime status authority](/reference/roadmap/agent-runtime-status/)** — Phase 2 state source. Herdr-class in-container authority for `working`, `blocked`, derived `done`, `idle`, `unknown`, and stuck diagnostics, informed by multicode, CCManager, Agent Session Manager, WezTerm Agent Deck, ccmux, TUICommander, Codemux, and tmux-agent-status. Uses semantic runtime hooks/APIs, foreground-process ownership, visible-screen signals, shell markers, and cursor/readiness probes instead of treating PTY silence as attention-needed (status: open — design proposal)
95
-
-**[Agent attention prompts](/reference/roadmap/agent-attention-prompts/)** — Phase 2 adapter. Host-side OS notifications when an agent inside a Capsule-managed role container is waiting on operator input or has finished unseen work. Consumes the agent runtime status authority, escalates from silent toast to sound after a configurable timeout, and focuses the right terminal tab where supported. Targets the biggest operator throughput drag: idle wall-clock waiting on agents that don't surface their waiting state (status: open — design proposal)
95
+
-**[Agent attention prompts](/reference/roadmap/agent-attention-prompts/)** — Phase 2 adapter. Host-side OS notifications when an agent inside a Capsule-managed role container is waiting on operator input or has finished unseen work. The daemon notification bridge and in-container `jackin-notify` helper have landed; Capsule status events, MCP enrichment, click-to-focus activation, and policy UI remain open (status: in progress)
96
96
-**[Host bridge — secrets and approved host actions](/reference/roadmap/host-bridge/)** — Phase 3 adapter. Operator-mediated channel for agents to request a single secret value or invoke a single host command without tearing down the container. Auto-registered MCP server, TouchID / polkit / password approval per request, per-workspace allowlist / blocklist / disabled policies, audit log. Closes the *"agent needs one thing from the host, mid-session"* gap that today forces full-restart workarounds (status: open — design proposal)
97
97
-**[Container credential exposure — beyond env injection](/reference/roadmap/container-credential-exposure/)** — Phase 3 follow-on. Auth tokens and operator env values resolved from `op://` references become agent-readable when exported into the container today. Captures the trajectory from documented exposure to file-mount compatibility, command-scoped secret handles, Docker Sandboxes-style credential proxying, and daemon-mediated `secret.request` / `secret.run` grants where the agent gets a handle rather than the raw value (status: open — design proposal)
Copy file name to clipboardExpand all lines: docs/src/content/docs/reference/roadmap/agent-attention-prompts.mdx
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -136,7 +136,7 @@ The bet of jackin' is that running many agents safely and conveniently changes h
136
136
137
137
## Related work
138
138
139
-
-[jackin' daemon](/reference/roadmap/jackin-daemon/) — host-side process this feature plugs into. Phase 1 daemon must ship before this adapter can.
139
+
-[jackin' daemon](/reference/roadmap/jackin-daemon/) — host-side process this feature plugs into. The base notification bridge exists; the real Capsule-backed event stream remains open.
140
140
-[Live bidirectional auth sync](/reference/roadmap/live-auth-sync/) — sibling feature plugging into the same daemon; sets the precedent for per-axis adapters.
141
141
-[jackin' Desktop Agent Hub](/reference/roadmap/jackin-desktop-agent-hub/) — native macOS surface that should display attention/ready-for-review state and owns the first Ghostty click-to-focus UX.
142
142
-[Agent runtime status authority](/reference/roadmap/agent-runtime-status/) — canonical source for `blocked`, derived `done`, `idle`, `working`, `unknown`, and stuck diagnostics. Attention prompts consume this stream; they do not infer state independently.
**Status**: Implemented — phase 1 base daemon landed
8
+
**Status**: Partially implemented — base host daemon, first Desktop API surface, and notification bridge implemented; real event streaming, Capsule aggregation, live auth sync, and provider quota telemetry remain open.
9
9
10
10
## Problem
11
11
@@ -18,9 +18,11 @@ A handful of these features have already accumulated:
18
18
-**Container event watcher (future).** Surface launch failures, OOM kills, agent process exits to the operator without requiring an open `jackin console` session. Today these only surface when the operator next runs `jackin console` or `gh pr checks`-style polling on the CLI.
19
19
-**Cross-session notifications (future).** Ping the operator when an agent in a backgrounded session needs attention (sensitive-mount confirmation, auth re-prompt, network-policy violation).
20
20
21
-
The pattern: each new feature that wants to **react to events instead of waiting for the next command** independently invents its own "what if jackin had a daemon" workaround. That doesn't scale.
21
+
The pattern: each new feature that wants to **react to events instead of waiting for the next command** independently invents its own "what if jackin' had a daemon" workaround. That doesn't scale.
22
22
23
-
This roadmap item introduced **the jackin' daemon** as a first-class concept the rest of the project can compose on. The initial implementation ships the daemon bones and the first host adapters:
23
+
This roadmap item introduced **the jackin' daemon** as a first-class concept the rest of the project can compose on. The implementation now restores the host-daemon plan on top of the newer jackin' architecture: the Capsule is the in-container session authority, the runtime instance model owns durable identity, and the host daemon is the per-user aggregator / action surface rather than a host-side PTY scraper.
- A per-user Unix domain socket at `~/.jackin/run/jackin-daemon.sock`.
@@ -30,13 +32,23 @@ This roadmap item introduced **the jackin' daemon** as a first-class concept the
30
32
- Periodic cache warmup for the construct image, `docker:dind`, and any cached role manifest `published_image`.
31
33
- macOS Notification Center notifications through the daemon via `jackin daemon notify` and the in-container `jackin-notify` helper. High urgency requests the native `Glass` sound.
32
34
- A container bridge: running roles receive `JACKIN_DAEMON_SOCKET=/jackin/daemon.sock` and the host daemon socket bind-mounted at that path when the daemon is available.
35
+
- Desktop-facing read/action methods for `daemon/hello`, saved workspace summaries, running session labels, GitHub PR lists, Ghostty/browser open actions, credential-source presence, and the first attention-route polling contract.
36
+
37
+
## Architecture reset after Capsule
38
+
39
+
The original daemon roadmap predates the shipped `jackin-capsule` multiplexer. That changes the daemon boundary:
40
+
41
+
- The Capsule owns PTYs, panes, session lifecycle, snapshots, and future runtime state authority inside each role container.
42
+
- The host daemon should subscribe to Capsule control sockets and maintain a cross-instance index. It should not infer agent state by scraping rendered terminal text or shelling into containers for tmux state.
43
+
- Docker labels remain useful for cheap discovery (`workspace/list`, `session/list`) and stale/fallback state, but the authoritative live session tree comes from Capsule snapshots/events.
44
+
- Desktop Agent Hub should treat the daemon as its API, and the daemon should treat Capsule/runtime modules as sources. Desktop should not parse jackin' TOML files, Docker output, or Capsule socket frames directly.
33
45
34
46
## What the daemon owns
35
47
36
48
The daemon is the long-running, per-operator-user, per-host process that holds anything jackin' needs to:
37
49
38
-
1.**Watch host state.** Filesystem inotify, macOS Keychain notifications, periodic polls — for any host source jackin reacts to.
1.**Watch host state.** Filesystem inotify, macOS Keychain notifications, periodic polls — for any host source jackin' reacts to.
51
+
2.**Watch container state.** Docker labels/events for process-level lifecycle, plus Capsule sockets for live session/pane inventory and future agent-state events.
40
52
3.**Push reactive updates** into running containers via the existing bind-mount channels (no new container-side privilege).
41
53
4.**Hold cross-process locks** that have to outlive any one CLI invocation (the live-auth-sync shared store flock, future "only one `jackin load` at a time per role class" mutex, etc.).
42
54
5.**Reconcile per-host singleton state.** Today's keep-awake `caffeinate` lock is the obvious example — only one caffeinate process per host, regardless of how many `jackin` invocations want it alive.
@@ -70,6 +82,16 @@ To keep the surface manageable and the security posture reviewable:
70
82
-**Fallback for systems without launchd / systemd.**`jackin daemon start` backgrounds `jackin daemon serve`, writes a pid file, and logs to `~/.jackin/run/jackin-daemon.log`.
71
83
-**Container / CI environments.** The daemon is per-user and host-scoped. CI can avoid `load`/`console` or explicitly stop it; future CI detection can make this silent.
72
84
85
+
### Host-side effects
86
+
87
+
The daemon follows the host-mutation rule by keeping writes scoped and operator-visible:
-`jackin daemon install` is explicit; it writes a per-user launchd or systemd unit and starts it.
91
+
-`jackin daemon uninstall` is explicit; it stops and removes that unit.
92
+
-`jackin daemon notify`, `notification/send`, `workspace/launch`, and `desktop/open` perform visible host actions: Notification Center toast, Ghostty launch/focus, or browser open.
93
+
- The daemon reads host credential/config state for status, but it does not write provider config, Keychain entries, browser profiles, Git config, or user repositories.
|`github/repository_prs`| Return open pull requests for one repository, sorted newest first. |
110
132
|`workspace/launch`| Open Ghostty and run `jackin load` against a saved workspace, with optional role and agent override. |
111
133
|`desktop/open`| Open a browser URL through macOS `open`, or open Ghostty and run `jackin hardline` for a running session. |
112
-
|`account/status`| Return cached Claude, Codex, and Amp credential-source presence without exposing token values; `refresh` bypasses the daemon cache. |
134
+
|`account/status`| Return cached Claude, Codex, Amp, Kimi, and OpenCode credential-source presence without exposing token values; `refresh` bypasses the daemon cache. |
113
135
|`event/subscribe`| Return the first Desktop event contract. Streaming is explicitly disabled for now; the response names the poll methods and click-route target fields Desktop should use for attention and ready-for-review routing. |
114
136
|`notification/send`| Dispatch a host macOS Notification Center notification. |
115
137
116
138
Most Desktop-specific methods are deliberately absent until their slices land. The next phase turns the event subscription placeholder into a real stream.
117
139
118
140
### Security posture
119
141
120
-
-**Credential lifetime in memory.** Live auth sync requires the daemon to hold tokens in memory while watching for changes. Document the threat model: any process running as the operator can already read those tokens from the host's stores — the daemon does not widen the attack surface, but it does centralise it.
142
+
-**Credential lifetime in memory.**Today `account/status` reports credential-source presence only, not raw token values. Live auth sync will require the daemon to hold tokens in memory while watching for changes. Document the threat model before that lands: any process running as the operator can already read those tokens from the host's stores, but the daemon centralizes that access.
121
143
-**Secret-redacted logs.** Daemon log output must redact tokens the same way `tracing::debug!` already does for `GithubAuthContext` and `GithubProvisionOutcome` (manual `Debug` impls; see <RepoFilepath="src/instance/mod.rs" />).
122
144
-**Crash dumps and panic backtraces.** Tokens in memory can leak through coredumps. Either disable coredumps for the daemon process (`prctl(PR_SET_DUMPABLE, 0)` on Linux, equivalent on macOS) or redact tokens before any panic-backtrace path can format them.
123
145
-**Fork-safety.** Daemon does not exec subprocesses with token env vars set; `gh auth token` shellouts use a clean env.
@@ -148,15 +170,19 @@ Rough order of operations — not committed; to be confirmed during the design p
3.**Phase 2 — first adapters.** Started: keep-awake reconciliation, cache warmup, and host notification dispatch are daemon-owned.
151
-
4.**Phase 3 — Desktop-ready daemon API.** Started: `daemon/hello` now provides a versioned capability handshake; read-only workspace/session discovery is available through `workspace/list` and `session/list`; initial GitHub PR lookup is available through `github/my_open_prs`, `github/project_inbox`, and `github/repository_prs`; Ghostty/browser actions are available through `workspace/launch` and `desktop/open`; Claude/Codex/Amp credential-source presence is available through `account/status`; the first `event/subscribe` response publishes the poll and click-routing contract. Next, replace the placeholder with a real event stream.
152
-
5.**Phase 4 — live auth sync.** Not started. Add per-axis host watchers and shared-store flocks on top of this daemon.
4.**Phase 3 — Desktop-ready daemon API.** Started: `daemon/hello` now provides a versioned capability handshake; read-only workspace/session discovery is available through `workspace/list` and `session/list`; initial GitHub PR lookup is available through `github/my_open_prs`, `github/project_inbox`, and `github/repository_prs`; Ghostty/browser actions are available through `workspace/launch` and `desktop/open`; Claude/Codex/Amp/Kimi/OpenCode credential-source presence is available through `account/status`; the first `event/subscribe` response publishes the poll and click-routing contract.
174
+
5.**Phase 4 — Capsule-backed live index.** Open: replace Docker-label-only session state with a daemon-owned cross-instance cache fed by Capsule snapshots/events, including pane/session IDs, branch/PR context, runtime status, and stale/disconnected diagnostics.
175
+
6.**Phase 5 — real event stream and attention routing.** Open: replace the `event/subscribe` placeholder with streaming daemon events, then connect `blocked`, derived `done`, notification click routes, and Desktop attention surfaces.
176
+
7.**Phase 6 — live auth sync and account telemetry.** Open: add per-axis host watchers/shared-store flocks, then replace credential-source presence with the account quota snapshots and usage endpoints described by Token & Cost Telemetry.
177
+
8.**Phase 7+ — host bridge and approved host actions.** Open: add operator-approved `secret.*` / `host.*` flows against the same daemon policy/audit surface.
154
178
155
179
## Related work
156
180
157
181
-[Live bidirectional auth sync](/reference/roadmap/live-auth-sync/) — the first reactive feature this daemon hosts.
158
182
-[Agent attention prompts](/reference/roadmap/agent-attention-prompts/) — host-side OS notifications when an agent waits on operator input. Plugs into this daemon.
159
183
-[Host bridge — secrets and approved host actions](/reference/roadmap/host-bridge/) — operator-mediated channel for agents to request secrets or invoke host commands. Plugs into this daemon and uses the same approval surface (TouchID / polkit / password) the daemon hosts.
184
+
-[Agent runtime status authority](/reference/roadmap/agent-runtime-status/) — Capsule-side source for `blocked`, derived `done`, `working`, `idle`, and `unknown` state. The daemon consumes this; it does not reimplement the detector.
185
+
-[Token & Cost Telemetry](/reference/roadmap/token-cost-telemetry/) — account quota and workspace/session spend model that should replace the current credential-source-only `account/status` placeholder.
160
186
-[jackin' Desktop Agent Hub](/reference/roadmap/jackin-desktop-agent-hub/) — native macOS status bar and desktop companion that consumes daemon state for workspaces, sessions, GitHub PRs, account status, notifications, and approved host actions.
161
187
- <RepoFilepath="src/runtime/caffeinate.rs" /> — today's per-command keep-awake reconciler; first migration target in Phase 2.
162
188
-[Reliable Claude authentication strategy](/reference/roadmap/claude-auth-strategy/) — concurrent-session token-drift concerns the live-auth-sync feature ultimately answers, so the daemon hosts the answer.
0 commit comments