ctxr-cli 0.33.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.
- package/README.md +40 -6
- package/dist/commands/archive.d.ts +5 -4
- package/dist/commands/archive.d.ts.map +1 -1
- package/dist/commands/archive.js +7 -7
- package/dist/commands/archive.js.map +1 -1
- package/dist/commands/catalog-show.d.ts +8 -0
- package/dist/commands/catalog-show.d.ts.map +1 -1
- package/dist/commands/catalog-show.js +29 -2
- package/dist/commands/catalog-show.js.map +1 -1
- package/dist/commands/context-gather.d.ts.map +1 -1
- package/dist/commands/context-gather.js +3 -2
- package/dist/commands/context-gather.js.map +1 -1
- package/dist/commands/doctor.d.ts +5 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +4 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/graph-build.d.ts +4 -1
- package/dist/commands/graph-build.d.ts.map +1 -1
- package/dist/commands/graph-build.js +14 -5
- package/dist/commands/graph-build.js.map +1 -1
- package/dist/commands/land.d.ts +27 -7
- package/dist/commands/land.d.ts.map +1 -1
- package/dist/commands/land.js +307 -32
- 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/publish-gather.d.ts.map +1 -1
- package/dist/commands/publish-gather.js +2 -3
- package/dist/commands/publish-gather.js.map +1 -1
- package/dist/commands/review-list.d.ts +19 -5
- package/dist/commands/review-list.d.ts.map +1 -1
- package/dist/commands/review-list.js +55 -6
- package/dist/commands/review-list.js.map +1 -1
- package/dist/commands/rollup-gather.d.ts.map +1 -1
- package/dist/commands/rollup-gather.js +2 -3
- package/dist/commands/rollup-gather.js.map +1 -1
- package/dist/commands/second-opinion.d.ts +33 -0
- package/dist/commands/second-opinion.d.ts.map +1 -0
- package/dist/commands/second-opinion.js +56 -0
- package/dist/commands/second-opinion.js.map +1 -0
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +14 -2
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/session-discard.d.ts +18 -0
- package/dist/commands/session-discard.d.ts.map +1 -0
- package/dist/commands/session-discard.js +31 -0
- package/dist/commands/session-discard.js.map +1 -0
- package/dist/commands/session-list.d.ts +17 -6
- package/dist/commands/session-list.d.ts.map +1 -1
- package/dist/commands/session-list.js +31 -11
- package/dist/commands/session-list.js.map +1 -1
- package/dist/commands/session-rebase.d.ts +18 -0
- package/dist/commands/session-rebase.d.ts.map +1 -0
- package/dist/commands/session-rebase.js +43 -0
- package/dist/commands/session-rebase.js.map +1 -0
- package/dist/commands/session-start.d.ts +8 -0
- package/dist/commands/session-start.d.ts.map +1 -1
- package/dist/commands/session-start.js +52 -38
- package/dist/commands/session-start.js.map +1 -1
- package/dist/commands/session-status.d.ts +17 -0
- package/dist/commands/session-status.d.ts.map +1 -0
- package/dist/commands/session-status.js +38 -0
- package/dist/commands/session-status.js.map +1 -0
- package/dist/commands/session-submit.d.ts +23 -0
- package/dist/commands/session-submit.d.ts.map +1 -0
- package/dist/commands/session-submit.js +42 -0
- package/dist/commands/session-submit.js.map +1 -0
- package/dist/commands/shared-stores-status.d.ts +24 -0
- package/dist/commands/shared-stores-status.d.ts.map +1 -0
- package/dist/commands/shared-stores-status.js +51 -0
- package/dist/commands/shared-stores-status.js.map +1 -0
- package/dist/commands/shared-stores-sync.d.ts +27 -0
- package/dist/commands/shared-stores-sync.d.ts.map +1 -0
- package/dist/commands/shared-stores-sync.js +115 -0
- package/dist/commands/shared-stores-sync.js.map +1 -0
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +2 -4
- package/dist/commands/verify.js.map +1 -1
- package/dist/config/schema.d.ts +16 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +32 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/core/agents-doc.d.ts +10 -0
- package/dist/core/agents-doc.d.ts.map +1 -1
- package/dist/core/agents-doc.js +26 -1
- package/dist/core/agents-doc.js.map +1 -1
- package/dist/core/approval/decision.d.ts +39 -1
- package/dist/core/approval/decision.d.ts.map +1 -1
- package/dist/core/approval/decision.js +53 -6
- package/dist/core/approval/decision.js.map +1 -1
- package/dist/core/approval/session-group.d.ts +156 -0
- package/dist/core/approval/session-group.d.ts.map +1 -0
- package/dist/core/approval/session-group.js +359 -0
- package/dist/core/approval/session-group.js.map +1 -0
- package/dist/core/approval/session-marker.d.ts +79 -0
- package/dist/core/approval/session-marker.d.ts.map +1 -0
- package/dist/core/approval/session-marker.js +146 -0
- package/dist/core/approval/session-marker.js.map +1 -0
- package/dist/core/approval/store-forges.d.ts +15 -0
- package/dist/core/approval/store-forges.d.ts.map +1 -0
- package/dist/core/approval/store-forges.js +33 -0
- package/dist/core/approval/store-forges.js.map +1 -0
- package/dist/core/browse/approve.d.ts +8 -0
- package/dist/core/browse/approve.d.ts.map +1 -1
- package/dist/core/browse/approve.js +366 -48
- package/dist/core/browse/approve.js.map +1 -1
- package/dist/core/browse/link-resolver.d.ts +9 -4
- package/dist/core/browse/link-resolver.d.ts.map +1 -1
- package/dist/core/browse/link-resolver.js +12 -7
- package/dist/core/browse/link-resolver.js.map +1 -1
- package/dist/core/browse/review.d.ts +5 -0
- package/dist/core/browse/review.d.ts.map +1 -1
- package/dist/core/browse/review.js +8 -0
- package/dist/core/browse/review.js.map +1 -1
- package/dist/core/checks/integrity-checks.d.ts.map +1 -1
- package/dist/core/checks/integrity-checks.js +7 -1
- package/dist/core/checks/integrity-checks.js.map +1 -1
- package/dist/core/checks/manifest.d.ts.map +1 -1
- package/dist/core/checks/manifest.js +2 -0
- package/dist/core/checks/manifest.js.map +1 -1
- package/dist/core/checks/shared-stores-checks.d.ts +17 -0
- package/dist/core/checks/shared-stores-checks.d.ts.map +1 -0
- package/dist/core/checks/shared-stores-checks.js +84 -0
- package/dist/core/checks/shared-stores-checks.js.map +1 -0
- package/dist/core/errors.d.ts +17 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +21 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/forge/github.d.ts +14 -0
- package/dist/core/forge/github.d.ts.map +1 -1
- package/dist/core/forge/github.js +17 -0
- package/dist/core/forge/github.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/fast-forward.d.ts +23 -0
- package/dist/core/git/fast-forward.d.ts.map +1 -0
- package/dist/core/git/fast-forward.js +38 -0
- package/dist/core/git/fast-forward.js.map +1 -0
- package/dist/core/git/repo.d.ts +11 -0
- package/dist/core/git/repo.d.ts.map +1 -1
- package/dist/core/git/repo.js +25 -0
- package/dist/core/git/repo.js.map +1 -1
- package/dist/core/graph/model.d.ts +27 -0
- package/dist/core/graph/model.d.ts.map +1 -1
- package/dist/core/graph/model.js +68 -2
- package/dist/core/graph/model.js.map +1 -1
- package/dist/core/graph/persist.d.ts.map +1 -1
- package/dist/core/graph/persist.js +3 -2
- package/dist/core/graph/persist.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 +25 -50
- package/dist/core/mcp/sessions.d.ts.map +1 -1
- package/dist/core/mcp/sessions.js +31 -123
- 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/notes/list.d.ts.map +1 -1
- package/dist/core/notes/list.js +5 -0
- package/dist/core/notes/list.js.map +1 -1
- 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/reconcile.d.ts.map +1 -1
- package/dist/core/reconcile.js +2 -1
- package/dist/core/reconcile.js.map +1 -1
- package/dist/core/retrieval/pass.d.ts.map +1 -1
- package/dist/core/retrieval/pass.js +5 -4
- package/dist/core/retrieval/pass.js.map +1 -1
- package/dist/core/rollup.d.ts.map +1 -1
- package/dist/core/rollup.js +2 -3
- package/dist/core/rollup.js.map +1 -1
- package/dist/core/root.d.ts.map +1 -1
- package/dist/core/root.js +33 -2
- package/dist/core/root.js.map +1 -1
- package/dist/core/second-opinion/environment.d.ts +21 -0
- package/dist/core/second-opinion/environment.d.ts.map +1 -0
- package/dist/core/second-opinion/environment.js +70 -0
- package/dist/core/second-opinion/environment.js.map +1 -0
- package/dist/core/second-opinion/judge.d.ts +29 -0
- package/dist/core/second-opinion/judge.d.ts.map +1 -0
- package/dist/core/second-opinion/judge.js +55 -0
- package/dist/core/second-opinion/judge.js.map +1 -0
- package/dist/core/second-opinion/launch.d.ts +16 -0
- package/dist/core/second-opinion/launch.d.ts.map +1 -0
- package/dist/core/second-opinion/launch.js +75 -0
- package/dist/core/second-opinion/launch.js.map +1 -0
- package/dist/core/second-opinion/lineup.d.ts +82 -0
- package/dist/core/second-opinion/lineup.d.ts.map +1 -0
- package/dist/core/second-opinion/lineup.js +113 -0
- package/dist/core/second-opinion/lineup.js.map +1 -0
- package/dist/core/second-opinion/modes.d.ts +98 -0
- package/dist/core/second-opinion/modes.d.ts.map +1 -0
- package/dist/core/second-opinion/modes.js +224 -0
- package/dist/core/second-opinion/modes.js.map +1 -0
- package/dist/core/second-opinion/prompts.d.ts +18 -0
- package/dist/core/second-opinion/prompts.d.ts.map +1 -0
- package/dist/core/second-opinion/prompts.js +65 -0
- package/dist/core/second-opinion/prompts.js.map +1 -0
- package/dist/core/session/commit.d.ts +29 -0
- package/dist/core/session/commit.d.ts.map +1 -0
- package/dist/core/session/commit.js +22 -0
- package/dist/core/session/commit.js.map +1 -0
- package/dist/core/session/discard.d.ts +24 -0
- package/dist/core/session/discard.d.ts.map +1 -0
- package/dist/core/session/discard.js +68 -0
- package/dist/core/session/discard.js.map +1 -0
- package/dist/core/session/list.d.ts +48 -0
- package/dist/core/session/list.d.ts.map +1 -0
- package/dist/core/session/list.js +55 -0
- package/dist/core/session/list.js.map +1 -0
- package/dist/core/session/rebase.d.ts +34 -0
- package/dist/core/session/rebase.d.ts.map +1 -0
- package/dist/core/session/rebase.js +87 -0
- package/dist/core/session/rebase.js.map +1 -0
- package/dist/core/session/remote.d.ts +80 -0
- package/dist/core/session/remote.d.ts.map +1 -0
- package/dist/core/session/remote.js +102 -0
- package/dist/core/session/remote.js.map +1 -0
- package/dist/core/session/resolve.d.ts +41 -0
- package/dist/core/session/resolve.d.ts.map +1 -0
- package/dist/core/session/resolve.js +109 -0
- package/dist/core/session/resolve.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/status.d.ts +47 -0
- package/dist/core/session/status.d.ts.map +1 -0
- package/dist/core/session/status.js +55 -0
- package/dist/core/session/status.js.map +1 -0
- package/dist/core/session/submit.d.ts +67 -0
- package/dist/core/session/submit.d.ts.map +1 -0
- package/dist/core/session/submit.js +254 -0
- package/dist/core/session/submit.js.map +1 -0
- package/dist/core/shared-stores-location.d.ts +17 -0
- package/dist/core/shared-stores-location.d.ts.map +1 -0
- package/dist/core/shared-stores-location.js +22 -0
- package/dist/core/shared-stores-location.js.map +1 -0
- package/dist/core/shared-stores.d.ts +69 -0
- package/dist/core/shared-stores.d.ts.map +1 -0
- package/dist/core/shared-stores.js +100 -0
- package/dist/core/shared-stores.js.map +1 -0
- package/dist/core/skills.d.ts +20 -2
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +70 -13
- package/dist/core/skills.js.map +1 -1
- package/dist/run.d.ts +12 -0
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +194 -55
- 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/agents/shared-stores.md +11 -0
- package/templates/approve/copies-missing.md +1 -0
- package/templates/approve/elsewhere-heading.md +1 -0
- package/templates/approve/elsewhere-intro.md +1 -0
- package/templates/approve/homed-elsewhere.md +1 -0
- package/templates/approve/not-decider.md +1 -0
- package/templates/approve/part-heading.md +1 -0
- package/templates/approve/parts-changed.md +1 -0
- package/templates/approve/session-decision-note.md +1 -0
- package/templates/approve/session-intro.md +1 -0
- package/templates/approve/session-no-decision.md +1 -0
- package/templates/approve/store-unreachable.md +1 -0
- package/templates/land/resolver.md +2 -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/second-opinion/poll-answer.md +7 -0
- package/templates/second-opinion/taste-panel.md +14 -0
- package/templates/session/pages/bare-route.md +2 -0
- package/templates/session/pages/block.md +8 -0
- package/templates/session/pages/condition-preview.md +1 -0
- package/templates/session/pages/condition.md +1 -0
- package/templates/session/pages/moved.md +1 -0
- package/templates/session/pages/stops-working.md +1 -0
- package/templates/session/pages/table-head-preview.md +2 -0
- package/templates/session/pages/table-head.md +2 -0
- package/templates/skills/ctxr-connection-finding.md +4 -1
- package/templates/skills/ctxr-land.md +26 -7
- package/templates/skills/ctxr-placement.md +10 -0
- package/templates/skills/ctxr-publish.md +2 -1
- package/templates/skills/ctxr-rollup.md +3 -0
- package/templates/skills/ctxr-second-opinion.md +52 -36
- package/templates/skills/ctxr-session-lifecycle.md +60 -33
- package/templates/skills/ctxr-submit.md +65 -56
- package/templates/skills/mcp/_preamble.md +44 -0
- 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
- package/templates/skills/ctxr-second-opinion/run.mjs +0 -542
- /package/templates/{skills/ctxr-second-opinion → second-opinion}/critic-contract.md +0 -0
- /package/templates/{skills/ctxr-second-opinion → second-opinion}/lenses.md +0 -0
- /package/templates/{skills/ctxr-second-opinion → second-opinion}/personas/architect.md +0 -0
- /package/templates/{skills/ctxr-second-opinion → second-opinion}/personas/pragmatist.md +0 -0
- /package/templates/{skills/ctxr-second-opinion → second-opinion}/personas/skeptic.md +0 -0
|
@@ -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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { mkdir, readFile } from 'node:fs/promises';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { writeFileAtomic } from '../fs/atomic.js';
|
|
6
|
+
import { listSessionWorktreeDirs, sessionLabelFromDirName } from '../session.js';
|
|
7
|
+
import { slugifySegment } from '../slug.js';
|
|
8
|
+
/**
|
|
9
|
+
* serve-the-session-lifecycle-to-chat-apps D3 (remote-access spec, *A member
|
|
10
|
+
* works in named sessions of their own*): who started each session over MCP.
|
|
11
|
+
* One JSON file under the canonical checkout's derived cache, keyed by the
|
|
12
|
+
* worktree's directory name, written atomically and only under the surface's
|
|
13
|
+
* write mutex. A record whose worktree is gone — landed, or discarded locally —
|
|
14
|
+
* is dropped on read, and the next write persists the drop. Sessions started
|
|
15
|
+
* locally have no record and are never visible over MCP.
|
|
16
|
+
*
|
|
17
|
+
* A worktree left by the per-member draft of `2026-10-23-serve-the-store-over-mcp`
|
|
18
|
+
* carries no record; it is adopted for the member whose email its label was
|
|
19
|
+
* derived from, so its pull request stays the member's to answer.
|
|
20
|
+
*/
|
|
21
|
+
export const OWNERSHIP_VERSION = 1;
|
|
22
|
+
/** D3: the open sessions a member may hold from `session_start`; a capture's session does not count (revision 8). */
|
|
23
|
+
export const MAX_OPEN_SESSIONS = 20;
|
|
24
|
+
const DRAFT_LABEL_PREFIX = 'mcp-draft-';
|
|
25
|
+
/** The ownership record's path under the canonical checkout, beside the read view. */
|
|
26
|
+
export function ownershipFile(canonicalRoot) {
|
|
27
|
+
return path.join(canonicalRoot, '.contexture', 'cache', 'mcp', 'sessions.json');
|
|
28
|
+
}
|
|
29
|
+
/** The label the earlier per-member draft carried: `mcp-draft-<local part>-<8 hex of the email>`. */
|
|
30
|
+
export function draftLabel(email) {
|
|
31
|
+
const local = slugifySegment(email.split('@')[0] ?? 'member').slice(0, 20).replace(/-+$/, '') || 'member';
|
|
32
|
+
const digest = createHash('sha256').update(email.toLowerCase()).digest('hex').slice(0, 8);
|
|
33
|
+
return `${DRAFT_LABEL_PREFIX}${local}-${digest}`;
|
|
34
|
+
}
|
|
35
|
+
export class Ownership {
|
|
36
|
+
canonicalRoot;
|
|
37
|
+
config;
|
|
38
|
+
constructor(canonicalRoot, config) {
|
|
39
|
+
this.canonicalRoot = canonicalRoot;
|
|
40
|
+
this.config = config;
|
|
41
|
+
}
|
|
42
|
+
worktreeExists(name) {
|
|
43
|
+
return existsSync(path.join(this.canonicalRoot, this.config.session.worktrees_path, name));
|
|
44
|
+
}
|
|
45
|
+
/** Every record whose worktree still exists. */
|
|
46
|
+
async read() {
|
|
47
|
+
let parsed = null;
|
|
48
|
+
try {
|
|
49
|
+
parsed = JSON.parse(await readFile(ownershipFile(this.canonicalRoot), 'utf8'));
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
if (err.code !== 'ENOENT' && !(err instanceof SyntaxError))
|
|
53
|
+
throw err;
|
|
54
|
+
}
|
|
55
|
+
const sessions = {};
|
|
56
|
+
for (const [name, record] of Object.entries(parsed?.sessions ?? {})) {
|
|
57
|
+
if (typeof record?.owner === 'string' && this.worktreeExists(name))
|
|
58
|
+
sessions[name] = record;
|
|
59
|
+
}
|
|
60
|
+
return sessions;
|
|
61
|
+
}
|
|
62
|
+
async persist(sessions) {
|
|
63
|
+
const file = ownershipFile(this.canonicalRoot);
|
|
64
|
+
await mkdir(path.dirname(file), { recursive: true });
|
|
65
|
+
await writeFileAtomic(file, `${JSON.stringify({ version: OWNERSHIP_VERSION, sessions }, null, 2)}\n`);
|
|
66
|
+
}
|
|
67
|
+
/** Under the write mutex. */
|
|
68
|
+
async record(name, record) {
|
|
69
|
+
const sessions = await this.read();
|
|
70
|
+
sessions[name] = { ...record, owner: record.owner.toLowerCase() };
|
|
71
|
+
await this.persist(sessions);
|
|
72
|
+
}
|
|
73
|
+
/** Under the write mutex. */
|
|
74
|
+
async forget(name) {
|
|
75
|
+
const sessions = await this.read();
|
|
76
|
+
delete sessions[name];
|
|
77
|
+
await this.persist(sessions);
|
|
78
|
+
}
|
|
79
|
+
/** The member's sessions on disk, recorded or adopted, by directory name. */
|
|
80
|
+
async ownedBy(email) {
|
|
81
|
+
const who = email.toLowerCase();
|
|
82
|
+
const sessions = await this.read();
|
|
83
|
+
const owned = Object.entries(sessions)
|
|
84
|
+
.filter(([, record]) => record.owner === who)
|
|
85
|
+
.map(([name, record]) => ({ name, record }));
|
|
86
|
+
const draft = draftLabel(who);
|
|
87
|
+
for (const name of await listSessionWorktreeDirs(this.canonicalRoot, this.config)) {
|
|
88
|
+
if (sessions[name] === undefined && sessionLabelFromDirName(this.config, name) === draft)
|
|
89
|
+
owned.push({ name, record: { owner: who, kind: 'session', started_at: null } });
|
|
90
|
+
}
|
|
91
|
+
return owned.sort((a, b) => (a.name < b.name ? -1 : 1));
|
|
92
|
+
}
|
|
93
|
+
/** Every capture session on disk, whoever started it. */
|
|
94
|
+
async captures() {
|
|
95
|
+
return Object.entries(await this.read())
|
|
96
|
+
.filter(([, record]) => record.kind === 'capture')
|
|
97
|
+
.map(([name, record]) => ({ name, record }))
|
|
98
|
+
.sort((a, b) => (a.name < b.name ? -1 : 1));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=ownership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ownership.js","sourceRoot":"","sources":["../../../src/core/mcp/ownership.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { StoreConfig } from '../../config/schema.js';
|
|
2
|
+
import { ToolRefusal } from './jsonrpc.js';
|
|
3
|
+
/**
|
|
4
|
+
* serve-the-session-lifecycle-to-chat-apps D5: what the file tools and the
|
|
5
|
+
* command runners may read and change, as predicates over a store-relative,
|
|
6
|
+
* `/`-separated path. Kept free of any session or snapshot, so the file tools
|
|
7
|
+
* over the served commit, the same tools inside a session, and `ctxr_write`'s
|
|
8
|
+
* before- and after-run checks all ask the same question.
|
|
9
|
+
*/
|
|
10
|
+
/** The store's entry document, readable though it is not a note. */
|
|
11
|
+
export declare const ENTRY_DOCUMENT = "AGENTS.md";
|
|
12
|
+
export type ProtectedReason = 'configuration' | 'git' | 'derived' | 'worktrees' | 'skills';
|
|
13
|
+
/**
|
|
14
|
+
* D5, revision 7: the one protected-path predicate. Inside a session a member
|
|
15
|
+
* may change what a local session may change except these: the configuration
|
|
16
|
+
* (it grants MCP scopes), anything whose first segment begins with `.git` —
|
|
17
|
+
* the hooks directory among them, because a commit in a session worktree runs
|
|
18
|
+
* that worktree's hooks on the server — derived and cache paths, the
|
|
19
|
+
* worktrees path, and the managed skills path, which `ctxr update` owns.
|
|
20
|
+
* Null when the path may be changed.
|
|
21
|
+
*/
|
|
22
|
+
export declare function protectedReason(rel: string, config: StoreConfig): ProtectedReason | null;
|
|
23
|
+
export declare function protectedRefusal(rel: string, reason: ProtectedReason): ToolRefusal;
|
|
24
|
+
/** D5: the paths the owned skills read that are not notes: templates, house conventions, the mission, the log and the skills. */
|
|
25
|
+
export declare function widenedReadablePrefixes(config: StoreConfig): string[];
|
|
26
|
+
/** Never read or returned, whatever else applies: configuration, `.git`, derived paths and the worktrees path. */
|
|
27
|
+
export declare function neverReadablePrefixes(config: StoreConfig): string[];
|
|
28
|
+
/**
|
|
29
|
+
* D5: hidden from the file tools. `retrieval.exclude_paths` stays hidden — it
|
|
30
|
+
* is the operator's declared intent — except the capture tier, which `Read`
|
|
31
|
+
* marks, and the widened readable set, which the skills need.
|
|
32
|
+
*/
|
|
33
|
+
export declare function hiddenPrefixes(config: StoreConfig): string[];
|
|
34
|
+
/** Whether `rel` is a path the file tools may name at all (a file or a directory to search). */
|
|
35
|
+
export declare function nameablePath(rel: string, config: StoreConfig): boolean;
|
|
36
|
+
/** What `Read` answers for, as one predicate: a note, a markdown capture, the entry document, or the widened set. Grep and Glob return nothing else. */
|
|
37
|
+
export declare function readablePath(rel: string, config: StoreConfig): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* The exclusions ripgrep is given: the hidden prefixes that contain nothing in
|
|
40
|
+
* the widened set. A hidden prefix that does contain some (the default
|
|
41
|
+
* `.contexture/` holds the templates) is searched and filtered by
|
|
42
|
+
* `readablePath` afterwards, because a later positive glob would turn
|
|
43
|
+
* ripgrep's exclusions into an allowlist.
|
|
44
|
+
*/
|
|
45
|
+
export declare function searchExclusions(config: StoreConfig): string[];
|
|
46
|
+
/** A caller's path as a normalized store-relative one (a leading `/` names the store root); refused when it leaves the store. `''` is the root. */
|
|
47
|
+
export declare function normalizeStorePath(input: string): string;
|
|
48
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/paths.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAK1D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C;;;;;;GAMG;AAEH,oEAAoE;AACpE,eAAO,MAAM,cAAc,cAAc,CAAC;AAE1C,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG,KAAK,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE3F;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,eAAe,GAAG,IAAI,CAOxF;AAUD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,WAAW,CAElF;AAED,iIAAiI;AACjI,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,CAQrE;AAED,kHAAkH;AAClH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,CAEnE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,CAG5D;AAED,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAKtE;AAED,wJAAwJ;AACxJ,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAKtE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,CAG9D;AAED,mJAAmJ;AACnJ,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOxD"}
|