@creator-notes/cnotes 0.25.1 → 0.26.0

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.
Files changed (37) hide show
  1. package/dist/commands/auth-keys.d.ts +3 -0
  2. package/dist/commands/auth-keys.d.ts.map +1 -0
  3. package/dist/commands/auth-keys.js +69 -0
  4. package/dist/commands/auth-keys.js.map +1 -0
  5. package/dist/commands/auth.d.ts +1 -0
  6. package/dist/commands/auth.d.ts.map +1 -1
  7. package/dist/commands/auth.js +65 -7
  8. package/dist/commands/auth.js.map +1 -1
  9. package/dist/commands/canvas.d.ts.map +1 -1
  10. package/dist/commands/canvas.js +122 -20
  11. package/dist/commands/canvas.js.map +1 -1
  12. package/dist/commands/files.d.ts.map +1 -1
  13. package/dist/commands/files.js +11 -1
  14. package/dist/commands/files.js.map +1 -1
  15. package/dist/commands/operations.d.ts.map +1 -1
  16. package/dist/commands/operations.js +21 -19
  17. package/dist/commands/operations.js.map +1 -1
  18. package/dist/lib/api-client.d.ts +35 -9
  19. package/dist/lib/api-client.d.ts.map +1 -1
  20. package/dist/lib/api-client.js +60 -24
  21. package/dist/lib/api-client.js.map +1 -1
  22. package/dist/lib/auth-store.d.ts +42 -10
  23. package/dist/lib/auth-store.d.ts.map +1 -1
  24. package/dist/lib/auth-store.js +38 -12
  25. package/dist/lib/auth-store.js.map +1 -1
  26. package/dist/lib/mcp-local-file.d.ts +11 -0
  27. package/dist/lib/mcp-local-file.d.ts.map +1 -0
  28. package/dist/lib/mcp-local-file.js +62 -0
  29. package/dist/lib/mcp-local-file.js.map +1 -0
  30. package/dist/lib/output.d.ts +7 -0
  31. package/dist/lib/output.d.ts.map +1 -1
  32. package/dist/lib/output.js +16 -0
  33. package/dist/lib/output.js.map +1 -1
  34. package/dist/mcp-server.js +7 -1
  35. package/dist/mcp-server.js.map +1 -1
  36. package/package.json +2 -2
  37. package/skills/cnotes/SKILL.md +20 -2
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerAuthKeysCommands(auth: Command, program: Command): void;
3
+ //# sourceMappingURL=auth-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-keys.d.ts","sourceRoot":"","sources":["../../src/commands/auth-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAkE9E"}
@@ -0,0 +1,69 @@
1
+ import { ApiClient } from "../lib/api-client.js";
2
+ import { resolveBaseConfig } from "../lib/config.js";
3
+ import { handleError, ValidationError } from "../lib/errors.js";
4
+ import { outputJson } from "../lib/output.js";
5
+ export function registerAuthKeysCommands(auth, program) {
6
+ const keys = auth
7
+ .command("keys")
8
+ .description("List and revoke CLI API keys for your account");
9
+ keys
10
+ .command("list")
11
+ .description("List CLI API keys (metadata only — not the secret values)")
12
+ .action(async () => {
13
+ const json = program.opts().json ?? false;
14
+ try {
15
+ const cfg = resolveBaseConfig(program.opts());
16
+ if (!cfg.token)
17
+ throw new ValidationError("Not authenticated. Run `cnotes auth login` first.");
18
+ const api = new ApiClient(cfg.serverUrl, cfg.token);
19
+ const data = await api.get("/api/auth/cli-keys");
20
+ const rows = Array.isArray(data.keys) ? data.keys : [];
21
+ if (json) {
22
+ outputJson({ keys: rows });
23
+ return;
24
+ }
25
+ if (rows.length === 0) {
26
+ console.log("No CLI API keys found.");
27
+ return;
28
+ }
29
+ console.log("CLI API keys:");
30
+ for (const k of rows) {
31
+ const last = k.lastUsedAt
32
+ ? new Date(k.lastUsedAt).toISOString()
33
+ : "never";
34
+ const exp = k.expiresAt
35
+ ? new Date(k.expiresAt).toISOString()
36
+ : "never";
37
+ console.log(` ${k.id} ${k.name}`);
38
+ console.log(` created: ${new Date(k.createdAt).toISOString()} last used: ${last} expires: ${exp}`);
39
+ }
40
+ }
41
+ catch (error) {
42
+ handleError(error, json);
43
+ }
44
+ });
45
+ keys
46
+ .command("revoke")
47
+ .description("Revoke a CLI API key by id (from `cnotes auth keys list`)")
48
+ .argument("<keyId>", "CLI API key id")
49
+ .action(async (keyId) => {
50
+ const json = program.opts().json ?? false;
51
+ try {
52
+ const cfg = resolveBaseConfig(program.opts());
53
+ if (!cfg.token)
54
+ throw new ValidationError("Not authenticated. Run `cnotes auth login` first.");
55
+ const api = new ApiClient(cfg.serverUrl, cfg.token);
56
+ const result = await api.delete(`/api/auth/cli-keys?keyId=${encodeURIComponent(keyId)}`);
57
+ if (json) {
58
+ outputJson(result);
59
+ }
60
+ else {
61
+ console.log(`Revoked CLI API key ${keyId}`);
62
+ }
63
+ }
64
+ catch (error) {
65
+ handleError(error, json);
66
+ }
67
+ });
68
+ }
69
+ //# sourceMappingURL=auth-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-keys.js","sourceRoot":"","sources":["../../src/commands/auth-keys.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ export declare function registerAuthCommands(program: Command): void;
3
3
  export interface LoginResult {
4
4
  email: string;
5
5
  serverUrl: string;
6
+ expiresAt?: number;
6
7
  }
