ctxr-cli 0.34.0 → 0.35.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 (125) hide show
  1. package/README.md +25 -5
  2. package/dist/commands/plugin-build.d.ts +33 -0
  3. package/dist/commands/plugin-build.d.ts.map +1 -0
  4. package/dist/commands/plugin-build.js +51 -0
  5. package/dist/commands/plugin-build.js.map +1 -0
  6. package/dist/commands/publish-check.d.ts.map +1 -1
  7. package/dist/commands/publish-check.js +35 -4
  8. package/dist/commands/publish-check.js.map +1 -1
  9. package/dist/commands/serve.d.ts.map +1 -1
  10. package/dist/commands/serve.js +10 -2
  11. package/dist/commands/serve.js.map +1 -1
  12. package/dist/commands/session-start.d.ts.map +1 -1
  13. package/dist/commands/session-start.js +12 -38
  14. package/dist/commands/session-start.js.map +1 -1
  15. package/dist/core/fs/atomic.d.ts +3 -2
  16. package/dist/core/fs/atomic.d.ts.map +1 -1
  17. package/dist/core/fs/atomic.js +3 -2
  18. package/dist/core/fs/atomic.js.map +1 -1
  19. package/dist/core/mcp/cli-runner.d.ts +41 -0
  20. package/dist/core/mcp/cli-runner.d.ts.map +1 -0
  21. package/dist/core/mcp/cli-runner.js +81 -0
  22. package/dist/core/mcp/cli-runner.js.map +1 -0
  23. package/dist/core/mcp/jsonrpc.d.ts +13 -1
  24. package/dist/core/mcp/jsonrpc.d.ts.map +1 -1
  25. package/dist/core/mcp/jsonrpc.js +1 -1
  26. package/dist/core/mcp/jsonrpc.js.map +1 -1
  27. package/dist/core/mcp/member-sessions.d.ts +48 -0
  28. package/dist/core/mcp/member-sessions.d.ts.map +1 -0
  29. package/dist/core/mcp/member-sessions.js +85 -0
  30. package/dist/core/mcp/member-sessions.js.map +1 -0
  31. package/dist/core/mcp/ownership.d.ts +51 -0
  32. package/dist/core/mcp/ownership.d.ts.map +1 -0
  33. package/dist/core/mcp/ownership.js +101 -0
  34. package/dist/core/mcp/ownership.js.map +1 -0
  35. package/dist/core/mcp/paths.d.ts +48 -0
  36. package/dist/core/mcp/paths.d.ts.map +1 -0
  37. package/dist/core/mcp/paths.js +111 -0
  38. package/dist/core/mcp/paths.js.map +1 -0
  39. package/dist/core/mcp/sessions.d.ts +24 -46
  40. package/dist/core/mcp/sessions.d.ts.map +1 -1
  41. package/dist/core/mcp/sessions.js +31 -103
  42. package/dist/core/mcp/sessions.js.map +1 -1
  43. package/dist/core/mcp/tool-map.d.ts +94 -0
  44. package/dist/core/mcp/tool-map.d.ts.map +1 -0
  45. package/dist/core/mcp/tool-map.js +211 -0
  46. package/dist/core/mcp/tool-map.js.map +1 -0
  47. package/dist/core/mcp/tools/capture.d.ts +7 -2
  48. package/dist/core/mcp/tools/capture.d.ts.map +1 -1
  49. package/dist/core/mcp/tools/capture.js +69 -18
  50. package/dist/core/mcp/tools/capture.js.map +1 -1
  51. package/dist/core/mcp/tools/cli.d.ts +97 -0
  52. package/dist/core/mcp/tools/cli.d.ts.map +1 -0
  53. package/dist/core/mcp/tools/cli.js +271 -0
  54. package/dist/core/mcp/tools/cli.js.map +1 -0
  55. package/dist/core/mcp/tools/edit.d.ts +62 -28
  56. package/dist/core/mcp/tools/edit.d.ts.map +1 -1
  57. package/dist/core/mcp/tools/edit.js +182 -153
  58. package/dist/core/mcp/tools/edit.js.map +1 -1
  59. package/dist/core/mcp/tools/files.d.ts +37 -11
  60. package/dist/core/mcp/tools/files.d.ts.map +1 -1
  61. package/dist/core/mcp/tools/files.js +122 -100
  62. package/dist/core/mcp/tools/files.js.map +1 -1
  63. package/dist/core/mcp/tools/index.d.ts +12 -3
  64. package/dist/core/mcp/tools/index.d.ts.map +1 -1
  65. package/dist/core/mcp/tools/index.js +161 -58
  66. package/dist/core/mcp/tools/index.js.map +1 -1
  67. package/dist/core/mcp/tools/sessions.d.ts +145 -0
  68. package/dist/core/mcp/tools/sessions.d.ts.map +1 -0
  69. package/dist/core/mcp/tools/sessions.js +226 -0
  70. package/dist/core/mcp/tools/sessions.js.map +1 -0
  71. package/dist/core/plugin/build.d.ts +70 -0
  72. package/dist/core/plugin/build.d.ts.map +1 -0
  73. package/dist/core/plugin/build.js +159 -0
  74. package/dist/core/plugin/build.js.map +1 -0
  75. package/dist/core/plugin/routes.d.ts +35 -0
  76. package/dist/core/plugin/routes.d.ts.map +1 -0
  77. package/dist/core/plugin/routes.js +77 -0
  78. package/dist/core/plugin/routes.js.map +1 -0
  79. package/dist/core/plugin/zip.d.ts +17 -0
  80. package/dist/core/plugin/zip.d.ts.map +1 -0
  81. package/dist/core/plugin/zip.js +75 -0
  82. package/dist/core/plugin/zip.js.map +1 -0
  83. package/dist/core/session/start.d.ts +46 -0
  84. package/dist/core/session/start.d.ts.map +1 -0
  85. package/dist/core/session/start.js +33 -0
  86. package/dist/core/session/start.js.map +1 -0
  87. package/dist/core/skills.d.ts +20 -2
  88. package/dist/core/skills.d.ts.map +1 -1
  89. package/dist/core/skills.js +56 -3
  90. package/dist/core/skills.js.map +1 -1
  91. package/dist/run.d.ts +12 -0
  92. package/dist/run.d.ts.map +1 -1
  93. package/dist/run.js +81 -58
  94. package/dist/run.js.map +1 -1
  95. package/dist/version.d.ts +1 -1
  96. package/dist/version.js +1 -1
  97. package/package.json +1 -1
  98. package/templates/mcp/Delete.md +6 -0
  99. package/templates/mcp/Edit.md +6 -5
  100. package/templates/mcp/Glob.md +2 -2
  101. package/templates/mcp/Grep.md +2 -1
  102. package/templates/mcp/Move.md +7 -0
  103. package/templates/mcp/Read.md +4 -4
  104. package/templates/mcp/Write.md +4 -4
  105. package/templates/mcp/ctxr.md +7 -0
  106. package/templates/mcp/ctxr_write.md +8 -0
  107. package/templates/mcp/server-instructions.md +11 -3
  108. package/templates/mcp/session_discard.md +4 -0
  109. package/templates/mcp/session_list.md +7 -0
  110. package/templates/mcp/session_rebase.md +5 -0
  111. package/templates/mcp/session_start.md +7 -0
  112. package/templates/mcp/session_status.md +3 -0
  113. package/templates/mcp/session_submit.md +8 -0
  114. package/templates/plugin/README.md +13 -0
  115. package/templates/plugin/chatgpt-mcp.json +19 -0
  116. package/templates/plugin/chatgpt-plugin.json +13 -0
  117. package/templates/plugin/claude-mcp.json +8 -0
  118. package/templates/plugin/claude-plugin.json +6 -0
  119. package/templates/plugin/page.html +47 -0
  120. package/templates/skills/ctxr-publish.md +2 -1
  121. package/templates/skills/mcp/_preamble.md +44 -0
  122. package/dist/core/mcp/drafts.d.ts +0 -30
  123. package/dist/core/mcp/drafts.d.ts.map +0 -1
  124. package/dist/core/mcp/drafts.js +0 -52
  125. package/dist/core/mcp/drafts.js.map +0 -1
