codedeck 0.6.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -35
- package/dist/cli/commands/claims.js +3 -2
- package/dist/cli/commands/claims.js.map +1 -1
- package/dist/cli/commands/doctor.js +8 -40
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/logs.js +2 -2
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/open.js +102 -11
- package/dist/cli/commands/open.js.map +1 -1
- package/dist/cli/commands/ps.js +6 -6
- package/dist/cli/commands/ps.js.map +1 -1
- package/dist/cli/commands/review.js +36 -58
- package/dist/cli/commands/review.js.map +1 -1
- package/dist/cli/commands/run.js +27 -27
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/setup.js +96 -314
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/show.js +2 -1
- package/dist/cli/commands/show.js.map +1 -1
- package/dist/cli/commands/ui.js +61 -0
- package/dist/cli/commands/ui.js.map +1 -0
- package/dist/cli/commands/usage-backfill.js +149 -0
- package/dist/cli/commands/usage-backfill.js.map +1 -0
- package/dist/cli/commands/usage.js +113 -45
- package/dist/cli/commands/usage.js.map +1 -1
- package/dist/cli/commands/wait.js +3 -2
- package/dist/cli/commands/wait.js.map +1 -1
- package/dist/cli/index.js +55 -39
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/web-launch.js +126 -0
- package/dist/cli/web-launch.js.map +1 -0
- package/dist/config/config.js +0 -70
- package/dist/config/config.js.map +1 -1
- package/dist/config/paths.js +1 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/config/setup.js +248 -0
- package/dist/config/setup.js.map +1 -0
- package/dist/config/web-host.js +31 -0
- package/dist/config/web-host.js.map +1 -0
- package/dist/config/web-port.js +24 -0
- package/dist/config/web-port.js.map +1 -0
- package/dist/core/claude-transcript.js +226 -0
- package/dist/core/claude-transcript.js.map +1 -0
- package/dist/core/errors.js +17 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/models.js +4 -1
- package/dist/core/models.js.map +1 -1
- package/dist/core/pricing.js +87 -55
- package/dist/core/pricing.js.map +1 -1
- package/dist/core/roles.js +6 -5
- package/dist/core/roles.js.map +1 -1
- package/dist/core/run-skills.js +114 -0
- package/dist/core/run-skills.js.map +1 -0
- package/dist/core/run-usage.js +56 -10
- package/dist/core/run-usage.js.map +1 -1
- package/dist/core/session.js +6 -16
- package/dist/core/session.js.map +1 -1
- package/dist/core/usage-query.js +41 -0
- package/dist/core/usage-query.js.map +1 -0
- package/dist/core/usage-source.js +17 -0
- package/dist/core/usage-source.js.map +1 -0
- package/dist/daemon/build-id.js +30 -0
- package/dist/daemon/build-id.js.map +1 -0
- package/dist/daemon/daemon.js +1257 -700
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/instance-lock.js +48 -0
- package/dist/daemon/instance-lock.js.map +1 -0
- package/dist/daemon/ipc.js +4 -3
- package/dist/daemon/ipc.js.map +1 -1
- package/dist/daemon/web-supervisor.js +251 -0
- package/dist/daemon/web-supervisor.js.map +1 -0
- package/dist/drivers/claude/driver.js +1 -0
- package/dist/drivers/claude/driver.js.map +1 -1
- package/dist/drivers/codex/driver.js +14 -3
- package/dist/drivers/codex/driver.js.map +1 -1
- package/dist/drivers/codex/host-skills.js +57 -0
- package/dist/drivers/codex/host-skills.js.map +1 -0
- package/dist/drivers/opencode/driver.js +6 -2
- package/dist/drivers/opencode/driver.js.map +1 -1
- package/dist/drivers/session-driver.js +7 -1
- package/dist/drivers/session-driver.js.map +1 -1
- package/dist/drivers/session-runtime.js +2 -0
- package/dist/drivers/session-runtime.js.map +1 -1
- package/dist/drivers/terminal.js +15 -0
- package/dist/drivers/terminal.js.map +1 -1
- package/dist/git/diff.js +29 -4
- package/dist/git/diff.js.map +1 -1
- package/dist/open/contract.js.map +1 -1
- package/dist/open/launchers/claude.js +78 -2
- package/dist/open/launchers/claude.js.map +1 -1
- package/dist/open/link-watcher.js +44 -0
- package/dist/open/link-watcher.js.map +1 -0
- package/dist/open/pty.js +330 -5
- package/dist/open/pty.js.map +1 -1
- package/dist/open/runtime.js +15 -12
- package/dist/open/runtime.js.map +1 -1
- package/dist/plugin/agents/general.md +33 -6
- package/dist/plugin/hooks/pane-ticker.ts +102 -0
- package/dist/plugin/hooks/register.tsx +39 -18
- package/dist/plugin/hooks/session-id.sh +1 -1
- package/dist/plugin/mods/agents/pane.ts +285 -156
- package/dist/plugin/mods/agents/types.ts +23 -3
- package/dist/plugin/statusline.sh +57 -32
- package/dist/store/database.js +49 -1
- package/dist/store/database.js.map +1 -1
- package/dist/store/native-links.js +80 -0
- package/dist/store/native-links.js.map +1 -0
- package/dist/store/sessions.js +166 -51
- package/dist/store/sessions.js.map +1 -1
- package/dist/store/usage-ledger.js +153 -0
- package/dist/store/usage-ledger.js.map +1 -0
- package/dist/utils/process.js +2 -16
- package/dist/utils/process.js.map +1 -1
- package/dist/web/brand.js +59 -0
- package/dist/web/brand.js.map +1 -0
- package/dist/web/child.js +67 -0
- package/dist/web/child.js.map +1 -0
- package/dist/web/home-page.js +48 -0
- package/dist/web/home-page.js.map +1 -0
- package/dist/web/review-page.js +12 -5
- package/dist/web/review-page.js.map +1 -1
- package/dist/web/security.js +170 -0
- package/dist/web/security.js.map +1 -0
- package/dist/web/server.js +198 -0
- package/dist/web/server.js.map +1 -0
- package/dist/web/setup-icons.js +37 -0
- package/dist/web/setup-icons.js.map +1 -0
- package/dist/web/setup-page.js +1795 -0
- package/dist/web/setup-page.js.map +1 -0
- package/dist/web/setup-routes.js +475 -0
- package/dist/web/setup-routes.js.map +1 -0
- package/dist/web/usage-page.js +609 -0
- package/dist/web/usage-page.js.map +1 -0
- package/dist/web/usage-routes.js +88 -0
- package/dist/web/usage-routes.js.map +1 -0
- package/dist/web/web-token.js +56 -0
- package/dist/web/web-token.js.map +1 -0
- package/package.json +1 -1
- package/dist/plugin/prompts/_partials/commit.md +0 -145
- package/dist/plugin/prompts/_partials/pr-writer.md +0 -186
package/README.md
CHANGED
|
@@ -16,10 +16,10 @@ CodeDeck is not an agent. It manages the lifecycle of existing harnesses:
|
|
|
16
16
|
The `codedeck` CLI provides a single unified interface for all of them:
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
|
-
npx codedeck run "implement authentication" --agent claude
|
|
20
|
-
npx codedeck run "fix the tests" --agent codex
|
|
19
|
+
npx codedeck run "implement authentication" --agent claude --effort medium
|
|
20
|
+
npx codedeck run "fix the tests" --agent codex --effort medium
|
|
21
21
|
npx codedeck run "investigate this bug" --agent opencode
|
|
22
|
-
npx codedeck run "refactor this module" --agent omp
|
|
22
|
+
npx codedeck run "refactor this module" --agent omp --effort medium
|
|
23
23
|
|
|
24
24
|
npx codedeck ps
|
|
25
25
|
npx codedeck logs a83f --follow
|
|
@@ -83,9 +83,8 @@ The daemon owns the sessions. The CLI only follows events — closing the termin
|
|
|
83
83
|
|---------|-------------|
|
|
84
84
|
| `npx codedeck open [role] [--no-bypass] [--no-theme] [--no-pty] [-- <claude args>]` | Open an opinionated Claude Code session with the CodeDeck plugin loaded |
|
|
85
85
|
| `npx codedeck setup` | Choose the harness and model each agent should run on |
|
|
86
|
-
| `npx codedeck profile <list\|show\|save\|use\|delete>` | Save and switch named setups |
|
|
87
86
|
| `npx codedeck doctor` | Check Node, Git, harnesses, daemon, and database |
|
|
88
|
-
| `npx codedeck run "<prompt>" --agent <id> [--model <m>] [--role <r>] [--name <n>] [--worktree] [--bg|--detach]` | Start a session; blocks and follows logs by default |
|
|
87
|
+
| `npx codedeck run "<prompt>" [--agent <id>] [--model <m>] [--effort <level>] [--role <r>] [--name <n>] [--worktree] [--bg|--detach]` | Start a session; blocks and follows logs by default |
|
|
89
88
|
| `npx codedeck wait <id> [--json]` | Wait for a session to reach a terminal state without polling |
|
|
90
89
|
| `npx codedeck ps [--all] [--json]` | List recent sessions |
|
|
91
90
|
| `npx codedeck show <id> [--json]` | Show session details |
|
|
@@ -93,8 +92,27 @@ The daemon owns the sessions. The CLI only follows events — closing the termin
|
|
|
93
92
|
| `npx codedeck send <id> "<msg>"` | Continue a session (new turn) |
|
|
94
93
|
| `npx codedeck stop <id>` | Graceful interrupt → SIGTERM → SIGKILL |
|
|
95
94
|
| `npx codedeck diff <id> [--stat] [--json]` | Git diff against base commit |
|
|
95
|
+
| `npx codedeck ui [--host <addr>] [--port <n>] [--no-open]` | Open the local web console |
|
|
96
96
|
| `npx codedeck review [--port <n>] [--no-open]` | Open a local review of the current git changes |
|
|
97
97
|
|
|
98
|
+
## Web console
|
|
99
|
+
|
|
100
|
+
The console listens on `127.0.0.1` by default. Set `web.host` in `config.json` to an IPv4 or IPv6 address to bind another interface, such as a Tailscale address:
|
|
101
|
+
|
|
102
|
+
```json
|
|
103
|
+
{
|
|
104
|
+
"web": {
|
|
105
|
+
"host": "100.101.102.103"
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
`web.host` accepts IP addresses only. `codedeck ui --host <addr>` explicitly binds that address for the launch. The CLI sends it as `host` to `web.ensure`; without the flag, it sends the resolved config value as `preferredHost`. The daemon passes the selected address to the child as `--host <addr>`. An explicit host change restarts the child. A preferred host moves a child started for a preferred host or with no host request, and never moves a child started for an explicit host. If both host fields are absent, the supervisor reuses a running child at any address and starts a new child on `127.0.0.1`.
|
|
111
|
+
|
|
112
|
+
Warnings and alternate links use the bind address reported by the running child, so a retained explicit bind remains visible even when it differs from `web.host`.
|
|
113
|
+
|
|
114
|
+
For a specific bind address, the console accepts that address in the request `Host` with the exact console port, even when it is missing from the system's interface list. Other accepted hosts on non-loopback binds are current interface IPs, the exact `os.hostname()`, and Tailscale MagicDNS names in the form `<hostname>.<label>.ts.net`, with one or more labels allowed. Names such as `<hostname>.evil.com` are rejected. The default `127.0.0.1` bind continues to accept only `127.0.0.1` and `localhost`.
|
|
115
|
+
|
|
98
116
|
## Open
|
|
99
117
|
|
|
100
118
|
`codedeck open` launches a session on the harness bound to the role in `codedeck setup`: Claude Code with the CodeDeck plugin, an appended system prompt, Opus 4.8 at `xhigh` effort, and permissions bypassed; or the opencode TUI with the role contract injected, `--auto` on, and a stock look. Nothing is written to `~/.claude/` or `~/.config/opencode`; everything loads for that session only.
|
|
@@ -122,15 +140,17 @@ Two things worth knowing before you edit an agent file. `--agent` layers on top
|
|
|
122
140
|
|
|
123
141
|
`codedeck run --role <role>` gives a worker the same contract. `--agent` is Claude's flag and no other harness has it, so there the role body is prefixed to the prompt instead, frontmatter stripped. The text travels; the allowlist does not, so a codex or opencode worker is held to the role by prose alone.
|
|
124
142
|
|
|
143
|
+
Bind `reviewer` to codex with an effort in `codedeck setup`, then run it:
|
|
144
|
+
|
|
125
145
|
```bash
|
|
126
|
-
npx codedeck run "review the diff on this branch" --
|
|
146
|
+
npx codedeck run "review the diff on this branch" --role reviewer
|
|
127
147
|
```
|
|
128
148
|
|
|
129
|
-
`--no-bypass` drops the bypass flag, `--no-theme` keeps the status line but drops everything else the look changes, `--no-pty` opts out of the session naming itself, and `--model`/`--effort`/`--resume`/`--worktree` override the defaults.
|
|
149
|
+
`--no-bypass` drops the bypass flag, `--no-theme` keeps the status line but drops everything else the look changes, `--no-pty` opts out of the session naming itself, and `--model`/`--effort`/`--resume`/`--worktree` override the defaults. Interactive opens ask about a worktree when neither `--worktree` nor `--no-worktree` is set.
|
|
130
150
|
|
|
131
151
|
### What the session looks like
|
|
132
152
|
|
|
133
|
-
`open` hands Claude Code a settings payload built at launch, not a file on disk. It carries five things: the `codedeck-ultra` theme, the fullscreen renderer, a spinner vocabulary of its own, CodeDeck's tips in place of the built-in ones, and a startup line naming the role, the model, the effort and whether permissions are bypassed. The status line under the prompt reads
|
|
153
|
+
`open` hands Claude Code a settings payload built at launch, not a file on disk. It carries five things: the `codedeck-ultra` theme, the fullscreen renderer, a spinner vocabulary of its own, CodeDeck's tips in place of the built-in ones, and a startup line naming the role, the model, the effort and whether permissions are bypassed. The status line under the prompt reads `<role> · <project>/<branch> · ctx <remaining> · <tokens> tok · run $<cost>` (or `$<cost>` for local usage), showing only the branch when it matches the project name or `worktree-<project>`, and dropping any field the session cannot answer.
|
|
134
154
|
|
|
135
155
|
The payload is generated rather than shipped because of `${CLAUDE_PLUGIN_ROOT}`. Claude Code expands it only for hooks declared in a plugin's `hooks/hooks.json`, never for `statusLine.command`, and the failure is silent: no status line, no error, not even under `--debug`. `open` knows the real plugin directory, so it writes the resolved path.
|
|
136
156
|
|
|
@@ -150,8 +170,16 @@ A launch carrying `-p`/`--print` answers once and exits, so it never asks anythi
|
|
|
150
170
|
|
|
151
171
|
Launching never asks. Which harness and model each of the four agents should run on is a question worth answering deliberately, not one to greet someone with, so it lives in its own command:
|
|
152
172
|
|
|
173
|
+
In an interactive terminal, setup opens the local web console in your browser:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
npx codedeck setup # opens the setup web console
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
The frozen terminal wizard remains available with `--tui`:
|
|
180
|
+
|
|
153
181
|
```bash
|
|
154
|
-
npx codedeck setup
|
|
182
|
+
npx codedeck setup --tui
|
|
155
183
|
```
|
|
156
184
|
|
|
157
185
|
```
|
|
@@ -183,31 +211,17 @@ An id the catalog does not list can still be typed, with its harness as a prefix
|
|
|
183
211
|
|
|
184
212
|
The prefix is required, because a bare id names half a binding and there is no honest way to guess the other half. Enter asks once to confirm, and a second Enter writes it.
|
|
185
213
|
|
|
186
|
-
The catalog is cached for four hours. `codedeck setup --refresh`
|
|
187
|
-
|
|
188
|
-
`codedeck run --role reviewer "<prompt>"` then needs no other flag: the role's binding supplies both the harness and the model. `--agent` and `--model` still win over it, and a `--role` whose harness disagrees with an explicit `--agent` keeps the flag and drops the bound model, rather than hand one harness another's id.
|
|
214
|
+
The catalog is cached for four hours. `codedeck setup --refresh` rediscovers it when the web console opens. Add `--tui` to use the frozen terminal picker instead.
|
|
189
215
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
### Profiles
|
|
193
|
-
|
|
194
|
-
A profile is a named snapshot of what `setup` writes (agents, orchestrator, sandbox, autocompact). The rest of the config stays global.
|
|
195
|
-
|
|
196
|
-
```bash
|
|
197
|
-
npx codedeck profile save max # snapshot the current setup
|
|
198
|
-
npx codedeck profile use max # make it the active setup
|
|
199
|
-
npx codedeck setup --profile max # edit that profile directly
|
|
200
|
-
npx codedeck run "task" --profile max --bg
|
|
201
|
-
npx codedeck open reviewer --profile max
|
|
202
|
-
```
|
|
216
|
+
`codedeck run --role reviewer "<prompt>"` uses `reviewer`'s binding for both the harness and model. Every harness except opencode also needs effort from the binding or `--effort`; the flag overrides a bound effort. Opencode has no effort channel. If you pass a conflicting `--agent` or `--model` with a bound role, CodeDeck ignores it and prints a warning. Use `codedeck setup` to change the pairing. Without a role binding, `--agent` and `--model` still choose the harness and model, whether you omit `--role` or use an unbound role.
|
|
203
217
|
|
|
204
|
-
|
|
218
|
+
Without a role binding, explicit flags take precedence over the defaults. If `--agent` is omitted, the harness comes from `defaultAgent`, then claude. If `--model` is omitted, the model comes from `models[harness]`, then `defaultModel`, then whatever the driver picks for itself. An unbound role, including one skipped in setup, prints a warning and uses this selection path.
|
|
205
219
|
|
|
206
220
|
## Session
|
|
207
221
|
|
|
208
222
|
```ts
|
|
209
223
|
Session {
|
|
210
|
-
id: string // e.g.
|
|
224
|
+
id: string // e.g. a83f0123456789ab (CodeDeck)
|
|
211
225
|
nativeSessionId? // internal harness id
|
|
212
226
|
agent: "claude" | "codex" | "opencode" | "omp"
|
|
213
227
|
status: "starting" | "working" | "needs_input" | "idle" | "completed" | "failed" | "stopped" | "orphaned" | "interrupted"
|
|
@@ -217,6 +231,7 @@ Session {
|
|
|
217
231
|
```
|
|
218
232
|
|
|
219
233
|
`nativeSessionId` is an internal detail. Users only see the CodeDeck ID.
|
|
234
|
+
The CLI displays the first eight characters of a CodeDeck ID.
|
|
220
235
|
|
|
221
236
|
## Normalized Events
|
|
222
237
|
|
|
@@ -293,7 +308,7 @@ reattached session works even when no in-memory process handle exists.
|
|
|
293
308
|
|
|
294
309
|
### Power loss and resume
|
|
295
310
|
|
|
296
|
-
A `poweroff`, `reboot`, or
|
|
311
|
+
A `poweroff`, `reboot`, or logout sends the daemon `SIGTERM`/`SIGHUP`. The
|
|
297
312
|
daemon drains running sessions best-effort (a few seconds, no root) and marks
|
|
298
313
|
each active session `interrupted` with a `session.failed` event carrying
|
|
299
314
|
`failure: { "code": "SHUTDOWN", "blame": "infra", "retryable": true }` —
|
|
@@ -305,16 +320,16 @@ never a silent `completed`.
|
|
|
305
320
|
- Resume is explicit: `codedeck send <id> "continue"` reopens the turn with
|
|
306
321
|
`--resume <nativeId>` in the same `cwd`/`worktree`. Sessions without a
|
|
307
322
|
resumable harness id are rejected with `CAPABILITY_NOT_SUPPORTED`.
|
|
308
|
-
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
`Power`. No setup step or privileged install is required or promised.
|
|
323
|
+
- The drain runs on `SIGTERM` and fits the stop timeout systemd gives the
|
|
324
|
+
session before `SIGKILL`. The daemon holds no `systemd-inhibit` lock, so it
|
|
325
|
+
never delays poweroff or suspend. `codedeck doctor` reports the user unit
|
|
326
|
+
under `Power`. No setup step or privileged install is required or promised.
|
|
312
327
|
|
|
313
328
|
|
|
314
329
|
## Worktrees
|
|
315
330
|
|
|
316
331
|
```bash
|
|
317
|
-
npx codedeck run "implement oauth" --worktree
|
|
332
|
+
npx codedeck run "implement oauth" --worktree --effort medium
|
|
318
333
|
# creates ~/.run-agent/worktrees/<repo-hash>/<session-id>
|
|
319
334
|
# branch: ra/<slug>-<session-id>
|
|
320
335
|
```
|
|
@@ -375,8 +390,8 @@ npm test
|
|
|
375
390
|
```bash
|
|
376
391
|
cd example-project
|
|
377
392
|
npx codedeck doctor
|
|
378
|
-
npx codedeck run "find one improvement and implement it" --agent claude --worktree --bg
|
|
379
|
-
npx codedeck run "find one improvement and implement it" --agent codex --worktree --bg
|
|
393
|
+
npx codedeck run "find one improvement and implement it" --agent claude --worktree --bg --effort medium
|
|
394
|
+
npx codedeck run "find one improvement and implement it" --agent codex --worktree --bg --effort medium
|
|
380
395
|
npx codedeck ps
|
|
381
396
|
npx codedeck wait <claude-session>
|
|
382
397
|
npx codedeck logs <claude-session> --follow
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { shortSessionId } from "../../core/session.js";
|
|
1
2
|
import { IpcClient } from "../../daemon/ipc.js";
|
|
2
3
|
class ClaimsCommandError extends Error {
|
|
3
4
|
code;
|
|
@@ -63,7 +64,7 @@ function resolveClaimId(value) {
|
|
|
63
64
|
return claimId;
|
|
64
65
|
}
|
|
65
66
|
function printClaim(claim, verb) {
|
|
66
|
-
console.log(`${verb} claim #${claim.id} ${claim.pathGlob} for session ${claim.sessionId}: ${claim.reason}`);
|
|
67
|
+
console.log(`${verb} claim #${claim.id} ${claim.pathGlob} for session ${shortSessionId(claim.sessionId)}: ${claim.reason}`);
|
|
67
68
|
}
|
|
68
69
|
function printClaims(claims) {
|
|
69
70
|
if (claims.length === 0) {
|
|
@@ -71,7 +72,7 @@ function printClaims(claims) {
|
|
|
71
72
|
return;
|
|
72
73
|
}
|
|
73
74
|
for (const claim of claims) {
|
|
74
|
-
console.log(`#${claim.id} ${claim.pathGlob} ${claim.sessionId} ${claim.reason}`);
|
|
75
|
+
console.log(`#${claim.id} ${claim.pathGlob} ${shortSessionId(claim.sessionId)} ${claim.reason}`);
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
78
|
export function registerClaimsCommand(program) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claims.js","sourceRoot":"","sources":["../../../src/cli/commands/claims.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAchD,MAAM,kBAAmB,SAAQ,KAAK;IACS;IAA7C,YAAY,OAAe,EAAkB,IAAY;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,SAAI,GAAJ,IAAI,CAAQ;QAEvD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,SAAS,WAAW,CAAC,KAAY;IAC/B,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,IAAI,GAAI,KAA4B,CAAC,IAAI,CAAC;QAChD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;IACpD,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,IAAa;IAChD,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,iBAAiB,IAAI,MAAM,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,gBAAgB,CAAC,OAA6B;IACrD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;IAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,kBAAkB,CAC1B,sGAAsG,EACtG,kBAAkB,CACnB,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,aAAa,CAAC,OAA6B;IAClD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,kBAAkB,CAAC,6BAA6B,EAAE,iBAAiB,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,kBAAkB,CAAC,qBAAqB,KAAK,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,kBAAkB,CAAC,qBAAqB,KAAK,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,UAAU,CAAC,KAAY,EAAE,IAAY;IAC5C,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,WAAW,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,QAAQ,gBAAgB,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"claims.js","sourceRoot":"","sources":["../../../src/cli/commands/claims.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { resolveInhibitBin } from "../../utils/process.js";
|
|
2
1
|
import fs from "node:fs";
|
|
3
2
|
import os from "node:os";
|
|
4
3
|
import path from "node:path";
|
|
5
4
|
import { IpcClient, isDaemonRunning } from "../../daemon/ipc.js";
|
|
6
5
|
import { getPaths } from "../../config/paths.js";
|
|
7
|
-
import { loadConfig,
|
|
6
|
+
import { loadConfig, resolveRoleBinding } from "../../config/config.js";
|
|
8
7
|
import { ROLES } from "../../core/roles.js";
|
|
9
8
|
export function powerServicePath(homeDir = os.homedir()) {
|
|
10
9
|
return path.join(homeDir, ".config", "systemd", "user", "codedeck.service");
|
|
@@ -17,21 +16,12 @@ export function detectPowerReadiness(homeDir) {
|
|
|
17
16
|
catch {
|
|
18
17
|
serviceInstalled = false;
|
|
19
18
|
}
|
|
20
|
-
|
|
21
|
-
try {
|
|
22
|
-
inhibitAvailable = resolveInhibitBin() !== null;
|
|
23
|
-
}
|
|
24
|
-
catch {
|
|
25
|
-
inhibitAvailable = false;
|
|
26
|
-
}
|
|
27
|
-
return { serviceInstalled, inhibitAvailable };
|
|
19
|
+
return { serviceInstalled };
|
|
28
20
|
}
|
|
29
21
|
export function resolvePowerInfo(result) {
|
|
30
22
|
const power = result.power;
|
|
31
|
-
if (power &&
|
|
32
|
-
|
|
33
|
-
typeof power.inhibitAvailable === "boolean") {
|
|
34
|
-
return { serviceInstalled: power.serviceInstalled, inhibitAvailable: power.inhibitAvailable };
|
|
23
|
+
if (power && typeof power.serviceInstalled === "boolean") {
|
|
24
|
+
return { serviceInstalled: power.serviceInstalled };
|
|
35
25
|
}
|
|
36
26
|
return detectPowerReadiness();
|
|
37
27
|
}
|
|
@@ -39,7 +29,6 @@ export function renderPowerSection(power) {
|
|
|
39
29
|
return [
|
|
40
30
|
"Power",
|
|
41
31
|
` ${check("service", power.serviceInstalled, power.serviceInstalled ? "unit installed" : "unit not installed")}`,
|
|
42
|
-
` ${check("inhibit", power.inhibitAvailable, power.inhibitAvailable ? "systemd-inhibit available" : "systemd-inhibit not found")}`,
|
|
43
32
|
].join("\n");
|
|
44
33
|
}
|
|
45
34
|
export function resolveRoleReadiness(config) {
|
|
@@ -52,9 +41,9 @@ export function resolveRoleReadiness(config) {
|
|
|
52
41
|
* and nobody could see why: the bindings lived in a JSON file no command
|
|
53
42
|
* printed. Reading them costs nothing, so `doctor` reads them.
|
|
54
43
|
*/
|
|
55
|
-
export function renderRolesSection(rows
|
|
44
|
+
export function renderRolesSection(rows) {
|
|
56
45
|
return [
|
|
57
|
-
|
|
46
|
+
"Roles",
|
|
58
47
|
...rows.map(({ role, harness, model, fallback }) => ` ${check(role, harness !== undefined, harness ? `${harness} / ${model}` : `unbound, runs on ${fallback}`)}`),
|
|
59
48
|
].join("\n");
|
|
60
49
|
}
|
|
@@ -87,27 +76,11 @@ export function registerDoctorCommand(program) {
|
|
|
87
76
|
process.exit(1);
|
|
88
77
|
}
|
|
89
78
|
const loaded = loadConfig();
|
|
90
|
-
const
|
|
91
|
-
? loaded.activeProfile.trim()
|
|
92
|
-
: undefined;
|
|
93
|
-
// Readiness follows the active profile. A dangling pointer still gets
|
|
94
|
-
// a report, but the error is shown instead of hiding it behind the base
|
|
95
|
-
// bindings.
|
|
96
|
-
let effective = loaded;
|
|
97
|
-
let activeProfileError = null;
|
|
98
|
-
try {
|
|
99
|
-
effective = resolveEffectiveConfig(loaded);
|
|
100
|
-
}
|
|
101
|
-
catch (error) {
|
|
102
|
-
activeProfileError = error instanceof Error ? error.message : String(error);
|
|
103
|
-
}
|
|
104
|
-
const roles = resolveRoleReadiness(effective);
|
|
79
|
+
const roles = resolveRoleReadiness(loaded);
|
|
105
80
|
if (opts.json) {
|
|
106
81
|
console.log(JSON.stringify({
|
|
107
82
|
...result,
|
|
108
83
|
power: resolvePowerInfo(result),
|
|
109
|
-
activeProfile: activeProfile ?? null,
|
|
110
|
-
activeProfileError,
|
|
111
84
|
roles,
|
|
112
85
|
}, null, 2));
|
|
113
86
|
return;
|
|
@@ -160,12 +133,7 @@ export function registerDoctorCommand(program) {
|
|
|
160
133
|
console.log("");
|
|
161
134
|
console.log(renderPowerSection(resolvePowerInfo(result)));
|
|
162
135
|
console.log("");
|
|
163
|
-
console.log(
|
|
164
|
-
console.log(` active ${activeProfile ?? "base config"}`);
|
|
165
|
-
if (activeProfileError !== null)
|
|
166
|
-
console.log(` error ${activeProfileError}`);
|
|
167
|
-
console.log("");
|
|
168
|
-
console.log(renderRolesSection(roles, activeProfile));
|
|
136
|
+
console.log(renderRolesSection(roles));
|
|
169
137
|
console.log("");
|
|
170
138
|
const paths = getPaths();
|
|
171
139
|
console.log("Paths");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { IpcClient } from "../../daemon/ipc.js";
|
|
2
|
-
function formatEvent(ev) {
|
|
2
|
+
export function formatEvent(ev) {
|
|
3
3
|
const t = new Date(ev.timestamp).toLocaleTimeString();
|
|
4
4
|
switch (ev.type) {
|
|
5
5
|
case "session.started":
|
|
@@ -7,7 +7,7 @@ function formatEvent(ev) {
|
|
|
7
7
|
case "turn.started":
|
|
8
8
|
return `[${t}] ▶ Turn started${ev.prompt ? `: ${String(ev.prompt).slice(0, 100)}` : ""}`;
|
|
9
9
|
case "message":
|
|
10
|
-
return `[${t}] ${ev.role === "user" ? "▶" : "●"} ${ev.role}: ${String(ev.content)
|
|
10
|
+
return `[${t}] ${ev.role === "user" ? "▶" : "●"} ${ev.role}: ${String(ev.content)}`;
|
|
11
11
|
case "text.delta":
|
|
12
12
|
return ev.delta;
|
|
13
13
|
case "tool.started":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/cli/commands/logs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/cli/commands/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import fs from "node:fs";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import * as readline from "node:readline";
|
|
5
5
|
import { IpcClient } from "../../daemon/ipc.js";
|
|
6
|
-
import { loadConfig,
|
|
6
|
+
import { loadConfig, resolveRoleBinding, resolveOrchestratorMode, } from "../../config/config.js";
|
|
7
7
|
import { parseEffort, REASONING_EFFORTS } from "../../core/driver.js";
|
|
8
8
|
import { parseAutocompact } from "../../core/autocompact.js";
|
|
9
9
|
import { harnessInjection } from "../../open/injection.js";
|
|
@@ -12,6 +12,7 @@ import { createWorktree } from "../../git/worktree.js";
|
|
|
12
12
|
import { ptyShimPath } from "../../open/pty.js";
|
|
13
13
|
import { isInteractiveTerminal } from "./setup.js";
|
|
14
14
|
import { sessionsDir } from "../../open/pty.js";
|
|
15
|
+
import { startLinkWatcher } from "../../open/link-watcher.js";
|
|
15
16
|
import { ROLES, parseRole, resolvePluginDir } from "../../core/roles.js";
|
|
16
17
|
import { getCliName } from "../cli-name.js";
|
|
17
18
|
import { effectiveModel, resolveOpenModel } from "../../open/contract.js";
|
|
@@ -214,6 +215,54 @@ function selectRole() {
|
|
|
214
215
|
ask();
|
|
215
216
|
});
|
|
216
217
|
}
|
|
218
|
+
export function askWorktree() {
|
|
219
|
+
const rl = readline.createInterface({
|
|
220
|
+
input: process.stdin,
|
|
221
|
+
output: process.stdout,
|
|
222
|
+
});
|
|
223
|
+
return new Promise((resolve, reject) => {
|
|
224
|
+
let settled = false;
|
|
225
|
+
const finish = (worktree) => {
|
|
226
|
+
if (settled)
|
|
227
|
+
return;
|
|
228
|
+
settled = true;
|
|
229
|
+
rl.close();
|
|
230
|
+
resolve(worktree);
|
|
231
|
+
};
|
|
232
|
+
rl.once("close", () => {
|
|
233
|
+
if (settled)
|
|
234
|
+
return;
|
|
235
|
+
settled = true;
|
|
236
|
+
reject(new Error("Worktree selection was interrupted; nothing was launched."));
|
|
237
|
+
});
|
|
238
|
+
const ask = () => {
|
|
239
|
+
rl.question("Open in a worktree? [y/N]: ", (answer) => {
|
|
240
|
+
const choice = answer.trim().toLowerCase();
|
|
241
|
+
if (choice === "y" || choice === "yes") {
|
|
242
|
+
finish(true);
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
if (choice === "" || choice === "n" || choice === "no") {
|
|
246
|
+
finish(false);
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
process.stderr.write("Answer y or n.\n");
|
|
250
|
+
ask();
|
|
251
|
+
});
|
|
252
|
+
};
|
|
253
|
+
ask();
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
export async function resolveOpenWorktree(flag, ctx, ask = askWorktree) {
|
|
257
|
+
if (flag !== undefined)
|
|
258
|
+
return flag;
|
|
259
|
+
if (!ctx.interactive || ctx.resume !== undefined)
|
|
260
|
+
return false;
|
|
261
|
+
const gitInfo = await getGitInfo(ctx.cwd);
|
|
262
|
+
if (!gitInfo)
|
|
263
|
+
return false;
|
|
264
|
+
return ask();
|
|
265
|
+
}
|
|
217
266
|
/**
|
|
218
267
|
* `claude -p` answers one prompt and exits, so there is no session to choose a
|
|
219
268
|
* role for. A terminal check alone does not catch this: under a pty (CI scripts,
|
|
@@ -337,8 +386,8 @@ export function registerOpenCommand(program) {
|
|
|
337
386
|
.option("--autocompact [value]", "native auto-compact: Claude window size is auto or 100000-1000000 tokens; OpenCode toggles its native setting")
|
|
338
387
|
.option("--no-autocompact", "disable native auto-compaction in Claude and OpenCode")
|
|
339
388
|
.option("--resume <session>", "resume an interactive session")
|
|
340
|
-
.option("--worktree", "
|
|
341
|
-
.option("--
|
|
389
|
+
.option("--worktree", "open the session in an isolated git worktree")
|
|
390
|
+
.option("--no-worktree", "open in the current directory without asking")
|
|
342
391
|
.option("--no-bypass", "do not skip Claude Code permission prompts")
|
|
343
392
|
.option("--no-theme", "keep only the CodeDeck status line, without the theme or the renderer")
|
|
344
393
|
.option("--no-pty", "do not run the session under a pty, which also drops the automatic rename")
|
|
@@ -346,11 +395,9 @@ export function registerOpenCommand(program) {
|
|
|
346
395
|
.action(async (roleArg, opts, command) => {
|
|
347
396
|
const invocation = getInvocation(command, roleArg);
|
|
348
397
|
const autocompact = parseAutocompact(opts.autocompact);
|
|
349
|
-
// Launching
|
|
350
|
-
//
|
|
351
|
-
|
|
352
|
-
// binding, model and effort below comes from the same setup.
|
|
353
|
-
const config = resolveEffectiveConfig(loadConfig(), opts.profile);
|
|
398
|
+
// Launching does not open the wizard. `codedeck setup` is where users
|
|
399
|
+
// choose models. Bindings, models and effort come from top-level setup.
|
|
400
|
+
const config = loadConfig();
|
|
354
401
|
const orchestratorMode = resolveOrchestratorMode(config);
|
|
355
402
|
// The print-flag check is harness-specific (-p is --profile on codex),
|
|
356
403
|
// so peek at the launcher through the requested role before deciding.
|
|
@@ -367,9 +414,14 @@ export function registerOpenCommand(program) {
|
|
|
367
414
|
}
|
|
368
415
|
const interactive = !isNonInteractiveLaunch(invocation.passthrough, hintLauncher);
|
|
369
416
|
const role = await resolveRole(invocation.roleInput, interactive);
|
|
417
|
+
const cwd = currentWorkingDirectory();
|
|
418
|
+
opts.worktree = await resolveOpenWorktree(opts.worktree, {
|
|
419
|
+
interactive: interactive && isInteractiveTerminal(),
|
|
420
|
+
resume: opts.resume,
|
|
421
|
+
cwd,
|
|
422
|
+
});
|
|
370
423
|
const pluginDir = resolvePluginDir();
|
|
371
424
|
assertPluginDirectory(pluginDir);
|
|
372
|
-
const cwd = currentWorkingDirectory();
|
|
373
425
|
const client = new IpcClient();
|
|
374
426
|
await client.ensureDaemonStarted();
|
|
375
427
|
const binding = resolveRoleBinding(role, config);
|
|
@@ -397,8 +449,33 @@ export function registerOpenCommand(program) {
|
|
|
397
449
|
...(openEffort !== undefined ? { effort: openEffort } : {}),
|
|
398
450
|
cwd,
|
|
399
451
|
name: role,
|
|
452
|
+
role,
|
|
453
|
+
...(opts.resume !== undefined ? { resume: opts.resume } : {}),
|
|
400
454
|
});
|
|
401
455
|
const runId = adoptRes.session.id;
|
|
456
|
+
let linkWatcher;
|
|
457
|
+
let linkWatcherFlush;
|
|
458
|
+
const flushLinkWatcher = async () => {
|
|
459
|
+
if (linkWatcherFlush !== undefined) {
|
|
460
|
+
await linkWatcherFlush;
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
if (linkWatcher === undefined)
|
|
464
|
+
return;
|
|
465
|
+
const watcher = linkWatcher;
|
|
466
|
+
linkWatcherFlush = (async () => {
|
|
467
|
+
try {
|
|
468
|
+
await watcher.flush();
|
|
469
|
+
}
|
|
470
|
+
catch { }
|
|
471
|
+
try {
|
|
472
|
+
watcher.stop();
|
|
473
|
+
}
|
|
474
|
+
catch { }
|
|
475
|
+
linkWatcher = undefined;
|
|
476
|
+
})();
|
|
477
|
+
await linkWatcherFlush;
|
|
478
|
+
};
|
|
402
479
|
let patchPromise;
|
|
403
480
|
try {
|
|
404
481
|
if (launcher === "opencode") {
|
|
@@ -452,6 +529,8 @@ export function registerOpenCommand(program) {
|
|
|
452
529
|
}
|
|
453
530
|
catch { }
|
|
454
531
|
}
|
|
532
|
+
if (linkWatcher !== undefined || linkWatcherFlush !== undefined)
|
|
533
|
+
await flushLinkWatcher();
|
|
455
534
|
const nativeSessionId = finishOpenSession(role, sessionFile);
|
|
456
535
|
try {
|
|
457
536
|
if (patchPromise)
|
|
@@ -470,6 +549,7 @@ export function registerOpenCommand(program) {
|
|
|
470
549
|
cwd: openCwd,
|
|
471
550
|
envExtra: {
|
|
472
551
|
CODEDECK_RUN_ID: runId,
|
|
552
|
+
CODEDECK_SESSION_ID: runId,
|
|
473
553
|
OPENCODE_CONFIG_CONTENT: buildInlineConfig(pluginDir, role, orchestratorMode, { config, explicit: autocompact }),
|
|
474
554
|
...(tuiDir !== undefined ? { OPENCODE_CONFIG_DIR: tuiDir } : {}),
|
|
475
555
|
},
|
|
@@ -542,6 +622,8 @@ export function registerOpenCommand(program) {
|
|
|
542
622
|
}
|
|
543
623
|
catch { }
|
|
544
624
|
}
|
|
625
|
+
if (linkWatcher !== undefined || linkWatcherFlush !== undefined)
|
|
626
|
+
await flushLinkWatcher();
|
|
545
627
|
const nativeSessionId = finishOpenSession(role, sessionFile);
|
|
546
628
|
try {
|
|
547
629
|
if (patchPromise)
|
|
@@ -558,7 +640,7 @@ export function registerOpenCommand(program) {
|
|
|
558
640
|
};
|
|
559
641
|
await spawnHarness(codexBin, buildCodexOpenArgs(role, { ...opts, model, effort }, pluginDir, invocation.passthrough, openCwd, orchestratorMode), {
|
|
560
642
|
cwd: openCwd,
|
|
561
|
-
envExtra: { CODEDECK_RUN_ID: runId },
|
|
643
|
+
envExtra: { CODEDECK_RUN_ID: runId, CODEDECK_SESSION_ID: runId },
|
|
562
644
|
sessionFile,
|
|
563
645
|
model,
|
|
564
646
|
notFoundMessage: CODEX_NOT_FOUND,
|
|
@@ -590,6 +672,11 @@ export function registerOpenCommand(program) {
|
|
|
590
672
|
else {
|
|
591
673
|
await playBoot(role, model, effort);
|
|
592
674
|
}
|
|
675
|
+
linkWatcher = startLinkWatcher({
|
|
676
|
+
sessionFile,
|
|
677
|
+
runId,
|
|
678
|
+
link: (id, nativeId) => client.request("session.linkNative", { id, nativeId }),
|
|
679
|
+
});
|
|
593
680
|
const closeClaude = async () => {
|
|
594
681
|
if (!fs.existsSync(sessionFile) && opts.resume && SESSION_ID_PATTERN.test(opts.resume)) {
|
|
595
682
|
try {
|
|
@@ -597,6 +684,8 @@ export function registerOpenCommand(program) {
|
|
|
597
684
|
}
|
|
598
685
|
catch { }
|
|
599
686
|
}
|
|
687
|
+
if (linkWatcher !== undefined || linkWatcherFlush !== undefined)
|
|
688
|
+
await flushLinkWatcher();
|
|
600
689
|
const nativeSessionId = finishOpenSession(role, sessionFile);
|
|
601
690
|
try {
|
|
602
691
|
if (patchPromise)
|
|
@@ -611,7 +700,7 @@ export function registerOpenCommand(program) {
|
|
|
611
700
|
}
|
|
612
701
|
catch { }
|
|
613
702
|
};
|
|
614
|
-
await launchClaude(claudeBin, model, args, cwd, sessionFile, closeClaude, undefined, undefined, { CODEDECK_RUN_ID: runId }, ptyLaunchForHarness("claude", pluginDir, sessionFile, opts, config, interactive), (child) => {
|
|
703
|
+
await launchClaude(claudeBin, model, args, cwd, sessionFile, closeClaude, undefined, undefined, { CODEDECK_RUN_ID: runId, CODEDECK_SESSION_ID: runId }, ptyLaunchForHarness("claude", pluginDir, sessionFile, opts, config, interactive), (child) => {
|
|
615
704
|
if (child.pid) {
|
|
616
705
|
patchPromise = client.request("session.patch", {
|
|
617
706
|
id: runId,
|
|
@@ -621,6 +710,8 @@ export function registerOpenCommand(program) {
|
|
|
621
710
|
});
|
|
622
711
|
}
|
|
623
712
|
catch (err) {
|
|
713
|
+
if (linkWatcher !== undefined || linkWatcherFlush !== undefined)
|
|
714
|
+
await flushLinkWatcher();
|
|
624
715
|
try {
|
|
625
716
|
await client.request("session.release", {
|
|
626
717
|
id: runId,
|