ctxr-cli 0.34.0 → 0.36.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/README.md +50 -7
- package/dist/commands/land.d.ts +1 -1
- package/dist/commands/land.d.ts.map +1 -1
- package/dist/commands/land.js +8 -4
- package/dist/commands/land.js.map +1 -1
- package/dist/commands/plugin-build.d.ts +33 -0
- package/dist/commands/plugin-build.d.ts.map +1 -0
- package/dist/commands/plugin-build.js +51 -0
- package/dist/commands/plugin-build.js.map +1 -0
- package/dist/commands/publish-check.d.ts.map +1 -1
- package/dist/commands/publish-check.js +35 -4
- package/dist/commands/publish-check.js.map +1 -1
- package/dist/commands/serve.d.ts +3 -0
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +129 -23
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/session-start.d.ts.map +1 -1
- package/dist/commands/session-start.js +12 -38
- package/dist/commands/session-start.js.map +1 -1
- package/dist/commands/session-submit.d.ts.map +1 -1
- package/dist/commands/session-submit.js +2 -0
- package/dist/commands/session-submit.js.map +1 -1
- package/dist/commands/sync.d.ts +50 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +186 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/version.d.ts.map +1 -1
- package/dist/commands/version.js +6 -3
- package/dist/commands/version.js.map +1 -1
- package/dist/config/defaults.d.ts +13 -0
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +11 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/schema.d.ts +1 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +7 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/core/approval/sessions.d.ts.map +1 -1
- package/dist/core/approval/sessions.js +4 -2
- package/dist/core/approval/sessions.js.map +1 -1
- package/dist/core/browse/approve.d.ts.map +1 -1
- package/dist/core/browse/approve.js +12 -2
- package/dist/core/browse/approve.js.map +1 -1
- package/dist/core/browse/page-url.d.ts +13 -0
- package/dist/core/browse/page-url.d.ts.map +1 -1
- package/dist/core/browse/page-url.js +17 -0
- package/dist/core/browse/page-url.js.map +1 -1
- package/dist/core/browse/pull-preview.d.ts +67 -0
- package/dist/core/browse/pull-preview.d.ts.map +1 -0
- package/dist/core/browse/pull-preview.js +154 -0
- package/dist/core/browse/pull-preview.js.map +1 -0
- package/dist/core/browse/webhook.d.ts +38 -0
- package/dist/core/browse/webhook.d.ts.map +1 -0
- package/dist/core/browse/webhook.js +102 -0
- package/dist/core/browse/webhook.js.map +1 -0
- package/dist/core/errors.d.ts +16 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +27 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/fs/atomic.d.ts +3 -2
- package/dist/core/fs/atomic.d.ts.map +1 -1
- package/dist/core/fs/atomic.js +3 -2
- package/dist/core/fs/atomic.js.map +1 -1
- package/dist/core/git/exec.d.ts +16 -1
- package/dist/core/git/exec.d.ts.map +1 -1
- package/dist/core/git/exec.js +15 -4
- package/dist/core/git/exec.js.map +1 -1
- package/dist/core/git/fast-forward.d.ts +23 -0
- package/dist/core/git/fast-forward.d.ts.map +1 -1
- package/dist/core/git/fast-forward.js +24 -0
- package/dist/core/git/fast-forward.js.map +1 -1
- package/dist/core/git/hardened.d.ts +15 -0
- package/dist/core/git/hardened.d.ts.map +1 -0
- package/dist/core/git/hardened.js +123 -0
- package/dist/core/git/hardened.js.map +1 -0
- package/dist/core/install-kind.d.ts +10 -3
- package/dist/core/install-kind.d.ts.map +1 -1
- package/dist/core/install-kind.js +48 -14
- package/dist/core/install-kind.js.map +1 -1
- package/dist/core/mcp/cli-runner.d.ts +41 -0
- package/dist/core/mcp/cli-runner.d.ts.map +1 -0
- package/dist/core/mcp/cli-runner.js +81 -0
- package/dist/core/mcp/cli-runner.js.map +1 -0
- package/dist/core/mcp/jsonrpc.d.ts +13 -1
- package/dist/core/mcp/jsonrpc.d.ts.map +1 -1
- package/dist/core/mcp/jsonrpc.js +1 -1
- package/dist/core/mcp/jsonrpc.js.map +1 -1
- package/dist/core/mcp/member-sessions.d.ts +48 -0
- package/dist/core/mcp/member-sessions.d.ts.map +1 -0
- package/dist/core/mcp/member-sessions.js +85 -0
- package/dist/core/mcp/member-sessions.js.map +1 -0
- package/dist/core/mcp/ownership.d.ts +51 -0
- package/dist/core/mcp/ownership.d.ts.map +1 -0
- package/dist/core/mcp/ownership.js +101 -0
- package/dist/core/mcp/ownership.js.map +1 -0
- package/dist/core/mcp/paths.d.ts +48 -0
- package/dist/core/mcp/paths.d.ts.map +1 -0
- package/dist/core/mcp/paths.js +111 -0
- package/dist/core/mcp/paths.js.map +1 -0
- package/dist/core/mcp/sessions.d.ts +24 -46
- package/dist/core/mcp/sessions.d.ts.map +1 -1
- package/dist/core/mcp/sessions.js +31 -103
- package/dist/core/mcp/sessions.js.map +1 -1
- package/dist/core/mcp/tool-map.d.ts +94 -0
- package/dist/core/mcp/tool-map.d.ts.map +1 -0
- package/dist/core/mcp/tool-map.js +211 -0
- package/dist/core/mcp/tool-map.js.map +1 -0
- package/dist/core/mcp/tools/capture.d.ts +7 -2
- package/dist/core/mcp/tools/capture.d.ts.map +1 -1
- package/dist/core/mcp/tools/capture.js +69 -18
- package/dist/core/mcp/tools/capture.js.map +1 -1
- package/dist/core/mcp/tools/cli.d.ts +97 -0
- package/dist/core/mcp/tools/cli.d.ts.map +1 -0
- package/dist/core/mcp/tools/cli.js +271 -0
- package/dist/core/mcp/tools/cli.js.map +1 -0
- package/dist/core/mcp/tools/edit.d.ts +62 -28
- package/dist/core/mcp/tools/edit.d.ts.map +1 -1
- package/dist/core/mcp/tools/edit.js +182 -153
- package/dist/core/mcp/tools/edit.js.map +1 -1
- package/dist/core/mcp/tools/files.d.ts +37 -11
- package/dist/core/mcp/tools/files.d.ts.map +1 -1
- package/dist/core/mcp/tools/files.js +122 -100
- package/dist/core/mcp/tools/files.js.map +1 -1
- package/dist/core/mcp/tools/index.d.ts +12 -3
- package/dist/core/mcp/tools/index.d.ts.map +1 -1
- package/dist/core/mcp/tools/index.js +161 -58
- package/dist/core/mcp/tools/index.js.map +1 -1
- package/dist/core/mcp/tools/sessions.d.ts +145 -0
- package/dist/core/mcp/tools/sessions.d.ts.map +1 -0
- package/dist/core/mcp/tools/sessions.js +226 -0
- package/dist/core/mcp/tools/sessions.js.map +1 -0
- package/dist/core/npm-prefix.d.ts +10 -0
- package/dist/core/npm-prefix.d.ts.map +1 -0
- package/dist/core/npm-prefix.js +11 -0
- package/dist/core/npm-prefix.js.map +1 -0
- package/dist/core/plugin/build.d.ts +70 -0
- package/dist/core/plugin/build.d.ts.map +1 -0
- package/dist/core/plugin/build.js +159 -0
- package/dist/core/plugin/build.js.map +1 -0
- package/dist/core/plugin/routes.d.ts +35 -0
- package/dist/core/plugin/routes.d.ts.map +1 -0
- package/dist/core/plugin/routes.js +77 -0
- package/dist/core/plugin/routes.js.map +1 -0
- package/dist/core/plugin/zip.d.ts +17 -0
- package/dist/core/plugin/zip.d.ts.map +1 -0
- package/dist/core/plugin/zip.js +75 -0
- package/dist/core/plugin/zip.js.map +1 -0
- package/dist/core/session/start.d.ts +46 -0
- package/dist/core/session/start.d.ts.map +1 -0
- package/dist/core/session/start.js +33 -0
- package/dist/core/session/start.js.map +1 -0
- package/dist/core/session/submit.d.ts +7 -0
- package/dist/core/session/submit.d.ts.map +1 -1
- package/dist/core/session/submit.js +8 -0
- package/dist/core/session/submit.js.map +1 -1
- package/dist/core/skills.d.ts +20 -2
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +56 -3
- package/dist/core/skills.js.map +1 -1
- package/dist/core/store-update-runner.d.ts +57 -0
- package/dist/core/store-update-runner.d.ts.map +1 -0
- package/dist/core/{approval/lander.js → store-update-runner.js} +41 -17
- package/dist/core/store-update-runner.js.map +1 -0
- package/dist/run.d.ts +12 -0
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +93 -58
- package/dist/run.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/templates/approve/pages-note-pull.md +1 -0
- package/templates/conventions/baseline-conventions.md +5 -0
- package/templates/mcp/Delete.md +6 -0
- package/templates/mcp/Edit.md +6 -5
- package/templates/mcp/Glob.md +2 -2
- package/templates/mcp/Grep.md +2 -1
- package/templates/mcp/Move.md +7 -0
- package/templates/mcp/Read.md +4 -4
- package/templates/mcp/Write.md +4 -4
- package/templates/mcp/ctxr.md +7 -0
- package/templates/mcp/ctxr_write.md +8 -0
- package/templates/mcp/server-instructions.md +11 -3
- package/templates/mcp/session_discard.md +4 -0
- package/templates/mcp/session_list.md +7 -0
- package/templates/mcp/session_rebase.md +5 -0
- package/templates/mcp/session_start.md +7 -0
- package/templates/mcp/session_status.md +3 -0
- package/templates/mcp/session_submit.md +8 -0
- package/templates/plugin/README.md +13 -0
- package/templates/plugin/chatgpt-mcp.json +19 -0
- package/templates/plugin/chatgpt-plugin.json +13 -0
- package/templates/plugin/claude-mcp.json +8 -0
- package/templates/plugin/claude-plugin.json +6 -0
- package/templates/plugin/page.html +47 -0
- package/templates/skills/ctxr-publish.md +2 -1
- package/templates/skills/ctxr-upgrade.md +5 -5
- package/templates/skills/mcp/_preamble.md +44 -0
- package/dist/core/approval/lander.d.ts +0 -38
- package/dist/core/approval/lander.d.ts.map +0 -1
- package/dist/core/approval/lander.js.map +0 -1
- package/dist/core/mcp/drafts.d.ts +0 -30
- package/dist/core/mcp/drafts.d.ts.map +0 -1
- package/dist/core/mcp/drafts.js +0 -52
- package/dist/core/mcp/drafts.js.map +0 -1
|
@@ -1,21 +1,45 @@
|
|
|
1
1
|
import { access, constants } from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { askNpmForPrefix } from './npm-prefix.js';
|
|
4
5
|
const NODE_MODULES = 'node_modules';
|
|
5
6
|
/**
|
|
6
|
-
* Global installs
|
|
7
|
+
* Global installs under the running Node's own prefix:
|
|
7
8
|
* POSIX `<prefix>/lib/node_modules`, where execPath is `<prefix>/bin/node`;
|
|
8
|
-
* Windows `<dir of node.exe>/node_modules`.
|
|
9
|
+
* Windows `<dir of node.exe>/node_modules`. Launchers go beside node.
|
|
9
10
|
*/
|
|
10
|
-
function
|
|
11
|
+
function nodePrefixRoots(execPath) {
|
|
11
12
|
const binDir = path.dirname(execPath);
|
|
12
13
|
const prefix = path.dirname(binDir);
|
|
13
14
|
return [
|
|
14
|
-
path.join(prefix, 'lib', NODE_MODULES),
|
|
15
|
-
path.join(prefix, NODE_MODULES),
|
|
16
|
-
path.join(binDir, NODE_MODULES),
|
|
15
|
+
{ modules: path.join(prefix, 'lib', NODE_MODULES), bin: binDir },
|
|
16
|
+
{ modules: path.join(prefix, NODE_MODULES), bin: binDir },
|
|
17
|
+
{ modules: path.join(binDir, NODE_MODULES), bin: binDir },
|
|
17
18
|
];
|
|
18
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Global installs under npm's configured prefix -- where `npm install -g` writes, which is the
|
|
22
|
+
* question the classification answers (install-tools-in-the-home D4): POSIX
|
|
23
|
+
* `<prefix>/lib/node_modules` with launchers in `<prefix>/bin`, Windows `<prefix>/node_modules`
|
|
24
|
+
* with launchers in `<prefix>` itself.
|
|
25
|
+
*/
|
|
26
|
+
function npmPrefixRoots(prefix) {
|
|
27
|
+
return [
|
|
28
|
+
{ modules: path.join(prefix, 'lib', NODE_MODULES), bin: path.join(prefix, 'bin') },
|
|
29
|
+
{ modules: path.join(prefix, NODE_MODULES), bin: prefix },
|
|
30
|
+
];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The roots a global install may live under. With npm's prefix known, only those: an install
|
|
34
|
+
* under Node's own prefix that npm would not write to is not one `npm install -g` replaces. Node's
|
|
35
|
+
* prefix stands in only when npm could not be asked (`npmPrefix` null).
|
|
36
|
+
*/
|
|
37
|
+
function globalRoots(execPath, npmPrefix) {
|
|
38
|
+
return npmPrefix === null ? nodePrefixRoots(execPath) : npmPrefixRoots(path.resolve(npmPrefix));
|
|
39
|
+
}
|
|
40
|
+
function rootOf(resolved, execPath, npmPrefix) {
|
|
41
|
+
return globalRoots(path.resolve(execPath), npmPrefix).find((root) => isUnder(resolved, root.modules));
|
|
42
|
+
}
|
|
19
43
|
function isUnder(child, parent) {
|
|
20
44
|
const relative = path.relative(parent, child);
|
|
21
45
|
return relative.length > 0 && !relative.startsWith('..') && !path.isAbsolute(relative);
|
|
@@ -26,15 +50,26 @@ function isUnder(child, parent) {
|
|
|
26
50
|
* a dev checkout both resolve to, because Node resolves the symlink before
|
|
27
51
|
* import.meta.url is derived.
|
|
28
52
|
*/
|
|
29
|
-
export function classifyInstallPath(binPath, execPath) {
|
|
53
|
+
export function classifyInstallPath(binPath, execPath, npmPrefix = null) {
|
|
30
54
|
const resolved = path.resolve(binPath);
|
|
31
55
|
const segments = resolved.split(path.sep);
|
|
32
56
|
if (!segments.includes(NODE_MODULES))
|
|
33
57
|
return 'linked';
|
|
34
|
-
if (
|
|
58
|
+
if (rootOf(resolved, execPath, npmPrefix) !== undefined)
|
|
35
59
|
return 'global';
|
|
36
60
|
return 'undetermined';
|
|
37
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Where `npm install -g` writes: NPM_CONFIG_PREFIX / npm_config_prefix when set (npm reads those
|
|
64
|
+
* before any npmrc, so they are its answer), otherwise npm's own answer. Null when neither can be
|
|
65
|
+
* had, and the classification falls back to the running Node's prefix.
|
|
66
|
+
*/
|
|
67
|
+
export async function npmGlobalPrefix(env, ask = askNpmForPrefix) {
|
|
68
|
+
const configured = (env.NPM_CONFIG_PREFIX ?? env.npm_config_prefix ?? '').trim();
|
|
69
|
+
if (configured !== '' && path.isAbsolute(configured))
|
|
70
|
+
return configured;
|
|
71
|
+
return ask();
|
|
72
|
+
}
|
|
38
73
|
/**
|
|
39
74
|
* The entrypoint of the process running right now.
|
|
40
75
|
*
|
|
@@ -50,9 +85,9 @@ export function classifyInstallPath(binPath, execPath) {
|
|
|
50
85
|
function runningEntrypoint() {
|
|
51
86
|
return fileURLToPath(new URL('../bin.js', import.meta.url));
|
|
52
87
|
}
|
|
53
|
-
export function resolveInstallLocation(execPath) {
|
|
88
|
+
export function resolveInstallLocation(execPath, npmPrefix = null) {
|
|
54
89
|
const binPath = runningEntrypoint();
|
|
55
|
-
return { path: binPath, kind: classifyInstallPath(binPath, execPath) };
|
|
90
|
+
return { path: binPath, kind: classifyInstallPath(binPath, execPath, npmPrefix) };
|
|
56
91
|
}
|
|
57
92
|
/**
|
|
58
93
|
* migrate-stores-on-update (design D5): can the running user upgrade this
|
|
@@ -66,12 +101,11 @@ export function resolveInstallLocation(execPath) {
|
|
|
66
101
|
* could never succeed. Only meaningful for a `global` classification; callers
|
|
67
102
|
* do not ask for the other two.
|
|
68
103
|
*/
|
|
69
|
-
export async function isGlobalInstallWritable(binPath, execPath) {
|
|
70
|
-
const
|
|
71
|
-
const root = globalRootsFor(path.resolve(execPath)).find((candidate) => isUnder(resolved, candidate));
|
|
104
|
+
export async function isGlobalInstallWritable(binPath, execPath, npmPrefix = null) {
|
|
105
|
+
const root = rootOf(path.resolve(binPath), execPath, npmPrefix);
|
|
72
106
|
if (root === undefined)
|
|
73
107
|
return false;
|
|
74
|
-
const targets = [root,
|
|
108
|
+
const targets = [root.modules, root.bin];
|
|
75
109
|
for (const target of targets) {
|
|
76
110
|
try {
|
|
77
111
|
await access(target, constants.W_OK);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-kind.js","sourceRoot":"","sources":["../../src/core/install-kind.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"install-kind.js","sourceRoot":"","sources":["../../src/core/install-kind.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* serve-the-session-lifecycle-to-chat-apps D4: the one module that spawns the
|
|
3
|
+
* server's own CLI for the `ctxr` and `ctxr_write` tools. Always
|
|
4
|
+
* `process.execPath` plus this package's own entry script, never a `PATH`
|
|
5
|
+
* lookup — a resolved `ctxr` could be another installation — and always an
|
|
6
|
+
* argument vector, never a shell. The run is killed at the time bound and
|
|
7
|
+
* each stream is kept to the output bound; whatever is cut is said to be.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* D4, task 4.2: the time bound. Measured on generated stores of 2,539 and
|
|
11
|
+
* 5,039 linked notes (11 and 21 MB) on a 4-core host: `ctxr doctor` took
|
|
12
|
+
* 0.9 s and 1.2 s, `ctxr lint` — the slowest allowlisted command there —
|
|
13
|
+
* 1.2 s and 1.7 s, `graph build` 0.8 s and 1.0 s. 30 s leaves more than an
|
|
14
|
+
* order of magnitude for a busier server, a slower disk and a larger store,
|
|
15
|
+
* while still stopping a run that has hung. Task 9.1 times it on pkm itself.
|
|
16
|
+
*/
|
|
17
|
+
export declare const CLI_TIMEOUT_MS = 30000;
|
|
18
|
+
/** D4: each output stream is bounded to this many bytes. */
|
|
19
|
+
export declare const CLI_MAX_OUTPUT_BYTES: number;
|
|
20
|
+
/** This package's own CLI entry, beside the module that asks — the built `bin.js` in a release. */
|
|
21
|
+
export declare function packagedCliEntry(): string;
|
|
22
|
+
export interface CliRunResult {
|
|
23
|
+
/** Null when the run was killed. */
|
|
24
|
+
exit_code: number | null;
|
|
25
|
+
stdout: string;
|
|
26
|
+
stderr: string;
|
|
27
|
+
stdout_truncated: boolean;
|
|
28
|
+
stderr_truncated: boolean;
|
|
29
|
+
timed_out: boolean;
|
|
30
|
+
duration_ms: number;
|
|
31
|
+
}
|
|
32
|
+
export interface CliRunOptions {
|
|
33
|
+
entry: string;
|
|
34
|
+
argv: readonly string[];
|
|
35
|
+
cwd: string;
|
|
36
|
+
env: Record<string, string>;
|
|
37
|
+
timeoutMs?: number;
|
|
38
|
+
maxOutputBytes?: number;
|
|
39
|
+
}
|
|
40
|
+
export declare function runServerCli(opts: CliRunOptions): Promise<CliRunResult>;
|
|
41
|
+
//# sourceMappingURL=cli-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-runner.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/cli-runner.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,QAAS,CAAC;AACrC,4DAA4D;AAC5D,eAAO,MAAM,oBAAoB,QAAa,CAAC;AAE/C,mGAAmG;AACnG,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA0BD,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CA8BvE"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
/**
|
|
4
|
+
* serve-the-session-lifecycle-to-chat-apps D4: the one module that spawns the
|
|
5
|
+
* server's own CLI for the `ctxr` and `ctxr_write` tools. Always
|
|
6
|
+
* `process.execPath` plus this package's own entry script, never a `PATH`
|
|
7
|
+
* lookup — a resolved `ctxr` could be another installation — and always an
|
|
8
|
+
* argument vector, never a shell. The run is killed at the time bound and
|
|
9
|
+
* each stream is kept to the output bound; whatever is cut is said to be.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* D4, task 4.2: the time bound. Measured on generated stores of 2,539 and
|
|
13
|
+
* 5,039 linked notes (11 and 21 MB) on a 4-core host: `ctxr doctor` took
|
|
14
|
+
* 0.9 s and 1.2 s, `ctxr lint` — the slowest allowlisted command there —
|
|
15
|
+
* 1.2 s and 1.7 s, `graph build` 0.8 s and 1.0 s. 30 s leaves more than an
|
|
16
|
+
* order of magnitude for a busier server, a slower disk and a larger store,
|
|
17
|
+
* while still stopping a run that has hung. Task 9.1 times it on pkm itself.
|
|
18
|
+
*/
|
|
19
|
+
export const CLI_TIMEOUT_MS = 30_000;
|
|
20
|
+
/** D4: each output stream is bounded to this many bytes. */
|
|
21
|
+
export const CLI_MAX_OUTPUT_BYTES = 256 * 1024;
|
|
22
|
+
/** This package's own CLI entry, beside the module that asks — the built `bin.js` in a release. */
|
|
23
|
+
export function packagedCliEntry() {
|
|
24
|
+
return fileURLToPath(new URL('../../bin.js', import.meta.url));
|
|
25
|
+
}
|
|
26
|
+
class Bounded {
|
|
27
|
+
limit;
|
|
28
|
+
chunks = [];
|
|
29
|
+
size = 0;
|
|
30
|
+
truncated = false;
|
|
31
|
+
constructor(limit) {
|
|
32
|
+
this.limit = limit;
|
|
33
|
+
}
|
|
34
|
+
push(chunk) {
|
|
35
|
+
if (this.size >= this.limit) {
|
|
36
|
+
this.truncated = true;
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const room = this.limit - this.size;
|
|
40
|
+
const kept = chunk.length > room ? chunk.subarray(0, room) : chunk;
|
|
41
|
+
if (kept.length < chunk.length)
|
|
42
|
+
this.truncated = true;
|
|
43
|
+
this.chunks.push(kept);
|
|
44
|
+
this.size += kept.length;
|
|
45
|
+
}
|
|
46
|
+
text() {
|
|
47
|
+
return Buffer.concat(this.chunks).toString('utf8');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export function runServerCli(opts) {
|
|
51
|
+
const timeoutMs = opts.timeoutMs ?? CLI_TIMEOUT_MS;
|
|
52
|
+
const limit = opts.maxOutputBytes ?? CLI_MAX_OUTPUT_BYTES;
|
|
53
|
+
const started = Date.now();
|
|
54
|
+
return new Promise((resolve) => {
|
|
55
|
+
const child = spawn(process.execPath, [opts.entry, ...opts.argv], { cwd: opts.cwd, env: opts.env, stdio: ['ignore', 'pipe', 'pipe'], shell: false });
|
|
56
|
+
const out = new Bounded(limit);
|
|
57
|
+
const err = new Bounded(limit);
|
|
58
|
+
let timedOut = false;
|
|
59
|
+
const timer = setTimeout(() => {
|
|
60
|
+
timedOut = true;
|
|
61
|
+
child.kill('SIGKILL');
|
|
62
|
+
}, timeoutMs);
|
|
63
|
+
child.stdout.on('data', (chunk) => out.push(chunk));
|
|
64
|
+
child.stderr.on('data', (chunk) => err.push(chunk));
|
|
65
|
+
const finish = (code, error) => {
|
|
66
|
+
clearTimeout(timer);
|
|
67
|
+
resolve({
|
|
68
|
+
exit_code: timedOut ? null : code,
|
|
69
|
+
stdout: out.text(),
|
|
70
|
+
stderr: error === undefined ? err.text() : `${err.text()}${error.message}\n`,
|
|
71
|
+
stdout_truncated: out.truncated,
|
|
72
|
+
stderr_truncated: err.truncated,
|
|
73
|
+
timed_out: timedOut,
|
|
74
|
+
duration_ms: Date.now() - started,
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
child.on('error', (error) => finish(null, error));
|
|
78
|
+
child.on('close', (code) => finish(code));
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=cli-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-runner.js","sourceRoot":"","sources":["../../../src/core/mcp/cli-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,18 @@ export interface JsonRpcResponse {
|
|
|
24
24
|
result?: unknown;
|
|
25
25
|
error?: JsonRpcError;
|
|
26
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* serve-the-session-lifecycle-to-chat-apps D8: the hints every tool declares,
|
|
29
|
+
* so each app's confirmation prompts match what a call does. A presentation
|
|
30
|
+
* hint only: scope and ownership are still checked by the server on every call.
|
|
31
|
+
*/
|
|
32
|
+
export interface ToolAnnotations {
|
|
33
|
+
readOnlyHint: boolean;
|
|
34
|
+
destructiveHint: boolean;
|
|
35
|
+
idempotentHint: boolean;
|
|
36
|
+
/** False for every tool: none reaches beyond the store. */
|
|
37
|
+
openWorldHint: false;
|
|
38
|
+
}
|
|
27
39
|
/** A tool as `tools/list` advertises it and `tools/call` runs it. */
|
|
28
40
|
export interface ToolDefinition<TPrincipal> {
|
|
29
41
|
name: string;
|
|
@@ -32,7 +44,7 @@ export interface ToolDefinition<TPrincipal> {
|
|
|
32
44
|
inputSchema: Record<string, unknown>;
|
|
33
45
|
/** The scope a principal must hold for the tool to be listed or called. */
|
|
34
46
|
scope: string;
|
|
35
|
-
|
|
47
|
+
annotations: ToolAnnotations;
|
|
36
48
|
run(args: Record<string, unknown>, principal: TPrincipal): Promise<unknown>;
|
|
37
49
|
/**
|
|
38
50
|
* The text a client model reads, when JSON is the wrong shape for it — the file tools answer
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonrpc.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/jsonrpc.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,wGAAwG;AACxG,eAAO,MAAM,2BAA2B,YAAI,YAAY,EAAE,YAAY,EAAE,YAAY,CAAU,CAAC;AAE/F,eAAO,MAAM,mBAAmB,SAAS,CAAC;AAC1C,eAAO,MAAM,uBAAuB,SAAS,CAAC;AAC9C,eAAO,MAAM,wBAAwB,SAAS,CAAC;AAC/C,eAAO,MAAM,sBAAsB,SAAS,CAAC;AAC7C,eAAO,MAAM,sBAAsB,SAAS,CAAC;AAE7C,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAExC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,SAAS,GAAG,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAED,qEAAqE;AACrE,MAAM,WAAW,cAAc,CAAC,UAAU;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAC;IACd,
|
|
1
|
+
{"version":3,"file":"jsonrpc.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/jsonrpc.ts"],"names":[],"mappings":"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"}
|
package/dist/core/mcp/jsonrpc.js
CHANGED
|
@@ -113,7 +113,7 @@ async function dispatchOne(message, ctx) {
|
|
|
113
113
|
title: tool.title,
|
|
114
114
|
description: tool.description,
|
|
115
115
|
inputSchema: tool.inputSchema,
|
|
116
|
-
annotations: { title: tool.title,
|
|
116
|
+
annotations: { title: tool.title, ...tool.annotations },
|
|
117
117
|
})),
|
|
118
118
|
},
|
|
119
119
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonrpc.js","sourceRoot":"","sources":["../../../src/core/mcp/jsonrpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C;;;;;;GAMG;AAEH,wGAAwG;AACxG,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,CAAU,CAAC;AAE/F,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAK,CAAC;AAC1C,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,KAAK,CAAC;AAC9C,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,KAAK,CAAC;AAC/C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAK,CAAC;AAC7C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"jsonrpc.js","sourceRoot":"","sources":["../../../src/core/mcp/jsonrpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type SessionRef } from '../session/resolve.js';
|
|
2
|
+
import { ToolRefusal } from './jsonrpc.js';
|
|
3
|
+
import { Ownership, type OwnedKind } from './ownership.js';
|
|
4
|
+
import type { WriteDeps } from './sessions.js';
|
|
5
|
+
/**
|
|
6
|
+
* serve-the-session-lifecycle-to-chat-apps D1, D3: a member's sessions, as the
|
|
7
|
+
* tools address them. A session argument is the worktree's directory name; a
|
|
8
|
+
* file path addresses it by its store-relative root — the real worktree path,
|
|
9
|
+
* which can never collide with a note because the worktrees path is never
|
|
10
|
+
* enumerated. Anyone else's session, and any session not started over MCP,
|
|
11
|
+
* answers exactly as one that does not exist.
|
|
12
|
+
*/
|
|
13
|
+
export interface MemberSession {
|
|
14
|
+
/** The worktree's directory name. */
|
|
15
|
+
name: string;
|
|
16
|
+
ref: SessionRef;
|
|
17
|
+
/** The session's store root, store-relative, with a trailing `/`: what file paths into it start with. */
|
|
18
|
+
root: string;
|
|
19
|
+
kind: OwnedKind;
|
|
20
|
+
started_at: string | null;
|
|
21
|
+
}
|
|
22
|
+
export declare function repoPrefixOf(write: WriteDeps): Promise<string>;
|
|
23
|
+
export declare function ownershipOf(write: WriteDeps): Ownership;
|
|
24
|
+
export declare function sessionRootFor(write: WriteDeps, name: string): Promise<string>;
|
|
25
|
+
/** The member's sessions that still resolve as sessions, by directory name. */
|
|
26
|
+
export declare function memberSessions(write: WriteDeps, email: string): Promise<MemberSession[]>;
|
|
27
|
+
/** D1: the refusal for a write outside every session, or a session that is not the member's, naming the way in. */
|
|
28
|
+
export declare function noSessionRefusal(message: string, sessions: readonly MemberSession[]): ToolRefusal;
|
|
29
|
+
/** One of the member's sessions by directory name; refused as `mcp.no_session` for anything else. */
|
|
30
|
+
export declare function ownedSession(write: WriteDeps, email: string, name: unknown): Promise<MemberSession>;
|
|
31
|
+
export type LocatedPath = {
|
|
32
|
+
kind: 'view';
|
|
33
|
+
rel: string;
|
|
34
|
+
} | {
|
|
35
|
+
kind: 'session';
|
|
36
|
+
session: MemberSession;
|
|
37
|
+
rel: string;
|
|
38
|
+
} | {
|
|
39
|
+
kind: 'foreign';
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* D1: where a normalized store-relative path points. Under one of the
|
|
43
|
+
* member's session roots it is that session's working tree, `rel` inside it;
|
|
44
|
+
* elsewhere under the worktrees path it is someone else's (or nobody's) and is
|
|
45
|
+
* `foreign`; anywhere else it is the served commit.
|
|
46
|
+
*/
|
|
47
|
+
export declare function locatePath(write: WriteDeps, email: string, rel: string): Promise<LocatedPath>;
|
|
48
|
+
//# sourceMappingURL=member-sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"member-sessions.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/member-sessions.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAmB,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C;;;;;;;GAOG;AAEH,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,UAAU,CAAC;IAChB,yGAAyG;IACzG,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAEpE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAEvD;AAMD,wBAAsB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEpF;AAaD,+EAA+E;AAC/E,wBAAsB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAO9F;AAQD,mHAAmH;AACnH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,aAAa,EAAE,GAAG,WAAW,CAMjG;AAED,qGAAqG;AACrG,wBAAsB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAKzG;AAED,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAEzI;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAWnG"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { ContextureError } from '../errors.js';
|
|
3
|
+
import { isUnderPrefix } from '../fs/prefix.js';
|
|
4
|
+
import { resolveSession } from '../session/resolve.js';
|
|
5
|
+
import { ToolRefusal } from './jsonrpc.js';
|
|
6
|
+
import { Ownership } from './ownership.js';
|
|
7
|
+
export async function repoPrefixOf(write) {
|
|
8
|
+
return write.repoPrefix ?? (await write.git.run(['rev-parse', '--show-prefix'], { cwd: write.canonicalRoot, allowFailure: true })).stdout.trim();
|
|
9
|
+
}
|
|
10
|
+
export function ownershipOf(write) {
|
|
11
|
+
return new Ownership(write.canonicalRoot, write.config);
|
|
12
|
+
}
|
|
13
|
+
function worktreesPrefix(write) {
|
|
14
|
+
return write.config.session.worktrees_path.replace(/^\.?\/+/, '').replace(/\/+$/, '');
|
|
15
|
+
}
|
|
16
|
+
export async function sessionRootFor(write, name) {
|
|
17
|
+
return `${path.posix.join(worktreesPrefix(write), name, await repoPrefixOf(write))}/`.replace(/\/+$/, '/');
|
|
18
|
+
}
|
|
19
|
+
async function resolveOwned(write, entry) {
|
|
20
|
+
let ref;
|
|
21
|
+
try {
|
|
22
|
+
ref = await resolveSession(write.git, write.canonicalRoot, write.config, entry.name, write.canonicalRoot);
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
if (err instanceof ContextureError)
|
|
26
|
+
return null;
|
|
27
|
+
throw err;
|
|
28
|
+
}
|
|
29
|
+
return { name: entry.name, ref, root: await sessionRootFor(write, entry.name), kind: entry.record.kind, started_at: entry.record.started_at };
|
|
30
|
+
}
|
|
31
|
+
/** The member's sessions that still resolve as sessions, by directory name. */
|
|
32
|
+
export async function memberSessions(write, email) {
|
|
33
|
+
const found = [];
|
|
34
|
+
for (const entry of await ownershipOf(write).ownedBy(email)) {
|
|
35
|
+
const session = await resolveOwned(write, entry);
|
|
36
|
+
if (session !== null)
|
|
37
|
+
found.push(session);
|
|
38
|
+
}
|
|
39
|
+
return found;
|
|
40
|
+
}
|
|
41
|
+
/** One of the member's sessions by directory name, resolving only that one; null when it is not theirs. */
|
|
42
|
+
async function findOwned(write, email, name) {
|
|
43
|
+
const entry = (await ownershipOf(write).ownedBy(email)).find((e) => e.name === name);
|
|
44
|
+
return entry === undefined ? null : resolveOwned(write, entry);
|
|
45
|
+
}
|
|
46
|
+
/** D1: the refusal for a write outside every session, or a session that is not the member's, naming the way in. */
|
|
47
|
+
export function noSessionRefusal(message, sessions) {
|
|
48
|
+
const open = sessions.filter((s) => s.kind === 'session');
|
|
49
|
+
const listed = open.length === 0 ? 'You have no open sessions.' : `Your open sessions: ${open.map((s) => `${s.name} (root ${s.root})`).join('; ')}.`;
|
|
50
|
+
return new ToolRefusal('mcp.no_session', `${message} Call session_start to start a session, then address files under the root it returns. ${listed}`, {
|
|
51
|
+
sessions: open.map((s) => ({ session: s.name, root: s.root })),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/** One of the member's sessions by directory name; refused as `mcp.no_session` for anything else. */
|
|
55
|
+
export async function ownedSession(write, email, name) {
|
|
56
|
+
if (typeof name !== 'string' || name.trim() === '')
|
|
57
|
+
throw new ToolRefusal('mcp.invalid_arguments', '"session" is required: the directory name session_list or session_start gave.');
|
|
58
|
+
const session = await findOwned(write, email, name.trim());
|
|
59
|
+
if (session === null)
|
|
60
|
+
throw noSessionRefusal(`You have no session named "${name}".`, await memberSessions(write, email));
|
|
61
|
+
return session;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* D1: where a normalized store-relative path points. Under one of the
|
|
65
|
+
* member's session roots it is that session's working tree, `rel` inside it;
|
|
66
|
+
* elsewhere under the worktrees path it is someone else's (or nobody's) and is
|
|
67
|
+
* `foreign`; anywhere else it is the served commit.
|
|
68
|
+
*/
|
|
69
|
+
export async function locatePath(write, email, rel) {
|
|
70
|
+
const prefix = worktreesPrefix(write);
|
|
71
|
+
if (!isUnderPrefix(rel, prefix))
|
|
72
|
+
return { kind: 'view', rel };
|
|
73
|
+
const rest = rel.slice(prefix.length).replace(/^\/+/, '');
|
|
74
|
+
const name = rest.split('/')[0] ?? '';
|
|
75
|
+
if (name === '')
|
|
76
|
+
return { kind: 'foreign' };
|
|
77
|
+
const session = await findOwned(write, email, name);
|
|
78
|
+
if (session === null)
|
|
79
|
+
return { kind: 'foreign' };
|
|
80
|
+
const root = session.root.replace(/\/+$/, '');
|
|
81
|
+
if (rel !== root && !rel.startsWith(`${root}/`))
|
|
82
|
+
return { kind: 'foreign' };
|
|
83
|
+
return { kind: 'session', session, rel: rel === root ? '' : rel.slice(root.length + 1) };
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=member-sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"member-sessions.js","sourceRoot":"","sources":["../../../src/core/mcp/member-sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { StoreConfig } from '../../config/schema.js';
|
|
2
|
+
/**
|
|
3
|
+
* serve-the-session-lifecycle-to-chat-apps D3 (remote-access spec, *A member
|
|
4
|
+
* works in named sessions of their own*): who started each session over MCP.
|
|
5
|
+
* One JSON file under the canonical checkout's derived cache, keyed by the
|
|
6
|
+
* worktree's directory name, written atomically and only under the surface's
|
|
7
|
+
* write mutex. A record whose worktree is gone — landed, or discarded locally —
|
|
8
|
+
* is dropped on read, and the next write persists the drop. Sessions started
|
|
9
|
+
* locally have no record and are never visible over MCP.
|
|
10
|
+
*
|
|
11
|
+
* A worktree left by the per-member draft of `2026-10-23-serve-the-store-over-mcp`
|
|
12
|
+
* carries no record; it is adopted for the member whose email its label was
|
|
13
|
+
* derived from, so its pull request stays the member's to answer.
|
|
14
|
+
*/
|
|
15
|
+
export declare const OWNERSHIP_VERSION = 1;
|
|
16
|
+
/** D3: the open sessions a member may hold from `session_start`; a capture's session does not count (revision 8). */
|
|
17
|
+
export declare const MAX_OPEN_SESSIONS = 20;
|
|
18
|
+
export type OwnedKind = 'session' | 'capture';
|
|
19
|
+
export interface OwnershipRecord {
|
|
20
|
+
owner: string;
|
|
21
|
+
kind: OwnedKind;
|
|
22
|
+
/** ISO time; null for an adopted draft, whose start was never recorded. */
|
|
23
|
+
started_at: string | null;
|
|
24
|
+
}
|
|
25
|
+
/** The ownership record's path under the canonical checkout, beside the read view. */
|
|
26
|
+
export declare function ownershipFile(canonicalRoot: string): string;
|
|
27
|
+
/** The label the earlier per-member draft carried: `mcp-draft-<local part>-<8 hex of the email>`. */
|
|
28
|
+
export declare function draftLabel(email: string): string;
|
|
29
|
+
export interface OwnedEntry {
|
|
30
|
+
/** The worktree's directory name. */
|
|
31
|
+
name: string;
|
|
32
|
+
record: OwnershipRecord;
|
|
33
|
+
}
|
|
34
|
+
export declare class Ownership {
|
|
35
|
+
private readonly canonicalRoot;
|
|
36
|
+
private readonly config;
|
|
37
|
+
constructor(canonicalRoot: string, config: StoreConfig);
|
|
38
|
+
private worktreeExists;
|
|
39
|
+
/** Every record whose worktree still exists. */
|
|
40
|
+
read(): Promise<Record<string, OwnershipRecord>>;
|
|
41
|
+
private persist;
|
|
42
|
+
/** Under the write mutex. */
|
|
43
|
+
record(name: string, record: OwnershipRecord): Promise<void>;
|
|
44
|
+
/** Under the write mutex. */
|
|
45
|
+
forget(name: string): Promise<void>;
|
|
46
|
+
/** The member's sessions on disk, recorded or adopted, by directory name. */
|
|
47
|
+
ownedBy(email: string): Promise<OwnedEntry[]>;
|
|
48
|
+
/** Every capture session on disk, whoever started it. */
|
|
49
|
+
captures(): Promise<OwnedEntry[]>;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=ownership.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ownership.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/ownership.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAK1D;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC,qHAAqH;AACrH,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAGpC,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE9C,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,2EAA2E;IAC3E,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAOD,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,qGAAqG;AACrG,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED,MAAM,WAAW,UAAU;IACzB,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,qBAAa,SAAS;IAElB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFzB,YACmB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,WAAW,EAClC;IAEJ,OAAO,CAAC,cAAc;IAItB,gDAAgD;IAC1C,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAYrD;YAEa,OAAO;IAMrB,6BAA6B;IACvB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjE;IAED,6BAA6B;IACvB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIxC;IAED,6EAA6E;IACvE,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAWlD;IAED,yDAAyD;IACnD,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAKtC;CACF"}
|