@@ -0,0 +1,211 @@
1
+ /**
2
+ * serve-the-session-lifecycle-to-chat-apps D9 and revisions 2, 3 and 6: the
3
+ * one place a `ctxr` command is mapped to the MCP tool that runs it. The tool
4
+ * registry (`tools/index.ts`) registers exactly the tools listed here, in
5
+ * this order; the rendered skills' preamble, the drift check over the MCP
6
+ * render and the tool/command alignment check all read this module, so no
7
+ * tool name is ever derived from a command name by rule.
8
+ *
9
+ * Every tool is one of four kinds:
10
+ * - `file`: Claude Code's own file tools, plus `Move` and `Delete`, which stand
11
+ * in for the `git mv` and `git rm` a local agent runs;
12
+ * - `command`: one `ctxr` command, named for its path, taking its options as
13
+ * fields (plus `session`, the one field the MCP layer adds);
14
+ * - `runner`: `ctxr` and `ctxr_write`, through which every allowlisted command
15
+ * without a tool of its own runs (D4);
16
+ * - `exception`: a tool with no command, each with its reason.
17
+ */
18
+ /** The one field the MCP layer adds to a command's options: a local command finds its session from its working directory, a stateless server cannot. */
19
+ export const SESSION_FIELD = 'session';
20
+ /** The fields of the two runners (D4, D9). */
21
+ export const RUNNER_FIELDS = ['args', SESSION_FIELD, 'input'];
22
+ /** The literal argument `ctxr_write` replaces with the path of a file holding the call's `input` (D4). */
23
+ export const INPUT_ARGUMENT = '@input';
24
+ /** D4: read-only commands `ctxr` runs, as command paths matched before any option. */
25
+ export const CTXR_READ_COMMANDS = [
26
+ 'lint',
27
+ 'doctor',
28
+ 'catalog show',
29
+ 'catalog check',
30
+ 'graph query',
31
+ 'graph diff',
32
+ 'context gather',
33
+ 'source check',
34
+ 'source hash',
35
+ 'rollup stale',
36
+ 'rollup gather',
37
+ 'publish check',
38
+ 'publish urls',
39
+ 'publish gather',
40
+ // mount-shared-stores: reads the declared mounts, with no writes and no network.
41
+ 'shared-stores status',
42
+ ];
43
+ /** D4: writing commands `ctxr_write` runs inside a member's own session. `session capture` is one of them (revision 2). */
44
+ export const CTXR_WRITE_COMMANDS = [
45
+ 'ingest',
46
+ 'archive',
47
+ 'entry append',
48
+ 'rollup write',
49
+ 'source stamp',
50
+ 'source add-alt',
51
+ 'session capture',
52
+ 'catalog build',
53
+ 'graph build',
54
+ // ctxr-session-capture regenerates AGENTS.md after a guidance edit. Only the
55
+ // entry document may change: the after-run check restores and refuses any
56
+ // change update makes to the skills, the hooks or the configuration, which
57
+ // is what a server on another ctxr version than the store's would write.
58
+ 'update',
59
+ ];
60
+ /**
61
+ * Commands a shipped skill names that have no counterpart over MCP, so the
62
+ * preamble marks them `none` and the agent skips the step. `shared-stores
63
+ * sync` refreshes the canonical clone's mounts; the server keeps no mounts,
64
+ * and a chat session cannot change into one (mount-shared-stores).
65
+ */
66
+ export const UNAVAILABLE_COMMANDS = ['shared-stores sync'];
67
+ /** D3: the session commands with a typed tool of their own. */
68
+ export const SESSION_COMMAND_TOOLS = {
69
+ 'session start': 'session_start',
70
+ 'session list': 'session_list',
71
+ 'session status': 'session_status',
72
+ 'session submit': 'session_submit',
73
+ 'session rebase': 'session_rebase',
74
+ 'session discard': 'session_discard',
75
+ };
76
+ /**
77
+ * D6: the git and gh steps the shipped skills name, and the tool each one is in
78
+ * this environment; null marks the server's own work, which the agent skips (the
79
+ * lifecycle skill's canonical-clone refresh). A step not listed here has no
80
+ * counterpart over MCP, and the drift check over the MCP render refuses it. The
81
+ * preamble's tables are rendered from this and `SESSION_COMMAND_TOOLS`.
82
+ */
83
+ export const GIT_STEP_TOOLS = {
84
+ 'git mv': 'Move',
85
+ 'git rm': 'Delete',
86
+ 'git status': 'session_status',
87
+ 'git diff': 'session_status',
88
+ 'git log': 'session_status',
89
+ 'git add': 'session_submit',
90
+ 'git commit': 'session_submit',
91
+ 'git push': 'session_submit',
92
+ 'git branch -m': 'session_submit',
93
+ 'gh pr create': 'session_submit',
94
+ 'gh pr edit': 'session_submit',
95
+ 'git fetch': null,
96
+ 'git merge --ff-only': null,
97
+ 'git rebase': 'session_rebase',
98
+ 'git worktree add': 'session_start',
99
+ 'git worktree list': 'session_list',
100
+ 'git worktree remove': 'session_discard',
101
+ };
102
+ /** The registry, in `tools/list` order. */
103
+ export const TOOL_REGISTRY = [
104
+ { name: 'find', kind: 'exception', reason: "the content matching a local agent does with its own Grep together with `catalog show`, in one obvious entry for a client that has neither" },
105
+ { name: 'gather', kind: 'exception', reason: '`ctxr context gather` with the bodies attached, which a client cannot read in one call otherwise; named for the clients already connected' },
106
+ { name: 'Read', kind: 'file' },
107
+ { name: 'Grep', kind: 'file' },
108
+ { name: 'Glob', kind: 'file' },
109
+ { name: 'capture', kind: 'exception', reason: 'a one-call capture for a phone: session_start, Write into the inbox, `ctxr source check` and session_submit together' },
110
+ { name: 'session_start', kind: 'command', command: 'session start' },
111
+ { name: 'session_list', kind: 'command', command: 'session list' },
112
+ { name: 'session_status', kind: 'command', command: 'session status' },
113
+ { name: 'Edit', kind: 'file' },
114
+ { name: 'Write', kind: 'file' },
115
+ { name: 'Move', kind: 'file' },
116
+ { name: 'Delete', kind: 'file' },
117
+ { name: 'session_submit', kind: 'command', command: 'session submit' },
118
+ { name: 'session_rebase', kind: 'command', command: 'session rebase' },
119
+ { name: 'session_discard', kind: 'command', command: 'session discard' },
120
+ { name: 'ctxr', kind: 'runner', reason: 'runs every allowlisted read-only command that has no tool of its own (D4)' },
121
+ { name: 'ctxr_write', kind: 'runner', reason: "runs every allowlisted writing command that has no tool of its own, inside the member's session (D4)" },
122
+ ];
123
+ export const TOOL_NAMES = TOOL_REGISTRY.map((t) => t.name);
124
+ /** The command path at the front of `argv` that `allowlist` holds, longest first; null when none does. Matched before any option. */
125
+ export function matchCommand(argv, allowlist) {
126
+ const leading = [];
127
+ for (const token of argv) {
128
+ if (token.startsWith('-'))
129
+ break;
130
+ leading.push(token);
131
+ }
132
+ let best = null;
133
+ for (const entry of allowlist) {
134
+ const words = entry.split(' ');
135
+ if (words.length <= leading.length && words.every((w, i) => leading[i] === w) && (best === null || words.length > best.split(' ').length))
136
+ best = entry;
137
+ }
138
+ return best;
139
+ }
140
+ /** How a `ctxr <command path>` step runs over MCP; null when the surface does not run it. */
141
+ export function routeForCommand(commandPath) {
142
+ const words = commandPath.trim().split(/\s+/);
143
+ const typed = SESSION_COMMAND_TOOLS[words.slice(0, 2).join(' ')];
144
+ if (typed !== undefined)
145
+ return { via: 'tool', tool: typed };
146
+ if (matchCommand(words, CTXR_WRITE_COMMANDS) !== null)
147
+ return { via: 'ctxr_write' };
148
+ if (matchCommand(words, CTXR_READ_COMMANDS) !== null)
149
+ return { via: 'ctxr' };
150
+ return null;
151
+ }
152
+ /** The file tools: Claude Code's own, plus the two that stand in for `git mv` and `git rm` (D9). */
153
+ export const FILE_TOOLS = ['Read', 'Grep', 'Glob', 'Edit', 'Write', 'Move', 'Delete'];
154
+ /** The named exceptions (D9): tools with no command, each with its reason in the registry. */
155
+ export const NAMED_EXCEPTIONS = ['find', 'gather', 'capture'];
156
+ /** The command runners (D4, D9). */
157
+ export const RUNNERS = ['ctxr', 'ctxr_write'];
158
+ /**
159
+ * D9: what is wrong with a registry against the CLI's commands, one line per
160
+ * problem, each naming the tool. Empty when every tool is a file tool, a
161
+ * runner, a named exception, or a command-named tool whose fields other than
162
+ * `session` are options or arguments that command registers.
163
+ */
164
+ export function alignmentProblems(registry, toolFields, commands) {
165
+ const problems = [];
166
+ const byPath = new Map(commands.map((c) => [c.path, c]));
167
+ for (const entry of registry) {
168
+ const fields = toolFields[entry.name] ?? [];
169
+ switch (entry.kind) {
170
+ case 'file':
171
+ if (!FILE_TOOLS.includes(entry.name))
172
+ problems.push(`${entry.name}: registered as a file tool, but it is not one of ${FILE_TOOLS.join(', ')}`);
173
+ break;
174
+ case 'exception':
175
+ if (!NAMED_EXCEPTIONS.includes(entry.name))
176
+ problems.push(`${entry.name}: not a named exception (${NAMED_EXCEPTIONS.join(', ')})`);
177
+ else if ((entry.reason ?? '').trim() === '')
178
+ problems.push(`${entry.name}: a named exception carries its reason`);
179
+ break;
180
+ case 'runner': {
181
+ if (!RUNNERS.includes(entry.name))
182
+ problems.push(`${entry.name}: not a command runner (${RUNNERS.join(', ')})`);
183
+ const extra = fields.filter((f) => !RUNNER_FIELDS.includes(f));
184
+ if (extra.length > 0)
185
+ problems.push(`${entry.name}: a runner takes only ${RUNNER_FIELDS.join(', ')}, not ${extra.join(', ')}`);
186
+ break;
187
+ }
188
+ case 'command': {
189
+ const command = entry.command === undefined ? undefined : byPath.get(entry.command);
190
+ if (command === undefined) {
191
+ problems.push(`${entry.name}: no \`ctxr ${entry.command ?? '?'}\` command exists`);
192
+ break;
193
+ }
194
+ if (entry.name !== command.path.split(' ').join('_'))
195
+ problems.push(`${entry.name}: a command's tool is named for its path, \`${command.path.split(' ').join('_')}\``);
196
+ const extra = fields.filter((f) => f !== SESSION_FIELD && !command.params.includes(f));
197
+ if (extra.length > 0)
198
+ problems.push(`${entry.name}: ${extra.join(', ')} ${extra.length === 1 ? 'is not an option' : 'are not options'} of \`ctxr ${command.path}\``);
199
+ break;
200
+ }
201
+ default:
202
+ problems.push(`${entry.name}: is neither a file tool, a command, a runner nor a named exception`);
203
+ }
204
+ }
205
+ for (const listed of [...CTXR_READ_COMMANDS, ...CTXR_WRITE_COMMANDS]) {
206
+ if (!commands.some((c) => c.path === listed || c.path.startsWith(`${listed} `)))
207
+ problems.push(`ctxr: the allowlisted \`ctxr ${listed}\` is not a command`);
208
+ }
209
+ return problems;
210
+ }
211
+ //# sourceMappingURL=tool-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-map.js","sourceRoot":"","sources":["../../../src/core/mcp/tool-map.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,13 @@ import type { McpView, SyncDeps } from '../sync.js';
7
7
  * capture is idempotent by source identity — derived from the content when
