@nanonets/graft 0.23.1 → 0.24.1
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 +4 -4
- package/dist/ai/crux.d.ts +31 -3
- package/dist/ai/crux.d.ts.map +1 -1
- package/dist/ai/crux.js +88 -10
- package/dist/ai/crux.js.map +1 -1
- package/dist/ai/llm/openai.d.ts +101 -0
- package/dist/ai/llm/openai.d.ts.map +1 -1
- package/dist/ai/llm/openai.js +396 -6
- package/dist/ai/llm/openai.js.map +1 -1
- package/dist/ai/llm/recover-tool.d.ts +2 -0
- package/dist/ai/llm/recover-tool.d.ts.map +1 -1
- package/dist/ai/llm/recover-tool.js +1 -1
- package/dist/ai/llm/recover-tool.js.map +1 -1
- package/dist/ai/synthesize.d.ts.map +1 -1
- package/dist/ai/synthesize.js +100 -1
- package/dist/ai/synthesize.js.map +1 -1
- package/dist/ask/ask.d.ts +8 -0
- package/dist/ask/ask.d.ts.map +1 -1
- package/dist/ask/ask.js +33 -12
- package/dist/ask/ask.js.map +1 -1
- package/dist/claude/format.js +1 -1
- package/dist/claude/format.js.map +1 -1
- package/dist/claude/hook-io.d.ts +44 -0
- package/dist/claude/hook-io.d.ts.map +1 -0
- package/dist/claude/hook-io.js +144 -0
- package/dist/claude/hook-io.js.map +1 -0
- package/dist/claude/hooks.d.ts +0 -18
- package/dist/claude/hooks.d.ts.map +1 -1
- package/dist/claude/hooks.js +24 -77
- package/dist/claude/hooks.js.map +1 -1
- package/dist/claude/init.js +3 -3
- package/dist/claude/init.js.map +1 -1
- package/dist/claude/note-signals.d.ts +28 -0
- package/dist/claude/note-signals.d.ts.map +1 -0
- package/dist/claude/note-signals.js +325 -0
- package/dist/claude/note-signals.js.map +1 -0
- package/dist/claude/shim-template.d.ts.map +1 -1
- package/dist/claude/shim-template.js +10 -4
- package/dist/claude/shim-template.js.map +1 -1
- package/dist/claude/skill-template.d.ts.map +1 -1
- package/dist/claude/skill-template.js +49 -18
- package/dist/claude/skill-template.js.map +1 -1
- package/dist/claude/skills-hook-util.d.ts +25 -0
- package/dist/claude/skills-hook-util.d.ts.map +1 -0
- package/dist/claude/skills-hook-util.js +71 -0
- package/dist/claude/skills-hook-util.js.map +1 -0
- package/dist/claude/state.d.ts +4 -3
- package/dist/claude/state.d.ts.map +1 -1
- package/dist/claude/state.js.map +1 -1
- package/dist/claude/sync-run.js +1 -1
- package/dist/claude/sync-run.js.map +1 -1
- package/dist/cli-picker.d.ts +36 -5
- package/dist/cli-picker.d.ts.map +1 -1
- package/dist/cli-picker.js +60 -13
- package/dist/cli-picker.js.map +1 -1
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +406 -64
- package/dist/cli.js.map +1 -1
- package/dist/cloud/lookup-activity.d.ts +16 -0
- package/dist/cloud/lookup-activity.d.ts.map +1 -0
- package/dist/cloud/lookup-activity.js +56 -0
- package/dist/cloud/lookup-activity.js.map +1 -0
- package/dist/cloud/nudge.d.ts.map +1 -1
- package/dist/cloud/nudge.js +3 -0
- package/dist/cloud/nudge.js.map +1 -1
- package/dist/cloud/onboarding.d.ts +237 -0
- package/dist/cloud/onboarding.d.ts.map +1 -0
- package/dist/cloud/onboarding.js +536 -0
- package/dist/cloud/onboarding.js.map +1 -0
- package/dist/cloud/pair.d.ts +76 -0
- package/dist/cloud/pair.d.ts.map +1 -0
- package/dist/cloud/pair.js +249 -0
- package/dist/cloud/pair.js.map +1 -0
- package/dist/cloud/workspace-sync.d.ts +10 -2
- package/dist/cloud/workspace-sync.d.ts.map +1 -1
- package/dist/cloud/workspace-sync.js +119 -7
- package/dist/cloud/workspace-sync.js.map +1 -1
- package/dist/cloud/workspace.d.ts +22 -1
- package/dist/cloud/workspace.d.ts.map +1 -1
- package/dist/cloud/workspace.js +16 -1
- package/dist/cloud/workspace.js.map +1 -1
- package/dist/context/batches.d.ts +29 -0
- package/dist/context/batches.d.ts.map +1 -0
- package/dist/context/batches.js +130 -0
- package/dist/context/batches.js.map +1 -0
- package/dist/context/build.d.ts +7 -2
- package/dist/context/build.d.ts.map +1 -1
- package/dist/context/build.js +84 -50
- package/dist/context/build.js.map +1 -1
- package/dist/context/node-file.d.ts.map +1 -1
- package/dist/context/node-file.js +41 -4
- package/dist/context/node-file.js.map +1 -1
- package/dist/engine.d.ts +2 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +1 -0
- package/dist/engine.js.map +1 -1
- package/dist/graph/cards.d.ts.map +1 -1
- package/dist/graph/cards.js +9 -4
- package/dist/graph/cards.js.map +1 -1
- package/dist/graph/enrich.d.ts.map +1 -1
- package/dist/graph/enrich.js +8 -3
- package/dist/graph/enrich.js.map +1 -1
- package/dist/graph/generic.d.ts.map +1 -1
- package/dist/graph/generic.js +207 -6
- package/dist/graph/generic.js.map +1 -1
- package/dist/graph/lsp/client.d.ts +18 -0
- package/dist/graph/lsp/client.d.ts.map +1 -1
- package/dist/graph/lsp/client.js +40 -2
- package/dist/graph/lsp/client.js.map +1 -1
- package/dist/graph/lsp/enrich.d.ts.map +1 -1
- package/dist/graph/lsp/enrich.js +9 -1
- package/dist/graph/lsp/enrich.js.map +1 -1
- package/dist/graph/lsp/registry.d.ts +7 -0
- package/dist/graph/lsp/registry.d.ts.map +1 -1
- package/dist/graph/lsp/registry.js +27 -2
- package/dist/graph/lsp/registry.js.map +1 -1
- package/dist/graph/native.d.ts +2 -0
- package/dist/graph/native.d.ts.map +1 -1
- package/dist/graph/native.js +29 -4
- package/dist/graph/native.js.map +1 -1
- package/dist/graph/queries/gleam.scm +51 -0
- package/dist/graph/resolve.d.ts.map +1 -1
- package/dist/graph/resolve.js +65 -3
- package/dist/graph/resolve.js.map +1 -1
- package/dist/graph/workspace-cli.d.ts +2 -0
- package/dist/graph/workspace-cli.d.ts.map +1 -1
- package/dist/graph/workspace-cli.js +1 -1
- package/dist/graph/workspace-cli.js.map +1 -1
- package/dist/hosts/claude-global.d.ts +14 -0
- package/dist/hosts/claude-global.d.ts.map +1 -1
- package/dist/hosts/claude-global.js +38 -3
- package/dist/hosts/claude-global.js.map +1 -1
- package/dist/init/install-record.d.ts +21 -0
- package/dist/init/install-record.d.ts.map +1 -0
- package/dist/init/install-record.js +144 -0
- package/dist/init/install-record.js.map +1 -0
- package/dist/init/plain-file.d.ts +11 -0
- package/dist/init/plain-file.d.ts.map +1 -0
- package/dist/init/plain-file.js +80 -0
- package/dist/init/plain-file.js.map +1 -0
- package/dist/mcp/brains.d.ts +72 -0
- package/dist/mcp/brains.d.ts.map +1 -0
- package/dist/mcp/brains.js +220 -0
- package/dist/mcp/brains.js.map +1 -0
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +40 -5
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +7 -2
- package/dist/mcp/tools.js.map +1 -1
- package/dist/notes/branches.d.ts +7 -1
- package/dist/notes/branches.d.ts.map +1 -1
- package/dist/notes/branches.js +31 -3
- package/dist/notes/branches.js.map +1 -1
- package/dist/notes/cold-start.d.ts +42 -3
- package/dist/notes/cold-start.d.ts.map +1 -1
- package/dist/notes/cold-start.js +144 -24
- package/dist/notes/cold-start.js.map +1 -1
- package/dist/notes/credit.d.ts +37 -0
- package/dist/notes/credit.d.ts.map +1 -0
- package/dist/notes/credit.js +78 -0
- package/dist/notes/credit.js.map +1 -0
- package/dist/notes/every-repo.d.ts +18 -0
- package/dist/notes/every-repo.d.ts.map +1 -0
- package/dist/notes/every-repo.js +86 -0
- package/dist/notes/every-repo.js.map +1 -0
- package/dist/notes/find-notes.d.ts +17 -0
- package/dist/notes/find-notes.d.ts.map +1 -0
- package/dist/notes/find-notes.js +48 -0
- package/dist/notes/find-notes.js.map +1 -0
- package/dist/notes/flatten.d.ts +31 -0
- package/dist/notes/flatten.d.ts.map +1 -0
- package/dist/notes/flatten.js +73 -0
- package/dist/notes/flatten.js.map +1 -0
- package/dist/notes/git-facts.d.ts +2 -0
- package/dist/notes/git-facts.d.ts.map +1 -1
- package/dist/notes/git-facts.js +6 -0
- package/dist/notes/git-facts.js.map +1 -1
- package/dist/notes/guardrails.d.ts +8 -0
- package/dist/notes/guardrails.d.ts.map +1 -0
- package/dist/notes/guardrails.js +38 -0
- package/dist/notes/guardrails.js.map +1 -0
- package/dist/notes/home.d.ts +24 -6
- package/dist/notes/home.d.ts.map +1 -1
- package/dist/notes/home.js +82 -15
- package/dist/notes/home.js.map +1 -1
- package/dist/notes/learning-fields.d.ts +102 -0
- package/dist/notes/learning-fields.d.ts.map +1 -0
- package/dist/notes/learning-fields.js +214 -0
- package/dist/notes/learning-fields.js.map +1 -0
- package/dist/notes/lesson-index.d.ts +13 -0
- package/dist/notes/lesson-index.d.ts.map +1 -0
- package/dist/notes/lesson-index.js +135 -0
- package/dist/notes/lesson-index.js.map +1 -0
- package/dist/notes/linked-learnings.d.ts +8 -0
- package/dist/notes/linked-learnings.d.ts.map +1 -0
- package/dist/notes/linked-learnings.js +113 -0
- package/dist/notes/linked-learnings.js.map +1 -0
- package/dist/notes/memory-notes.d.ts +71 -0
- package/dist/notes/memory-notes.d.ts.map +1 -0
- package/dist/notes/memory-notes.js +239 -0
- package/dist/notes/memory-notes.js.map +1 -0
- package/dist/notes/note-gate.d.ts +42 -0
- package/dist/notes/note-gate.d.ts.map +1 -0
- package/dist/notes/note-gate.js +181 -0
- package/dist/notes/note-gate.js.map +1 -0
- package/dist/notes/notes.d.ts +29 -85
- package/dist/notes/notes.d.ts.map +1 -1
- package/dist/notes/notes.js +69 -254
- package/dist/notes/notes.js.map +1 -1
- package/dist/notes/pr-reviews.d.ts +35 -7
- package/dist/notes/pr-reviews.d.ts.map +1 -1
- package/dist/notes/pr-reviews.js +156 -46
- package/dist/notes/pr-reviews.js.map +1 -1
- package/dist/notes/replace.d.ts +14 -0
- package/dist/notes/replace.d.ts.map +1 -0
- package/dist/notes/replace.js +38 -0
- package/dist/notes/replace.js.map +1 -0
- package/dist/notes/repo-notes-dir.d.ts +2 -0
- package/dist/notes/repo-notes-dir.d.ts.map +1 -0
- package/dist/notes/repo-notes-dir.js +16 -0
- package/dist/notes/repo-notes-dir.js.map +1 -0
- package/dist/notes/secrets.d.ts +28 -0
- package/dist/notes/secrets.d.ts.map +1 -0
- package/dist/notes/secrets.js +362 -0
- package/dist/notes/secrets.js.map +1 -0
- package/dist/notes/targets.d.ts +37 -0
- package/dist/notes/targets.d.ts.map +1 -0
- package/dist/notes/targets.js +108 -0
- package/dist/notes/targets.js.map +1 -0
- package/dist/notes/team-check.d.ts +22 -0
- package/dist/notes/team-check.d.ts.map +1 -0
- package/dist/notes/team-check.js +130 -0
- package/dist/notes/team-check.js.map +1 -0
- package/dist/notes/trail-home.d.ts +3 -0
- package/dist/notes/trail-home.d.ts.map +1 -0
- package/dist/notes/trail-home.js +12 -0
- package/dist/notes/trail-home.js.map +1 -0
- package/dist/skills/anchors-cli.d.ts +33 -0
- package/dist/skills/anchors-cli.d.ts.map +1 -0
- package/dist/skills/anchors-cli.js +274 -0
- package/dist/skills/anchors-cli.js.map +1 -0
- package/dist/skills/anchors-git.d.ts +29 -0
- package/dist/skills/anchors-git.d.ts.map +1 -0
- package/dist/skills/anchors-git.js +241 -0
- package/dist/skills/anchors-git.js.map +1 -0
- package/dist/skills/anchors-wide.d.ts +25 -0
- package/dist/skills/anchors-wide.d.ts.map +1 -0
- package/dist/skills/anchors-wide.js +481 -0
- package/dist/skills/anchors-wide.js.map +1 -0
- package/dist/skills/anchors.d.ts +32 -0
- package/dist/skills/anchors.d.ts.map +1 -0
- package/dist/skills/anchors.js +485 -0
- package/dist/skills/anchors.js.map +1 -0
- package/dist/skills/answers-prompt.d.ts +13 -0
- package/dist/skills/answers-prompt.d.ts.map +1 -0
- package/dist/skills/answers-prompt.js +83 -0
- package/dist/skills/answers-prompt.js.map +1 -0
- package/dist/skills/check-result.d.ts +26 -0
- package/dist/skills/check-result.d.ts.map +1 -0
- package/dist/skills/check-result.js +46 -0
- package/dist/skills/check-result.js.map +1 -0
- package/dist/skills/codex-sandbox.d.ts +6 -0
- package/dist/skills/codex-sandbox.d.ts.map +1 -0
- package/dist/skills/codex-sandbox.js +55 -0
- package/dist/skills/codex-sandbox.js.map +1 -0
- package/dist/skills/compile-split.d.ts +57 -0
- package/dist/skills/compile-split.d.ts.map +1 -0
- package/dist/skills/compile-split.js +532 -0
- package/dist/skills/compile-split.js.map +1 -0
- package/dist/skills/compile-version.d.ts +37 -0
- package/dist/skills/compile-version.d.ts.map +1 -0
- package/dist/skills/compile-version.js +56 -0
- package/dist/skills/compile-version.js.map +1 -0
- package/dist/skills/compile-waits.d.ts +12 -0
- package/dist/skills/compile-waits.d.ts.map +1 -0
- package/dist/skills/compile-waits.js +52 -0
- package/dist/skills/compile-waits.js.map +1 -0
- package/dist/skills/compile-words.d.ts +82 -0
- package/dist/skills/compile-words.d.ts.map +1 -0
- package/dist/skills/compile-words.js +385 -0
- package/dist/skills/compile-words.js.map +1 -0
- package/dist/skills/compile.d.ts +35 -0
- package/dist/skills/compile.d.ts.map +1 -0
- package/dist/skills/compile.js +488 -0
- package/dist/skills/compile.js.map +1 -0
- package/dist/skills/credit-facts.d.ts +8 -0
- package/dist/skills/credit-facts.d.ts.map +1 -0
- package/dist/skills/credit-facts.js +32 -0
- package/dist/skills/credit-facts.js.map +1 -0
- package/dist/skills/directive-words.d.ts +11 -0
- package/dist/skills/directive-words.d.ts.map +1 -0
- package/dist/skills/directive-words.js +33 -0
- package/dist/skills/directive-words.js.map +1 -0
- package/dist/skills/fidelity.d.ts +42 -0
- package/dist/skills/fidelity.d.ts.map +1 -0
- package/dist/skills/fidelity.js +138 -0
- package/dist/skills/fidelity.js.map +1 -0
- package/dist/skills/forget-notice.d.ts +44 -0
- package/dist/skills/forget-notice.d.ts.map +1 -0
- package/dist/skills/forget-notice.js +131 -0
- package/dist/skills/forget-notice.js.map +1 -0
- package/dist/skills/found-skill.d.ts +35 -0
- package/dist/skills/found-skill.d.ts.map +1 -0
- package/dist/skills/found-skill.js +66 -0
- package/dist/skills/found-skill.js.map +1 -0
- package/dist/skills/front-version.d.ts +12 -0
- package/dist/skills/front-version.d.ts.map +1 -0
- package/dist/skills/front-version.js +87 -0
- package/dist/skills/front-version.js.map +1 -0
- package/dist/skills/host-facts.d.ts +51 -0
- package/dist/skills/host-facts.d.ts.map +1 -0
- package/dist/skills/host-facts.js +134 -0
- package/dist/skills/host-facts.js.map +1 -0
- package/dist/skills/ledger.d.ts +43 -0
- package/dist/skills/ledger.d.ts.map +1 -0
- package/dist/skills/ledger.js +336 -0
- package/dist/skills/ledger.js.map +1 -0
- package/dist/skills/lessons.d.ts +60 -0
- package/dist/skills/lessons.d.ts.map +1 -0
- package/dist/skills/lessons.js +396 -0
- package/dist/skills/lessons.js.map +1 -0
- package/dist/skills/never-save.d.ts +5 -0
- package/dist/skills/never-save.d.ts.map +1 -0
- package/dist/skills/never-save.js +158 -0
- package/dist/skills/never-save.js.map +1 -0
- package/dist/skills/offer-answers.d.ts +20 -0
- package/dist/skills/offer-answers.d.ts.map +1 -0
- package/dist/skills/offer-answers.js +51 -0
- package/dist/skills/offer-answers.js.map +1 -0
- package/dist/skills/own-folder.d.ts +9 -0
- package/dist/skills/own-folder.d.ts.map +1 -0
- package/dist/skills/own-folder.js +36 -0
- package/dist/skills/own-folder.js.map +1 -0
- package/dist/skills/params.d.ts +39 -0
- package/dist/skills/params.d.ts.map +1 -0
- package/dist/skills/params.js +275 -0
- package/dist/skills/params.js.map +1 -0
- package/dist/skills/person.d.ts +34 -0
- package/dist/skills/person.d.ts.map +1 -0
- package/dist/skills/person.js +102 -0
- package/dist/skills/person.js.map +1 -0
- package/dist/skills/probe-clean.d.ts +9 -0
- package/dist/skills/probe-clean.d.ts.map +1 -0
- package/dist/skills/probe-clean.js +48 -0
- package/dist/skills/probe-clean.js.map +1 -0
- package/dist/skills/probes.d.ts +26 -0
- package/dist/skills/probes.d.ts.map +1 -0
- package/dist/skills/probes.js +225 -0
- package/dist/skills/probes.js.map +1 -0
- package/dist/skills/ran-less.d.ts +5 -0
- package/dist/skills/ran-less.d.ts.map +1 -0
- package/dist/skills/ran-less.js +51 -0
- package/dist/skills/ran-less.js.map +1 -0
- package/dist/skills/recall.d.ts +119 -0
- package/dist/skills/recall.d.ts.map +1 -0
- package/dist/skills/recall.js +370 -0
- package/dist/skills/recall.js.map +1 -0
- package/dist/skills/receipts.d.ts +44 -0
- package/dist/skills/receipts.d.ts.map +1 -0
- package/dist/skills/receipts.js +223 -0
- package/dist/skills/receipts.js.map +1 -0
- package/dist/skills/risk-delta.d.ts +32 -0
- package/dist/skills/risk-delta.d.ts.map +1 -0
- package/dist/skills/risk-delta.js +56 -0
- package/dist/skills/risk-delta.js.map +1 -0
- package/dist/skills/risk.d.ts +73 -0
- package/dist/skills/risk.d.ts.map +1 -0
- package/dist/skills/risk.js +396 -0
- package/dist/skills/risk.js.map +1 -0
- package/dist/skills/run-checkout.d.ts +4 -0
- package/dist/skills/run-checkout.d.ts.map +1 -0
- package/dist/skills/run-checkout.js +37 -0
- package/dist/skills/run-checkout.js.map +1 -0
- package/dist/skills/runblock.d.ts +45 -0
- package/dist/skills/runblock.d.ts.map +1 -0
- package/dist/skills/runblock.js +222 -0
- package/dist/skills/runblock.js.map +1 -0
- package/dist/skills/save-parse.d.ts +42 -0
- package/dist/skills/save-parse.d.ts.map +1 -0
- package/dist/skills/save-parse.js +172 -0
- package/dist/skills/save-parse.js.map +1 -0
- package/dist/skills/save-store.d.ts +12 -0
- package/dist/skills/save-store.d.ts.map +1 -0
- package/dist/skills/save-store.js +22 -0
- package/dist/skills/save-store.js.map +1 -0
- package/dist/skills/settings.d.ts +38 -0
- package/dist/skills/settings.d.ts.map +1 -0
- package/dist/skills/settings.js +133 -0
- package/dist/skills/settings.js.map +1 -0
- package/dist/skills/skill-diff.d.ts +40 -0
- package/dist/skills/skill-diff.d.ts.map +1 -0
- package/dist/skills/skill-diff.js +191 -0
- package/dist/skills/skill-diff.js.map +1 -0
- package/dist/skills/skill-file.d.ts +24 -0
- package/dist/skills/skill-file.d.ts.map +1 -0
- package/dist/skills/skill-file.js +97 -0
- package/dist/skills/skill-file.js.map +1 -0
- package/dist/skills/skill-rebuild.d.ts +27 -0
- package/dist/skills/skill-rebuild.d.ts.map +1 -0
- package/dist/skills/skill-rebuild.js +85 -0
- package/dist/skills/skill-rebuild.js.map +1 -0
- package/dist/skills/skillmd.d.ts +17 -0
- package/dist/skills/skillmd.d.ts.map +1 -0
- package/dist/skills/skillmd.js +219 -0
- package/dist/skills/skillmd.js.map +1 -0
- package/dist/skills/skills.d.ts +2 -0
- package/dist/skills/skills.d.ts.map +1 -1
- package/dist/skills/skills.js +1 -1
- package/dist/skills/skills.js.map +1 -1
- package/dist/skills/staleness.d.ts +27 -0
- package/dist/skills/staleness.d.ts.map +1 -0
- package/dist/skills/staleness.js +178 -0
- package/dist/skills/staleness.js.map +1 -0
- package/dist/skills/state.d.ts +36 -0
- package/dist/skills/state.d.ts.map +1 -0
- package/dist/skills/state.js +259 -0
- package/dist/skills/state.js.map +1 -0
- package/dist/skills/store-fs.d.ts +77 -0
- package/dist/skills/store-fs.d.ts.map +1 -0
- package/dist/skills/store-fs.js +194 -0
- package/dist/skills/store-fs.js.map +1 -0
- package/dist/skills/store-held.d.ts +44 -0
- package/dist/skills/store-held.d.ts.map +1 -0
- package/dist/skills/store-held.js +147 -0
- package/dist/skills/store-held.js.map +1 -0
- package/dist/skills/store.d.ts +73 -0
- package/dist/skills/store.d.ts.map +1 -0
- package/dist/skills/store.js +279 -0
- package/dist/skills/store.js.map +1 -0
- package/dist/skills/types.d.ts +422 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +2 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/skills/validate.d.ts +11 -0
- package/dist/skills/validate.d.ts.map +1 -0
- package/dist/skills/validate.js +112 -0
- package/dist/skills/validate.js.map +1 -0
- package/dist/skills/versions-fs.d.ts +45 -0
- package/dist/skills/versions-fs.d.ts.map +1 -0
- package/dist/skills/versions-fs.js +234 -0
- package/dist/skills/versions-fs.js.map +1 -0
- package/dist/skills/versions.d.ts +56 -0
- package/dist/skills/versions.d.ts.map +1 -0
- package/dist/skills/versions.js +351 -0
- package/dist/skills/versions.js.map +1 -0
- package/dist/telemetry/contract.d.ts.map +1 -1
- package/dist/telemetry/contract.js +8 -6
- package/dist/telemetry/contract.js.map +1 -1
- package/dist/telemetry/notice.d.ts.map +1 -1
- package/dist/telemetry/notice.js +3 -1
- package/dist/telemetry/notice.js.map +1 -1
- package/dist/trace/check-reads.d.ts +36 -0
- package/dist/trace/check-reads.d.ts.map +1 -0
- package/dist/trace/check-reads.js +57 -0
- package/dist/trace/check-reads.js.map +1 -0
- package/dist/trace/checks.d.ts +63 -0
- package/dist/trace/checks.d.ts.map +1 -0
- package/dist/trace/checks.js +487 -0
- package/dist/trace/checks.js.map +1 -0
- package/dist/trace/claude.d.ts +124 -0
- package/dist/trace/claude.d.ts.map +1 -0
- package/dist/trace/claude.js +303 -0
- package/dist/trace/claude.js.map +1 -0
- package/dist/trace/codex-exec.d.ts +22 -0
- package/dist/trace/codex-exec.d.ts.map +1 -0
- package/dist/trace/codex-exec.js +129 -0
- package/dist/trace/codex-exec.js.map +1 -0
- package/dist/trace/codex-meta.d.ts +23 -0
- package/dist/trace/codex-meta.d.ts.map +1 -0
- package/dist/trace/codex-meta.js +112 -0
- package/dist/trace/codex-meta.js.map +1 -0
- package/dist/trace/codex.d.ts +33 -0
- package/dist/trace/codex.d.ts.map +1 -0
- package/dist/trace/codex.js +485 -0
- package/dist/trace/codex.js.map +1 -0
- package/dist/trace/cursor.d.ts +16 -0
- package/dist/trace/cursor.d.ts.map +1 -0
- package/dist/trace/cursor.js +133 -0
- package/dist/trace/cursor.js.map +1 -0
- package/dist/trace/dialect.d.ts +43 -0
- package/dist/trace/dialect.d.ts.map +1 -0
- package/dist/trace/dialect.js +95 -0
- package/dist/trace/dialect.js.map +1 -0
- package/dist/trace/epochs.d.ts +10 -0
- package/dist/trace/epochs.d.ts.map +1 -0
- package/dist/trace/epochs.js +16 -0
- package/dist/trace/epochs.js.map +1 -0
- package/dist/trace/failure.d.ts +15 -0
- package/dist/trace/failure.d.ts.map +1 -0
- package/dist/trace/failure.js +69 -0
- package/dist/trace/failure.js.map +1 -0
- package/dist/trace/gate-file.d.ts +71 -0
- package/dist/trace/gate-file.d.ts.map +1 -0
- package/dist/trace/gate-file.js +329 -0
- package/dist/trace/gate-file.js.map +1 -0
- package/dist/trace/guard-fast.d.ts +22 -0
- package/dist/trace/guard-fast.d.ts.map +1 -0
- package/dist/trace/guard-fast.js +213 -0
- package/dist/trace/guard-fast.js.map +1 -0
- package/dist/trace/host.d.ts +40 -0
- package/dist/trace/host.d.ts.map +1 -0
- package/dist/trace/host.js +84 -0
- package/dist/trace/host.js.map +1 -0
- package/dist/trace/housekeeping.d.ts +5 -0
- package/dist/trace/housekeeping.d.ts.map +1 -0
- package/dist/trace/housekeeping.js +93 -0
- package/dist/trace/housekeeping.js.map +1 -0
- package/dist/trace/jobs.d.ts +52 -0
- package/dist/trace/jobs.d.ts.map +1 -0
- package/dist/trace/jobs.js +182 -0
- package/dist/trace/jobs.js.map +1 -0
- package/dist/trace/known-repo.d.ts +3 -0
- package/dist/trace/known-repo.d.ts.map +1 -0
- package/dist/trace/known-repo.js +55 -0
- package/dist/trace/known-repo.js.map +1 -0
- package/dist/trace/pool.d.ts +40 -0
- package/dist/trace/pool.d.ts.map +1 -0
- package/dist/trace/pool.js +154 -0
- package/dist/trace/pool.js.map +1 -0
- package/dist/trace/redact.d.ts +8 -0
- package/dist/trace/redact.d.ts.map +1 -0
- package/dist/trace/redact.js +63 -0
- package/dist/trace/redact.js.map +1 -0
- package/dist/trace/repairs.d.ts +27 -0
- package/dist/trace/repairs.d.ts.map +1 -0
- package/dist/trace/repairs.js +303 -0
- package/dist/trace/repairs.js.map +1 -0
- package/dist/trace/run-calls.d.ts +82 -0
- package/dist/trace/run-calls.d.ts.map +1 -0
- package/dist/trace/run-calls.js +331 -0
- package/dist/trace/run-calls.js.map +1 -0
- package/dist/trace/run-join.d.ts +20 -0
- package/dist/trace/run-join.d.ts.map +1 -0
- package/dist/trace/run-join.js +99 -0
- package/dist/trace/run-join.js.map +1 -0
- package/dist/trace/run-sheets.d.ts +26 -0
- package/dist/trace/run-sheets.d.ts.map +1 -0
- package/dist/trace/run-sheets.js +145 -0
- package/dist/trace/run-sheets.js.map +1 -0
- package/dist/trace/run-turns.d.ts +24 -0
- package/dist/trace/run-turns.d.ts.map +1 -0
- package/dist/trace/run-turns.js +67 -0
- package/dist/trace/run-turns.js.map +1 -0
- package/dist/trace/run-verdict.d.ts +24 -0
- package/dist/trace/run-verdict.d.ts.map +1 -0
- package/dist/trace/run-verdict.js +176 -0
- package/dist/trace/run-verdict.js.map +1 -0
- package/dist/trace/runs.d.ts +54 -0
- package/dist/trace/runs.d.ts.map +1 -0
- package/dist/trace/runs.js +501 -0
- package/dist/trace/runs.js.map +1 -0
- package/dist/trace/seen-cache.d.ts +9 -0
- package/dist/trace/seen-cache.d.ts.map +1 -0
- package/dist/trace/seen-cache.js +46 -0
- package/dist/trace/seen-cache.js.map +1 -0
- package/dist/trace/shell-scan.d.ts +52 -0
- package/dist/trace/shell-scan.d.ts.map +1 -0
- package/dist/trace/shell-scan.js +318 -0
- package/dist/trace/shell-scan.js.map +1 -0
- package/dist/trace/shell-words.d.ts +91 -0
- package/dist/trace/shell-words.d.ts.map +1 -0
- package/dist/trace/shell-words.js +558 -0
- package/dist/trace/shell-words.js.map +1 -0
- package/dist/trace/shell.d.ts +91 -0
- package/dist/trace/shell.d.ts.map +1 -0
- package/dist/trace/shell.js +435 -0
- package/dist/trace/shell.js.map +1 -0
- package/dist/trace/skill-session.d.ts +64 -0
- package/dist/trace/skill-session.d.ts.map +1 -0
- package/dist/trace/skill-session.js +232 -0
- package/dist/trace/skill-session.js.map +1 -0
- package/dist/trace/state.d.ts +27 -0
- package/dist/trace/state.d.ts.map +1 -0
- package/dist/trace/state.js +98 -0
- package/dist/trace/state.js.map +1 -0
- package/dist/trace/tamper-code.d.ts +9 -0
- package/dist/trace/tamper-code.d.ts.map +1 -0
- package/dist/trace/tamper-code.js +174 -0
- package/dist/trace/tamper-code.js.map +1 -0
- package/dist/trace/tamper-git.d.ts +12 -0
- package/dist/trace/tamper-git.d.ts.map +1 -0
- package/dist/trace/tamper-git.js +77 -0
- package/dist/trace/tamper-git.js.map +1 -0
- package/dist/trace/tamper.d.ts +12 -0
- package/dist/trace/tamper.d.ts.map +1 -0
- package/dist/trace/tamper.js +405 -0
- package/dist/trace/tamper.js.map +1 -0
- package/dist/trace/typed.d.ts +30 -0
- package/dist/trace/typed.d.ts.map +1 -0
- package/dist/trace/typed.js +132 -0
- package/dist/trace/typed.js.map +1 -0
- package/dist/trace/types.d.ts +477 -0
- package/dist/trace/types.d.ts.map +1 -0
- package/dist/trace/types.js +12 -0
- package/dist/trace/types.js.map +1 -0
- package/dist/trace/wall-state.d.ts +86 -0
- package/dist/trace/wall-state.d.ts.map +1 -0
- package/dist/trace/wall-state.js +279 -0
- package/dist/trace/wall-state.js.map +1 -0
- package/dist/trace/walls-glob.d.ts +11 -0
- package/dist/trace/walls-glob.d.ts.map +1 -0
- package/dist/trace/walls-glob.js +264 -0
- package/dist/trace/walls-glob.js.map +1 -0
- package/dist/trace/walls-quoted.d.ts +25 -0
- package/dist/trace/walls-quoted.d.ts.map +1 -0
- package/dist/trace/walls-quoted.js +81 -0
- package/dist/trace/walls-quoted.js.map +1 -0
- package/dist/trace/walls.d.ts +40 -0
- package/dist/trace/walls.d.ts.map +1 -0
- package/dist/trace/walls.js +318 -0
- package/dist/trace/walls.js.map +1 -0
- package/dist/upkeep.d.ts +1 -1
- package/dist/upkeep.d.ts.map +1 -1
- package/dist/upkeep.js +4 -1
- package/dist/upkeep.js.map +1 -1
- package/dist/util/actions-folder.d.ts +2 -0
- package/dist/util/actions-folder.d.ts.map +1 -0
- package/dist/util/actions-folder.js +9 -0
- package/dist/util/actions-folder.js.map +1 -0
- package/dist/util/front-matter.d.ts +31 -4
- package/dist/util/front-matter.d.ts.map +1 -1
- package/dist/util/front-matter.js +95 -3
- package/dist/util/front-matter.js.map +1 -1
- package/dist/util/private-file.d.ts +14 -0
- package/dist/util/private-file.d.ts.map +1 -0
- package/dist/util/private-file.js +82 -0
- package/dist/util/private-file.js.map +1 -0
- package/dist/util/private-fs.d.ts +25 -0
- package/dist/util/private-fs.d.ts.map +1 -0
- package/dist/util/private-fs.js +253 -0
- package/dist/util/private-fs.js.map +1 -0
- package/dist/util/state.d.ts.map +1 -1
- package/dist/util/state.js +3 -0
- package/dist/util/state.js.map +1 -1
- package/dist/vendor/tree-sitter-swift/LICENSE +21 -0
- package/dist/vendor/tree-sitter-swift/node-types.json +30694 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/darwin-arm64/tree-sitter-swift.node +0 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/darwin-x64/tree-sitter-swift.node +0 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/linux-arm64/tree-sitter-swift.node +0 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/linux-x64/tree-sitter-swift.node +0 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/win32-arm64/tree-sitter-swift.node +0 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/win32-x64/tree-sitter-swift.node +0 -0
- package/dist/viewer/app.js +2 -2
- package/package.json +10 -7
- package/scripts/run-tests.mjs +14 -2
- package/scripts/stamp-telemetry-key.mjs +8 -5
- package/scripts/vendor-grammars.mjs +35 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How init opens a file it did not write (b5 review): transcripts, how-to
|
|
3
|
+
* files, and the pointers in its own record, which an agent can edit.
|
|
4
|
+
*
|
|
5
|
+
* - `openPlain` never waits on a FIFO or a device (O_NONBLOCK, then a
|
|
6
|
+
* plain-file check on the open descriptor, so a file swapped after a stat
|
|
7
|
+
* is still caught) and, unless asked, never follows a link.
|
|
8
|
+
* - `claudeTranscript` says whether a path is a transcript where Claude Code
|
|
9
|
+
* keeps them, `~/.claude/projects/<folder>/<name>.jsonl` (HOME from env, as
|
|
10
|
+
* discovery reads it), reached with no link on the way: a file the agent
|
|
11
|
+
* wrote anywhere else, or linked into that folder, is not one.
|
|
12
|
+
*/
|
|
13
|
+
import { closeSync, constants, fstatSync, lstatSync, openSync, readSync, realpathSync } from 'node:fs';
|
|
14
|
+
import { homedir } from 'node:os';
|
|
15
|
+
import { basename, dirname, join } from 'node:path';
|
|
16
|
+
/** A read-only descriptor of a plain file, or a throw. `follow`: a link to a plain file is allowed. */
|
|
17
|
+
export function openPlain(path, opts = {}) {
|
|
18
|
+
const flags = constants.O_RDONLY | (constants.O_NONBLOCK ?? 0) | (opts.follow ? 0 : constants.O_NOFOLLOW ?? 0);
|
|
19
|
+
const fd = openSync(path, flags);
|
|
20
|
+
try {
|
|
21
|
+
if (!fstatSync(fd).isFile())
|
|
22
|
+
throw new Error('not a plain file');
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
closeSync(fd);
|
|
26
|
+
throw e;
|
|
27
|
+
}
|
|
28
|
+
return fd;
|
|
29
|
+
}
|
|
30
|
+
/** A plain file's text (no link, no FIFO) of at most `max` bytes; null otherwise. Never throws. */
|
|
31
|
+
export function readPlain(path, max) {
|
|
32
|
+
let fd = -1;
|
|
33
|
+
try {
|
|
34
|
+
fd = openPlain(path);
|
|
35
|
+
const size = fstatSync(fd).size;
|
|
36
|
+
if (size > max)
|
|
37
|
+
return null;
|
|
38
|
+
const buf = Buffer.alloc(size);
|
|
39
|
+
const n = readSync(fd, buf, 0, size, 0);
|
|
40
|
+
return buf.toString('utf8', 0, n);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
if (fd >= 0)
|
|
47
|
+
try {
|
|
48
|
+
closeSync(fd);
|
|
49
|
+
}
|
|
50
|
+
catch { /* closed */ }
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** Claude Code's projects folder for `env`, real path; null when there is none. */
|
|
54
|
+
export function claudeProjectsDir(env = process.env) {
|
|
55
|
+
try {
|
|
56
|
+
return realpathSync(join(env.HOME || homedir(), '.claude', 'projects'));
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** `path` is `<projects>/<folder>/<name>.jsonl`, a plain file, with no link in the folder or the file itself. */
|
|
63
|
+
export function claudeTranscript(path, env = process.env) {
|
|
64
|
+
try {
|
|
65
|
+
if (typeof path !== 'string' || !path.endsWith('.jsonl'))
|
|
66
|
+
return false;
|
|
67
|
+
const root = claudeProjectsDir(env);
|
|
68
|
+
if (!root)
|
|
69
|
+
return false;
|
|
70
|
+
// Neither the file nor its folder is a link, and the folder is one of the projects folder's own.
|
|
71
|
+
if (!lstatSync(path).isFile() || !lstatSync(dirname(path)).isDirectory())
|
|
72
|
+
return false;
|
|
73
|
+
const folder = realpathSync(dirname(path));
|
|
74
|
+
return dirname(folder) === root && lstatSync(join(root, basename(folder))).isDirectory();
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=plain-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plain-file.js","sourceRoot":"","sources":["../../src/init/plain-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The workspace's brains, served by the local trail MCP server.
|
|
3
|
+
*
|
|
4
|
+
* Once this machine is connected to a Trail workspace (`trail init --connect`,
|
|
5
|
+
* or `trail login`), the one `trail` MCP entry Claude Code already has also
|
|
6
|
+
* answers the workspace connector's brain tools: `list_brains`,
|
|
7
|
+
* `get_context`, `search_rules` and `get_rules`. Each call is passed to the
|
|
8
|
+
* workspace connector (`<trail>/api/v1/mcp`, MCP over streamable HTTP) with
|
|
9
|
+
* the stored token, and its answer comes back as is: every result names the
|
|
10
|
+
* brain and the rule it came from.
|
|
11
|
+
*
|
|
12
|
+
* The repo tools never wait on this. Not connected, the brain tools aren't
|
|
13
|
+
* listed; connected but offline, they're listed and answer with a soft error,
|
|
14
|
+
* while the repo tools keep working.
|
|
15
|
+
*/
|
|
16
|
+
import type { ToolDef } from './tools.js';
|
|
17
|
+
import { type Cloud } from '../cloud/workspace.js';
|
|
18
|
+
/** The workspace connector's brain tools, the only ones passed through. */
|
|
19
|
+
export declare const BRAIN_TOOLS: readonly ["list_brains", "get_context", "search_rules", "get_rules"];
|
|
20
|
+
export declare function isBrainTool(name: string): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* What's listed when the connector can't be asked for its own list (offline,
|
|
23
|
+
* slow): the same four tools, as the workspace connector describes them.
|
|
24
|
+
*/
|
|
25
|
+
export declare const BRAIN_TOOL_DEFS: ToolDef[];
|
|
26
|
+
/** The workspace connector for a connection: TRAIL_MCP_URL, else `<trail>/api/v1/mcp`. */
|
|
27
|
+
export declare function connectorUrl(cloud: Cloud, env?: NodeJS.ProcessEnv): string;
|
|
28
|
+
export interface CallResult {
|
|
29
|
+
content: Array<{
|
|
30
|
+
type: string;
|
|
31
|
+
text?: string;
|
|
32
|
+
[k: string]: unknown;
|
|
33
|
+
}>;
|
|
34
|
+
isError?: boolean;
|
|
35
|
+
structuredContent?: unknown;
|
|
36
|
+
}
|
|
37
|
+
type Fetch = typeof fetch;
|
|
38
|
+
/**
|
|
39
|
+
* A small MCP client for the workspace connector. One per server process:
|
|
40
|
+
* it initializes once, keeps a session id if the connector hands one out
|
|
41
|
+
* (it runs stateless today, so it usually doesn't), and reads the connection
|
|
42
|
+
* from `~/.trail/cloud.json` on every call, so `trail logout` or a new
|
|
43
|
+
* `--connect` takes effect without restarting the agent.
|
|
44
|
+
*/
|
|
45
|
+
export declare class BrainProxy {
|
|
46
|
+
private readonly opts;
|
|
47
|
+
private nextId;
|
|
48
|
+
private session;
|
|
49
|
+
private listing;
|
|
50
|
+
constructor(opts?: {
|
|
51
|
+
env?: NodeJS.ProcessEnv;
|
|
52
|
+
fetchImpl?: Fetch;
|
|
53
|
+
timeoutMs?: number;
|
|
54
|
+
version?: string;
|
|
55
|
+
});
|
|
56
|
+
private cloud;
|
|
57
|
+
/** Whether this machine is connected to a workspace, so the brain tools are offered. */
|
|
58
|
+
connected(): boolean;
|
|
59
|
+
private rpc;
|
|
60
|
+
/** Initialize once per token: a new connection starts a new session. */
|
|
61
|
+
private ready;
|
|
62
|
+
/**
|
|
63
|
+
* The brain tools to list: the connector's own definitions of the four
|
|
64
|
+
* when it answers in time, else the built-in ones. Empty when not connected.
|
|
65
|
+
* Asked once per process; the answer is reused.
|
|
66
|
+
*/
|
|
67
|
+
listTools(): Promise<ToolDef[]>;
|
|
68
|
+
/** Pass one brain tool call to the workspace. Never throws: a failure is a soft error the agent can read. */
|
|
69
|
+
callTool(name: string, args: Record<string, unknown>): Promise<CallResult>;
|
|
70
|
+
}
|
|
71
|
+
export {};
|
|
72
|
+
//# sourceMappingURL=brains.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brains.d.ts","sourceRoot":"","sources":["../../src/mcp/brains.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAa,KAAK,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE9D,2EAA2E;AAC3E,eAAO,MAAM,WAAW,sEAAuE,CAAC;AAEhG,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,OAAO,EAyCpC,CAAC;AAEF,0FAA0F;AAC1F,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAEvF;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;IACtE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,KAAK,KAAK,GAAG,OAAO,KAAK,CAAC;AAyB1B;;;;;;GAMG;AACH,qBAAa,UAAU;IAMnB,OAAO,CAAC,QAAQ,CAAC,IAAI;IALvB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAAiE;IAChF,OAAO,CAAC,OAAO,CAAmC;gBAG/B,IAAI,GAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;QAAC,SAAS,CAAC,EAAE,KAAK,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO;IAGlH,OAAO,CAAC,KAAK;IAIb,wFAAwF;IACxF,SAAS,IAAI,OAAO;YAIN,GAAG;IA6BjB,wEAAwE;YAC1D,KAAK;IA6BnB;;;;OAIG;IACH,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAkB/B,6GAA6G;IACvG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;CAmBjF"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { readCloud } from '../cloud/workspace.js';
|
|
2
|
+
/** The workspace connector's brain tools, the only ones passed through. */
|
|
3
|
+
export const BRAIN_TOOLS = ['list_brains', 'get_context', 'search_rules', 'get_rules'];
|
|
4
|
+
export function isBrainTool(name) {
|
|
5
|
+
return BRAIN_TOOLS.includes(name);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* What's listed when the connector can't be asked for its own list (offline,
|
|
9
|
+
* slow): the same four tools, as the workspace connector describes them.
|
|
10
|
+
*/
|
|
11
|
+
export const BRAIN_TOOL_DEFS = [
|
|
12
|
+
{
|
|
13
|
+
name: 'list_brains',
|
|
14
|
+
description: "Your Trail workspace's brains (team knowledge: brand, product, conventions, decisions), with how many rules each has. Use it to pick a brain for get_rules.",
|
|
15
|
+
inputSchema: { type: 'object', properties: {} },
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'get_context',
|
|
19
|
+
description: "The rules from your Trail workspace's brains that apply to a task, each naming its brain and rule. Ask before writing anything that has to follow the team's brand, product or conventions.",
|
|
20
|
+
inputSchema: {
|
|
21
|
+
type: 'object',
|
|
22
|
+
properties: {
|
|
23
|
+
query: { type: 'string', description: 'the task or question, in a short phrase' },
|
|
24
|
+
brain: { type: 'string', description: "optional: one brain's name, slug or id; leave out to search every brain" },
|
|
25
|
+
},
|
|
26
|
+
required: ['query'],
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: 'search_rules',
|
|
31
|
+
description: "Search the rules in your Trail workspace's brains by meaning. Each result names its brain and rule.",
|
|
32
|
+
inputSchema: {
|
|
33
|
+
type: 'object',
|
|
34
|
+
properties: {
|
|
35
|
+
query: { type: 'string', description: 'what to look for' },
|
|
36
|
+
brain: { type: 'string', description: "optional: one brain's name, slug or id; leave out to search every brain" },
|
|
37
|
+
},
|
|
38
|
+
required: ['query'],
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'get_rules',
|
|
43
|
+
description: "Every rule in one of your Trail workspace's brains.",
|
|
44
|
+
inputSchema: {
|
|
45
|
+
type: 'object',
|
|
46
|
+
properties: { brain: { type: 'string', description: "the brain's name, slug or id, as list_brains shows it" } },
|
|
47
|
+
required: ['brain'],
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
/** The workspace connector for a connection: TRAIL_MCP_URL, else `<trail>/api/v1/mcp`. */
|
|
52
|
+
export function connectorUrl(cloud, env = process.env) {
|
|
53
|
+
return (env.TRAIL_MCP_URL || `${cloud.url.replace(/\/+$/, '')}/api/v1/mcp`).replace(/\/+$/, '');
|
|
54
|
+
}
|
|
55
|
+
/** The JSON-RPC message answering `id`, from a JSON body or an SSE stream. */
|
|
56
|
+
function pickReply(contentType, text, id) {
|
|
57
|
+
if (contentType.includes('text/event-stream')) {
|
|
58
|
+
for (const line of text.split(/\r?\n/)) {
|
|
59
|
+
if (!line.startsWith('data:'))
|
|
60
|
+
continue;
|
|
61
|
+
try {
|
|
62
|
+
const msg = JSON.parse(line.slice(5).trim());
|
|
63
|
+
if (msg && msg.id === id)
|
|
64
|
+
return msg;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
/* a partial event */
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const msg = JSON.parse(text);
|
|
74
|
+
if (Array.isArray(msg))
|
|
75
|
+
return msg.find((m) => m?.id === id) ?? null;
|
|
76
|
+
return msg;
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* A small MCP client for the workspace connector. One per server process:
|
|
84
|
+
* it initializes once, keeps a session id if the connector hands one out
|
|
85
|
+
* (it runs stateless today, so it usually doesn't), and reads the connection
|
|
86
|
+
* from `~/.trail/cloud.json` on every call, so `trail logout` or a new
|
|
87
|
+
* `--connect` takes effect without restarting the agent.
|
|
88
|
+
*/
|
|
89
|
+
export class BrainProxy {
|
|
90
|
+
opts;
|
|
91
|
+
nextId = 1;
|
|
92
|
+
session = null;
|
|
93
|
+
listing = null;
|
|
94
|
+
constructor(opts = {}) {
|
|
95
|
+
this.opts = opts;
|
|
96
|
+
}
|
|
97
|
+
cloud() {
|
|
98
|
+
return readCloud(this.opts.env);
|
|
99
|
+
}
|
|
100
|
+
/** Whether this machine is connected to a workspace, so the brain tools are offered. */
|
|
101
|
+
connected() {
|
|
102
|
+
return this.cloud() !== null;
|
|
103
|
+
}
|
|
104
|
+
async rpc(cloud, method, params, notify = false) {
|
|
105
|
+
const f = this.opts.fetchImpl ?? fetch;
|
|
106
|
+
const id = this.nextId++;
|
|
107
|
+
const headers = {
|
|
108
|
+
'content-type': 'application/json',
|
|
109
|
+
accept: 'application/json, text/event-stream',
|
|
110
|
+
authorization: `Bearer ${cloud.token}`,
|
|
111
|
+
};
|
|
112
|
+
if (this.session?.id)
|
|
113
|
+
headers['mcp-session-id'] = this.session.id;
|
|
114
|
+
if (this.session)
|
|
115
|
+
headers['mcp-protocol-version'] = this.session.protocol;
|
|
116
|
+
const body = notify ? { jsonrpc: '2.0', method, params } : { jsonrpc: '2.0', id, method, params };
|
|
117
|
+
const res = await f(connectorUrl(cloud, this.opts.env), {
|
|
118
|
+
method: 'POST',
|
|
119
|
+
headers,
|
|
120
|
+
body: JSON.stringify(body),
|
|
121
|
+
signal: AbortSignal.timeout(this.opts.timeoutMs ?? 15_000),
|
|
122
|
+
});
|
|
123
|
+
const text = await res.text();
|
|
124
|
+
if (notify)
|
|
125
|
+
return null;
|
|
126
|
+
if (res.status === 401 || res.status === 403)
|
|
127
|
+
throw new Error('your Trail workspace token was not accepted; run `trail init --connect <code>` with a new code from team.trailhq.com');
|
|
128
|
+
if (!res.ok)
|
|
129
|
+
throw new Error(`the Trail workspace answered ${res.status}`);
|
|
130
|
+
const sid = res.headers.get('mcp-session-id');
|
|
131
|
+
if (sid && this.session)
|
|
132
|
+
this.session.id = sid;
|
|
133
|
+
const msg = pickReply(res.headers.get('content-type') ?? '', text, id);
|
|
134
|
+
if (!msg)
|
|
135
|
+
throw new Error('the Trail workspace sent an answer trail could not read');
|
|
136
|
+
if (msg.error)
|
|
137
|
+
throw new Error(msg.error.message ?? 'the Trail workspace returned an error');
|
|
138
|
+
return msg.result;
|
|
139
|
+
}
|
|
140
|
+
/** Initialize once per token: a new connection starts a new session. */
|
|
141
|
+
async ready(cloud) {
|
|
142
|
+
if (this.session?.token === cloud.token)
|
|
143
|
+
return;
|
|
144
|
+
this.session = null;
|
|
145
|
+
const f = this.opts.fetchImpl ?? fetch;
|
|
146
|
+
const id = this.nextId++;
|
|
147
|
+
const res = await f(connectorUrl(cloud, this.opts.env), {
|
|
148
|
+
method: 'POST',
|
|
149
|
+
headers: {
|
|
150
|
+
'content-type': 'application/json',
|
|
151
|
+
accept: 'application/json, text/event-stream',
|
|
152
|
+
authorization: `Bearer ${cloud.token}`,
|
|
153
|
+
},
|
|
154
|
+
body: JSON.stringify({
|
|
155
|
+
jsonrpc: '2.0',
|
|
156
|
+
id,
|
|
157
|
+
method: 'initialize',
|
|
158
|
+
params: { protocolVersion: '2025-06-18', capabilities: {}, clientInfo: { name: 'trail', version: this.opts.version ?? '0' } },
|
|
159
|
+
}),
|
|
160
|
+
signal: AbortSignal.timeout(this.opts.timeoutMs ?? 15_000),
|
|
161
|
+
});
|
|
162
|
+
const text = await res.text();
|
|
163
|
+
if (res.status === 401 || res.status === 403)
|
|
164
|
+
throw new Error('your Trail workspace token was not accepted; run `trail init --connect <code>` with a new code from team.trailhq.com');
|
|
165
|
+
if (!res.ok)
|
|
166
|
+
throw new Error(`the Trail workspace answered ${res.status}`);
|
|
167
|
+
const msg = pickReply(res.headers.get('content-type') ?? '', text, id);
|
|
168
|
+
const protocol = typeof msg?.result?.protocolVersion === 'string' ? msg.result.protocolVersion : '2025-06-18';
|
|
169
|
+
this.session = { token: cloud.token, id: res.headers.get('mcp-session-id') ?? undefined, protocol };
|
|
170
|
+
await this.rpc(cloud, 'notifications/initialized', undefined, true).catch(() => { });
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* The brain tools to list: the connector's own definitions of the four
|
|
174
|
+
* when it answers in time, else the built-in ones. Empty when not connected.
|
|
175
|
+
* Asked once per process; the answer is reused.
|
|
176
|
+
*/
|
|
177
|
+
listTools() {
|
|
178
|
+
const cloud = this.cloud();
|
|
179
|
+
if (!cloud)
|
|
180
|
+
return Promise.resolve([]);
|
|
181
|
+
this.listing ??= (async () => {
|
|
182
|
+
try {
|
|
183
|
+
await this.ready(cloud);
|
|
184
|
+
const result = await this.rpc(cloud, 'tools/list', {});
|
|
185
|
+
const remote = (Array.isArray(result?.tools) ? result.tools : []);
|
|
186
|
+
const brains = remote.filter((t) => t && isBrainTool(t.name));
|
|
187
|
+
if (brains.length === 0)
|
|
188
|
+
return BRAIN_TOOL_DEFS;
|
|
189
|
+
return brains.map((t) => ({ name: t.name, description: t.description ?? '', inputSchema: t.inputSchema ?? { type: 'object' } }));
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
return BRAIN_TOOL_DEFS;
|
|
193
|
+
}
|
|
194
|
+
})();
|
|
195
|
+
return this.listing;
|
|
196
|
+
}
|
|
197
|
+
/** Pass one brain tool call to the workspace. Never throws: a failure is a soft error the agent can read. */
|
|
198
|
+
async callTool(name, args) {
|
|
199
|
+
const cloud = this.cloud();
|
|
200
|
+
if (!cloud) {
|
|
201
|
+
return { content: [{ type: 'text', text: 'not connected to a Trail workspace · run `trail init --connect <code>` with the code from team.trailhq.com' }], isError: true };
|
|
202
|
+
}
|
|
203
|
+
try {
|
|
204
|
+
await this.ready(cloud);
|
|
205
|
+
const result = await this.rpc(cloud, 'tools/call', { name, arguments: args });
|
|
206
|
+
const content = Array.isArray(result?.content) ? result.content : [{ type: 'text', text: JSON.stringify(result ?? null) }];
|
|
207
|
+
const out = { content, isError: result?.isError === true };
|
|
208
|
+
if (result?.structuredContent !== undefined)
|
|
209
|
+
out.structuredContent = result.structuredContent;
|
|
210
|
+
return out;
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
// A dropped session is worth one fresh start.
|
|
214
|
+
this.session = null;
|
|
215
|
+
const why = err instanceof Error && err.name !== 'TimeoutError' && err.name !== 'AbortError' && !/fetch failed/.test(err.message) ? err.message : "couldn't reach your Trail workspace";
|
|
216
|
+
return { content: [{ type: 'text', text: `${why} · the repo tools still work` }], isError: true };
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=brains.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brains.js","sourceRoot":"","sources":["../../src/mcp/brains.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/server.d.ts
CHANGED
|
@@ -3,5 +3,7 @@
|
|
|
3
3
|
* resolves package.json relative to the calling module, and from `dist/mcp/` that
|
|
4
4
|
* lookup misses. The caller already knows it.
|
|
5
5
|
*/
|
|
6
|
-
export declare function startMcpServer(root: string, dirOverride?: string, version?: string
|
|
6
|
+
export declare function startMcpServer(root: string, dirOverride?: string, version?: string, opts?: {
|
|
7
|
+
brainsOnly?: boolean;
|
|
8
|
+
}): void;
|
|
7
9
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/mcp/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AA8EA;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,SAAM,EAAE,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,IAAI,CAgH3H"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -12,6 +12,7 @@ import { runningVersion } from '../upkeep.js';
|
|
|
12
12
|
import { maybeFlushInBackground, track } from '../telemetry/index.js';
|
|
13
13
|
import { brand, inBrand } from '../brand.js';
|
|
14
14
|
import { canonicalToolName } from './tool-names.js';
|
|
15
|
+
import { BRAIN_TOOL_DEFS, BrainProxy, isBrainTool } from './brains.js';
|
|
15
16
|
/**
|
|
16
17
|
* MCP tool name → the command enum the telemetry contract knows. A tool absent
|
|
17
18
|
* here is simply not counted: `track` would drop an unlisted command anyway, and
|
|
@@ -26,6 +27,12 @@ const TOOL_COMMAND = {
|
|
|
26
27
|
graft_repo_map: 'map',
|
|
27
28
|
graft_check_freshness: 'check',
|
|
28
29
|
};
|
|
30
|
+
/** How long `tools/list` waits on the workspace for its brain tools before listing the built-in ones. */
|
|
31
|
+
const BRAIN_LIST_WAIT_MS = 4000;
|
|
32
|
+
/** Said in `instructions` when this machine is connected to a Trail workspace. */
|
|
33
|
+
const BRAINS_LINE = "Connected to a Trail workspace: list_brains, get_context, search_rules and get_rules answer from the team's brains (brand, product, conventions, decisions); each result names its brain and rule. Use them for how the team does things, the tools above for the code.";
|
|
34
|
+
/** What the brains-only server says when this machine isn't connected (any more). */
|
|
35
|
+
const NOT_CONNECTED_LINE = 'Not connected to a Trail workspace: run `trail init --connect <code>` with the code from team.trailhq.com to use its brains here.';
|
|
29
36
|
function send(msg) {
|
|
30
37
|
process.stdout.write(`${JSON.stringify(msg)}\n`);
|
|
31
38
|
}
|
|
@@ -66,14 +73,18 @@ function advertised(root, dirOverride) {
|
|
|
66
73
|
* resolves package.json relative to the calling module, and from `dist/mcp/` that
|
|
67
74
|
* lookup misses. The caller already knows it.
|
|
68
75
|
*/
|
|
69
|
-
export function startMcpServer(root, dirOverride, version = '0') {
|
|
76
|
+
export function startMcpServer(root, dirOverride, version = '0', opts = {}) {
|
|
77
|
+
// `trail mcp --brains`: the one entry Claude Code gets once connected to a
|
|
78
|
+
// workspace. It serves the workspace's brain tools and nothing of the repo's,
|
|
79
|
+
// so it does none of the repo upkeep either: it starts in every project.
|
|
80
|
+
const brainsOnly = opts.brainsOnly === true;
|
|
70
81
|
// The self-maintenance pass, run once at boot. This is the ONLY channel that
|
|
71
82
|
// reaches hosts with no hook support (Cursor, and any plain MCP client): it
|
|
72
83
|
// refreshes rule files an older `graft init` wrote, and kicks off the cached
|
|
73
84
|
// registry check. Both are fail-soft, and the resulting lines ride along in
|
|
74
85
|
// `instructions` below — stdout is protocol-only, so there is nowhere else to
|
|
75
86
|
// put them. Never blocks: the registry fetch happens in a detached child.
|
|
76
|
-
const upkeep = runUpkeep(root, runningVersion()).lines;
|
|
87
|
+
const upkeep = brainsOnly ? [] : runUpkeep(root, runningVersion()).lines;
|
|
77
88
|
for (const line of upkeep)
|
|
78
89
|
console.error(line);
|
|
79
90
|
// Same deal for the telemetry queue: flushed from a detached child at boot, so
|
|
@@ -83,7 +94,13 @@ export function startMcpServer(root, dirOverride, version = '0') {
|
|
|
83
94
|
// log nobody reads, so printing it here would mark the disclosure as shown
|
|
84
95
|
// without anyone having seen it. It stays pending for the next CLI command,
|
|
85
96
|
// and `graft init`'s picker is the channel that reached this user already.
|
|
86
|
-
|
|
97
|
+
if (!brainsOnly)
|
|
98
|
+
maybeFlushInBackground();
|
|
99
|
+
// The workspace's brains, when this machine is connected to one: asked for
|
|
100
|
+
// their list now, so it's in hand by the time the client lists tools.
|
|
101
|
+
const brains = new BrainProxy({ version });
|
|
102
|
+
if (brains.connected())
|
|
103
|
+
void brains.listTools();
|
|
87
104
|
const rl = createInterface({ input: process.stdin, crlfDelay: Infinity });
|
|
88
105
|
rl.on('line', (line) => {
|
|
89
106
|
const text = line.trim();
|
|
@@ -106,7 +123,9 @@ export function startMcpServer(root, dirOverride, version = '0') {
|
|
|
106
123
|
capabilities: { tools: {} },
|
|
107
124
|
serverInfo: { name: brand(), version },
|
|
108
125
|
// The one channel that survives tool deferral — see ./instructions.ts.
|
|
109
|
-
instructions: upkeep.length ?
|
|
126
|
+
instructions: [upkeep.length ? upkeep.join('\n') : '', brainsOnly ? '' : mcpInstructions(), brains.connected() ? BRAINS_LINE : brainsOnly ? NOT_CONNECTED_LINE : '']
|
|
127
|
+
.filter(Boolean)
|
|
128
|
+
.join('\n\n'),
|
|
110
129
|
});
|
|
111
130
|
return;
|
|
112
131
|
case 'notifications/initialized':
|
|
@@ -120,7 +139,14 @@ export function startMcpServer(root, dirOverride, version = '0') {
|
|
|
120
139
|
if (isNotification)
|
|
121
140
|
return;
|
|
122
141
|
// Under trail, the same tools as `trail_*`, described in trail's words.
|
|
123
|
-
|
|
142
|
+
const local = (brainsOnly ? [] : advertised(root, dirOverride)).map((t) => ({ name: inBrand(t.name), description: inBrand(t.description), inputSchema: t.inputSchema }));
|
|
143
|
+
if (!brains.connected()) {
|
|
144
|
+
reply(id, { tools: local });
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
// Connected: the workspace's brain tools too. A slow workspace never holds the repo tools up for long.
|
|
148
|
+
const capped = new Promise((r) => setTimeout(() => r(BRAIN_TOOL_DEFS), BRAIN_LIST_WAIT_MS).unref());
|
|
149
|
+
Promise.race([brains.listTools(), capped]).then((remote) => reply(id, { tools: [...local, ...remote] }), () => reply(id, { tools: local }));
|
|
124
150
|
return;
|
|
125
151
|
}
|
|
126
152
|
case 'tools/call': {
|
|
@@ -128,6 +154,15 @@ export function startMcpServer(root, dirOverride, version = '0') {
|
|
|
128
154
|
return;
|
|
129
155
|
const name = String(params?.name ?? '');
|
|
130
156
|
const args = (params?.arguments ?? {});
|
|
157
|
+
if (isBrainTool(name)) {
|
|
158
|
+
// A workspace brain: passed to the workspace as is. Never throws.
|
|
159
|
+
brains.callTool(name, args).then((r) => reply(id, r));
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
if (brainsOnly) {
|
|
163
|
+
reply(id, { content: [{ type: 'text', text: `this server answers the workspace's brain tools only; ${name} isn't one` }], isError: true });
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
131
166
|
// Async because a tool call may rebuild the graph first (see
|
|
132
167
|
// graph/refresh.ts). `callTool` absorbs its own errors, so the only thing
|
|
133
168
|
// that can reject here is a bug — surface it as a JSON-RPC error rather
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGpD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAQD,eAAO,MAAM,KAAK,EAAE,OAAO,EAoF1B,CAAC;AA+EF;;;;;;;;GAQG;AACH,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAE7B,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAuB7C"}
|
package/dist/mcp/tools.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* `callTool` never throws — hosts get soft errors as isError content.
|
|
4
4
|
*/
|
|
5
5
|
import { Graft } from '../engine.js';
|
|
6
|
-
import { formatAsk, skeleton, formatSkeleton } from '../ask/ask.js';
|
|
6
|
+
import { formatAsk, formatAskWithSaved, skeleton, formatSkeleton } from '../ask/ask.js';
|
|
7
7
|
import { formatCheckReport } from '../context/check.js';
|
|
8
8
|
import { formatGraphCheckReport } from '../graph/check.js';
|
|
9
9
|
import { loadGraphCached } from '../graph/load.js';
|
|
@@ -18,6 +18,7 @@ import { formatGrepResult, zeroHitNote } from '../search/grep-cli.js';
|
|
|
18
18
|
import { ignoredCode } from '../search/ignored-code.js';
|
|
19
19
|
import { buildRepoMap, formatRepoMap } from '../graph/map.js';
|
|
20
20
|
import { federateAsk, federateCallers, federateCheck, federateGrep, federateMap, readWorkspace, } from '../graph/workspace.js';
|
|
21
|
+
import { recordLookup } from '../cloud/lookup-activity.js';
|
|
21
22
|
import { canonicalToolName } from './tool-names.js';
|
|
22
23
|
import { cmd } from '../brand.js';
|
|
23
24
|
const noGraph = () => `no graph found — run \`${cmd('graft build')}\` first`;
|
|
@@ -220,7 +221,11 @@ async function callSingleTool(root, name, args, dirOverride) {
|
|
|
220
221
|
const engine = new Graft({ contextDir: dirOverride });
|
|
221
222
|
const inArg = typeof args.in === 'string' && args.in ? args.in : undefined;
|
|
222
223
|
const r = engine.ask(root, query, { limit, source: true, full: args.full === true, in: inArg });
|
|
223
|
-
|
|
224
|
+
// Same event the CLI's `ask` reports: the learnings shown and the tokens saved.
|
|
225
|
+
// One render serves both the answer and the saving the event reports.
|
|
226
|
+
const { text, savedTokens } = formatAskWithSaved(r);
|
|
227
|
+
recordLookup(r, root, undefined, savedTokens);
|
|
228
|
+
return { text, isError: false };
|
|
224
229
|
}
|
|
225
230
|
case 'graft_file_api': {
|
|
226
231
|
const file = String(args.file ?? '');
|