7
8
  export declare function browserLogin(rawServerUrl: string, json: boolean, options?: {
8
9
  quiet?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyI3D;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5B,OAAO,CAAC,WAAW,CAAC,CA6ItB"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2I3D;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAuCD,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5B,OAAO,CAAC,WAAW,CAAC,CAyKtB"}
@@ -5,6 +5,7 @@ import { validateServerUrl, unofficialServerWarning, allowedCallbackOrigins, } f
5
5
  import { readStdin } from "../lib/stdin.js";
6
6
  import { handleError } from "../lib/errors.js";
7
7
  import { outputJson } from "../lib/output.js";
8
+ import { registerAuthKeysCommands } from "./auth-keys.js";
8
9
  export function registerAuthCommands(program) {
9
10
  const auth = program
10
11
  .command("auth")
@@ -133,6 +134,40 @@ export function registerAuthCommands(program) {
133
134
  handleError(error, json);
134
135
  }
135
136
  });
137
+ registerAuthKeysCommands(auth, program);
138
+ }
139
+ /** Read a small JSON body from an HTTP POST (login callback). */
140
+ async function readJsonBody(req, maxBytes = 16_384) {
141
+ const chunks = [];
142
+ let total = 0;
143
+ for await (const chunk of req) {
144
+ const buf = Buffer.from(chunk);
145
+ total += buf.length;
146
+ if (total > maxBytes)
147
+ throw new Error("Request body too large");
148
+ chunks.push(buf);
149
+ }
150
+ const text = Buffer.concat(chunks).toString("utf-8");
151
+ if (!text)
152
+ return {};
153
+ return JSON.parse(text);
154
+ }
155
+ function parseCallbackPayload(method, url, body) {
156
+ if (method === "POST" && body && typeof body === "object") {
157
+ const b = body;
158
+ return {
159
+ token: typeof b.token === "string" ? b.token : undefined,
160
+ email: typeof b.email === "string" ? b.email : undefined,
161
+ state: typeof b.state === "string" ? b.state : undefined,
162
+ expiresAt: typeof b.expiresAt === "number" ? b.expiresAt : undefined,
163
+ };
164
+ }
165
+ // Legacy GET callback (older auth pages) — token still in query string.
166
+ return {
167
+ token: url.searchParams.get("token") ?? undefined,
168
+ email: url.searchParams.get("email") ?? undefined,
169
+ state: url.searchParams.get("state") ?? undefined,
170
+ };
136
171
  }