8
8
  * the caller names none — so a call that failed after committing resumes into
9
9
  * the same pull request instead of being refused as its own duplicate.
10
+ *
11
+ * serve-the-session-lifecycle-to-chat-apps task 3.3: the named exception
12
+ * (D9) is `session_start`, a `Write` into the inbox, the source check and
13
+ * `session_submit` in one call, so it runs on their core — the shared start,
14
+ * and the shared submit with its doctor gate and the member as author — and
15
+ * records its session as the member's capture, which `session_list` lists but
16
+ * the session cap does not count (revision 8).
10
17
  */
11
18
  export declare const MAX_CAPTURE_BODY_BYTES: number;
12
19
  export declare const CAPTURE_LABEL_PREFIX = "capture-";
@@ -59,6 +66,4 @@ export interface CaptureContext {
59
66
  }
60
67
  /** Run under the write mutex (design.md D9). */
61
68
  export declare function capture(ctx: CaptureContext, email: string, args: CaptureArgs): Promise<CaptureResult>;
62
- /** WriteRefusal → ToolRefusal, so the client reads the reason rather than a protocol error. */
63
- export declare function asToolRefusal(err: unknown): unknown;
64
69
  //# sourceMappingURL=capture.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../../../src/core/mcp/tools/capture.ts"],"names":[],"mappings":"AAaA,OAAO,EAWL,KAAK,SAAS,EACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEpD;;;;;;;GAOG;AAEH,eAAO,MAAM,sBAAsB,QAAa,CAAC;AAGjD,eAAO,MAAM,oBAAoB,aAAa,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,yFAAyF;AACzF,eAAO,MAAM,oBAAoB;aAC/B,IAAI,EAAE,QAAQ;aACd,UAAU;iBACR,KAAK;qBAAI,IAAI,EAAE,QAAQ;qBAAE,WAAW,EAAE,wEAAwE;;iBAC9G,IAAI;qBAAI,IAAI,EAAE,QAAQ;qBAAE,WAAW,EAAE,qDAAqD;;iBAC1F,WAAW;qBAAI,IAAI,EAAE,QAAQ;qBAAE,WAAW,EAAE,kEAAkE;;iBAC9G,SAAS;qBAAI,IAAI,EAAE,QAAQ;qBAAE,WAAW,EAAE,iGAAiG;;;aAE7I,QAAQ,YAAG,OAAO,EAAE,MAAM,EAAE,aAAa;CACjC,CAAC;AAEX,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAkB3E;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,IAAI,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;CAClB;AAoDD,gDAAgD;AAChD,wBAAsB,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAkE3G;AAED,+FAA+F;AAC/F,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAEnD"}
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../../../src/core/mcp/tools/capture.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAyD,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACvG,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEpD;;;;;;;;;;;;;;GAcG;AAEH,eAAO,MAAM,sBAAsB,QAAa,CAAC;AAGjD,eAAO,MAAM,oBAAoB,aAAa,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,yFAAyF;AACzF,eAAO,MAAM,oBAAoB;aAC/B,IAAI,EAAE,QAAQ;aACd,UAAU;iBACR,KAAK;qBAAI,IAAI,EAAE,QAAQ;qBAAE,WAAW,EAAE,wEAAwE;;iBAC9G,IAAI;qBAAI,IAAI,EAAE,QAAQ;qBAAE,WAAW,EAAE,qDAAqD;;iBAC1F,WAAW;qBAAI,IAAI,EAAE,QAAQ;qBAAE,WAAW,EAAE,kEAAkE;;iBAC9G,SAAS;qBAAI,IAAI,EAAE,QAAQ;qBAAE,WAAW,EAAE,iGAAiG;;;aAE7I,QAAQ,YAAG,OAAO,EAAE,MAAM,EAAE,aAAa;CACjC,CAAC;AAEX,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAkB3E;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,IAAI,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;CAClB;AAwFD,gDAAgD;AAChD,wBAAsB,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAoE3G"}
@@ -10,8 +10,14 @@ import { listCaptures, listNotes } from '../../notes/list.js';
10
10
  import { parseNoteText } from '../../notes/parse.js';
