@elliotding/ai-agent-mcp 0.2.21 → 0.2.22
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/dist/client-adapters/codex-adapter.d.ts +48 -0
- package/dist/client-adapters/codex-adapter.d.ts.map +1 -0
- package/dist/client-adapters/codex-adapter.js +69 -0
- package/dist/client-adapters/codex-adapter.js.map +1 -0
- package/dist/client-adapters/cursor-adapter.d.ts +36 -0
- package/dist/client-adapters/cursor-adapter.d.ts.map +1 -0
- package/dist/client-adapters/cursor-adapter.js +65 -0
- package/dist/client-adapters/cursor-adapter.js.map +1 -0
- package/dist/client-adapters/index.d.ts +89 -0
- package/dist/client-adapters/index.d.ts.map +1 -0
- package/dist/client-adapters/index.js +49 -0
- package/dist/client-adapters/index.js.map +1 -0
- package/dist/config/index.d.ts +19 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +12 -2
- package/dist/config/index.js.map +1 -1
- package/dist/prompts/manager.d.ts +18 -0
- package/dist/prompts/manager.d.ts.map +1 -1
- package/dist/prompts/manager.js +51 -5
- package/dist/prompts/manager.js.map +1 -1
- package/dist/server/http.d.ts +10 -6
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +83 -89
- package/dist/server/http.js.map +1 -1
- package/dist/server/streamable-http.d.ts +28 -0
- package/dist/server/streamable-http.d.ts.map +1 -0
- package/dist/server/streamable-http.js +126 -0
- package/dist/server/streamable-http.js.map +1 -0
- package/dist/server.d.ts +8 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +60 -96
- package/dist/server.js.map +1 -1
- package/dist/telemetry/manager.d.ts +5 -0
- package/dist/telemetry/manager.d.ts.map +1 -1
- package/dist/telemetry/manager.js +5 -0
- package/dist/telemetry/manager.js.map +1 -1
- package/dist/tools/manage-subscription.d.ts.map +1 -1
- package/dist/tools/manage-subscription.js +33 -2
- package/dist/tools/manage-subscription.js.map +1 -1
- package/dist/tools/policy-generator.d.ts +31 -0
- package/dist/tools/policy-generator.d.ts.map +1 -0
- package/dist/tools/policy-generator.js +53 -0
- package/dist/tools/policy-generator.js.map +1 -0
- package/dist/tools/resolve-prompt-content.d.ts.map +1 -1
- package/dist/tools/resolve-prompt-content.js +14 -1
- package/dist/tools/resolve-prompt-content.js.map +1 -1
- package/dist/tools/search-resources.d.ts.map +1 -1
- package/dist/tools/search-resources.js +24 -0
- package/dist/tools/search-resources.js.map +1 -1
- package/dist/tools/sync-resources.d.ts.map +1 -1
- package/dist/tools/sync-resources.js +134 -39
- package/dist/tools/sync-resources.js.map +1 -1
- package/dist/tools/uninstall-resource.d.ts.map +1 -1
- package/dist/tools/uninstall-resource.js +21 -3
- package/dist/tools/uninstall-resource.js.map +1 -1
- package/dist/types/tools.d.ts +78 -1
- package/dist/types/tools.d.ts.map +1 -1
- package/dist/utils/codex-paths.d.ts +35 -0
- package/dist/utils/codex-paths.d.ts.map +1 -0
- package/dist/utils/codex-paths.js +49 -0
- package/dist/utils/codex-paths.js.map +1 -0
- package/package.json +1 -1
- package/dist/transport/sse.d.ts +0 -29
- package/dist/transport/sse.d.ts.map +0 -1
- package/dist/transport/sse.js +0 -271
- package/dist/transport/sse.js.map +0 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex Policy Generator
|
|
3
|
+
*
|
|
4
|
+
* Aggregates all subscribed CSP routing rule contents into a single
|
|
5
|
+
* `csp-routing-policy.md` markdown file that is injected into Codex via
|
|
6
|
+
* the `developer_instructions` key in `~/.codex/config.toml`.
|
|
7
|
+
*
|
|
8
|
+
* Design rationale:
|
|
9
|
+
* - Codex does not support per-file `.mdc` rule directories like Cursor does.
|
|
10
|
+
* - The `developer_instructions` config key accepts a freeform string that
|
|
11
|
+
* Codex loads at session startup as additional system instructions.
|
|
12
|
+
* - Rather than dumping raw rule content into config.toml (size / escaping
|
|
13
|
+
* issues), we write a stable policy file path and instruct Codex to read it.
|
|
14
|
+
* - The policy file itself is a well-structured markdown document that Codex
|
|
15
|
+
* can parse and apply during the session.
|
|
16
|
+
*/
|
|
17
|
+
export interface RuleContent {
|
|
18
|
+
name: string;
|
|
19
|
+
content: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Generates the aggregated `csp-routing-policy.md` content from the given
|
|
23
|
+
* list of rule contents.
|
|
24
|
+
*
|
|
25
|
+
* The output format is a self-describing markdown document with:
|
|
26
|
+
* - A header section explaining the file purpose.
|
|
27
|
+
* - One `##` section per rule, using the rule name as the heading.
|
|
28
|
+
* - A generation timestamp for cache-busting diagnostics.
|
|
29
|
+
*/
|
|
30
|
+
export declare function generatePolicyContent(rules: RuleContent[]): string;
|
|
31
|
+
//# sourceMappingURL=policy-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-generator.d.ts","sourceRoot":"","sources":["../../src/tools/policy-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAyBlE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Codex Policy Generator
|
|
4
|
+
*
|
|
5
|
+
* Aggregates all subscribed CSP routing rule contents into a single
|
|
6
|
+
* `csp-routing-policy.md` markdown file that is injected into Codex via
|
|
7
|
+
* the `developer_instructions` key in `~/.codex/config.toml`.
|
|
8
|
+
*
|
|
9
|
+
* Design rationale:
|
|
10
|
+
* - Codex does not support per-file `.mdc` rule directories like Cursor does.
|
|
11
|
+
* - The `developer_instructions` config key accepts a freeform string that
|
|
12
|
+
* Codex loads at session startup as additional system instructions.
|
|
13
|
+
* - Rather than dumping raw rule content into config.toml (size / escaping
|
|
14
|
+
* issues), we write a stable policy file path and instruct Codex to read it.
|
|
15
|
+
* - The policy file itself is a well-structured markdown document that Codex
|
|
16
|
+
* can parse and apply during the session.
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.generatePolicyContent = generatePolicyContent;
|
|
20
|
+
/**
|
|
21
|
+
* Generates the aggregated `csp-routing-policy.md` content from the given
|
|
22
|
+
* list of rule contents.
|
|
23
|
+
*
|
|
24
|
+
* The output format is a self-describing markdown document with:
|
|
25
|
+
* - A header section explaining the file purpose.
|
|
26
|
+
* - One `##` section per rule, using the rule name as the heading.
|
|
27
|
+
* - A generation timestamp for cache-busting diagnostics.
|
|
28
|
+
*/
|
|
29
|
+
function generatePolicyContent(rules) {
|
|
30
|
+
const timestamp = new Date().toISOString();
|
|
31
|
+
const ruleSections = rules
|
|
32
|
+
.map(({ name, content }) => {
|
|
33
|
+
const sanitisedName = name.replace(/[`*#]/g, ' ').trim();
|
|
34
|
+
return `## ${sanitisedName}\n\n${content.trim()}`;
|
|
35
|
+
})
|
|
36
|
+
.join('\n\n---\n\n');
|
|
37
|
+
return [
|
|
38
|
+
'---',
|
|
39
|
+
'title: CSP AI Agent Routing Policy',
|
|
40
|
+
`generated_at: ${timestamp}`,
|
|
41
|
+
`rule_count: ${rules.length}`,
|
|
42
|
+
'---',
|
|
43
|
+
'',
|
|
44
|
+
'# CSP AI Agent Routing Policy',
|
|
45
|
+
'',
|
|
46
|
+
'> Auto-generated by CSP AI Agent MCP. Do not edit manually.',
|
|
47
|
+
'> This file is refreshed automatically on `sync_resources`.',
|
|
48
|
+
'',
|
|
49
|
+
ruleSections,
|
|
50
|
+
'',
|
|
51
|
+
].join('\n');
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=policy-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-generator.js","sourceRoot":"","sources":["../../src/tools/policy-generator.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;AAgBH,sDAyBC;AAlCD;;;;;;;;GAQG;AACH,SAAgB,qBAAqB,CAAC,KAAoB;IACxD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE3C,MAAM,YAAY,GAAG,KAAK;SACvB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QACzB,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACzD,OAAO,MAAM,aAAa,OAAO,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;IACpD,CAAC,CAAC;SACD,IAAI,CAAC,aAAa,CAAC,CAAC;IAEvB,OAAO;QACL,KAAK;QACL,oCAAoC;QACpC,iBAAiB,SAAS,EAAE;QAC5B,eAAe,KAAK,CAAC,MAAM,EAAE;QAC7B,KAAK;QACL,EAAE;QACF,+BAA+B;QAC/B,EAAE;QACF,6DAA6D;QAC7D,6DAA6D;QAC7D,EAAE;QACF,YAAY;QACZ,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-prompt-content.d.ts","sourceRoot":"","sources":["../../src/tools/resolve-prompt-content.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;
|
|
1
|
+
{"version":3,"file":"resolve-prompt-content.d.ts","sourceRoot":"","sources":["../../src/tools/resolve-prompt-content.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AASH,OAAO,KAAK,EAEV,0BAA0B,EAC1B,UAAU,EACX,MAAM,gBAAgB,CAAC;AAExB,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC,CAmGjD;AA8KD,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCpC,CAAC"}
|
|
@@ -65,6 +65,7 @@ const index_js_1 = require("../prompts/index.js");
|
|
|
65
65
|
const client_js_1 = require("../api/client.js");
|
|
66
66
|
const multi_source_manager_js_1 = require("../git/multi-source-manager.js");
|
|
67
67
|
const md_reference_expander_js_1 = require("../utils/md-reference-expander.js");
|
|
68
|
+
const index_js_2 = require("../telemetry/index.js");
|
|
68
69
|
async function resolvePromptContent(params) {
|
|
69
70
|
const p = params;
|
|
70
71
|
const promptName = typeof p.prompt_name === 'string' && p.prompt_name.trim() !== ''
|
|
@@ -120,6 +121,18 @@ async function resolvePromptContent(params) {
|
|
|
120
121
|
resourceId: resolved.meta.resource_id,
|
|
121
122
|
contentSource: resolved.contentSource,
|
|
122
123
|
}, 'resolve_prompt_content: prompt resolved successfully');
|
|
124
|
+
// Record telemetry directly on the server side so that invocations are always
|
|
125
|
+
// counted regardless of whether the AI Agent subsequently calls track_usage.
|
|
126
|
+
// Only commands and skills reach this path (rules are injected silently).
|
|
127
|
+
let usageRecorded = false;
|
|
128
|
+
if (userToken) {
|
|
129
|
+
await index_js_2.telemetry
|
|
130
|
+
.recordInvocation(resolved.meta.resource_id, resolved.meta.resource_type, resolved.meta.resource_name, userToken, jiraId)
|
|
131
|
+
.then(() => { usageRecorded = true; })
|
|
132
|
+
.catch((err) => {
|
|
133
|
+
logger_1.logger.warn({ resourceId: resolved.meta.resource_id, error: err.message }, 'resolve_prompt_content: telemetry recordInvocation failed (non-critical)');
|
|
134
|
+
});
|
|
135
|
+
}
|
|
123
136
|
return {
|
|
124
137
|
success: true,
|
|
125
138
|
data: {
|
|
@@ -130,7 +143,7 @@ async function resolvePromptContent(params) {
|
|
|
130
143
|
description: resolved.description,
|
|
131
144
|
content: resolved.content,
|
|
132
145
|
content_source: resolved.contentSource,
|
|
133
|
-
usage_tracked:
|
|
146
|
+
usage_tracked: usageRecorded,
|
|
134
147
|
},
|
|
135
148
|
};
|
|
136
149
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-prompt-content.js","sourceRoot":"","sources":["../../src/tools/resolve-prompt-content.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"resolve-prompt-content.js","sourceRoot":"","sources":["../../src/tools/resolve-prompt-content.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-resources.d.ts","sourceRoot":"","sources":["../../src/tools/search-resources.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAyB,qBAAqB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"search-resources.d.ts","sourceRoot":"","sources":["../../src/tools/search-resources.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAyB,qBAAqB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAoD/F,wBAAsB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC,CAkJjG;AAGD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6B/B,CAAC"}
|
|
@@ -12,6 +12,7 @@ const manager_1 = require("../filesystem/manager");
|
|
|
12
12
|
const cursor_paths_js_1 = require("../utils/cursor-paths.js");
|
|
13
13
|
const errors_1 = require("../types/errors");
|
|
14
14
|
const search_1 = require("../search");
|
|
15
|
+
const index_js_1 = require("../prompts/index.js");
|
|
15
16
|
// Search coordinator singleton
|
|
16
17
|
const searchCoordinator = new search_1.SearchCoordinator();
|
|
17
18
|
// Simple in-memory cache
|
|
@@ -88,6 +89,20 @@ async function searchResources(params) {
|
|
|
88
89
|
enhancedResults: enhancedResults.length,
|
|
89
90
|
topScore: enhancedResults[0]?.score
|
|
90
91
|
}, 'Search enhancement applied');
|
|
92
|
+
// Build a local subscription set from registered prompts for the current user.
|
|
93
|
+
// The server-side is_subscribed flag may be stale (token mismatch, cache, etc.)
|
|
94
|
+
// so we override it with the authoritative local promptManager state.
|
|
95
|
+
const userToken = typedParams.user_token ?? '';
|
|
96
|
+
const localSubscribedNames = new Set(index_js_1.promptManager.promptNames(userToken).map((promptName) => {
|
|
97
|
+
// Prompt names are "<type>/<resource_name>" where resource_name is already
|
|
98
|
+
// lowercased with spaces replaced by '-' (see buildPromptName).
|
|
99
|
+
// Extract just the resource_name portion for comparison against search results.
|
|
100
|
+
const slashIdx = promptName.indexOf('/');
|
|
101
|
+
return slashIdx >= 0 ? promptName.slice(slashIdx + 1) : promptName;
|
|
102
|
+
}));
|
|
103
|
+
// Normalize API resource names the same way buildPromptName does so the
|
|
104
|
+
// comparison is case/whitespace insensitive.
|
|
105
|
+
const normalizeResourceName = (name) => name.toLowerCase().replace(/\s+/g, '-');
|
|
91
106
|
// Check subscription and installation status for each result
|
|
92
107
|
const finalResults = await Promise.all(enhancedResults.map(async (resource) => {
|
|
93
108
|
// Check if installed locally in the Cursor directory for this resource type
|
|
@@ -100,8 +115,17 @@ async function searchResources(params) {
|
|
|
100
115
|
// Unknown type or path check failed — treat as not installed
|
|
101
116
|
isInstalled = false;
|
|
102
117
|
}
|
|
118
|
+
// Override is_subscribed with the local promptManager state.
|
|
119
|
+
// Local state is authoritative: if the prompt is registered in-memory,
|
|
120
|
+
// the resource is definitely subscribed regardless of the API response.
|
|
121
|
+
const locallySubscribed = localSubscribedNames.has(normalizeResourceName(resource.name));
|
|
122
|
+
const isSubscribed = locallySubscribed || Boolean(resource.is_subscribed);
|
|
123
|
+
if (locallySubscribed && !resource.is_subscribed) {
|
|
124
|
+
logger_1.logger.debug({ resourceName: resource.name, normalizedName: normalizeResourceName(resource.name), apiIsSubscribed: resource.is_subscribed }, 'search_resources: overriding is_subscribed=false from API with local promptManager state (true)');
|
|
125
|
+
}
|
|
103
126
|
return {
|
|
104
127
|
...resource,
|
|
128
|
+
is_subscribed: isSubscribed,
|
|
105
129
|
is_installed: isInstalled,
|
|
106
130
|
};
|
|
107
131
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-resources.js","sourceRoot":"","sources":["../../src/tools/search-resources.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;
|
|
1
|
+
{"version":3,"file":"search-resources.js","sourceRoot":"","sources":["../../src/tools/search-resources.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-resources.d.ts","sourceRoot":"","sources":["../../src/tools/sync-resources.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAeH,OAAO,KAAK,EAEV,mBAAmB,EAEnB,UAAU,EACX,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"sync-resources.d.ts","sourceRoot":"","sources":["../../src/tools/sync-resources.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAeH,OAAO,KAAK,EAEV,mBAAmB,EAEnB,UAAU,EACX,MAAM,gBAAgB,CAAC;AAuIxB,wBAAsB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,CAwpC7F;AAGD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8J7B,CAAC"}
|
|
@@ -62,6 +62,9 @@ const errors_1 = require("../types/errors");
|
|
|
62
62
|
const index_js_1 = require("../telemetry/index.js");
|
|
63
63
|
const index_js_2 = require("../prompts/index.js");
|
|
64
64
|
const md_reference_expander_js_1 = require("../utils/md-reference-expander.js");
|
|
65
|
+
const index_js_3 = require("../client-adapters/index.js");
|
|
66
|
+
const policy_generator_js_1 = require("./policy-generator.js");
|
|
67
|
+
const index_js_4 = require("../config/index.js");
|
|
65
68
|
const downloadCache = new Map();
|
|
66
69
|
function syncCacheKey(userToken, resourceId) {
|
|
67
70
|
return `${userToken}::${resourceId}`;
|
|
@@ -171,6 +174,13 @@ async function syncResources(params) {
|
|
|
171
174
|
? new Set(typedParams.resource_ids)
|
|
172
175
|
: null;
|
|
173
176
|
const confirmedFullSync = typedParams._confirmed_full_sync === true;
|
|
177
|
+
// Resolve client adapter: prefer the caller-supplied agent_profile, fall
|
|
178
|
+
// back to the server-wide config.agentProfile (set via CSP_AGENT_PROFILE).
|
|
179
|
+
const resolvedProfile = typedParams.agent_profile ?? index_js_4.config.agentProfile ?? 'cursor';
|
|
180
|
+
const clientAdapter = index_js_3.adapterRegistry.get(resolvedProfile);
|
|
181
|
+
// Collect per-rule content for Codex policy aggregation (stage 4).
|
|
182
|
+
// Each entry is raw rule markdown to be merged into csp-routing-policy.md.
|
|
183
|
+
const codexRuleContents = [];
|
|
174
184
|
(0, logger_1.logToolStep)('sync_resources', 'Parameters validated', {
|
|
175
185
|
mode,
|
|
176
186
|
scope,
|
|
@@ -736,8 +746,10 @@ async function syncResources(params) {
|
|
|
736
746
|
// not on this (possibly remote Linux) server.
|
|
737
747
|
if (sub.type === 'mcp') {
|
|
738
748
|
const mcpConfigFile = resourceFiles.find((f) => path.basename(f.path) === 'mcp-config.json');
|
|
739
|
-
//
|
|
740
|
-
const mcpJsonPath =
|
|
749
|
+
// Config path differs per client: mcp.json (Cursor) vs config.toml (Codex)
|
|
750
|
+
const mcpJsonPath = resolvedProfile === 'codex'
|
|
751
|
+
? clientAdapter.getMcpConfigPath() // ~/.codex/config.toml
|
|
752
|
+
: `${(0, cursor_paths_1.getCursorRootDirForClient)()}/mcp.json`;
|
|
741
753
|
// ── Optimization: skip if already configured (incremental mode only) ────
|
|
742
754
|
// In incremental mode, if the AI Agent reports this MCP server is already
|
|
743
755
|
// in ~/.cursor/mcp.json, skip downloading and generating write_file actions.
|
|
@@ -785,7 +797,25 @@ async function syncResources(params) {
|
|
|
785
797
|
catch {
|
|
786
798
|
logger_1.logger.warn({ resourceId: sub.id, resourceName: sub.name }, 'sync_resources: failed to parse mcp-config.json — treating as empty config');
|
|
787
799
|
}
|
|
788
|
-
if (
|
|
800
|
+
if (resolvedProfile === 'codex') {
|
|
801
|
+
// ── Codex MCP: inject server entry into config.toml via merge_toml ──
|
|
802
|
+
// The Codex CLI reads MCP server configuration from ~/.codex/config.toml.
|
|
803
|
+
// We emit a merge_toml action for the AI Agent to update that file.
|
|
804
|
+
// The value is the JSON-serialised mcp-config entry so the agent can
|
|
805
|
+
// parse and embed it in the correct TOML table.
|
|
806
|
+
const tomlPath = clientAdapter.getMcpConfigPath();
|
|
807
|
+
const serverName = cfg['name'] ?? sub.name;
|
|
808
|
+
localActions.push({
|
|
809
|
+
action: 'merge_toml',
|
|
810
|
+
toml_path: tomlPath,
|
|
811
|
+
key: `mcp.servers.${serverName}`,
|
|
812
|
+
value: JSON.stringify(cfg),
|
|
813
|
+
overwrite: false,
|
|
814
|
+
});
|
|
815
|
+
logger_1.logger.info({ resourceId: sub.id, resourceName: sub.name, serverName, tomlPath, profile: 'codex' }, 'sync_resources: Codex MCP — merge_toml action queued');
|
|
816
|
+
(0, logger_1.logToolStep)('sync_resources', 'Codex MCP: merge_toml queued', { resourceId: sub.id });
|
|
817
|
+
}
|
|
818
|
+
else if (typeof cfg['command'] === 'string') {
|
|
789
819
|
// ── Format A: local executable ──────────────────────────────────
|
|
790
820
|
const installDir = `${(0, cursor_paths_1.getCursorTypeDirForClient)('mcp')}/${sub.name}`;
|
|
791
821
|
const writeActions = [];
|
|
@@ -867,43 +897,57 @@ async function syncResources(params) {
|
|
|
867
897
|
}
|
|
868
898
|
else {
|
|
869
899
|
// No mcp-config.json: heuristic fallback
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
const normalised = path.normalize(file.path);
|
|
874
|
-
if (normalised.startsWith('..'))
|
|
875
|
-
continue;
|
|
876
|
-
const fileDest = `${installDir}/${normalised}`;
|
|
900
|
+
if (resolvedProfile === 'codex') {
|
|
901
|
+
// Codex: emit a bare merge_toml with minimal entry
|
|
902
|
+
const tomlPath = clientAdapter.getMcpConfigPath();
|
|
877
903
|
localActions.push({
|
|
878
|
-
action: '
|
|
879
|
-
|
|
880
|
-
|
|
904
|
+
action: 'merge_toml',
|
|
905
|
+
toml_path: tomlPath,
|
|
906
|
+
key: `mcp.servers.${sub.name}`,
|
|
907
|
+
value: JSON.stringify({ command: 'node', args: [] }),
|
|
908
|
+
overwrite: false,
|
|
881
909
|
});
|
|
882
|
-
|
|
910
|
+
logger_1.logger.info({ resourceId: sub.id, resourceName: sub.name, tomlPath, profile: 'codex' }, 'sync_resources: Codex MCP heuristic — merge_toml action queued (no mcp-config.json)');
|
|
911
|
+
}
|
|
912
|
+
else {
|
|
913
|
+
const installDir = `${(0, cursor_paths_1.getCursorTypeDirForClient)('mcp')}/${sub.name}`;
|
|
914
|
+
const writeActions = [];
|
|
915
|
+
for (const file of resourceFiles) {
|
|
916
|
+
const normalised = path.normalize(file.path);
|
|
917
|
+
if (normalised.startsWith('..'))
|
|
918
|
+
continue;
|
|
919
|
+
const fileDest = `${installDir}/${normalised}`;
|
|
920
|
+
localActions.push({
|
|
921
|
+
action: 'write_file',
|
|
922
|
+
path: fileDest,
|
|
923
|
+
...encodeForRender(file.path, file.content),
|
|
924
|
+
});
|
|
925
|
+
writeActions.push(fileDest);
|
|
926
|
+
}
|
|
927
|
+
const jsEntry = resourceFiles.find((f) => f.path.endsWith('.js'));
|
|
928
|
+
const pyEntry = resourceFiles.find((f) => f.path.endsWith('.py'));
|
|
929
|
+
const entryFile = jsEntry ?? pyEntry ?? resourceFiles[0];
|
|
930
|
+
const cmd = jsEntry ? 'node' : 'python3';
|
|
931
|
+
const entryPath = `${installDir}/${entryFile?.path ?? ''}`;
|
|
932
|
+
localActions.push({
|
|
933
|
+
action: 'merge_mcp_json',
|
|
934
|
+
mcp_json_path: mcpJsonPath,
|
|
935
|
+
server_name: sub.name,
|
|
936
|
+
entry: { command: cmd, args: [entryPath] },
|
|
937
|
+
skip_if_exists: true,
|
|
938
|
+
});
|
|
939
|
+
logger_1.logger.info({
|
|
940
|
+
resourceId: sub.id,
|
|
941
|
+
resourceName: sub.name,
|
|
942
|
+
format: 'heuristic',
|
|
943
|
+
installDir,
|
|
944
|
+
mcpJsonPath,
|
|
945
|
+
cmd,
|
|
946
|
+
entryPath,
|
|
947
|
+
writeFiles: writeActions,
|
|
948
|
+
}, 'sync_resources: MCP heuristic fallback — write_file + merge_mcp_json actions queued');
|
|
949
|
+
(0, logger_1.logToolStep)('sync_resources', 'MCP heuristic fallback: write_file + merge_mcp_json queued', { resourceId: sub.id });
|
|
883
950
|
}
|
|
884
|
-
const jsEntry = resourceFiles.find((f) => f.path.endsWith('.js'));
|
|
885
|
-
const pyEntry = resourceFiles.find((f) => f.path.endsWith('.py'));
|
|
886
|
-
const entryFile = jsEntry ?? pyEntry ?? resourceFiles[0];
|
|
887
|
-
const cmd = jsEntry ? 'node' : 'python3';
|
|
888
|
-
const entryPath = `${installDir}/${entryFile?.path ?? ''}`;
|
|
889
|
-
localActions.push({
|
|
890
|
-
action: 'merge_mcp_json',
|
|
891
|
-
mcp_json_path: mcpJsonPath,
|
|
892
|
-
server_name: sub.name,
|
|
893
|
-
entry: { command: cmd, args: [entryPath] },
|
|
894
|
-
skip_if_exists: true,
|
|
895
|
-
});
|
|
896
|
-
logger_1.logger.info({
|
|
897
|
-
resourceId: sub.id,
|
|
898
|
-
resourceName: sub.name,
|
|
899
|
-
format: 'heuristic',
|
|
900
|
-
installDir,
|
|
901
|
-
mcpJsonPath,
|
|
902
|
-
cmd,
|
|
903
|
-
entryPath,
|
|
904
|
-
writeFiles: writeActions,
|
|
905
|
-
}, 'sync_resources: MCP heuristic fallback — write_file + merge_mcp_json actions queued');
|
|
906
|
-
(0, logger_1.logToolStep)('sync_resources', 'MCP heuristic fallback: write_file + merge_mcp_json queued', { resourceId: sub.id });
|
|
907
951
|
}
|
|
908
952
|
tally.synced++;
|
|
909
953
|
details.push({ id: sub.id, name: sub.name, action: 'synced', version: resourceVersion });
|
|
@@ -917,11 +961,25 @@ async function syncResources(params) {
|
|
|
917
961
|
// or has different content, the AI writes it unconditionally, which also
|
|
918
962
|
// recovers files that were accidentally deleted by the user.
|
|
919
963
|
//
|
|
920
|
-
// DUAL-LAYER STRATEGY (v1.6):
|
|
964
|
+
// DUAL-LAYER STRATEGY (v1.6, Cursor only):
|
|
921
965
|
// - scope='global' → write to ~/.cursor/rules/ only (macOS support)
|
|
922
966
|
// - scope='workspace' → write to ${WORKSPACE}/.cursor/rules/ only (Windows support)
|
|
923
967
|
// - scope='all' → write to BOTH locations (maximum compatibility)
|
|
968
|
+
//
|
|
969
|
+
// CODEX STRATEGY: rules are aggregated into csp-routing-policy.md and injected
|
|
970
|
+
// via developer_instructions in config.toml (no .mdc files written to disk).
|
|
924
971
|
if (sub.type === 'rule') {
|
|
972
|
+
if (resolvedProfile === 'codex') {
|
|
973
|
+
// Collect rule content for policy aggregation; no individual file actions.
|
|
974
|
+
for (const file of resourceFiles) {
|
|
975
|
+
codexRuleContents.push({ name: sub.name, content: file.content });
|
|
976
|
+
}
|
|
977
|
+
logger_1.logger.info({ resourceId: sub.id, resourceName: sub.name, profile: 'codex' }, 'sync_resources: Rule collected for Codex policy aggregation');
|
|
978
|
+
tally.synced++;
|
|
979
|
+
details.push({ id: sub.id, name: sub.name, action: 'synced', version: resourceVersion });
|
|
980
|
+
continue;
|
|
981
|
+
}
|
|
982
|
+
// ── Cursor: dual-layer .mdc file strategy (unchanged) ──────────────
|
|
925
983
|
const writeActions = [];
|
|
926
984
|
// Determine target directories based on scope parameter
|
|
927
985
|
const targetDirs = [];
|
|
@@ -1000,7 +1058,43 @@ async function syncResources(params) {
|
|
|
1000
1058
|
else if (resourceIds) {
|
|
1001
1059
|
logger_1.logger.info({ resourceIdsFilter: [...resourceIds], expectedPromptCount: expectedPromptNames.size }, 'sync_resources: skipping pruneStalePrompts — resource_ids filter active (partial sync)');
|
|
1002
1060
|
}
|
|
1003
|
-
// ── Step 5:
|
|
1061
|
+
// ── Step 5 (Codex): Aggregate collected rules into policy actions ──────
|
|
1062
|
+
// If any rule content was collected during this sync run, materialise the
|
|
1063
|
+
// csp-routing-policy.md file and emit a merge_toml action to inject it
|
|
1064
|
+
// into developer_instructions in ~/.codex/config.toml.
|
|
1065
|
+
let restartRequired = false;
|
|
1066
|
+
let restartHint;
|
|
1067
|
+
if (resolvedProfile === 'codex' && codexRuleContents.length > 0) {
|
|
1068
|
+
try {
|
|
1069
|
+
const policyStrategy = clientAdapter.getPolicyStrategy();
|
|
1070
|
+
const policyContent = (0, policy_generator_js_1.generatePolicyContent)(codexRuleContents);
|
|
1071
|
+
const policyFile = policyStrategy.policyFile ?? '~/.csp-ai-agent/codex/csp-routing-policy.md';
|
|
1072
|
+
const tomlPath = policyStrategy.configTomlPath ?? '~/.codex/config.toml';
|
|
1073
|
+
const tomlKey = policyStrategy.configTomlKey ?? 'developer_instructions';
|
|
1074
|
+
// 1. Write the policy markdown file
|
|
1075
|
+
localActions.push({
|
|
1076
|
+
action: 'write_file',
|
|
1077
|
+
path: policyFile,
|
|
1078
|
+
content: policyContent,
|
|
1079
|
+
encoding: 'utf8',
|
|
1080
|
+
});
|
|
1081
|
+
// 2. Inject the policy file reference into developer_instructions
|
|
1082
|
+
localActions.push({
|
|
1083
|
+
action: 'merge_toml',
|
|
1084
|
+
toml_path: tomlPath,
|
|
1085
|
+
key: tomlKey,
|
|
1086
|
+
value: `Please read and follow the CSP routing policy at: ${policyFile}`,
|
|
1087
|
+
overwrite: false,
|
|
1088
|
+
});
|
|
1089
|
+
restartRequired = true;
|
|
1090
|
+
restartHint = `CSP routing policy has been updated. Please restart Codex for the policy to take effect: codex`;
|
|
1091
|
+
logger_1.logger.info({ profile: 'codex', policyFile, tomlPath, ruleCount: codexRuleContents.length }, 'sync_resources: Codex policy materialised — merge_toml action queued');
|
|
1092
|
+
}
|
|
1093
|
+
catch (err) {
|
|
1094
|
+
logger_1.logger.error({ error: err instanceof Error ? err.message : String(err) }, 'sync_resources: Failed to generate Codex policy');
|
|
1095
|
+
}
|
|
1096
|
+
}
|
|
1097
|
+
// ── Step 6: Health score ───────────────────────────────────────────────
|
|
1004
1098
|
const healthScore = tally.total > 0
|
|
1005
1099
|
? Math.round(((tally.synced + tally.cached + tally.skipped) / tally.total) * 100)
|
|
1006
1100
|
: 100;
|
|
@@ -1011,6 +1105,7 @@ async function syncResources(params) {
|
|
|
1011
1105
|
details,
|
|
1012
1106
|
...(skippedResources.length > 0 ? { skipped_resources: skippedResources } : {}),
|
|
1013
1107
|
...(localActions.length > 0 ? { local_actions_required: localActions } : {}),
|
|
1108
|
+
...(restartRequired ? { restart_required: true, restart_hint: restartHint } : {}),
|
|
1014
1109
|
};
|
|
1015
1110
|
const duration = Date.now() - startTime;
|
|
1016
1111
|
(0, logger_1.logToolCall)('sync_resources', 'user-id', params, duration);
|