@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.
- package/dist/commands/auth-keys.d.ts +3 -0
- package/dist/commands/auth-keys.d.ts.map +1 -0
- package/dist/commands/auth-keys.js +69 -0
- package/dist/commands/auth-keys.js.map +1 -0
- package/dist/commands/auth.d.ts +1 -0
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +65 -7
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/canvas.d.ts.map +1 -1
- package/dist/commands/canvas.js +122 -20
- package/dist/commands/canvas.js.map +1 -1
- package/dist/commands/files.d.ts.map +1 -1
- package/dist/commands/files.js +11 -1
- package/dist/commands/files.js.map +1 -1
- package/dist/commands/operations.d.ts.map +1 -1
- package/dist/commands/operations.js +21 -19
- package/dist/commands/operations.js.map +1 -1
- package/dist/lib/api-client.d.ts +35 -9
- package/dist/lib/api-client.d.ts.map +1 -1
- package/dist/lib/api-client.js +60 -24
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/auth-store.d.ts +42 -10
- package/dist/lib/auth-store.d.ts.map +1 -1
- package/dist/lib/auth-store.js +38 -12
- package/dist/lib/auth-store.js.map +1 -1
- package/dist/lib/mcp-local-file.d.ts +11 -0
- package/dist/lib/mcp-local-file.d.ts.map +1 -0
- package/dist/lib/mcp-local-file.js +62 -0
- package/dist/lib/mcp-local-file.js.map +1 -0
- package/dist/lib/output.d.ts +7 -0
- package/dist/lib/output.d.ts.map +1 -1
- package/dist/lib/output.js +16 -0
- package/dist/lib/output.js.map +1 -1
- package/dist/mcp-server.js +7 -1
- package/dist/mcp-server.js.map +1 -1
- package/package.json +2 -2
- package/skills/cnotes/SKILL.md +20 -2
package/dist/lib/api-client.js
CHANGED
|
@@ -8,6 +8,43 @@ function isRetryable(status) {
|
|
|
8
8
|
function sleep(ms) {
|
|
9
9
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
10
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* Resolve the agent-run to attach to writes against `serverUrl`, in precedence
|
|
13
|
+
* order:
|
|
14
|
+
*
|
|
15
|
+
* 1. `CNOTES_AGENT_RUN_ID` env var (explicit override, wins everything).
|
|
16
|
+
* `canvas agent-run wrap` sets this for its subprocess, so a wrapped run
|
|
17
|
+
* correctly beats any outer persisted run.
|
|
18
|
+
* 2. The active run persisted on this server's config, written by
|
|
19
|
+
* `cnotes operations begin` / `cnotes canvas agent-run begin` and cleared
|
|
20
|
+
* by their matching `end`.
|
|
21
|
+
*
|
|
22
|
+
* The run id and its before-snapshot resolve together, from ONE source. They
|
|
23
|
+
* are a pair — the snapshot is the state of the canvas at that run's begin — so
|
|
24
|
+
* mixing them across sources would hand a wrapped run the *outer* run's
|
|
25
|
+
* before-snapshot. The server drops a snapshot that belongs to another canvas,
|
|
26
|
+
* so the run would quietly lose its revert point rather than fail loudly.
|
|
27
|
+
*
|
|
28
|
+
* Exported so the bracketing commands resolve the run the same way the client
|
|
29
|
+
* attaches it — `canvas agent-run end` closing a run the client would not have
|
|
30
|
+
* attached to is exactly the desync that let agent edits record as human ones.
|
|
31
|
+
*/
|
|
32
|
+
export function resolveActiveAgentRun(serverUrl) {
|
|
33
|
+
const envRunId = process.env.CNOTES_AGENT_RUN_ID;
|
|
34
|
+
if (envRunId) {
|
|
35
|
+
return {
|
|
36
|
+
agentRunId: envRunId,
|
|
37
|
+
beforeSnapshotId: process.env.CNOTES_AGENT_BEFORE_SNAPSHOT_ID,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const active = getActiveAgentRunId(loadConfig(), serverUrl);
|
|
41
|
+
if (!active)
|
|
42
|
+
return undefined;
|
|
43
|
+
return {
|
|
44
|
+
agentRunId: active.agentRunId,
|
|
45
|
+
beforeSnapshotId: active.beforeSnapshotId,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
11
48
|
export class ApiClient {
|
|
12
49
|
serverUrl;
|
|
13
50
|
token;
|
|
@@ -17,12 +54,7 @@ export class ApiClient {
|
|
|
17
54
|
}
|
|
18
55
|
/**
|
|
19
56
|
* Build request headers, attaching the active agent-run when one is
|
|
20
|
-
* open
|
|
21
|
-
*
|
|
22
|
-
* 1. `CNOTES_AGENT_RUN_ID` env var (explicit override, wins everything).
|
|
23
|
-
* 2. The `activeAgentRunId` persisted on the current server's config
|
|
24
|
-
* (written by `cnotes operations begin`, cleared by `cnotes operations
|
|
25
|
-
* end`).
|
|
57
|
+
* open (see {@link resolveActiveAgentRun} for the resolution order).
|
|
26
58
|
*
|
|
27
59
|
* The config fallback exists because env vars don't survive across
|
|
28
60
|
* separate shell processes (or stateless tool calls — e.g. an agent
|
|
@@ -32,27 +64,31 @@ export class ApiClient {
|
|
|
32
64
|
*
|
|
33
65
|
* X-Agent-Before-Snapshot-Id carries the begin-checkpoint's snapshot
|
|
34
66
|
* ID so the first mutation under the run can back-link
|
|
35
|
-
* operation.checkpointBeforeId at open time
|
|
36
|
-
* snapshot belongs to the target canvas before
|
|
67
|
+
* operation.checkpointBeforeId at open time — no header, no revert point.
|
|
68
|
+
* The server validates the snapshot belongs to the target canvas before
|
|
69
|
+
* stamping it, and ignores it entirely without a run id.
|
|
37
70
|
*
|
|
38
71
|
* Prompt + rationale are deliberately NOT carried per-request — they
|
|
39
72
|
* were already persisted on the operation row at begin time, and
|
|
40
73
|
* resending them on every mutation would create a spoofing surface (a
|
|
41
74
|
* leaked runId could overwrite stored intent metadata).
|
|
75
|
+
*
|
|
76
|
+
* @internal exposed (not private) so tests can assert the run actually
|
|
77
|
+
* rides on the request — the header being silently absent is the bug.
|
|
42
78
|
*/
|
|
43
|
-
|
|
79
|
+
buildHeaders() {
|
|
44
80
|
const base = {
|
|
45
81
|
Authorization: `Bearer ${this.token}`,
|
|
46
82
|
"Content-Type": "application/json",
|
|
47
83
|
"X-Source": "cli",
|
|
48
84
|
};
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
85
|
+
const run = resolveActiveAgentRun(this.serverUrl);
|
|
86
|
+
if (run) {
|
|
87
|
+
base["X-Agent-Run-Id"] = run.agentRunId;
|
|
88
|
+
if (run.beforeSnapshotId) {
|
|
89
|
+
base["X-Agent-Before-Snapshot-Id"] = run.beforeSnapshotId;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
56
92
|
return base;
|
|
57
93
|
}
|
|
58
94
|
/**
|
|
@@ -129,7 +165,7 @@ export class ApiClient {
|
|
|
129
165
|
}
|
|
130
166
|
const res = await this.fetchWithRetry(url.toString(), {
|
|
131
167
|
method: "GET",
|
|
132
|
-
headers: this.
|
|
168
|
+
headers: this.buildHeaders(),
|
|
133
169
|
});
|
|
134
170
|
if (!res.ok) {
|
|
135
171
|
const body = await this.errorBody(res);
|
|
@@ -141,7 +177,7 @@ export class ApiClient {
|
|
|
141
177
|
const url = new URL(path, this.serverUrl);
|
|
142
178
|
const res = await this.fetchWithRetry(url.toString(), {
|
|
143
179
|
method: "POST",
|
|
144
|
-
headers: this.
|
|
180
|
+
headers: this.buildHeaders(),
|
|
145
181
|
body: body ? JSON.stringify(body) : undefined,
|
|
146
182
|
});
|
|
147
183
|
if (!res.ok) {
|
|
@@ -173,7 +209,7 @@ export class ApiClient {
|
|
|
173
209
|
const url = new URL(path, this.serverUrl);
|
|
174
210
|
const res = await this.fetchWithRetry(url.toString(), {
|
|
175
211
|
method: "PUT",
|
|
176
|
-
headers: this.
|
|
212
|
+
headers: this.buildHeaders(),
|
|
177
213
|
body: body ? JSON.stringify(body) : undefined,
|
|
178
214
|
});
|
|
179
215
|
if (!res.ok) {
|
|
@@ -192,7 +228,7 @@ export class ApiClient {
|
|
|
192
228
|
}
|
|
193
229
|
const res = await this.fetchWithRetry(url.toString(), {
|
|
194
230
|
method: "PATCH",
|
|
195
|
-
headers: this.
|
|
231
|
+
headers: this.buildHeaders(),
|
|
196
232
|
body: body ? JSON.stringify(body) : undefined,
|
|
197
233
|
});
|
|
198
234
|
if (!res.ok) {
|
|
@@ -205,7 +241,7 @@ export class ApiClient {
|
|
|
205
241
|
const url = new URL(path, this.serverUrl);
|
|
206
242
|
const res = await this.fetchWithRetry(url.toString(), {
|
|
207
243
|
method: "DELETE",
|
|
208
|
-
headers: this.
|
|
244
|
+
headers: this.buildHeaders(),
|
|
209
245
|
});
|
|
210
246
|
if (!res.ok) {
|
|
211
247
|
const body = await this.errorBody(res);
|
|
@@ -228,7 +264,7 @@ export class ApiClient {
|
|
|
228
264
|
try {
|
|
229
265
|
res = await fetch(url.toString(), {
|
|
230
266
|
method: "GET",
|
|
231
|
-
headers: this.
|
|
267
|
+
headers: this.buildHeaders(),
|
|
232
268
|
redirect: "manual",
|
|
233
269
|
});
|
|
234
270
|
}
|
|
@@ -247,7 +283,7 @@ export class ApiClient {
|
|
|
247
283
|
if (res.status === 0 || (!location && res.status < 400)) {
|
|
248
284
|
const followed = await this.fetchWithRetry(url.toString(), {
|
|
249
285
|
method: "GET",
|
|
250
|
-
headers: this.
|
|
286
|
+
headers: this.buildHeaders(),
|
|
251
287
|
});
|
|
252
288
|
if (!followed.ok) {
|
|
253
289
|
const body = await this.errorBody(followed);
|
|
@@ -270,7 +306,7 @@ export class ApiClient {
|
|
|
270
306
|
const url = new URL(path, this.serverUrl);
|
|
271
307
|
const res = await this.fetchWithRetry(url.toString(), {
|
|
272
308
|
method: "GET",
|
|
273
|
-
headers: this.
|
|
309
|
+
headers: this.buildHeaders(),
|
|
274
310
|
});
|
|
275
311
|
if (!res.ok) {
|
|
276
312
|
const body = await this.errorBody(res);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAElE,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,MAAM,IAAI,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC;AACzC,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,OAAO,SAAS;IAEV;IACA;IAFV,YACU,SAAiB,EACjB,KAAa;QADb,cAAS,GAAT,SAAS,CAAQ;QACjB,UAAK,GAAL,KAAK,CAAQ;IACpB,CAAC;IAEJ
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/auth-store.d.ts
CHANGED
|
@@ -4,15 +4,36 @@ export interface ServerConfig {
|
|
|
4
4
|
workspaceId?: string;
|
|
5
5
|
/**
|
|
6
6
|
* Currently-open agent-run on this server, written by `cnotes operations
|
|
7
|
-
* begin`
|
|
8
|
-
* to this when CNOTES_AGENT_RUN_ID env is
|
|
9
|
-
* separate shell processes (or stateless tool
|
|
10
|
-
* active run. Env wins when set, for explicit
|
|
7
|
+
* begin` / `cnotes canvas agent-run begin` and cleared by their matching
|
|
8
|
+
* `end`. The api-client falls back to this when CNOTES_AGENT_RUN_ID env is
|
|
9
|
+
* unset, so cnotes writes across separate shell processes (or stateless tool
|
|
10
|
+
* calls) auto-attach to the active run. Env wins when set, for explicit
|
|
11
|
+
* overrides.
|
|
12
|
+
*
|
|
13
|
+
* Both bracketing commands share this one slot on purpose: a request carries
|
|
14
|
+
* exactly one X-Agent-Run-Id, so two concurrent "active" runs would be
|
|
15
|
+
* ambiguous. `begin` refuses when this is already set (unless --force).
|
|
11
16
|
*/
|
|
12
17
|
activeAgentRunId?: string;
|
|
13
18
|
/** When activeAgentRunId was opened — used to surface helpful "started
|
|
14
19
|
* Xm ago" context on the "already-active" warning at begin time. */
|
|
15
20
|
activeAgentRunStartedAt?: number;
|
|
21
|
+
/**
|
|
22
|
+
* The `auto.before_agent` snapshot captured when a *canvas* agent-run was
|
|
23
|
+
* opened. Rides on every subsequent write as X-Agent-Before-Snapshot-Id so
|
|
24
|
+
* the run's first canvas mutation can back-link `checkpointBeforeId` onto its
|
|
25
|
+
* operation row.
|
|
26
|
+
*
|
|
27
|
+
* Load-bearing, not decorative: the server only back-links this at the first
|
|
28
|
+
* mutation (at begin time the operation row doesn't exist yet), and
|
|
29
|
+
* getRevertContext returns null without it — so a run that never carries this
|
|
30
|
+
* header cannot be reverted. Persisting it beside the run id is what makes
|
|
31
|
+
* "Revert this run" work for callers that don't inherit an env var.
|
|
32
|
+
*
|
|
33
|
+
* Unset for `operations begin` runs: those are workspace-scoped and have no
|
|
34
|
+
* canvas snapshot to carry.
|
|
35
|
+
*/
|
|
36
|
+
activeAgentBeforeSnapshotId?: string;
|
|
16
37
|
}
|
|
17
38
|
export interface CliConfig {
|
|
18
39
|
version: 1;
|
|
@@ -35,20 +56,31 @@ export declare function setCurrentServer(config: CliConfig, serverUrl: string):
|
|
|
35
56
|
export declare function setWorkspaceId(config: CliConfig, serverUrl: string, workspaceId: string): boolean;
|
|
36
57
|
/**
|
|
37
58
|
* Mark a given agent-run as the active one for a server. Subsequent cnotes
|
|
38
|
-
* writes against this server will carry X-Agent-Run-Id automatically
|
|
59
|
+
* writes against this server will carry X-Agent-Run-Id automatically —
|
|
60
|
+
* plus X-Agent-Before-Snapshot-Id when `beforeSnapshotId` is given (canvas
|
|
61
|
+
* runs), which is what makes the run revertable.
|
|
62
|
+
*
|
|
63
|
+
* Returns false (a no-op) when there is no stored config entry for `serverUrl`
|
|
64
|
+
* — i.e. the token came from a flag or env var against a server never logged
|
|
65
|
+
* into with `cnotes auth login`, so there is nowhere on disk to record the run.
|
|
66
|
+
* Callers MUST surface this instead of claiming the run is active: silently
|
|
67
|
+
* persisting nothing is exactly how bracketed agent writes end up recorded as
|
|
68
|
+
* unattributed human edits. Same contract as setWorkspaceId above.
|
|
39
69
|
*/
|
|
40
|
-
export declare function setActiveAgentRunId(config: CliConfig, serverUrl: string, agentRunId: string, startedAt: number):
|
|
70
|
+
export declare function setActiveAgentRunId(config: CliConfig, serverUrl: string, agentRunId: string, startedAt: number, beforeSnapshotId?: string): boolean;
|
|
41
71
|
/**
|
|
42
|
-
* Clear the active agent-run for a server. Called by `cnotes operations end`
|
|
43
|
-
* after a successful close, so the next cnotes
|
|
44
|
-
* unless the user opens a new run.
|
|
72
|
+
* Clear the active agent-run for a server. Called by `cnotes operations end` /
|
|
73
|
+
* `cnotes canvas agent-run end` after a successful close, so the next cnotes
|
|
74
|
+
* write reverts to "unattached" unless the user opens a new run.
|
|
45
75
|
*/
|
|
46
76
|
export declare function clearActiveAgentRunId(config: CliConfig, serverUrl: string): void;
|
|
47
77
|
/**
|
|
48
|
-
* Read the active agent-run for a server (if any).
|
|
78
|
+
* Read the active agent-run for a server (if any). `beforeSnapshotId` is
|
|
79
|
+
* present only for canvas runs (see the field docs on ServerConfig).
|
|
49
80
|
*/
|
|
50
81
|
export declare function getActiveAgentRunId(config: CliConfig, serverUrl: string): {
|
|
51
82
|
agentRunId: string;
|
|
52
83
|
startedAt: number;
|
|
84
|
+
beforeSnapshotId?: string;
|
|
53
85
|
} | null;
|
|
54
86
|
//# sourceMappingURL=auth-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-store.d.ts","sourceRoot":"","sources":["../../src/lib/auth-store.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB
|
|
1
|
+
{"version":3,"file":"auth-store.d.ts","sourceRoot":"","sources":["../../src/lib/auth-store.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;yEACqE;IACrE,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC;;;;;;;;;;;;;;OAcG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtC,aAAa,EAAE,MAAM,CAAC;CACvB;AA8CD,wBAAgB,UAAU,IAAI,SAAS,CAmBtC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAQlD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAGvF;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,YAAY,GACzB,IAAI,CAGN;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAG7E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAG3E;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAQT;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAeT;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,GAChB,IAAI,CAWN;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,GAChB;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAU7E"}
|
package/dist/lib/auth-store.js
CHANGED
|
@@ -2,7 +2,10 @@ import { readFileSync, writeFileSync, mkdirSync, chmodSync, existsSync, renameSy
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { BRAND } from "./brand.js";
|
|
5
|
-
|
|
5
|
+
// CNOTES_CONFIG_DIR redirects the whole config store (used by tests to work
|
|
6
|
+
// against a temp dir instead of the real ~/.cnotes, and handy for sandboxed or
|
|
7
|
+
// multi-profile setups). Unset in normal use, which is the homedir default.
|
|
8
|
+
const CONFIG_DIR = process.env.CNOTES_CONFIG_DIR || join(homedir(), BRAND.configDir);
|
|
6
9
|
const CONFIG_FILE = join(CONFIG_DIR, "config.json");
|
|
7
10
|
/**
|
|
8
11
|
* One-time migration of the pre-rename config dir (`~/.creatornotes`) to the
|
|
@@ -98,31 +101,53 @@ export function setWorkspaceId(config, serverUrl, workspaceId) {
|
|
|
98
101
|
}
|
|
99
102
|
/**
|
|
100
103
|
* Mark a given agent-run as the active one for a server. Subsequent cnotes
|
|
101
|
-
* writes against this server will carry X-Agent-Run-Id automatically
|
|
104
|
+
* writes against this server will carry X-Agent-Run-Id automatically —
|
|
105
|
+
* plus X-Agent-Before-Snapshot-Id when `beforeSnapshotId` is given (canvas
|
|
106
|
+
* runs), which is what makes the run revertable.
|
|
107
|
+
*
|
|
108
|
+
* Returns false (a no-op) when there is no stored config entry for `serverUrl`
|
|
109
|
+
* — i.e. the token came from a flag or env var against a server never logged
|
|
110
|
+
* into with `cnotes auth login`, so there is nowhere on disk to record the run.
|
|
111
|
+
* Callers MUST surface this instead of claiming the run is active: silently
|
|
112
|
+
* persisting nothing is exactly how bracketed agent writes end up recorded as
|
|
113
|
+
* unattributed human edits. Same contract as setWorkspaceId above.
|
|
102
114
|
*/
|
|
103
|
-
export function setActiveAgentRunId(config, serverUrl, agentRunId, startedAt) {
|
|
115
|
+
export function setActiveAgentRunId(config, serverUrl, agentRunId, startedAt, beforeSnapshotId) {
|
|
104
116
|
const sc = config.servers[serverUrl];
|
|
105
|
-
if (sc)
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
117
|
+
if (!sc)
|
|
118
|
+
return false;
|
|
119
|
+
sc.activeAgentRunId = agentRunId;
|
|
120
|
+
sc.activeAgentRunStartedAt = startedAt;
|
|
121
|
+
// Always write the slot, so a canvas run never inherits the stale
|
|
122
|
+
// before-snapshot of a previous run (which belongs to a different canvas and
|
|
123
|
+
// would be dropped server-side anyway, silently costing revertability).
|
|
124
|
+
if (beforeSnapshotId) {
|
|
125
|
+
sc.activeAgentBeforeSnapshotId = beforeSnapshotId;
|
|
109
126
|
}
|
|
127
|
+
else {
|
|
128
|
+
delete sc.activeAgentBeforeSnapshotId;
|
|
129
|
+
}
|
|
130
|
+
saveConfig(config);
|
|
131
|
+
return true;
|
|
110
132
|
}
|
|
111
133
|
/**
|
|
112
|
-
* Clear the active agent-run for a server. Called by `cnotes operations end`
|
|
113
|
-
* after a successful close, so the next cnotes
|
|
114
|
-
* unless the user opens a new run.
|
|
134
|
+
* Clear the active agent-run for a server. Called by `cnotes operations end` /
|
|
135
|
+
* `cnotes canvas agent-run end` after a successful close, so the next cnotes
|
|
136
|
+
* write reverts to "unattached" unless the user opens a new run.
|
|
115
137
|
*/
|
|
116
138
|
export function clearActiveAgentRunId(config, serverUrl) {
|
|
117
139
|
const sc = config.servers[serverUrl];
|
|
118
|
-
if (sc &&
|
|
140
|
+
if (sc &&
|
|
141
|
+
(sc.activeAgentRunId || sc.activeAgentRunStartedAt || sc.activeAgentBeforeSnapshotId)) {
|
|
119
142
|
delete sc.activeAgentRunId;
|
|
120
143
|
delete sc.activeAgentRunStartedAt;
|
|
144
|
+
delete sc.activeAgentBeforeSnapshotId;
|
|
121
145
|
saveConfig(config);
|
|
122
146
|
}
|
|
123
147
|
}
|
|
124
148
|
/**
|
|
125
|
-
* Read the active agent-run for a server (if any).
|
|
149
|
+
* Read the active agent-run for a server (if any). `beforeSnapshotId` is
|
|
150
|
+
* present only for canvas runs (see the field docs on ServerConfig).
|
|
126
151
|
*/
|
|
127
152
|
export function getActiveAgentRunId(config, serverUrl) {
|
|
128
153
|
const sc = config.servers[serverUrl];
|
|
@@ -130,6 +155,7 @@ export function getActiveAgentRunId(config, serverUrl) {
|
|
|
130
155
|
return {
|
|
131
156
|
agentRunId: sc.activeAgentRunId,
|
|
132
157
|
startedAt: sc.activeAgentRunStartedAt,
|
|
158
|
+
beforeSnapshotId: sc.activeAgentBeforeSnapshotId,
|
|
133
159
|
};
|
|
134
160
|
}
|
|
135
161
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-store.js","sourceRoot":"","sources":["../../src/lib/auth-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACpG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"auth-store.js","sourceRoot":"","sources":["../../src/lib/auth-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Throws when `absPath` is outside the permitted local-read scope.
|
|
3
|
+
*/
|
|
4
|
+
export declare function assertMcpLocalFileReadable(absPath: string): void;
|
|
5
|
+
/**
|
|
6
|
+
* Return canonical effective roots. `/` and the user's home are intentionally
|
|
7
|
+
* excluded as implicit cwd roots: MCP clients commonly start there, which
|
|
8
|
+
* would otherwise make the containment check cover all or nearly all files.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getMcpLocalFileRoots(): string[];
|
|
11
|
+
//# sourceMappingURL=mcp-local-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-local-file.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-local-file.ts"],"names":[],"mappings":"AAkCA;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAahE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAU/C"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { realpathSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
/**
|
|
5
|
+
* Guardrails for MCP `cnotes_files_upload` local reads (SOC2 pen-test MEDIUM-3).
|
|
6
|
+
*
|
|
7
|
+
* By default only files under the process cwd or explicit allowlist dirs may be
|
|
8
|
+
* read. Set CNOTES_MCP_ALLOW_ANY_LOCAL_FILE=1 to disable (not recommended).
|
|
9
|
+
*/
|
|
10
|
+
function canonicalPath(value) {
|
|
11
|
+
try {
|
|
12
|
+
return realpathSync(value);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
throw new Error(`MCP local-read scope does not exist or is unreadable: "${value}"`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function parseAllowedDirs() {
|
|
19
|
+
const raw = process.env.CNOTES_MCP_ALLOWED_DIRS;
|
|
20
|
+
if (!raw)
|
|
21
|
+
return [];
|
|
22
|
+
return raw
|
|
23
|
+
.split(path.delimiter)
|
|
24
|
+
.map((d) => d.trim())
|
|
25
|
+
.filter(Boolean)
|
|
26
|
+
.map((d) => canonicalPath(path.resolve(d)));
|
|
27
|
+
}
|
|
28
|
+
function isUnderRoot(filePath, root) {
|
|
29
|
+
const rel = path.relative(root, filePath);
|
|
30
|
+
return rel === "" || (!rel.startsWith("..") && !path.isAbsolute(rel));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Throws when `absPath` is outside the permitted local-read scope.
|
|
34
|
+
*/
|
|
35
|
+
export function assertMcpLocalFileReadable(absPath) {
|
|
36
|
+
if (process.env.CNOTES_MCP_ALLOW_ANY_LOCAL_FILE === "1")
|
|
37
|
+
return;
|
|
38
|
+
const resolved = canonicalPath(path.resolve(absPath));
|
|
39
|
+
const roots = getMcpLocalFileRoots();
|
|
40
|
+
if (roots.some((root) => isUnderRoot(resolved, root)))
|
|
41
|
+
return;
|
|
42
|
+
throw new Error(`Refusing to read "${resolved}" — outside the MCP local-read scope (cwd: ${process.cwd()}). ` +
|
|
43
|
+
`Set CNOTES_MCP_ALLOWED_DIRS to add directories (colon-separated), or ` +
|
|
44
|
+
`CNOTES_MCP_ALLOW_ANY_LOCAL_FILE=1 to disable this guard (not recommended).`);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Return canonical effective roots. `/` and the user's home are intentionally
|
|
48
|
+
* excluded as implicit cwd roots: MCP clients commonly start there, which
|
|
49
|
+
* would otherwise make the containment check cover all or nearly all files.
|
|
50
|
+
*/
|
|
51
|
+
export function getMcpLocalFileRoots() {
|
|
52
|
+
if (process.env.CNOTES_MCP_ALLOW_ANY_LOCAL_FILE === "1")
|
|
53
|
+
return [];
|
|
54
|
+
const cwd = canonicalPath(path.resolve(process.cwd()));
|
|
55
|
+
const unsafeImplicitRoots = new Set([
|
|
56
|
+
canonicalPath(path.parse(cwd).root),
|
|
57
|
+
canonicalPath(homedir()),
|
|
58
|
+
]);
|
|
59
|
+
const implicitRoots = unsafeImplicitRoots.has(cwd) ? [] : [cwd];
|
|
60
|
+
return [...new Set([...implicitRoots, ...parseAllowedDirs()])];
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=mcp-local-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-local-file.js","sourceRoot":"","sources":["../../src/lib/mcp-local-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;GAKG;AAEH,SAAS,aAAa,CAAC,KAAa;IAClC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,0DAA0D,KAAK,GAAG,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IAChD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,OAAO,GAAG;SACP,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;SACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB,EAAE,IAAY;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC1C,OAAO,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,OAAe;IACxD,IAAI,OAAO,CAAC,GAAG,CAAC,+BAA+B,KAAK,GAAG;QAAE,OAAO;IAEhE,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAC;IAErC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAAE,OAAO;IAE9D,MAAM,IAAI,KAAK,CACb,qBAAqB,QAAQ,8CAA8C,OAAO,CAAC,GAAG,EAAE,KAAK;QAC3F,uEAAuE;QACvE,4EAA4E,CAC/E,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IAClC,IAAI,OAAO,CAAC,GAAG,CAAC,+BAA+B,KAAK,GAAG;QAAE,OAAO,EAAE,CAAC;IAEnE,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACvD,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;QAClC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACnC,aAAa,CAAC,OAAO,EAAE,CAAC;KACzB,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,aAAa,EAAE,GAAG,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC"}
|
package/dist/lib/output.d.ts
CHANGED
|
@@ -22,6 +22,13 @@ export declare function outputTable(headers: string[], rows: string[][]): void;
|
|
|
22
22
|
* Format a timestamp as relative time (e.g., "2h ago", "3d ago").
|
|
23
23
|
*/
|
|
24
24
|
export declare function timeAgo(timestamp: number | string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Like timeAgo, but keeps second-level precision instead of collapsing the
|
|
27
|
+
* first minute to "just now". Used by the agent-run conflict messages, where
|
|
28
|
+
* "started 8s ago" vs "started 3h ago" is the whole signal: it tells you
|
|
29
|
+
* whether you just opened this run in another shell or left one stranded.
|
|
30
|
+
*/
|
|
31
|
+
export declare function formatAgo(startedAtMs: number): string;
|
|
25
32
|
/**
|
|
26
33
|
* Truncate a string to a max length with ellipsis.
|
|
27
34
|
*/
|
package/dist/lib/output.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAYvE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAEjE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,EAAE,EAAE,GACf,IAAI,CAeN;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAa1D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGzD"}
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAYvE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAEjE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,EAAE,EAAE,GACf,IAAI,CAeN;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAa1D;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAOrD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGzD"}
|
package/dist/lib/output.js
CHANGED
|
@@ -67,6 +67,22 @@ export function timeAgo(timestamp) {
|
|
|
67
67
|
return `${minutes}m ago`;
|
|
68
68
|
return "just now";
|
|
69
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Like timeAgo, but keeps second-level precision instead of collapsing the
|
|
72
|
+
* first minute to "just now". Used by the agent-run conflict messages, where
|
|
73
|
+
* "started 8s ago" vs "started 3h ago" is the whole signal: it tells you
|
|
74
|
+
* whether you just opened this run in another shell or left one stranded.
|
|
75
|
+
*/
|
|
76
|
+
export function formatAgo(startedAtMs) {
|
|
77
|
+
const sec = Math.max(0, Math.round((Date.now() - startedAtMs) / 1000));
|
|
78
|
+
if (sec < 60)
|
|
79
|
+
return `${sec}s ago`;
|
|
80
|
+
const min = Math.round(sec / 60);
|
|
81
|
+
if (min < 60)
|
|
82
|
+
return `${min}m ago`;
|
|
83
|
+
const hr = Math.round(min / 60);
|
|
84
|
+
return `${hr}h ago`;
|
|
85
|
+
}
|
|
70
86
|
/**
|
|
71
87
|
* Truncate a string to a max length with ellipsis.
|
|
72
88
|
*/
|
package/dist/lib/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-server.js
CHANGED
|
@@ -28,6 +28,7 @@ import { ApiError, CliError, NotFoundError } from "./lib/errors.js";
|
|
|
28
28
|
import { resolveNoteId } from "./lib/resolve-note.js";
|
|
29
29
|
import { readCanvasMarkdown } from "./lib/canvas-read.js";
|
|
30
30
|
import { buildSchema } from "./lib/build-schema.js";
|
|
31
|
+
import { assertMcpLocalFileReadable, getMcpLocalFileRoots, } from "./lib/mcp-local-file.js";
|
|
31
32
|
// ---------------------------------------------------------------------------
|
|
32
33
|
// Environment
|
|
33
34
|
// ---------------------------------------------------------------------------
|
|
@@ -739,7 +740,7 @@ server.tool("cnotes_types_create", "Create a new note type (supertag).", {
|
|
|
739
740
|
displayName: z.string().optional().describe("Display name (can have spaces)"),
|
|
740
741
|
prefix: z.string().optional().describe("ID prefix, uppercase (e.g. PAINPOINT, USERSTORY)"),
|
|
741
742
|
description: z.string().optional().describe("Description"),
|
|
742
|
-
color: z.string().optional().describe("Color hex code (e.g. #
|
|
743
|
+
color: z.string().optional().describe("Color hex code (6-digit, e.g. #RRGGBB)"),
|
|
743
744
|
}, async ({ name, displayName, prefix, description, color }) => withErrorHandling(() => api.post("/api/supertags", {
|
|
744
745
|
workspaceId,
|
|
745
746
|
name,
|
|
@@ -848,6 +849,7 @@ server.tool("cnotes_files_upload", "Upload an image file to the workspace. Retur
|
|
|
848
849
|
filePath: z.string().describe("Absolute path to the image file on disk"),
|
|
849
850
|
}, async ({ filePath }) => withErrorHandling(async () => {
|
|
850
851
|
const absPath = path.resolve(filePath);
|
|
852
|
+
assertMcpLocalFileReadable(absPath);
|
|
851
853
|
let stat;
|
|
852
854
|
try {
|
|
853
855
|
stat = statSync(absPath);
|
|
@@ -888,6 +890,10 @@ server.tool("cnotes_schema", "Describe this workspace in one call: valid note ty
|
|
|
888
890
|
async function main() {
|
|
889
891
|
const transport = new StdioServerTransport();
|
|
890
892
|
await server.connect(transport);
|
|
893
|
+
const localReadScope = process.env.CNOTES_MCP_ALLOW_ANY_LOCAL_FILE === "1"
|
|
894
|
+
? "unrestricted (CNOTES_MCP_ALLOW_ANY_LOCAL_FILE=1)"
|
|
895
|
+
: getMcpLocalFileRoots().join(path.delimiter) || "none (set CNOTES_MCP_ALLOWED_DIRS)";
|
|
896
|
+
process.stderr.write(`cnotes-mcp local file scope: ${localReadScope}\n`);
|
|
891
897
|
process.stderr.write("cnotes-mcp server running on stdio\n");
|
|
892
898
|
}
|
|
893
899
|
main().catch((e) => {
|