11
11
  import { slugifySegment } from '../../slug.js';
12
12
  import { isUnderAnyPrefix } from '../../fs/prefix.js';
13
+ import { SessionRefusedError } from '../../errors.js';
14
+ import { listSessionWorktreeDirs, sessionLabelFromDirName } from '../../session.js';
15
+ import { pullStateFor, removeSession } from '../../session/remote.js';
16
+ import { resolveSession } from '../../session/resolve.js';
17
+ import { submitSession } from '../../session/submit.js';
13
18
  import { ToolRefusal } from '../jsonrpc.js';
14
- import { approvalUrl, commitAs, publish, pullStateFor, removeSession, repoPathOf, sessionsLabelled, startSession, WriteRefusal, } from '../sessions.js';
19
+ import { ownershipOf, repoPrefixOf } from '../member-sessions.js';
20
+ import { approvalUrl, memberCommit, startSession, WriteRefusal } from '../sessions.js';
15
21
  /**
16
22
  * remote-access spec, *`capture` opens a session pull request and never
17
23
  * writes the default branch* (design.md D9). One new inbox file, on its own
@@ -19,6 +25,13 @@ import { approvalUrl, commitAs, publish, pullStateFor, removeSession, repoPathOf
19
25
  * capture is idempotent by source identity — derived from the content when
20
26
  * the caller names none — so a call that failed after committing resumes into
21
27
  * the same pull request instead of being refused as its own duplicate.
28
+ *
29
+ * serve-the-session-lifecycle-to-chat-apps task 3.3: the named exception
30
+ * (D9) is `session_start`, a `Write` into the inbox, the source check and
31
+ * `session_submit` in one call, so it runs on their core — the shared start,
32
+ * and the shared submit with its doctor gate and the member as author — and
33
+ * records its session as the member's capture, which `session_list` lists but
34
+ * the session cap does not count (revision 8).
22
35
  */
