@mirnoorata/codexa 0.2.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/LICENSE +21 -0
- package/README.md +634 -0
- package/dist/artifacts.d.ts +2 -0
- package/dist/artifacts.js +375 -0
- package/dist/artifacts.js.map +1 -0
- package/dist/autonomy.d.ts +17 -0
- package/dist/autonomy.js +124 -0
- package/dist/autonomy.js.map +1 -0
- package/dist/autoverify/policy.d.ts +5 -0
- package/dist/autoverify/policy.js +18 -0
- package/dist/autoverify/policy.js.map +1 -0
- package/dist/autoverify.d.ts +45 -0
- package/dist/autoverify.js +1041 -0
- package/dist/autoverify.js.map +1 -0
- package/dist/cache-lock.d.ts +16 -0
- package/dist/cache-lock.js +181 -0
- package/dist/cache-lock.js.map +1 -0
- package/dist/cli/hooks.d.ts +5 -0
- package/dist/cli/hooks.js +264 -0
- package/dist/cli/hooks.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +1034 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex-contract.d.ts +2 -0
- package/dist/codex-contract.js +78 -0
- package/dist/codex-contract.js.map +1 -0
- package/dist/command.d.ts +34 -0
- package/dist/command.js +162 -0
- package/dist/command.js.map +1 -0
- package/dist/doctor.d.ts +112 -0
- package/dist/doctor.js +518 -0
- package/dist/doctor.js.map +1 -0
- package/dist/eval/baseline.d.ts +7 -0
- package/dist/eval/baseline.js +146 -0
- package/dist/eval/baseline.js.map +1 -0
- package/dist/eval/historical.d.ts +4 -0
- package/dist/eval/historical.js +663 -0
- package/dist/eval/historical.js.map +1 -0
- package/dist/eval/render.d.ts +2 -0
- package/dist/eval/render.js +53 -0
- package/dist/eval/render.js.map +1 -0
- package/dist/eval/scoring.d.ts +21 -0
- package/dist/eval/scoring.js +618 -0
- package/dist/eval/scoring.js.map +1 -0
- package/dist/eval/synthetic.d.ts +36 -0
- package/dist/eval/synthetic.js +107 -0
- package/dist/eval/synthetic.js.map +1 -0
- package/dist/eval/types.d.ts +36 -0
- package/dist/eval/types.js +2 -0
- package/dist/eval/types.js.map +1 -0
- package/dist/eval.d.ts +140 -0
- package/dist/eval.js +551 -0
- package/dist/eval.js.map +1 -0
- package/dist/git.d.ts +17 -0
- package/dist/git.js +189 -0
- package/dist/git.js.map +1 -0
- package/dist/github-release.d.ts +47 -0
- package/dist/github-release.js +610 -0
- package/dist/github-release.js.map +1 -0
- package/dist/github-sync.d.ts +68 -0
- package/dist/github-sync.js +345 -0
- package/dist/github-sync.js.map +1 -0
- package/dist/graph.d.ts +10 -0
- package/dist/graph.js +665 -0
- package/dist/graph.js.map +1 -0
- package/dist/indexer/aliases.d.ts +2 -0
- package/dist/indexer/aliases.js +190 -0
- package/dist/indexer/aliases.js.map +1 -0
- package/dist/indexer/artifact-writing.d.ts +3 -0
- package/dist/indexer/artifact-writing.js +79 -0
- package/dist/indexer/artifact-writing.js.map +1 -0
- package/dist/indexer/discovery.d.ts +2 -0
- package/dist/indexer/discovery.js +5 -0
- package/dist/indexer/discovery.js.map +1 -0
- package/dist/indexer/external-facts.d.ts +6 -0
- package/dist/indexer/external-facts.js +45 -0
- package/dist/indexer/external-facts.js.map +1 -0
- package/dist/indexer/freshness.d.ts +8 -0
- package/dist/indexer/freshness.js +56 -0
- package/dist/indexer/freshness.js.map +1 -0
- package/dist/indexer/graph-stage.d.ts +2 -0
- package/dist/indexer/graph-stage.js +21 -0
- package/dist/indexer/graph-stage.js.map +1 -0
- package/dist/indexer/parsing.d.ts +30 -0
- package/dist/indexer/parsing.js +177 -0
- package/dist/indexer/parsing.js.map +1 -0
- package/dist/indexer/pipeline.d.ts +5 -0
- package/dist/indexer/pipeline.js +8 -0
- package/dist/indexer/pipeline.js.map +1 -0
- package/dist/indexer/ranking.d.ts +4 -0
- package/dist/indexer/ranking.js +134 -0
- package/dist/indexer/ranking.js.map +1 -0
- package/dist/indexer.d.ts +13 -0
- package/dist/indexer.js +395 -0
- package/dist/indexer.js.map +1 -0
- package/dist/init.d.ts +24 -0
- package/dist/init.js +566 -0
- package/dist/init.js.map +1 -0
- package/dist/language.d.ts +8 -0
- package/dist/language.js +123 -0
- package/dist/language.js.map +1 -0
- package/dist/live-index.d.ts +68 -0
- package/dist/live-index.js +215 -0
- package/dist/live-index.js.map +1 -0
- package/dist/lsp/assist.d.ts +44 -0
- package/dist/lsp/assist.js +331 -0
- package/dist/lsp/assist.js.map +1 -0
- package/dist/lsp/client.d.ts +59 -0
- package/dist/lsp/client.js +208 -0
- package/dist/lsp/client.js.map +1 -0
- package/dist/mcp/compaction.d.ts +15 -0
- package/dist/mcp/compaction.js +1249 -0
- package/dist/mcp/compaction.js.map +1 -0
- package/dist/mcp/envelope.d.ts +44 -0
- package/dist/mcp/envelope.js +425 -0
- package/dist/mcp/envelope.js.map +1 -0
- package/dist/mcp/prompts.d.ts +2 -0
- package/dist/mcp/prompts.js +109 -0
- package/dist/mcp/prompts.js.map +1 -0
- package/dist/mcp/resources.d.ts +2 -0
- package/dist/mcp/resources.js +132 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/runtime.d.ts +15 -0
- package/dist/mcp/runtime.js +122 -0
- package/dist/mcp/runtime.js.map +1 -0
- package/dist/mcp/session-memory.d.ts +3 -0
- package/dist/mcp/session-memory.js +61 -0
- package/dist/mcp/session-memory.js.map +1 -0
- package/dist/mcp/tool-registry.d.ts +269 -0
- package/dist/mcp/tool-registry.js +284 -0
- package/dist/mcp/tool-registry.js.map +1 -0
- package/dist/mcp/tools.d.ts +53 -0
- package/dist/mcp/tools.js +372 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp-repo-root.d.ts +16 -0
- package/dist/mcp-repo-root.js +322 -0
- package/dist/mcp-repo-root.js.map +1 -0
- package/dist/mcp-tool-catalog.d.ts +2 -0
- package/dist/mcp-tool-catalog.js +2 -0
- package/dist/mcp-tool-catalog.js.map +1 -0
- package/dist/mcp.d.ts +11 -0
- package/dist/mcp.js +332 -0
- package/dist/mcp.js.map +1 -0
- package/dist/outcome-ranking.d.ts +5 -0
- package/dist/outcome-ranking.js +115 -0
- package/dist/outcome-ranking.js.map +1 -0
- package/dist/parser/context.d.ts +28 -0
- package/dist/parser/context.js +2 -0
- package/dist/parser/context.js.map +1 -0
- package/dist/parser/ecma.d.ts +5 -0
- package/dist/parser/ecma.js +388 -0
- package/dist/parser/ecma.js.map +1 -0
- package/dist/parser/facts.d.ts +12 -0
- package/dist/parser/facts.js +137 -0
- package/dist/parser/facts.js.map +1 -0
- package/dist/parser/json.d.ts +3 -0
- package/dist/parser/json.js +318 -0
- package/dist/parser/json.js.map +1 -0
- package/dist/parser/markdown.d.ts +3 -0
- package/dist/parser/markdown.js +180 -0
- package/dist/parser/markdown.js.map +1 -0
- package/dist/parser/nodes.d.ts +5 -0
- package/dist/parser/nodes.js +75 -0
- package/dist/parser/nodes.js.map +1 -0
- package/dist/parser/python.d.ts +2 -0
- package/dist/parser/python.js +307 -0
- package/dist/parser/python.js.map +1 -0
- package/dist/parser/references.d.ts +3 -0
- package/dist/parser/references.js +204 -0
- package/dist/parser/references.js.map +1 -0
- package/dist/parser/risks.d.ts +4 -0
- package/dist/parser/risks.js +62 -0
- package/dist/parser/risks.js.map +1 -0
- package/dist/parser/routes.d.ts +5 -0
- package/dist/parser/routes.js +97 -0
- package/dist/parser/routes.js.map +1 -0
- package/dist/parser/shallow.d.ts +3 -0
- package/dist/parser/shallow.js +545 -0
- package/dist/parser/shallow.js.map +1 -0
- package/dist/parser/source.d.ts +4 -0
- package/dist/parser/source.js +127 -0
- package/dist/parser/source.js.map +1 -0
- package/dist/parser.d.ts +2 -0
- package/dist/parser.js +2 -0
- package/dist/parser.js.map +1 -0
- package/dist/placeholder-signals.d.ts +15 -0
- package/dist/placeholder-signals.js +511 -0
- package/dist/placeholder-signals.js.map +1 -0
- package/dist/post-edit-outcomes.d.ts +167 -0
- package/dist/post-edit-outcomes.js +484 -0
- package/dist/post-edit-outcomes.js.map +1 -0
- package/dist/queries.d.ts +12 -0
- package/dist/queries.js +13 -0
- package/dist/queries.js.map +1 -0
- package/dist/query/change-plan.d.ts +48 -0
- package/dist/query/change-plan.js +858 -0
- package/dist/query/change-plan.js.map +1 -0
- package/dist/query/compact-data.d.ts +25 -0
- package/dist/query/compact-data.js +74 -0
- package/dist/query/compact-data.js.map +1 -0
- package/dist/query/context.d.ts +5 -0
- package/dist/query/context.js +1162 -0
- package/dist/query/context.js.map +1 -0
- package/dist/query/diff.d.ts +5 -0
- package/dist/query/diff.js +111 -0
- package/dist/query/diff.js.map +1 -0
- package/dist/query/edge-evidence.d.ts +3 -0
- package/dist/query/edge-evidence.js +36 -0
- package/dist/query/edge-evidence.js.map +1 -0
- package/dist/query/formatting.d.ts +14 -0
- package/dist/query/formatting.js +67 -0
- package/dist/query/formatting.js.map +1 -0
- package/dist/query/graph-traversal.d.ts +22 -0
- package/dist/query/graph-traversal.js +218 -0
- package/dist/query/graph-traversal.js.map +1 -0
- package/dist/query/graph.d.ts +14 -0
- package/dist/query/graph.js +102 -0
- package/dist/query/graph.js.map +1 -0
- package/dist/query/impact.d.ts +28 -0
- package/dist/query/impact.js +568 -0
- package/dist/query/impact.js.map +1 -0
- package/dist/query/inspection.d.ts +9 -0
- package/dist/query/inspection.js +290 -0
- package/dist/query/inspection.js.map +1 -0
- package/dist/query/next-tools.d.ts +3 -0
- package/dist/query/next-tools.js +25 -0
- package/dist/query/next-tools.js.map +1 -0
- package/dist/query/placeholders.d.ts +24 -0
- package/dist/query/placeholders.js +121 -0
- package/dist/query/placeholders.js.map +1 -0
- package/dist/query/post-edit/decision.d.ts +49 -0
- package/dist/query/post-edit/decision.js +130 -0
- package/dist/query/post-edit/decision.js.map +1 -0
- package/dist/query/post-edit/dirty-scope.d.ts +16 -0
- package/dist/query/post-edit/dirty-scope.js +21 -0
- package/dist/query/post-edit/dirty-scope.js.map +1 -0
- package/dist/query/post-edit/next-actions.d.ts +22 -0
- package/dist/query/post-edit/next-actions.js +44 -0
- package/dist/query/post-edit/next-actions.js.map +1 -0
- package/dist/query/post-edit/snapshot-contract.d.ts +8 -0
- package/dist/query/post-edit/snapshot-contract.js +111 -0
- package/dist/query/post-edit/snapshot-contract.js.map +1 -0
- package/dist/query/post-edit.d.ts +5 -0
- package/dist/query/post-edit.js +1108 -0
- package/dist/query/post-edit.js.map +1 -0
- package/dist/query/quality.d.ts +43 -0
- package/dist/query/quality.js +134 -0
- package/dist/query/quality.js.map +1 -0
- package/dist/query/raw-search.d.ts +23 -0
- package/dist/query/raw-search.js +147 -0
- package/dist/query/raw-search.js.map +1 -0
- package/dist/query/runtime.d.ts +11 -0
- package/dist/query/runtime.js +79 -0
- package/dist/query/runtime.js.map +1 -0
- package/dist/query/search.d.ts +25 -0
- package/dist/query/search.js +429 -0
- package/dist/query/search.js.map +1 -0
- package/dist/query/session-memory.d.ts +3 -0
- package/dist/query/session-memory.js +108 -0
- package/dist/query/session-memory.js.map +1 -0
- package/dist/query/session.d.ts +41 -0
- package/dist/query/session.js +90 -0
- package/dist/query/session.js.map +1 -0
- package/dist/query/targets.d.ts +25 -0
- package/dist/query/targets.js +97 -0
- package/dist/query/targets.js.map +1 -0
- package/dist/query/test-commands.d.ts +10 -0
- package/dist/query/test-commands.js +110 -0
- package/dist/query/test-commands.js.map +1 -0
- package/dist/query/test-plan.d.ts +6 -0
- package/dist/query/test-plan.js +104 -0
- package/dist/query/test-plan.js.map +1 -0
- package/dist/query/tests.d.ts +48 -0
- package/dist/query/tests.js +444 -0
- package/dist/query/tests.js.map +1 -0
- package/dist/query/verification/shell.d.ts +20 -0
- package/dist/query/verification/shell.js +164 -0
- package/dist/query/verification/shell.js.map +1 -0
- package/dist/query/verification.d.ts +47 -0
- package/dist/query/verification.js +1123 -0
- package/dist/query/verification.js.map +1 -0
- package/dist/query/workflow.d.ts +17 -0
- package/dist/query/workflow.js +252 -0
- package/dist/query/workflow.js.map +1 -0
- package/dist/query/workspace-guidance.d.ts +26 -0
- package/dist/query/workspace-guidance.js +214 -0
- package/dist/query/workspace-guidance.js.map +1 -0
- package/dist/query/worktree-state.d.ts +22 -0
- package/dist/query/worktree-state.js +32 -0
- package/dist/query/worktree-state.js.map +1 -0
- package/dist/query/worktree.d.ts +16 -0
- package/dist/query/worktree.js +194 -0
- package/dist/query/worktree.js.map +1 -0
- package/dist/query-data.d.ts +4 -0
- package/dist/query-data.js +112 -0
- package/dist/query-data.js.map +1 -0
- package/dist/repo-files.d.ts +24 -0
- package/dist/repo-files.js +105 -0
- package/dist/repo-files.js.map +1 -0
- package/dist/resolver.d.ts +9 -0
- package/dist/resolver.js +555 -0
- package/dist/resolver.js.map +1 -0
- package/dist/retrieval.d.ts +46 -0
- package/dist/retrieval.js +783 -0
- package/dist/retrieval.js.map +1 -0
- package/dist/risk-ingest.d.ts +16 -0
- package/dist/risk-ingest.js +458 -0
- package/dist/risk-ingest.js.map +1 -0
- package/dist/rules.d.ts +10 -0
- package/dist/rules.js +107 -0
- package/dist/rules.js.map +1 -0
- package/dist/semantic/python.d.ts +9 -0
- package/dist/semantic/python.js +817 -0
- package/dist/semantic/python.js.map +1 -0
- package/dist/semantic/typescript.d.ts +10 -0
- package/dist/semantic/typescript.js +714 -0
- package/dist/semantic/typescript.js.map +1 -0
- package/dist/semantic-retrieval.d.ts +53 -0
- package/dist/semantic-retrieval.js +673 -0
- package/dist/semantic-retrieval.js.map +1 -0
- package/dist/session-memory/derivation.d.ts +6 -0
- package/dist/session-memory/derivation.js +400 -0
- package/dist/session-memory/derivation.js.map +1 -0
- package/dist/session-memory/event-log.d.ts +23 -0
- package/dist/session-memory/event-log.js +126 -0
- package/dist/session-memory/event-log.js.map +1 -0
- package/dist/session-memory/formatting.d.ts +7 -0
- package/dist/session-memory/formatting.js +86 -0
- package/dist/session-memory/formatting.js.map +1 -0
- package/dist/session-memory/model.d.ts +94 -0
- package/dist/session-memory/model.js +17 -0
- package/dist/session-memory/model.js.map +1 -0
- package/dist/session-memory/runtime.d.ts +24 -0
- package/dist/session-memory/runtime.js +289 -0
- package/dist/session-memory/runtime.js.map +1 -0
- package/dist/session-memory/store.d.ts +27 -0
- package/dist/session-memory/store.js +447 -0
- package/dist/session-memory/store.js.map +1 -0
- package/dist/session-memory.d.ts +1 -0
- package/dist/session-memory.js +2 -0
- package/dist/session-memory.js.map +1 -0
- package/dist/static-analysis.d.ts +36 -0
- package/dist/static-analysis.js +505 -0
- package/dist/static-analysis.js.map +1 -0
- package/dist/symbol-report-ingest.d.ts +8 -0
- package/dist/symbol-report-ingest.js +504 -0
- package/dist/symbol-report-ingest.js.map +1 -0
- package/dist/task-snapshots.d.ts +41 -0
- package/dist/task-snapshots.js +430 -0
- package/dist/task-snapshots.js.map +1 -0
- package/dist/types.d.ts +848 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +11 -0
- package/dist/util.js +63 -0
- package/dist/util.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/package.json +81 -0
- package/plugins/codexa/.codex-plugin/plugin.json +38 -0
- package/plugins/codexa/.mcp.json +20 -0
- package/plugins/codexa/scripts/codexa-mcp.js +100 -0
- package/plugins/codexa/skills/codexa/SKILL.md +48 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerWorkflowPrompts(server) {
|
|
3
|
+
server.registerPrompt("impact_before_edit", {
|
|
4
|
+
title: "Codexa impact before edit",
|
|
5
|
+
description: "Use Codexa to gather blast-radius context before changing a file or symbol.",
|
|
6
|
+
argsSchema: {
|
|
7
|
+
target: z.string().describe("File path, symbol name, or symbol id to inspect before editing."),
|
|
8
|
+
task: z.string().optional().describe("Short task description.")
|
|
9
|
+
}
|
|
10
|
+
}, async ({ target, task }) => ({
|
|
11
|
+
messages: [
|
|
12
|
+
{
|
|
13
|
+
role: "user",
|
|
14
|
+
content: {
|
|
15
|
+
type: "text",
|
|
16
|
+
text: [
|
|
17
|
+
`Use Codexa before editing ${target}.`,
|
|
18
|
+
task ? `Task: ${task}` : undefined,
|
|
19
|
+
"If the target is unclear, call first-class `search` before planning.",
|
|
20
|
+
"Call `change_plan` with `saveSnapshot: true` for the target and task before editing.",
|
|
21
|
+
"Call `impact` only if the plan reports medium/low quality, broad fanout, or a high-risk public contract.",
|
|
22
|
+
"After editing, call `post_edit_review` with the returned task snapshot id.",
|
|
23
|
+
"Read the returned freshness, confidence labels, known gaps, affected files, and likely tests before modifying code."
|
|
24
|
+
]
|
|
25
|
+
.filter((line) => Boolean(line))
|
|
26
|
+
.join("\n")
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}));
|
|
31
|
+
server.registerPrompt("dirty_diff_review", {
|
|
32
|
+
title: "Codexa dirty diff review",
|
|
33
|
+
description: "Review the current dirty tree with grouped impact and targeted verification.",
|
|
34
|
+
argsSchema: {
|
|
35
|
+
task: z.string().optional().describe("What the dirty diff is supposed to accomplish.")
|
|
36
|
+
}
|
|
37
|
+
}, async ({ task }) => ({
|
|
38
|
+
messages: [
|
|
39
|
+
{
|
|
40
|
+
role: "user",
|
|
41
|
+
content: {
|
|
42
|
+
type: "text",
|
|
43
|
+
text: [
|
|
44
|
+
"Use Codexa to review the current dirty diff.",
|
|
45
|
+
task ? `Expected intent: ${task}` : undefined,
|
|
46
|
+
"Call `post_edit_review` first if a change_plan snapshot exists; otherwise call `search` for target discovery or `task_brief` with `diff: true` when the target is already clear.",
|
|
47
|
+
"Then call `diff_impact` or `test_plan` only if the review or brief leaves a gap.",
|
|
48
|
+
"Check changed-but-unindexed files, parser errors, heuristic-only links, and candidate test command provenance."
|
|
49
|
+
]
|
|
50
|
+
.filter((line) => Boolean(line))
|
|
51
|
+
.join("\n")
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
}));
|
|
56
|
+
server.registerPrompt("snapshot_edit_loop", {
|
|
57
|
+
title: "Codexa snapshot edit loop",
|
|
58
|
+
description: "Use a plan-time snapshot before editing and a drift review after editing.",
|
|
59
|
+
argsSchema: {
|
|
60
|
+
task: z.string().describe("Short description of the intended edit."),
|
|
61
|
+
target: z.string().optional().describe("Optional file path, symbol name, or symbol id to change.")
|
|
62
|
+
}
|
|
63
|
+
}, async ({ task, target }) => ({
|
|
64
|
+
messages: [
|
|
65
|
+
{
|
|
66
|
+
role: "user",
|
|
67
|
+
content: {
|
|
68
|
+
type: "text",
|
|
69
|
+
text: [
|
|
70
|
+
"Use Codexa's snapshot edit loop.",
|
|
71
|
+
`Task: ${task}`,
|
|
72
|
+
target ? `Target: ${target}` : undefined,
|
|
73
|
+
"Before editing, call first-class `search` if the target is unclear, then `change_plan` with `saveSnapshot: true` and a short `taskId`.",
|
|
74
|
+
"Use the returned planned files, tests, workflows, quality, and gaps to guide source reads.",
|
|
75
|
+
"After editing, call go-to `post_edit_review` with that `taskId` and any tests already run.",
|
|
76
|
+
"If the review says `inspect` or `replan`, resolve that drift before claiming the edit is complete."
|
|
77
|
+
]
|
|
78
|
+
.filter((line) => Boolean(line))
|
|
79
|
+
.join("\n")
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
}));
|
|
84
|
+
server.registerPrompt("targeted_test_plan", {
|
|
85
|
+
title: "Codexa targeted test plan",
|
|
86
|
+
description: "Generate a focused test plan with command provenance for current changes.",
|
|
87
|
+
argsSchema: {
|
|
88
|
+
task: z.string().optional().describe("Short description of the change being verified.")
|
|
89
|
+
}
|
|
90
|
+
}, async ({ task }) => ({
|
|
91
|
+
messages: [
|
|
92
|
+
{
|
|
93
|
+
role: "user",
|
|
94
|
+
content: {
|
|
95
|
+
type: "text",
|
|
96
|
+
text: [
|
|
97
|
+
"Use Codexa to create a targeted test plan.",
|
|
98
|
+
task ? `Change under test: ${task}` : undefined,
|
|
99
|
+
"Call `test_plan` with `diff: true` and prefer tests whose commands have package or Python metadata provenance.",
|
|
100
|
+
"If command provenance is missing, inspect the repo scripts before running a command."
|
|
101
|
+
]
|
|
102
|
+
.filter((line) => Boolean(line))
|
|
103
|
+
.join("\n")
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
]
|
|
107
|
+
}));
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/mcp/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { statusQuery } from "../queries.js";
|
|
5
|
+
export async function registerArtifactResources(server, resolveRepoRoot) {
|
|
6
|
+
const artifacts = [
|
|
7
|
+
["codebase-readme", "codexa://repo/codebase/README.md", ".codex/codebase/README.md", "text/markdown", "Codexa artifact overview"],
|
|
8
|
+
["codex-contract", "codexa://repo/codebase/codex-contract.md", ".codex/codebase/codex-contract.md", "text/markdown", "Codex automatic-use contract"],
|
|
9
|
+
["repo-map", "codexa://repo/codebase/repo-map.md", ".codex/codebase/repo-map.md", "text/markdown", "Ranked repository map"],
|
|
10
|
+
["risk-map", "codexa://repo/codebase/risk-map.md", ".codex/codebase/risk-map.md", "text/markdown", "Risk-ranked files and signals"],
|
|
11
|
+
["placeholder-map", "codexa://repo/codebase/placeholder-map.md", ".codex/codebase/placeholder-map.md", "text/markdown", "Placeholder and dummy code/data signals"],
|
|
12
|
+
["test-map", "codexa://repo/codebase/test-map.md", ".codex/codebase/test-map.md", "text/markdown", "Detected test files and test edges"],
|
|
13
|
+
["conventions", "codexa://repo/codebase/conventions.md", ".codex/codebase/conventions.md", "text/markdown", "Detected project conventions"],
|
|
14
|
+
["workflows", "codexa://repo/codebase/workflows.md", ".codex/codebase/workflows.md", "text/markdown", "Detected workflow traces"],
|
|
15
|
+
["playbooks", "codexa://repo/codebase/playbooks/README.md", ".codex/codebase/playbooks/README.md", "text/markdown", "Generated Codexa change playbook index"],
|
|
16
|
+
["freshness-json", "codexa://repo/codebase/freshness.json", ".codex/codebase/freshness.json", "application/json", "Codexa freshness snapshot"]
|
|
17
|
+
];
|
|
18
|
+
for (const [name, uri, relativePath, mimeType, description] of artifacts) {
|
|
19
|
+
server.registerResource(name, uri, {
|
|
20
|
+
title: `Codexa ${name}`,
|
|
21
|
+
description,
|
|
22
|
+
mimeType
|
|
23
|
+
}, async () => ({
|
|
24
|
+
contents: [
|
|
25
|
+
{
|
|
26
|
+
uri,
|
|
27
|
+
mimeType,
|
|
28
|
+
text: relativePath === ".codex/codebase/freshness.json"
|
|
29
|
+
? await readLiveFreshnessArtifact(await resolveRepoRoot())
|
|
30
|
+
: await readArtifact(await resolveRepoRoot(), relativePath)
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
server.registerResource("module-index", "codexa://repo/codebase/modules", {
|
|
36
|
+
title: "Codexa module index",
|
|
37
|
+
description: "List generated Codexa module artifact names.",
|
|
38
|
+
mimeType: "text/markdown"
|
|
39
|
+
}, async () => {
|
|
40
|
+
const repoRoot = await resolveRepoRoot();
|
|
41
|
+
const modulesDir = path.join(repoRoot, ".codex/codebase/modules");
|
|
42
|
+
let text = "# Codexa Modules\n\n";
|
|
43
|
+
try {
|
|
44
|
+
const allNames = (await fs.readdir(modulesDir)).filter((name) => name.endsWith(".md")).sort();
|
|
45
|
+
const names = allNames.slice(0, 80);
|
|
46
|
+
text += names.map((name) => `- codexa://repo/codebase/modules/${encodeURIComponent(name)}`).join("\n") || "- none";
|
|
47
|
+
if (allNames.length > names.length) {
|
|
48
|
+
text += `\n- ... ${allNames.length - names.length} more modules omitted from this bounded index`;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
text += "- modules unavailable; run `codexa index <repo>` first";
|
|
53
|
+
}
|
|
54
|
+
return { contents: [{ uri: "codexa://repo/codebase/modules", mimeType: "text/markdown", text }] };
|
|
55
|
+
});
|
|
56
|
+
server.registerResource("module-artifact", new ResourceTemplate("codexa://repo/codebase/modules/{name}", {
|
|
57
|
+
list: async () => ({
|
|
58
|
+
resources: await listMarkdownArtifacts(await resolveRepoRoot(), ".codex/codebase/modules", "codexa://repo/codebase/modules", "Codexa module", "Generated Codexa module artifact")
|
|
59
|
+
})
|
|
60
|
+
}), {
|
|
61
|
+
title: "Codexa module artifact",
|
|
62
|
+
description: "Read a generated Codexa module artifact by filename.",
|
|
63
|
+
mimeType: "text/markdown"
|
|
64
|
+
}, async (uri, variables) => {
|
|
65
|
+
const name = artifactNameVariable(variables.name);
|
|
66
|
+
return {
|
|
67
|
+
contents: [
|
|
68
|
+
{
|
|
69
|
+
uri: uri.toString(),
|
|
70
|
+
mimeType: "text/markdown",
|
|
71
|
+
text: await readArtifact(await resolveRepoRoot(), `.codex/codebase/modules/${name}`)
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
server.registerResource("playbook-artifact", new ResourceTemplate("codexa://repo/codebase/playbooks/{name}", {
|
|
77
|
+
list: async () => ({
|
|
78
|
+
resources: await listMarkdownArtifacts(await resolveRepoRoot(), ".codex/codebase/playbooks", "codexa://repo/codebase/playbooks", "Codexa playbook", "Generated Codexa change playbook", (name) => name !== "README.md")
|
|
79
|
+
})
|
|
80
|
+
}), {
|
|
81
|
+
title: "Codexa playbook artifact",
|
|
82
|
+
description: "Read a generated Codexa change playbook by filename.",
|
|
83
|
+
mimeType: "text/markdown"
|
|
84
|
+
}, async (uri, variables) => {
|
|
85
|
+
const name = artifactNameVariable(variables.name);
|
|
86
|
+
return {
|
|
87
|
+
contents: [
|
|
88
|
+
{
|
|
89
|
+
uri: uri.toString(),
|
|
90
|
+
mimeType: "text/markdown",
|
|
91
|
+
text: await readArtifact(await resolveRepoRoot(), `.codex/codebase/playbooks/${name}`)
|
|
92
|
+
}
|
|
93
|
+
]
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
async function readArtifact(repoRoot, relativePath) {
|
|
98
|
+
try {
|
|
99
|
+
return await fs.readFile(path.join(repoRoot, relativePath), "utf8");
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
103
|
+
throw new Error(`Codexa artifact missing: ${relativePath}. Run: codexa index ${repoRoot}. ${message}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async function readLiveFreshnessArtifact(repoRoot) {
|
|
107
|
+
const status = await statusQuery(repoRoot, { recover: false });
|
|
108
|
+
return `${JSON.stringify(status.data, null, 2)}\n`;
|
|
109
|
+
}
|
|
110
|
+
async function listMarkdownArtifacts(repoRoot, relativeDir, uriPrefix, titlePrefix, descriptionPrefix, include = () => true) {
|
|
111
|
+
try {
|
|
112
|
+
const names = (await fs.readdir(path.join(repoRoot, relativeDir))).filter((name) => name.endsWith(".md") && include(name)).sort().slice(0, 80);
|
|
113
|
+
return names.map((name) => ({
|
|
114
|
+
name: `${titlePrefix} ${name}`,
|
|
115
|
+
uri: `${uriPrefix}/${encodeURIComponent(name)}`,
|
|
116
|
+
title: `${titlePrefix} ${name}`,
|
|
117
|
+
description: `${descriptionPrefix} ${name}`,
|
|
118
|
+
mimeType: "text/markdown"
|
|
119
|
+
}));
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function artifactNameVariable(value) {
|
|
126
|
+
const name = Array.isArray(value) ? value.join("/") : value;
|
|
127
|
+
if (!name || name.includes("/") || name.includes("\\") || name === "." || name === ".." || !name.endsWith(".md")) {
|
|
128
|
+
throw new Error(`Invalid Codexa artifact name: ${name}`);
|
|
129
|
+
}
|
|
130
|
+
return name;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=resources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/mcp/resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAkB,MAAM,yCAAyC,CAAC;AAC3F,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,MAAiB,EAAE,eAAsC;IACvG,MAAM,SAAS,GAAG;QAChB,CAAC,iBAAiB,EAAE,kCAAkC,EAAE,2BAA2B,EAAE,eAAe,EAAE,0BAA0B,CAAC;QACjI,CAAC,gBAAgB,EAAE,0CAA0C,EAAE,mCAAmC,EAAE,eAAe,EAAE,8BAA8B,CAAC;QACpJ,CAAC,UAAU,EAAE,oCAAoC,EAAE,6BAA6B,EAAE,eAAe,EAAE,uBAAuB,CAAC;QAC3H,CAAC,UAAU,EAAE,oCAAoC,EAAE,6BAA6B,EAAE,eAAe,EAAE,+BAA+B,CAAC;QACnI,CAAC,iBAAiB,EAAE,2CAA2C,EAAE,oCAAoC,EAAE,eAAe,EAAE,yCAAyC,CAAC;QAClK,CAAC,UAAU,EAAE,oCAAoC,EAAE,6BAA6B,EAAE,eAAe,EAAE,oCAAoC,CAAC;QACxI,CAAC,aAAa,EAAE,uCAAuC,EAAE,gCAAgC,EAAE,eAAe,EAAE,8BAA8B,CAAC;QAC3I,CAAC,WAAW,EAAE,qCAAqC,EAAE,8BAA8B,EAAE,eAAe,EAAE,0BAA0B,CAAC;QACjI,CAAC,WAAW,EAAE,4CAA4C,EAAE,qCAAqC,EAAE,eAAe,EAAE,wCAAwC,CAAC;QAC7J,CAAC,gBAAgB,EAAE,uCAAuC,EAAE,gCAAgC,EAAE,kBAAkB,EAAE,2BAA2B,CAAC;KACtI,CAAC;IAEX,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,CAAC,IAAI,SAAS,EAAE,CAAC;QACzE,MAAM,CAAC,gBAAgB,CACrB,IAAI,EACJ,GAAG,EACH;YACE,KAAK,EAAE,UAAU,IAAI,EAAE;YACvB,WAAW;YACX,QAAQ;SACT,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;YACX,QAAQ,EAAE;gBACR;oBACE,GAAG;oBACH,QAAQ;oBACR,IAAI,EACF,YAAY,KAAK,gCAAgC;wBAC/C,CAAC,CAAC,MAAM,yBAAyB,CAAC,MAAM,eAAe,EAAE,CAAC;wBAC1D,CAAC,CAAC,MAAM,YAAY,CAAC,MAAM,eAAe,EAAE,EAAE,YAAY,CAAC;iBAChE;aACF;SACF,CAAC,CACH,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,gBAAgB,CACrB,cAAc,EACd,gCAAgC,EAChC;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,8CAA8C;QAC3D,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,IAAI,EAAE;QACT,MAAM,QAAQ,GAAG,MAAM,eAAe,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC;QAClE,IAAI,IAAI,GAAG,sBAAsB,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9F,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oCAAoC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;YACnH,IAAI,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBACnC,IAAI,IAAI,WAAW,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,+CAA+C,CAAC;YACnG,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,IAAI,wDAAwD,CAAC;QACnE,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,gCAAgC,EAAE,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACpG,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,gBAAgB,CACrB,iBAAiB,EACjB,IAAI,gBAAgB,CAAC,uCAAuC,EAAE;QAC5D,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACjB,SAAS,EAAE,MAAM,qBAAqB,CAAC,MAAM,eAAe,EAAE,EAAE,yBAAyB,EAAE,gCAAgC,EAAE,eAAe,EAAE,kCAAkC,CAAC;SAClL,CAAC;KACH,CAAC,EACF;QACE,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,sDAAsD;QACnE,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,oBAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClD,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;oBACnB,QAAQ,EAAE,eAAe;oBACzB,IAAI,EAAE,MAAM,YAAY,CAAC,MAAM,eAAe,EAAE,EAAE,2BAA2B,IAAI,EAAE,CAAC;iBACrF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,gBAAgB,CACrB,mBAAmB,EACnB,IAAI,gBAAgB,CAAC,yCAAyC,EAAE;QAC9D,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACjB,SAAS,EAAE,MAAM,qBAAqB,CACpC,MAAM,eAAe,EAAE,EACvB,2BAA2B,EAC3B,kCAAkC,EAClC,iBAAiB,EACjB,kCAAkC,EAClC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,WAAW,CAC/B;SACF,CAAC;KACH,CAAC,EACF;QACE,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,sDAAsD;QACnE,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,oBAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClD,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;oBACnB,QAAQ,EAAE,eAAe;oBACzB,IAAI,EAAE,MAAM,YAAY,CAAC,MAAM,eAAe,EAAE,EAAE,6BAA6B,IAAI,EAAE,CAAC;iBACvF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,QAAgB,EAAE,YAAoB;IAChE,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,4BAA4B,YAAY,uBAAuB,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC;IACzG,CAAC;AACH,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,QAAgB;IACvD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AACrD,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,QAAgB,EAChB,WAAmB,EACnB,SAAiB,EACjB,WAAmB,EACnB,iBAAyB,EACzB,UAAqC,GAAG,EAAE,CAAC,IAAI;IAE/C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/I,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1B,IAAI,EAAE,GAAG,WAAW,IAAI,IAAI,EAAE;YAC9B,GAAG,EAAE,GAAG,SAAS,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE;YAC/C,KAAK,EAAE,GAAG,WAAW,IAAI,IAAI,EAAE;YAC/B,WAAW,EAAE,GAAG,iBAAiB,IAAI,IAAI,EAAE;YAC3C,QAAQ,EAAE,eAAe;SAC1B,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAwB;IACpD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5D,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACjH,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { type QuerySession } from "../query/session.js";
|
|
3
|
+
import type { QueryOptions, QueryResult } from "../types.js";
|
|
4
|
+
export interface McpRuntime {
|
|
5
|
+
resolveActiveRepoRoot(): Promise<string>;
|
|
6
|
+
createQuerySession(activeRepoRoot: string): Promise<QuerySession>;
|
|
7
|
+
}
|
|
8
|
+
export interface CreateMcpRuntimeOptions {
|
|
9
|
+
configuredRepoRoot: string;
|
|
10
|
+
queryOptions: QueryOptions;
|
|
11
|
+
preferConfiguredRoot: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function createMcpRuntime({ configuredRepoRoot, queryOptions, preferConfiguredRoot }: CreateMcpRuntimeOptions): McpRuntime;
|
|
14
|
+
export declare function notifyResourceListChangedAfterRefresh(server: McpServer, session: QuerySession): Promise<void>;
|
|
15
|
+
export declare function withSessionRuntime(result: QueryResult, session: QuerySession): QueryResult;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { getFreshness } from "../indexer.js";
|
|
2
|
+
import { resolveMcpRepoRoot } from "../mcp-repo-root.js";
|
|
3
|
+
import { requireIndex } from "../query/runtime.js";
|
|
4
|
+
import { createQuerySessionFromIndexState } from "../query/session.js";
|
|
5
|
+
export function createMcpRuntime({ configuredRepoRoot, queryOptions, preferConfiguredRoot }) {
|
|
6
|
+
let cachedIndexState;
|
|
7
|
+
let cachedIndexStateRepoRoot;
|
|
8
|
+
let indexStateInflight;
|
|
9
|
+
let activeResolution;
|
|
10
|
+
const resolveActiveRepoRoot = async () => {
|
|
11
|
+
const resolution = await resolveMcpRepoRoot(configuredRepoRoot, {
|
|
12
|
+
workspaceFocusFile: queryOptions.workspaceFocusFile,
|
|
13
|
+
workspaceSessionId: queryOptions.workspaceSessionId,
|
|
14
|
+
preferConfiguredRoot
|
|
15
|
+
});
|
|
16
|
+
if (activeResolution?.repoRoot !== resolution.repoRoot) {
|
|
17
|
+
cachedIndexState = undefined;
|
|
18
|
+
cachedIndexStateRepoRoot = undefined;
|
|
19
|
+
indexStateInflight = undefined;
|
|
20
|
+
}
|
|
21
|
+
if (!sameResolution(activeResolution, resolution)) {
|
|
22
|
+
activeResolution = resolution;
|
|
23
|
+
if (resolution.source !== "configured-root") {
|
|
24
|
+
const via = resolution.focusFile ? `${resolution.source}:${resolution.focusFile}` : resolution.source;
|
|
25
|
+
console.error(`codexa MCP resolved ${resolution.configuredRoot} to focused repo ${resolution.repoRoot} via ${via}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return resolution.repoRoot;
|
|
29
|
+
};
|
|
30
|
+
const loadIndexState = async (activeRepoRoot) => {
|
|
31
|
+
if (indexStateInflight?.repoRoot === activeRepoRoot) {
|
|
32
|
+
return indexStateInflight.promise;
|
|
33
|
+
}
|
|
34
|
+
const pending = (async () => {
|
|
35
|
+
if (cachedIndexState && cachedIndexStateRepoRoot === activeRepoRoot) {
|
|
36
|
+
const freshness = await getFreshness(activeRepoRoot, cachedIndexState.index, { recover: false });
|
|
37
|
+
if (!freshness.stale || !queryOptions.autoRefresh) {
|
|
38
|
+
cachedIndexState = { ...cachedIndexState, freshness, refresh: { refreshed: false } };
|
|
39
|
+
return cachedIndexState;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const loaded = await requireIndex(activeRepoRoot, queryOptions);
|
|
43
|
+
cachedIndexState = loaded;
|
|
44
|
+
cachedIndexStateRepoRoot = activeRepoRoot;
|
|
45
|
+
return loaded;
|
|
46
|
+
})();
|
|
47
|
+
indexStateInflight = { repoRoot: activeRepoRoot, promise: pending };
|
|
48
|
+
void pending
|
|
49
|
+
.finally(() => {
|
|
50
|
+
if (indexStateInflight?.promise === pending) {
|
|
51
|
+
indexStateInflight = undefined;
|
|
52
|
+
}
|
|
53
|
+
})
|
|
54
|
+
.catch(() => undefined);
|
|
55
|
+
return pending;
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
resolveActiveRepoRoot,
|
|
59
|
+
async createQuerySession(activeRepoRoot) {
|
|
60
|
+
const state = await loadIndexState(activeRepoRoot);
|
|
61
|
+
return createQuerySessionFromIndexState(activeRepoRoot, state, queryOptions);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export async function notifyResourceListChangedAfterRefresh(server, session) {
|
|
66
|
+
if (!session.refresh?.refreshed) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
await Promise.resolve(server.sendResourceListChanged());
|
|
70
|
+
}
|
|
71
|
+
export function withSessionRuntime(result, session) {
|
|
72
|
+
const runtime = {
|
|
73
|
+
repoRoot: session.repoRoot,
|
|
74
|
+
indexLoaded: Boolean(session.index),
|
|
75
|
+
freshness: session.freshness.reason,
|
|
76
|
+
stale: session.freshness.stale,
|
|
77
|
+
gitHead: session.gitState.headCommit,
|
|
78
|
+
dirtyFileCount: session.gitState.dirtyFiles.length,
|
|
79
|
+
changedFilesLoaded: session.provenance.some((entry) => entry.startsWith("changed-files:")),
|
|
80
|
+
commandBudgetMs: session.commandBudgetMs,
|
|
81
|
+
commandBudgetUsedMs: session.commandBudgetUsedMs(),
|
|
82
|
+
commandBudgetRemainingMs: session.commandBudgetRemainingMs(),
|
|
83
|
+
maxResultBytes: session.maxResultBytes,
|
|
84
|
+
resultBytes: Buffer.byteLength(result.text, "utf8"),
|
|
85
|
+
maxResults: session.maxResults,
|
|
86
|
+
warnings: session.warnings.slice(0, 20),
|
|
87
|
+
provenance: session.provenance.slice(0, 30)
|
|
88
|
+
};
|
|
89
|
+
let text = result.text;
|
|
90
|
+
let data = addRuntimeData(result.data, runtime);
|
|
91
|
+
if (runtime.resultBytes > session.maxResultBytes) {
|
|
92
|
+
const suffix = `\n\n[Codexa result truncated to ${session.maxResultBytes} bytes for MCP transport.]`;
|
|
93
|
+
text = `${result.text.slice(0, Math.max(0, session.maxResultBytes - suffix.length))}${suffix}`;
|
|
94
|
+
session.warnings.push(`result truncated to ${session.maxResultBytes} bytes`);
|
|
95
|
+
data = addRuntimeData(result.data, {
|
|
96
|
+
...runtime,
|
|
97
|
+
resultBytes: Buffer.byteLength(text, "utf8"),
|
|
98
|
+
resultTruncated: true,
|
|
99
|
+
warnings: session.warnings.slice(0, 20)
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
...result,
|
|
104
|
+
text,
|
|
105
|
+
data
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function sameResolution(previous, next) {
|
|
109
|
+
return (previous !== undefined &&
|
|
110
|
+
previous.repoRoot === next.repoRoot &&
|
|
111
|
+
previous.source === next.source &&
|
|
112
|
+
previous.focusFile === next.focusFile &&
|
|
113
|
+
previous.focusReason === next.focusReason &&
|
|
114
|
+
previous.workspaceSessionId === next.workspaceSessionId);
|
|
115
|
+
}
|
|
116
|
+
function addRuntimeData(data, runtime) {
|
|
117
|
+
if (data && typeof data === "object" && !Array.isArray(data)) {
|
|
118
|
+
return { ...data, runtime };
|
|
119
|
+
}
|
|
120
|
+
return { value: data, runtime };
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/mcp/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { QuerySession } from "../query/session.js";
|
|
2
|
+
import type { QueryResult } from "../types.js";
|
|
3
|
+
export declare function withAutoRecordedSessionMemory(session: QuerySession, result: QueryResult, toolName: string, input: Record<string, unknown> | undefined): Promise<QueryResult>;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { recordViewedMemoryForTool } from "../session-memory.js";
|
|
2
|
+
export async function withAutoRecordedSessionMemory(session, result, toolName, input) {
|
|
3
|
+
try {
|
|
4
|
+
const writes = await recordViewedMemoryForTool({
|
|
5
|
+
repoRoot: session.repoRoot,
|
|
6
|
+
taskId: typeof input?.taskId === "string" ? input.taskId : undefined,
|
|
7
|
+
task: typeof input?.task === "string" ? input.task : undefined,
|
|
8
|
+
toolName,
|
|
9
|
+
result,
|
|
10
|
+
index: session.index
|
|
11
|
+
});
|
|
12
|
+
if (!writes) {
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
...result,
|
|
17
|
+
data: addSessionMemoryWrite(result.data, writes)
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
const warning = `session memory auto-record failed for ${toolName}: ${error instanceof Error ? error.message : String(error)}`;
|
|
22
|
+
return {
|
|
23
|
+
...result,
|
|
24
|
+
data: addSessionMemoryWarning(result.data, warning)
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function addSessionMemoryWrite(data, writes) {
|
|
29
|
+
if (!isRecord(data)) {
|
|
30
|
+
return data;
|
|
31
|
+
}
|
|
32
|
+
const existing = isRecord(data.sessionMemory) ? data.sessionMemory : {};
|
|
33
|
+
return {
|
|
34
|
+
...data,
|
|
35
|
+
sessionMemory: {
|
|
36
|
+
...existing,
|
|
37
|
+
autoRecorded: true,
|
|
38
|
+
writes
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function addSessionMemoryWarning(data, warning) {
|
|
43
|
+
if (!isRecord(data)) {
|
|
44
|
+
return data;
|
|
45
|
+
}
|
|
46
|
+
const warnings = Array.isArray(data.warnings) ? data.warnings.filter((entry) => typeof entry === "string") : [];
|
|
47
|
+
const existing = isRecord(data.sessionMemory) ? data.sessionMemory : {};
|
|
48
|
+
return {
|
|
49
|
+
...data,
|
|
50
|
+
warnings: [...warnings, warning],
|
|
51
|
+
sessionMemory: {
|
|
52
|
+
...existing,
|
|
53
|
+
autoRecorded: false,
|
|
54
|
+
warning
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function isRecord(value) {
|
|
59
|
+
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=session-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-memory.js","sourceRoot":"","sources":["../../src/mcp/session-memory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAGjE,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,OAAqB,EAAE,MAAmB,EAAE,QAAgB,EAAE,KAA0C;IAC1J,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC;YAC7C,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,MAAM,EAAE,OAAO,KAAK,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YACpE,IAAI,EAAE,OAAO,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YAC9D,QAAQ;YACR,MAAM;YACN,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO;YACL,GAAG,MAAM;YACT,IAAI,EAAE,qBAAqB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC;SACjD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,yCAAyC,QAAQ,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/H,OAAO;YACL,GAAG,MAAM;YACT,IAAI,EAAE,uBAAuB,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC;SACpD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAa,EAAE,MAAe;IAC3D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,OAAO;QACL,GAAG,IAAI;QACP,aAAa,EAAE;YACb,GAAG,QAAQ;YACX,YAAY,EAAE,IAAI;YAClB,MAAM;SACP;KACF,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAa,EAAE,OAAe;IAC7D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjI,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,OAAO;QACL,GAAG,IAAI;QACP,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,OAAO,CAAC;QAChC,aAAa,EAAE;YACb,GAAG,QAAQ;YACX,YAAY,EAAE,KAAK;YACnB,OAAO;SACR;KACF,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9E,CAAC"}
|