137
172
  export async function browserLogin(rawServerUrl, json, options) {
138
173
  const quiet = options?.quiet ?? false;
@@ -152,7 +187,7 @@ export async function browserLogin(rawServerUrl, json, options) {
152
187
  const expectedState = randomBytes(16).toString("hex");
153
188
  const allowedOrigins = allowedCallbackOrigins(serverUrl);
154
189
  return new Promise((resolve, reject) => {
155
- const server = createServer((req, res) => {
190
+ const server = createServer(async (req, res) => {
156
191
  const url = new URL(req.url || "/", `http://localhost`);
157
192
  // Scope CORS to the server origin (not "*") so no other site can read this
158
193
  // callback's response or drive it cross-origin (HIGH-1). Echo back the
@@ -166,7 +201,8 @@ export async function browserLogin(rawServerUrl, json, options) {
166
201
  const originToAllow = reqOrigin && allowedOrigins.has(reqOrigin) ? reqOrigin : allowedOrigins.values().next().value;
167
202
  res.setHeader("Access-Control-Allow-Origin", originToAllow);
168
203
  res.setHeader("Vary", "Origin");
169
- res.setHeader("Access-Control-Allow-Methods", "GET, OPTIONS");
204
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
205
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type");
170
206
  if (req.method === "OPTIONS") {
171
207
  res.writeHead(204);
172
208
  res.end();
@@ -177,9 +213,23 @@ export async function browserLogin(rawServerUrl, json, options) {
177
213
  res.end("Not found");
178
214
  return;
179
215
  }
180
- const token = url.searchParams.get("token");
181
- const email = url.searchParams.get("email");
182
- const state = url.searchParams.get("state");
216
+ if (req.method !== "POST" && req.method !== "GET") {
217
+ res.writeHead(405);
218
+ res.end("Method not allowed");
219
+ return;
220
+ }
221
+ let body = {};
222
+ if (req.method === "POST") {
223
+ try {
224
+ body = await readJsonBody(req);
225
+ }
226
+ catch {
227
+ res.writeHead(400);
228
+ res.end("Invalid JSON body");
229
+ return;
230
+ }
231
+ }
232
+ const { token, email, state, expiresAt } = parseCallbackPayload(req.method, url, body);
183
233
  // Reject a callback that doesn't carry our nonce. An older auth page that
184
234
  // doesn't echo `state` fails here too, but the page's own fallback then
185
235
  // shows the manual `--token` command, so the user is never hard-blocked.
@@ -208,14 +258,22 @@ export async function browserLogin(rawServerUrl, json, options) {
208
258
  res.end(JSON.stringify({ ok: true }));
209
259
  if (!quiet) {
210
260
  if (json) {
211
- outputJson({ status: "authenticated", server: serverUrl, email });
261
+ outputJson({
262
+ status: "authenticated",
263
+ server: serverUrl,
264
+ email,
265
+ expiresAt: expiresAt ?? null,
266
+ });
212
267
  }
213
268
  else {
214
269
  console.log(`\nAuthenticated as ${email || "unknown"} on ${serverUrl}`);
270
+ if (expiresAt) {
271
+ console.log(`API key expires: ${new Date(expiresAt).toISOString()}`);
272
+ }
215
273
  }
216
274
  }
217
275
  server.close();
218
- resolve({ email: email || "unknown", serverUrl });
276
+ resolve({ email: email || "unknown", serverUrl, expiresAt });
219
277
  });
220
278
  // Listen on ephemeral port
221
279
  server.listen(0, "localhost", async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["../../src/commands/canvas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAkF5C,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoxD7D"}
1
+ {"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["../../src/commands/canvas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAwF5C,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA44D7D"}
@@ -1,9 +1,10 @@
1
1
  import { Option } from "commander";
2
- import { ApiClient } from "../lib/api-client.js";
2
+ import { ApiClient, resolveActiveAgentRun } from "../lib/api-client.js";
3
3
  import { resolveConfig } from "../lib/config.js";
4
- import { EXIT_CODES, handleError, ValidationError } from "../lib/errors.js";
4
+ import { CliError, EXIT_CODES, handleError, ValidationError } from "../lib/errors.js";
5
5
  import { parseJsonOption, readFileSafe } from "../lib/fs-utils.js";
6
- import { outputJson, outputTable, outputQuiet, truncate, timeAgo } from "../lib/output.js";
6
+ import { loadConfig, setActiveAgentRunId, clearActiveAgentRunId, getActiveAgentRunId, } from "../lib/auth-store.js";
7
+ import { outputJson, outputTable, outputQuiet, truncate, timeAgo, formatAgo } from "../lib/output.js";
7
8
  import { readCanvasMarkdown, renderCanvasMarkdown } from "../lib/canvas-read.js";
8
9
  import { resolveAgentSession } from "../lib/claude-session.js";
9
10
  import { WARN, dim } from "../lib/style.js";
@@ -1520,33 +1521,88 @@ Examples:
1520
1521
  // Bracket a sequence of canvas commands with auto-checkpoints so the
1521
1522
  // server treats them as a single agent operation. The pattern:
1522
1523
  //
1523
- // eval "$(npx cnotes canvas agent-run begin --canvas <id> --prompt "Reorganize")"
1524
+ // npx cnotes canvas agent-run begin --canvas <id> --prompt "Reorganize"
1524
1525
  // npx cnotes canvas add-node ...
1525
1526
  // npx cnotes canvas add-edge ...
1526
1527
  // npx cnotes canvas agent-run end --canvas <id>
1527
1528
  //
1528
- // `begin` prints `export CNOTES_AGENT_RUN_ID=...` for shell eval. Subsequent
1529
- // commands pick up the env var and the api-client adds it as a header,
1530
- // so all mutations between begin and end share one operation row + a
1531
- // before/after snapshot pair, recoverable later via "Revert this run".
1529
+ // `begin` PERSISTS the run as the active run for this server (same store
1530
+ // `cnotes operations begin` uses), so every subsequent cnotes write attaches
1531
+ // automatically — across separate shells and stateless tool calls, with no
1532
+ // env var to thread through. It also still prints `export CNOTES_AGENT_RUN_ID=...`
1533
+ // so the older `eval "$(...)"` form keeps working; the env var wins over the
1534
+ // persisted pointer in ApiClient's precedence order.
1535
+ //
1536
+ // Persisting is load-bearing, not a convenience. Before it, an agent that ran
1537
+ // begin and then issued each write as its own process (the normal shape of
1538
+ // agent work) got NO run attached: the writes silently landed as
1539
+ // `manual.edit` / actorSource "human", and `end` failed with "No agent run ID
1540
+ // found". The bracket looked fine and recorded a lie.
1541
+ //
1542
+ // Two things persist, and BOTH are required for "Revert this run" to work:
1543
+ // the runId (which clusters the writes into one operation) and the
1544
+ // before-snapshot id (which the run's first mutation back-links as
1545
+ // operation.checkpointBeforeId — the state revert rewinds to). Persist only
1546
+ // the first and you get a run that looks healthy in the timeline and throws
1547
+ // "Operation cannot be reverted" when the user tries to undo it.
1532
1548
  const agentRun = canvas
1533
1549
  .command("agent-run")
1534
1550
  .description("Bracket canvas commands with before/after auto-checkpoints");
1535
1551
  agentRun
1536
1552
  .command("begin")
1537
- .description("Open an agent-run session — captures a before-snapshot and prints CNOTES_AGENT_RUN_ID")
1553
+ .description("Open an agent-run session — captures a before-snapshot and makes the run active for this server")
1538
1554
  .requiredOption("--canvas <id>", "Canvas ID to bracket")
1539
1555
  .requiredOption("--prompt <text>", "User prompt or summary describing the run")
1540
1556
  .option("--rationale <text>", "Optional rationale (e.g. agent's plan)")
1557
+ .option("--force", "If an active run already exists on this server, end it server-side and start a fresh one")
1558
+ .addHelpText("after", `
1559
+ Examples:
1560
+ $ cnotes canvas agent-run begin --canvas <id> --prompt "Reorganize into sections"
1561
+ $ cnotes canvas place <id> --spec ./layout.json # attaches automatically
1562
+ $ cnotes canvas agent-run end --canvas <id>
1563
+
1564
+ After 'begin', every subsequent cnotes write on this server attaches to the
1565
+ run automatically — no env var to export, and it survives across separate
1566
+ shells. End with 'cnotes canvas agent-run end --canvas <id>'.
1567
+
1568
+ If a run is already open (from 'agent-run begin' or 'operations begin'),
1569
+ begin refuses rather than silently clobbering it. Pass --force to end the
1570
+ prior run server-side and start fresh.
1571
+ `)
1541
1572
  .action(async (opts) => {
1542
1573
  const cfg = resolveConfig(program.opts());
1543
1574
  const api = new ApiClient(cfg.serverUrl, cfg.token);
1544
- // This command is designed to be used via `eval "$(...)"`, which makes
1575
+ // This command is designed to be usable via `eval "$(...)"`, which makes
1545
1576
  // stdout a non-TTY. resolveConfig's default would then flip cfg.json on
1546
1577
  // and we'd emit JSON instead of shell exports — breaking the eval form.
1547
1578
  // Honour JSON only when the user asked for it explicitly.
1548
1579
  const wantsJson = program.opts().json === true || process.env.CNOTES_JSON === "1";
1549
1580
  try {
1581
+ // Refuse to open a second run while one is still active on this server.
1582
+ // Both `operations begin` and `canvas agent-run begin` write the same
1583
+ // pointer, and a request carries exactly one X-Agent-Run-Id — so a
1584
+ // second begin would either clobber the first or silently attach writes
1585
+ // to the wrong run. Mirrors `cnotes operations begin`.
1586
+ const existing = getActiveAgentRunId(loadConfig(), cfg.serverUrl);
1587
+ if (existing) {
1588
+ if (opts.force) {
1589
+ try {
1590
+ await api.post("/api/operations", {
1591
+ action: "end",
1592
+ agentRunId: existing.agentRunId,
1593
+ });
1594
+ }
1595
+ catch {
1596
+ // Best-effort: ending an already-completed/abandoned run is
1597
+ // idempotent server-side. Either way clear the local pointer so
1598
+ // the caller isn't wedged.
1599
+ }
1600
+ clearActiveAgentRunId(loadConfig(), cfg.serverUrl);
1601
+ }
1602
+ else {
1603
+ throw new CliError(`An active agent-run already exists on this server (agentRunId ${existing.agentRunId}, started ${formatAgo(existing.startedAt)}).`, EXIT_CODES.CONFLICT, "End it first (`cnotes canvas agent-run end --canvas <id>` or `cnotes operations end`), or pass --force to end it server-side and start fresh.");
1604
+ }
1605
+ }
1550
1606
  const body = {
1551
1607
  action: "agentRunBegin",
1552
1608
  prompt: opts.prompt,
@@ -1557,6 +1613,29 @@ Examples:
1557
1613
  if (agentSession)
1558
1614
  body.agentSession = agentSession;
1559
1615
  const data = await api.post(`/api/canvas/${encodeURIComponent(opts.canvas)}`, body);
1616
+ // Persist the active run so subsequent cnotes writes attach to it even
1617
+ // when each one is a separate process. The server response carries no
1618
+ // startedAt for canvas runs, so stamp it locally — it only feeds the
1619
+ // "started Xs ago" text on a conflicting begin.
1620
+ //
1621
+ // beforeCheckpointId rides along on every write as
1622
+ // X-Agent-Before-Snapshot-Id: the server can only back-link
1623
+ // operation.checkpointBeforeId at the run's FIRST mutation (at begin
1624
+ // time the operation row doesn't exist yet), and without that link
1625
+ // getRevertContext bails — "Revert this run" is dead for the whole
1626
+ // batch. Persisting the run id without it produces a run that looks
1627
+ // perfectly healthy and cannot be undone.
1628
+ const persisted = setActiveAgentRunId(loadConfig(), cfg.serverUrl, data.agentRunId, Date.now(), data.beforeCheckpointId);
1629
+ // No stored config entry for this server (token came from --token /
1630
+ // CNOTES_TOKEN against a server never logged into), so there is nowhere
1631
+ // to record the run. Say so rather than printing "every write now
1632
+ // attaches" — silently attaching nothing is the bug this flow exists to
1633
+ // kill. stderr, so it can't corrupt --json or the eval form.
1634
+ if (!persisted) {
1635
+ console.error(`# WARNING: could not persist the active run for ${cfg.serverUrl} — no stored login for that server.`);
1636
+ console.error(`# Subsequent cnotes writes will NOT attach to it. Either run \`cnotes auth login\`,`);
1637
+ console.error(`# or use the env form: eval "$(cnotes canvas agent-run begin --canvas ${opts.canvas} --prompt "...")"`);
1638
+ }
1560
1639
  if (cfg.quiet) {
1561
1640
  outputQuiet(data.agentRunId);
1562
1641
  return;
@@ -1565,14 +1644,16 @@ Examples:
1565
1644
  outputJson(data);
1566
1645
  return;
1567
1646
  }
1568
- // Print eval-friendly export so users can:
1647
+ // Still print the eval-friendly exports so the older
1569
1648
  // eval "$(npx cnotes canvas agent-run begin ...)"
1570
- // Only the runId + before-snapshot id need to ride along on
1571
- // each request — prompt + rationale were already persisted on
1572
- // the operation row at agentRunBegin time.
1649
+ // form keeps working. The env var takes precedence over the persisted
1650
+ // pointer, so both paths agree on the same run.
1573
1651
  console.log(`export CNOTES_AGENT_RUN_ID=${data.agentRunId}`);
1574
1652
  console.log(`export CNOTES_AGENT_BEFORE_SNAPSHOT_ID=${data.beforeCheckpointId}`);
1575
1653
  console.error(`# agent run started: v${data.beforeSnapshotNumber} (${data.agentRunId})`);
1654
+ if (persisted) {
1655
+ console.error(`# every cnotes write on this server now attaches to this run`);
1656
+ }
1576
1657
  console.error(`# end with: npx cnotes canvas agent-run end --canvas ${opts.canvas}`);
1577
1658
  }
1578
1659
  catch (error) {
@@ -1612,6 +1693,14 @@ Examples:
1612
1693
  // need to propagate — prompt + rationale are persisted on the
1613
1694
  // operation row at agentRunBegin time, so resending them per-request
1614
1695
  // would be redundant (and would add a spoofing surface).
1696
+ //
1697
+ // Unlike `begin`, wrap deliberately does NOT persist the run to the
1698
+ // server config: the env var scopes it to this subprocess tree, and wrap
1699
+ // always closes the run in its own finally-path. Persisting would risk
1700
+ // leaving a stale pointer if wrap were killed, and would make wrap
1701
+ // unusable inside an open `operations` run (a common nesting: open an
1702
+ // operation for `notes create`, then wrap a canvas layout inside it).
1703
+ // Env var beats the persisted pointer in ApiClient, so the nesting works.
1615
1704
  const { spawn } = await import("node:child_process");
1616
1705
  const child = spawn(command[0], command.slice(1), {
1617
1706
  stdio: "inherit",
@@ -1663,24 +1752,37 @@ Examples:
1663
1752
  });
1664
1753
  agentRun
1665
1754
  .command("end")
1666
- .description("Close an agent-run session — captures an after-snapshot and prints unset commands")
1755
+ .description("Close an agent-run session — captures an after-snapshot and clears the active run")
1667
1756
  .requiredOption("--canvas <id>", "Canvas ID to close")
1668
- .option("--run-id <id>", "Agent run ID (defaults to CNOTES_AGENT_RUN_ID env var)")
1757
+ .option("--run-id <id>", "Agent run ID (defaults to the active run on this server, then CNOTES_AGENT_RUN_ID)")
1669
1758
  .action(async (opts) => {
1670
1759
  const cfg = resolveConfig(program.opts());
1671
1760
  const api = new ApiClient(cfg.serverUrl, cfg.token);
1672
- const runId = opts.runId ?? process.env.CNOTES_AGENT_RUN_ID;
1673
- if (!runId) {
1674
- throw new ValidationError("No agent run ID found. Pass --run-id or set CNOTES_AGENT_RUN_ID.");
1675
- }
1676
1761
  // Same reasoning as `begin`: eval form makes stdout non-TTY, so don't
1677
1762
  // let the auto-detect flip us into JSON mode.
1678
1763
  const wantsJson = program.opts().json === true || process.env.CNOTES_JSON === "1";
1679
1764
  try {
1765
+ // Resolve the run to close through the SAME resolver ApiClient uses to
1766
+ // attach it (explicit flag first, then env, then the persisted run).
1767
+ // Sharing the function, rather than re-deriving the precedence here, is
1768
+ // the point: `end` closing a run the client would not have attached to
1769
+ // is exactly the desync that let agent edits record as human ones.
1770
+ const runId = opts.runId ?? resolveActiveAgentRun(cfg.serverUrl)?.agentRunId;
1771
+ if (!runId) {
1772
+ throw new ValidationError("No active run on this server, and no --run-id passed", "Open one with `cnotes canvas agent-run begin --canvas <id> --prompt \"...\"`, or pass --run-id <id> to close a specific run.");
1773
+ }
1680
1774
  const data = await api.post(`/api/canvas/${encodeURIComponent(opts.canvas)}`, {
1681
1775
  action: "agentRunEnd",
1682
1776
  agentRunId: runId,
1683
1777
  });
1778
+ // Clear the local pointer so the next write detaches. Only clear when
1779
+ // it matches the run we just closed, so a concurrent begin from another
1780
+ // shell isn't stomped. Done after a successful response so a transient
1781
+ // server error can't desync local state from the server.
1782
+ const active = getActiveAgentRunId(loadConfig(), cfg.serverUrl);
1783
+ if (active?.agentRunId === data.agentRunId) {
1784
+ clearActiveAgentRunId(loadConfig(), cfg.serverUrl);
1785
+ }
1684
1786
  if (cfg.quiet) {
1685
1787
  outputQuiet(String(data.afterSnapshotNumber));
1686
1788
  return;