23
36
  export const MAX_CAPTURE_BODY_BYTES = 256 * 1024;
24
37
  const MAX_TITLE_CHARS = 200;
@@ -67,7 +80,7 @@ function captureText(args, sourceId) {
67
80
  async function sessionCapture(write, session, inbox) {
68
81
  const base = `refs/remotes/origin/${write.config.git.default_branch}`;
69
82
  const added = await write.git.run(['diff', '--name-only', '--diff-filter=A', '--no-renames', `${base}...HEAD`], { cwd: session.path, allowFailure: true });
70
- const prefix = await repoPathOf(write, '');
83
+ const prefix = await repoPrefixOf(write);
71
84
  for (const repoPath of added.stdout.split('\n').filter((p) => p.length > 0)) {
72
85
  if (!repoPath.startsWith(prefix))
73
86
  continue;
@@ -97,7 +110,7 @@ function pullBody(email, args, sourceId, rel) {
97
110
  ].join('\n');
98
111
  }
99
112
  function resultFor(write, session, pull, rel, sourceId, resumed) {
100
- const approval = approvalUrl(write, session);
113
+ const approval = approvalUrl(write, session.name);
101
114
  return {
102
115
  saved: true,
103
116
  resumed,
@@ -108,6 +121,45 @@ function resultFor(write, session, pull, rel, sourceId, resumed) {
108
121
  message: `Saved for approval as pull request #${pull.number}. It lands in the inbox once someone approves it at ${approval}.`,
109
122
  };
110
123
  }
124
+ /** The capture sessions on disk: recorded as captures, or labelled as one by the surface before the record existed. */
125
+ async function captureSessions(write) {
126
+ const recorded = new Set((await ownershipOf(write).captures()).map((entry) => entry.name));
127
+ const found = [];
128
+ for (const name of await listSessionWorktreeDirs(write.canonicalRoot, write.config)) {
129
+ if (!recorded.has(name) && !(sessionLabelFromDirName(write.config, name) ?? '').startsWith(CAPTURE_LABEL_PREFIX))
130
+ continue;
131
+ try {
132
+ found.push(await resolveSession(write.git, write.canonicalRoot, write.config, name, write.canonicalRoot));
133
+ }
134
+ catch (err) {
135
+ if (!(err instanceof SessionRefusedError))
136
+ throw err;
137
+ }
138
+ }
139
+ return found;
140
+ }
141
+ /**
142
+ * The shared submit, with the member as author and the session's own branch: nothing to name, since a capture's
143
+ * branch is never renamed. A retry whose commit already exists publishes it without a second one.
144
+ */
145
+ async function submitCapture(write, email, session, title, body) {
146
+ try {
147
+ const submitted = await submitSession({ ...write, commit: memberCommit(write, email, 'Captured-by') }, session, { branch: session.branch, message: `Capture: ${title}`, title: `Capture: ${title}`, body });
148
+ return submitted.pull_request;
149
+ }
150
+ catch (err) {
151
+ if (!(err instanceof SessionRefusedError))
152
+ throw err;
153
+ const reason = err.finding.code;
154
+ if (reason === 'session.push_failed') {
155
+ throw new WriteRefusal('mcp.push_failed', `The capture is saved in its session but could not be pushed yet. Retry the same call to publish it. (${err.finding.message})`, { session: session.name });
156
+ }
157
+ if (reason === 'session.pull_request_failed') {
158
+ throw new WriteRefusal('mcp.pull_request_failed', `The capture is pushed but its pull request could not be opened yet. Retry the same call to open it. (${err.finding.message})`, { session: session.name });
159
+ }
160
+ throw err;
161
+ }
162
+ }
111
163
  /** Run under the write mutex (design.md D9). */
112
164
  export async function capture(ctx, email, args) {
113
165
  // A sync forced now, so the duplicate check sees what was pushed and opened a moment ago.
@@ -126,13 +178,12 @@ export async function capture(ctx, email, args) {
126
178
  // The hash is over the canonical body, which the frontmatter does not enter, so any id gives the same hash.
127
179
  const hash = contentHash(captureText(args, 'pending'), 'capture');
128
180
  const sourceId = args.source_id ?? `${args.source_type}/${hash}`;
129
- const pullText = (rel) => ({ title: `Capture: ${args.title}`, body: pullBody(email, args, sourceId, rel) });
130
181
  // Capture sessions on disk: reclaim the closed, resume the unpublished, count the open as pending.
131
182
  const pending = [];
132
- for (const session of await sessionsLabelled(ctx.write, CAPTURE_LABEL_PREFIX)) {
133
- const state = await pullStateFor(ctx.write, session.branch);
183
+ for (const session of await captureSessions(ctx.write)) {
184
+ const state = await pullStateFor(ctx.write.forge, session.branch);
134
185
  if (state.kind === 'closed-unmerged') {
135
- await removeSession(ctx.write, session);
186
+ await removeSession(ctx.write.git, ctx.write.canonicalRoot, session);
136
187
  continue;
137
188
  }
138
189
  if (state.kind === 'merged')
@@ -141,7 +192,7 @@ export async function capture(ctx, email, args) {
141
192
  if (record === null)
142
193
  continue;
143
194
  if (state.kind === 'none' && record.frontmatter?.[SOURCE_ID_FIELD] === sourceId) {
144
- const pull = await publish(ctx.write, session, pullText(record.path));
195
+ const pull = await submitCapture(ctx.write, email, session, args.title, pullBody(email, args, sourceId, record.path));
145
196
  return resultFor(ctx.write, session, pull, record.path, sourceId, true);
146
197
  }
147
198
  if (state.kind === 'open')
@@ -158,25 +209,25 @@ export async function capture(ctx, email, args) {
158
209
  const date = ctx.write.now().toISOString().slice(0, 10);
159
210
  const slug = slugifySegment(args.title).slice(0, 40).replace(/-+$/, '') || 'capture';
160
211
  const id = randomBytes(3).toString('hex');
161
- const session = await startSession(ctx.write, `${CAPTURE_LABEL_PREFIX}${slug.slice(0, 30)}-${id}`);
212
+ const started = await startSession(ctx.write, `${CAPTURE_LABEL_PREFIX}${slug.slice(0, 30)}-${id}`);
213
+ await ownershipOf(ctx.write).record(started.name, { owner: email, kind: 'capture', started_at: ctx.write.now().toISOString() });
214
+ const session = await resolveSession(ctx.write.git, ctx.write.canonicalRoot, ctx.write.config, started.name, ctx.write.canonicalRoot);
162
215
  // posix join: the schema accepts an inbox path with or without its trailing slash.
163
216
  const rel = path.posix.join(inbox, `${date}-${slug}-${id}.md`);
164
- const repoPath = await repoPathOf(ctx.write, rel);
165
- const absolute = path.join(session.path, repoPath);
217
+ const absolute = path.join(session.storeRoot, rel);
166
218
  await mkdir(path.dirname(absolute), { recursive: true });
167
219
  await writeFile(absolute, captureText(args, sourceId));
220
+ let pull;
168
221
  try {
169
- await commitAs(ctx.write, session, email, [repoPath], `Capture: ${args.title}`, 'Captured-by');
222
+ pull = await submitCapture(ctx.write, email, session, args.title, pullBody(email, args, sourceId, rel));
170
223
  }
171
224
  catch (err) {
172
- await removeSession(ctx.write, session);
225
+ // Refused before anything was committed (the gate, or the hooks): nothing of it should stay behind.
226
+ const committed = (await ctx.write.git.run(['rev-list', '--count', `refs/remotes/origin/${ctx.write.config.git.default_branch}..HEAD`], { cwd: session.path, allowFailure: true })).stdout.trim();
227
+ if (committed === '0')
228
+ await removeSession(ctx.write.git, ctx.write.canonicalRoot, session);
173
229
  throw err;
174
230
  }
175
- const pull = await publish(ctx.write, session, pullText(rel));
176
231
  return resultFor(ctx.write, session, pull, rel, sourceId, false);
177
232
  }
178
- /** WriteRefusal → ToolRefusal, so the client reads the reason rather than a protocol error. */
179
- export function asToolRefusal(err) {
180
- return err instanceof WriteRefusal ? new ToolRefusal(err.code, err.message, err.details) : err;
181
- }
182
233
  //# sourceMappingURL=capture.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../../../src/core/mcp/tools/capture.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../../../src/core/mcp/tools/capture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAuB,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAmB,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAGvG;;;;;;;;;;;;;;GAcG;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,GAAG,IAAI,CAAC;AACjD,MAAM,eAAe,GAAG,GAAG,CAAC;AAC5B,MAAM,cAAc,GAAG,6BAA6B,CAAC;AACrD,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAC;AAS/C,yFAAyF;AACzF,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wEAAwE,EAAE;QAChH,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qDAAqD,EAAE;QAC5F,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kEAAkE,EAAE;QAChH,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iGAAiG,EAAE;KAC9I;IACD,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC;CAClC,CAAC;AAEX,MAAM,UAAU,gBAAgB,CAAC,IAA6B;IAC5D,MAAM,OAAO,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;IACvF,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC5G,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,eAAe;QAAE,MAAM,OAAO,CAAC,sBAAsB,eAAe,cAAc,CAAC,CAAC;IAC5G,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,0CAA0C,CAAC,CAAC;IAC9H,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,sBAAsB;QAAE,MAAM,OAAO,CAAC,qBAAqB,sBAAsB,oDAAoD,CAAC,CAAC;IAClL,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACnF,MAAM,OAAO,CAAC,oGAAoG,CAAC,CAAC;IACtH,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1I,MAAM,OAAO,CAAC,iDAAiD,CAAC,CAAC;IACnE,CAAC;IACD,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QACxB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,GAAG,CAAC,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpF,CAAC;AACJ,CAAC;AAkBD,iHAAiH;AACjH,SAAS,WAAW,CAAC,IAAiB,EAAE,QAAgB;IACtD,MAAM,WAAW,GAAG,aAAa,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IACvI,OAAO,QAAQ,WAAW,YAAY,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC;AAC1E,CAAC;AAED,4GAA4G;AAC5G,KAAK,UAAU,cAAc,CAAC,KAAgB,EAAE,OAAmB,EAAE,KAAa;IAChF,MAAM,IAAI,GAAG,uBAAuB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;IACtE,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,cAAc,EAAE,GAAG,IAAI,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3J,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;IACzC,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QAC5E,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,SAAS;QAC3C,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QACtE,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,QAAQ,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3G,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,IAAI,CAAC;YACH,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAClF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,IAAiB,EAAE,QAAgB,EAAE,GAAW;IAC/E,OAAO;QACL,iDAAiD,KAAK,GAAG;QACzD,EAAE;QACF,aAAa,IAAI,CAAC,WAAW,OAAO,QAAQ,KAAK;QACjD,aAAa,GAAG,IAAI;QACpB,EAAE;QACF,yGAAyG;KAC1G,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,KAAgB,EAAE,OAAmB,EAAE,IAAqC,EAAE,GAAW,EAAE,QAAgB,EAAE,OAAgB;IAC9I,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,OAAO;QACL,KAAK,EAAE,IAAI;QACX,OAAO;QACP,IAAI,EAAE,GAAG;QACT,SAAS,EAAE,QAAQ;QACnB,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;QACpD,YAAY,EAAE,QAAQ;QACtB,OAAO,EAAE,uCAAuC,IAAI,CAAC,MAAM,uDAAuD,QAAQ,GAAG;KAC9H,CAAC;AACJ,CAAC;AAED,uHAAuH;AACvH,KAAK,UAAU,eAAe,CAAC,KAAgB;IAC7C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3F,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,uBAAuB,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACpF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,uBAAuB,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,oBAAoB,CAAC;YAAE,SAAS;QAC3H,IAAI,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,MAAM,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;QAC5G,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,CAAC,GAAG,YAAY,mBAAmB,CAAC;gBAAE,MAAM,GAAG,CAAC;QACvD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,aAAa,CAAC,KAAgB,EAAE,KAAa,EAAE,OAAmB,EAAE,KAAa,EAAE,IAAY;IAC5G,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,KAAK,EAAE,EAAE,KAAK,EAAE,YAAY,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5M,OAAO,SAAS,CAAC,YAAY,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,GAAG,YAAY,mBAAmB,CAAC;YAAE,MAAM,GAAG,CAAC;QACrD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;QAChC,IAAI,MAAM,KAAK,qBAAqB,EAAE,CAAC;YACrC,MAAM,IAAI,YAAY,CAAC,iBAAiB,EAAE,wGAAwG,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACvM,CAAC;QACD,IAAI,MAAM,KAAK,6BAA6B,EAAE,CAAC;YAC7C,MAAM,IAAI,YAAY,CAAC,yBAAyB,EAAE,wGAAwG,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/M,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAmB,EAAE,KAAa,EAAE,IAAiB;IACjF,0FAA0F;IAC1F,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrC,gGAAgG;IAChG,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QACzF,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM;QACjC,WAAW,EAAE,CAAC,GAAG,CAAC,MAAM,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAqB;KACzK,CAAC,CAAC,CAAC;IACJ,MAAM,MAAM,GAAG,UAAU,CAAC;IAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;IAEvC,MAAM,OAAO,GAAG,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5E,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,WAAW,CAAC,8BAA8B,EAAE,KAAK,IAAI,CAAC,WAAW,0BAA0B,OAAO,uDAAuD,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7L,CAAC;IAED,4GAA4G;IAC5G,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;IAEjE,mGAAmG;IACnG,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,KAAK,MAAM,OAAO,IAAI,MAAM,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAClE,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YACrC,MAAM,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACrE,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QACtC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC/D,IAAI,MAAM,KAAK,IAAI;YAAE,SAAS;QAC9B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,eAAe,CAAC,KAAK,QAAQ,EAAE,CAAC;YAChF,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACtH,OAAO,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,mBAAmB,KAAK,CAAC,IAAI,CAAC,MAAM,sBAAsB,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/J,CAAC;IAED,MAAM,OAAO,GAAqB,CAAC,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAC5F,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC9B,MAAM,IAAI,WAAW,CAAC,sBAAsB,EAAE,+DAA+D,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;YACrM,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC;IACrF,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,oBAAoB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnG,MAAM,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAChI,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACtI,mFAAmF;IACnF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACnD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACvD,IAAI,IAAqC,CAAC;IAC1C,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1G,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,oGAAoG;QACpG,MAAM,SAAS,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,uBAAuB,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAClM,IAAI,SAAS,KAAK,GAAG;YAAE,MAAM,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAC5F,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,OAAO,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AACnE,CAAC"}
@@ -0,0 +1,97 @@
1
+ import { type CliRunResult } from '../cli-runner.js';
2
+ import type { WriteDeps } from '../sessions.js';
3
+ import type { McpView, SyncDeps } from '../sync.js';
4
+ /**
5
+ * serve-the-session-lifecycle-to-chat-apps D4, D5 (remote-access spec,
6
+ * *`ctxr` and `ctxr_write` run allowlisted CLI commands confined to one
7
+ * checkout*): a skill's "run `ctxr lint`" works unchanged. `ctxr` runs a
8
+ * read-only command against the served commit or one of the caller's
9
+ * sessions; `ctxr_write` runs a writing one inside a session the caller owns.
10
+ * Each runs the server's own CLI with the checkout as its working directory
11
+ * and store root, without the server's forge credentials. Before anything
12
+ * runs, the subcommand must be on the tool's allowlist, the root option is
13
+ * refused, and every path-like argument must stay inside the checkout and off
14
+ * the protected paths. After a `ctxr_write` run, every protected path git
15
+ * shows it changed is restored and the call refused, whatever destination the
16
+ * command derived — the boundary does not rest on each command's own checks.
17
+ */
18
+ export declare const CTXR_INPUT_SCHEMA: {
19
+ readonly type: 'object';
20
+ readonly properties: {
21
+ readonly args: {
22
+ readonly type: 'array';
23
+ readonly items: {
24
+ readonly type: 'string';
25
+ };
26
+ readonly description: `The command and its arguments, as you would type them after "ctxr", one item per argument, e.g. ["lint"] or ["catalog", "show", "--section", "projects"]. Read-only commands only: ${string}.`;
27
+ };
28
+ readonly session: {
29
+ readonly type: 'string';
30
+ readonly description: "Run in this session of yours (its directory name) instead of against the store's current commit.";
31
+ };
32
+ };
33
+ readonly required: readonly ['args'];
34
+ };
35
+ export declare const CTXR_WRITE_INPUT_SCHEMA: {
36
+ readonly type: 'object';
37
+ readonly properties: {
38
+ readonly args: {
39
+ readonly type: 'array';
40
+ readonly items: {
41
+ readonly type: 'string';
42
+ };
43
+ readonly description: `The command and its arguments, one item per argument, e.g. ["ingest", "<root>raw/inbox/x.md", "--into", "<root>projects/kestrel.md", ...]. Writing commands only: ${string}.`;
44
+ };
45
+ readonly session: {
46
+ readonly type: 'string';
47
+ readonly description: 'The session of yours to run in (its directory name). Required.';
48
+ };
49
+ readonly input: {
50
+ readonly type: 'string';
51
+ readonly description: "Text for a command that reads a file (rollup write --content-file, session capture --proposal): pass \"@input\" as that argument and it is replaced with a file holding this text.";
52
+ };
53
+ };
54
+ readonly required: readonly ['args', 'session'];
55
+ };
56
+ export interface CliArgs {
57
+ args: string[];
58
+ session?: string;
59
+ input?: string;
60
+ }
61
+ export declare function parseCliArgs(args: Record<string, unknown>, write: boolean): CliArgs;
62
+ /**
63
+ * D4: every argument after the command path, checked before anything runs.
64
+ * A path under the caller's session root is rewritten to the path inside the
65
+ * session, which is what the command sees as its store root; any other
66
+ * path-like argument must stay inside the checkout and off the protected paths.
67
+ */
68
+ export declare function checkArguments(argv: readonly string[], allowlist: readonly string[], tool: 'ctxr' | 'ctxr_write', config: WriteDeps['config'], sessionRoot: string | null): {
69
+ command: string;
70
+ argv: string[];
71
+ };
72
+ /** D4: the server's environment without its forge credentials, with the checkout as the store root. */
73
+ export declare function childEnv(env: Readonly<Record<string, string | undefined>>, cwd: string, cacheDir: string): Record<string, string>;
74
+ export interface CliToolContext {
75
+ view: McpView;
76
+ syncDeps: SyncDeps;
77
+ write: WriteDeps;
78
+ /** The CLI entry the runners spawn with `process.execPath`. */
79
+ entry: string;
80
+ timeoutMs?: number;
81
+ }
82
+ export interface CliToolResult extends CliRunResult {
83
+ command: string;
84
+ args: string[];
85
+ /** What it ran against: the session, or the served commit. */
86
+ ran_against: {
87
+ session: string;
88
+ root: string;
89
+ } | {
90
+ commit: string;
91
+ };
92
+ }
93
+ export declare function ctxrTool(ctx: CliToolContext, email: string, args: CliArgs): Promise<CliToolResult>;
94
+ /** Under the write mutex. */
95
+ export declare function ctxrWriteTool(ctx: CliToolContext, email: string, args: CliArgs): Promise<CliToolResult>;
96
+ export declare function renderCli(data: unknown): string;
97
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../../src/core/mcp/tools/cli.ts"],"names":[],"mappings":"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"}