@theihtisham/agent-shadow-brain 7.1.4 → 7.22.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/CHANGELOG.md +478 -462
- package/README.md +97 -24
- package/dist/brain/auto-update.js +1 -1
- package/dist/brain/auto-update.js.map +1 -1
- package/dist/brain/brain-portability.js +1 -1
- package/dist/brain/brain-portability.js.map +1 -1
- package/dist/brain/client-integrations.js +1 -1
- package/dist/brain/client-integrations.js.map +1 -1
- package/dist/brain/context-assembly.d.ts +10 -0
- package/dist/brain/context-assembly.d.ts.map +1 -1
- package/dist/brain/context-assembly.js +15 -6
- package/dist/brain/context-assembly.js.map +1 -1
- package/dist/brain/context-efficiency.d.ts +48 -0
- package/dist/brain/context-efficiency.d.ts.map +1 -0
- package/dist/brain/context-efficiency.js +34 -0
- package/dist/brain/context-efficiency.js.map +1 -0
- package/dist/brain/context-request.d.ts +1 -1
- package/dist/brain/context-request.d.ts.map +1 -1
- package/dist/brain/context-request.js +4 -2
- package/dist/brain/context-request.js.map +1 -1
- package/dist/brain/context-retrieval.d.ts +1 -1
- package/dist/brain/context-retrieval.d.ts.map +1 -1
- package/dist/brain/context-retrieval.js +2 -1
- package/dist/brain/context-retrieval.js.map +1 -1
- package/dist/brain/feature-settings.d.ts +5 -0
- package/dist/brain/feature-settings.d.ts.map +1 -1
- package/dist/brain/feature-settings.js +8 -2
- package/dist/brain/feature-settings.js.map +1 -1
- package/dist/brain/global-brain.d.ts +1 -1
- package/dist/brain/global-brain.d.ts.map +1 -1
- package/dist/brain/global-brain.js +1 -0
- package/dist/brain/global-brain.js.map +1 -1
- package/dist/brain/managed-project-skills.d.ts +48 -0
- package/dist/brain/managed-project-skills.d.ts.map +1 -0
- package/dist/brain/managed-project-skills.js +230 -0
- package/dist/brain/managed-project-skills.js.map +1 -0
- package/dist/brain/mcp-presence.d.ts +50 -0
- package/dist/brain/mcp-presence.d.ts.map +1 -0
- package/dist/brain/mcp-presence.js +214 -0
- package/dist/brain/mcp-presence.js.map +1 -0
- package/dist/brain/mcp-server.d.ts +12 -0
- package/dist/brain/mcp-server.d.ts.map +1 -1
- package/dist/brain/mcp-server.js +177 -31
- package/dist/brain/mcp-server.js.map +1 -1
- package/dist/brain/mcp-stdio.d.ts +1 -1
- package/dist/brain/mcp-stdio.d.ts.map +1 -1
- package/dist/brain/mcp-stdio.js +19 -1
- package/dist/brain/mcp-stdio.js.map +1 -1
- package/dist/brain/memory-annotations.d.ts +2 -0
- package/dist/brain/memory-annotations.d.ts.map +1 -1
- package/dist/brain/memory-annotations.js +13 -0
- package/dist/brain/memory-annotations.js.map +1 -1
- package/dist/brain/memory-inspection.d.ts +1 -0
- package/dist/brain/memory-inspection.d.ts.map +1 -1
- package/dist/brain/memory-inspection.js +1 -1
- package/dist/brain/memory-inspection.js.map +1 -1
- package/dist/brain/memory-mcp-content.d.ts +4 -2
- package/dist/brain/memory-mcp-content.d.ts.map +1 -1
- package/dist/brain/memory-mcp-content.js +20 -16
- package/dist/brain/memory-mcp-content.js.map +1 -1
- package/dist/brain/model-registry.d.ts +4 -5
- package/dist/brain/model-registry.d.ts.map +1 -1
- package/dist/brain/model-registry.js +22 -207
- package/dist/brain/model-registry.js.map +1 -1
- package/dist/brain/model-usage.d.ts +66 -0
- package/dist/brain/model-usage.d.ts.map +1 -0
- package/dist/brain/model-usage.js +246 -0
- package/dist/brain/model-usage.js.map +1 -0
- package/dist/brain/native-codex.d.ts +105 -0
- package/dist/brain/native-codex.d.ts.map +1 -0
- package/dist/brain/native-codex.js +292 -0
- package/dist/brain/native-codex.js.map +1 -0
- package/dist/brain/native-session-import.d.ts +56 -0
- package/dist/brain/native-session-import.d.ts.map +1 -0
- package/dist/brain/native-session-import.js +307 -0
- package/dist/brain/native-session-import.js.map +1 -0
- package/dist/brain/orchestrator.js +1 -1
- package/dist/brain/orchestrator.js.map +1 -1
- package/dist/brain/project-feedback.d.ts +1 -1
- package/dist/brain/project-feedback.d.ts.map +1 -1
- package/dist/brain/project-feedback.js +19 -8
- package/dist/brain/project-feedback.js.map +1 -1
- package/dist/brain/project-hub-contract.d.ts +6 -0
- package/dist/brain/project-hub-contract.d.ts.map +1 -1
- package/dist/brain/project-hub-contract.js +2 -1
- package/dist/brain/project-hub-contract.js.map +1 -1
- package/dist/brain/project-hub-mcp.d.ts +14 -0
- package/dist/brain/project-hub-mcp.d.ts.map +1 -1
- package/dist/brain/project-hub-mcp.js +6 -1
- package/dist/brain/project-hub-mcp.js.map +1 -1
- package/dist/brain/project-hub-store.d.ts +14 -2
- package/dist/brain/project-hub-store.d.ts.map +1 -1
- package/dist/brain/project-hub-store.js +70 -2
- package/dist/brain/project-hub-store.js.map +1 -1
- package/dist/brain/project-hub.d.ts +5 -0
- package/dist/brain/project-hub.d.ts.map +1 -1
- package/dist/brain/project-hub.js +23 -1
- package/dist/brain/project-hub.js.map +1 -1
- package/dist/brain/project-kit.d.ts +10 -0
- package/dist/brain/project-kit.d.ts.map +1 -1
- package/dist/brain/project-kit.js +80 -16
- package/dist/brain/project-kit.js.map +1 -1
- package/dist/brain/project-policy-delivery.d.ts +8 -0
- package/dist/brain/project-policy-delivery.d.ts.map +1 -0
- package/dist/brain/project-policy-delivery.js +38 -0
- package/dist/brain/project-policy-delivery.js.map +1 -0
- package/dist/brain/project-policy.d.ts +88 -0
- package/dist/brain/project-policy.d.ts.map +1 -0
- package/dist/brain/project-policy.js +267 -0
- package/dist/brain/project-policy.js.map +1 -0
- package/dist/brain/project-session-contract.d.ts +180 -0
- package/dist/brain/project-session-contract.d.ts.map +1 -0
- package/dist/brain/project-session-contract.js +50 -0
- package/dist/brain/project-session-contract.js.map +1 -0
- package/dist/brain/project-session-mcp.d.ts +145 -0
- package/dist/brain/project-session-mcp.d.ts.map +1 -0
- package/dist/brain/project-session-mcp.js +58 -0
- package/dist/brain/project-session-mcp.js.map +1 -0
- package/dist/brain/project-sessions.d.ts +97 -0
- package/dist/brain/project-sessions.d.ts.map +1 -0
- package/dist/brain/project-sessions.js +223 -0
- package/dist/brain/project-sessions.js.map +1 -0
- package/dist/brain/project-source-contract.d.ts +109 -0
- package/dist/brain/project-source-contract.d.ts.map +1 -0
- package/dist/brain/project-source-contract.js +2 -0
- package/dist/brain/project-source-contract.js.map +1 -0
- package/dist/brain/project-source-intake.d.ts +26 -0
- package/dist/brain/project-source-intake.d.ts.map +1 -0
- package/dist/brain/project-source-intake.js +457 -0
- package/dist/brain/project-source-intake.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/context-cli.d.ts.map +1 -1
- package/dist/context-cli.js +9 -3
- package/dist/context-cli.js.map +1 -1
- package/dist/dashboard/brain-hub-actions.d.ts.map +1 -1
- package/dist/dashboard/brain-hub-actions.js +232 -135
- package/dist/dashboard/brain-hub-actions.js.map +1 -1
- package/dist/dashboard/brain-hub-agent-dock.d.ts +2 -0
- package/dist/dashboard/brain-hub-agent-dock.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-agent-dock.js +255 -0
- package/dist/dashboard/brain-hub-agent-dock.js.map +1 -0
- package/dist/dashboard/brain-hub-brand-icons.d.ts +2 -0
- package/dist/dashboard/brain-hub-brand-icons.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-brand-icons.js +9 -0
- package/dist/dashboard/brain-hub-brand-icons.js.map +1 -0
- package/dist/dashboard/brain-hub-client.d.ts.map +1 -1
- package/dist/dashboard/brain-hub-client.js +433 -333
- package/dist/dashboard/brain-hub-client.js.map +1 -1
- package/dist/dashboard/brain-hub-context.d.ts +2 -0
- package/dist/dashboard/brain-hub-context.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-context.js +37 -0
- package/dist/dashboard/brain-hub-context.js.map +1 -0
- package/dist/dashboard/brain-hub-controls.d.ts +2 -0
- package/dist/dashboard/brain-hub-controls.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-controls.js +63 -0
- package/dist/dashboard/brain-hub-controls.js.map +1 -0
- package/dist/dashboard/brain-hub-exchanges.d.ts +2 -0
- package/dist/dashboard/brain-hub-exchanges.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-exchanges.js +82 -0
- package/dist/dashboard/brain-hub-exchanges.js.map +1 -0
- package/dist/dashboard/brain-hub-graph.d.ts.map +1 -1
- package/dist/dashboard/brain-hub-graph.js +236 -74
- package/dist/dashboard/brain-hub-graph.js.map +1 -1
- package/dist/dashboard/brain-hub-html.d.ts.map +1 -1
- package/dist/dashboard/brain-hub-html.js +56 -1
- package/dist/dashboard/brain-hub-html.js.map +1 -1
- package/dist/dashboard/brain-hub-knowledge.d.ts +2 -0
- package/dist/dashboard/brain-hub-knowledge.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-knowledge.js +33 -0
- package/dist/dashboard/brain-hub-knowledge.js.map +1 -0
- package/dist/dashboard/brain-hub-live.d.ts +2 -0
- package/dist/dashboard/brain-hub-live.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-live.js +151 -0
- package/dist/dashboard/brain-hub-live.js.map +1 -0
- package/dist/dashboard/brain-hub-managed-skills.d.ts +2 -0
- package/dist/dashboard/brain-hub-managed-skills.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-managed-skills.js +20 -0
- package/dist/dashboard/brain-hub-managed-skills.js.map +1 -0
- package/dist/dashboard/brain-hub-native.d.ts +2 -0
- package/dist/dashboard/brain-hub-native.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-native.js +44 -0
- package/dist/dashboard/brain-hub-native.js.map +1 -0
- package/dist/dashboard/brain-hub-project-views.d.ts.map +1 -1
- package/dist/dashboard/brain-hub-project-views.js +78 -77
- package/dist/dashboard/brain-hub-project-views.js.map +1 -1
- package/dist/dashboard/brain-hub-sessions.d.ts +2 -0
- package/dist/dashboard/brain-hub-sessions.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-sessions.js +40 -0
- package/dist/dashboard/brain-hub-sessions.js.map +1 -0
- package/dist/dashboard/brain-hub-usage.d.ts +2 -0
- package/dist/dashboard/brain-hub-usage.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-usage.js +28 -0
- package/dist/dashboard/brain-hub-usage.js.map +1 -0
- package/dist/dashboard/brain-hub-views.d.ts.map +1 -1
- package/dist/dashboard/brain-hub-views.js +151 -146
- package/dist/dashboard/brain-hub-views.js.map +1 -1
- package/dist/dashboard/live-workspace-html.js +1039 -1039
- package/dist/dashboard/managed-project-skills-api.d.ts +29 -0
- package/dist/dashboard/managed-project-skills-api.d.ts.map +1 -0
- package/dist/dashboard/managed-project-skills-api.js +28 -0
- package/dist/dashboard/managed-project-skills-api.js.map +1 -0
- package/dist/dashboard/native-codex-api.d.ts +83 -0
- package/dist/dashboard/native-codex-api.d.ts.map +1 -0
- package/dist/dashboard/native-codex-api.js +91 -0
- package/dist/dashboard/native-codex-api.js.map +1 -0
- package/dist/dashboard/project-file-watch.d.ts +46 -0
- package/dist/dashboard/project-file-watch.d.ts.map +1 -0
- package/dist/dashboard/project-file-watch.js +221 -0
- package/dist/dashboard/project-file-watch.js.map +1 -0
- package/dist/dashboard/project-live-stream.d.ts +33 -0
- package/dist/dashboard/project-live-stream.d.ts.map +1 -0
- package/dist/dashboard/project-live-stream.js +233 -0
- package/dist/dashboard/project-live-stream.js.map +1 -0
- package/dist/dashboard/project-policy-api.d.ts +37 -0
- package/dist/dashboard/project-policy-api.d.ts.map +1 -0
- package/dist/dashboard/project-policy-api.js +31 -0
- package/dist/dashboard/project-policy-api.js.map +1 -0
- package/dist/dashboard/project-session-api.d.ts +28 -0
- package/dist/dashboard/project-session-api.d.ts.map +1 -0
- package/dist/dashboard/project-session-api.js +84 -0
- package/dist/dashboard/project-session-api.js.map +1 -0
- package/dist/dashboard/project-source-api.d.ts +11 -0
- package/dist/dashboard/project-source-api.d.ts.map +1 -0
- package/dist/dashboard/project-source-api.js +67 -0
- package/dist/dashboard/project-source-api.js.map +1 -0
- package/dist/dashboard/project-workspace.d.ts.map +1 -1
- package/dist/dashboard/project-workspace.js +18 -0
- package/dist/dashboard/project-workspace.js.map +1 -1
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +64 -25
- package/dist/dashboard/server.js.map +1 -1
- package/dist/dashboard/v6-dashboard-html.d.ts +1 -1
- package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -1
- package/dist/dashboard/v6-dashboard-html.js +4261 -4309
- package/dist/dashboard/v6-dashboard-html.js.map +1 -1
- package/dist/dashboard/workspace-api.d.ts.map +1 -1
- package/dist/dashboard/workspace-api.js +105 -23
- package/dist/dashboard/workspace-api.js.map +1 -1
- package/dist/dashboard/workspace-status.d.ts +3 -0
- package/dist/dashboard/workspace-status.d.ts.map +1 -1
- package/dist/dashboard/workspace-status.js +4 -3
- package/dist/dashboard/workspace-status.js.map +1 -1
- package/dist/project-cli.js +1 -1
- package/dist/project-cli.js.map +1 -1
- package/docs/BRAND_ASSETS.md +36 -0
- package/docs/FEATURES_AND_LIMITS.md +29 -24
- package/docs/INTEGRATIONS.md +4 -2
- package/docs/LEARNING.md +1 -1
- package/docs/PROJECT_KIT.md +6 -1
- package/docs/QUICKSTART.md +62 -44
- package/docs/README.md +36 -33
- package/docs/SESSIONS.md +77 -0
- package/docs/SOURCE_INTAKE.md +33 -0
- package/docs/STATS.md +21 -21
- package/docs/VISUAL_GUIDE_v7.22.0.md +73 -0
- package/docs/WORKFLOW_INTEGRATION.md +3 -1
- package/docs/WORKSPACE.md +63 -37
- package/docs/assets/7.22.0-agent-dock-mobile.png +0 -0
- package/docs/assets/7.22.0-agent-dock.gif +0 -0
- package/docs/assets/7.22.0-agent-dock.png +0 -0
- package/docs/assets/7.22.0-hub-exchange.png +0 -0
- package/docs/assets/7.22.0-hub-exchanges.gif +0 -0
- package/docs/assets/7.22.0-hub-graph.png +0 -0
- package/docs/assets/7.22.0-hub-mobile-empty.png +0 -0
- package/docs/assets/7.22.0-managed-skills.png +0 -0
- package/docs/assets/7.22.0-plain-evidence.png +0 -0
- package/docs/assets/7.22.0-project-controls.png +0 -0
- package/docs/assets/7.22.0-sessions.png +0 -0
- package/docs/assets/7.22.0-teach-brain.png +0 -0
- package/docs/launch/RELEASE_ACCEPTANCE_v7.22.0.md +48 -0
- package/docs/launch/RELEASE_NOTES_v7.22.0.md +53 -0
- package/docs/launch/RESEARCH_AND_PLAN_v7.22.0.md +672 -0
- package/package.json +135 -130
- package/skills/shadow-workflow/SKILL.md +2 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed-project-skills.d.ts","sourceRoot":"","sources":["../../src/brain/managed-project-skills.ts"],"names":[],"mappings":"AAOA,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAS7E,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACjE,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;AAC3F,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,cAAc,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAC;IAAC,iBAAiB,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACjK,aAAa,CAAC,EAAE,kBAAkB,CAAC;CACpC;AAOD,qBAAa,iBAAkB,SAAQ,KAAK;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM;IAAmB,QAAQ,CAAC,MAAM,EAAE,MAAM;gBAAtD,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAW,MAAM,EAAE,MAAM;CAC5E;AAqED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM;;;;EAoBzD;AAoBD,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;;;EAGzF;AAQD,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;EAiDvF"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
import { GlobalBrain } from './global-brain.js';
|
|
5
|
+
import { MAX_PROJECT_SKILL_BYTES, PROJECT_SKILL_RECEIPT_DIR, replaceProjectFile, withProjectSkillWriteLock } from './project-kit.js';
|
|
6
|
+
import { ensureProjectDirectory, projectLocalPath, projectRoot, readProjectFile } from './project-kit-paths.js';
|
|
7
|
+
import { WORKFLOW_TARGETS } from './workflow-skills.js';
|
|
8
|
+
const disabledDirectory = '.shadow-brain/disabled-project-skills';
|
|
9
|
+
const hash = /^[a-f0-9]{64}$/u;
|
|
10
|
+
const MAX_RECEIPT_BYTES = 4096;
|
|
11
|
+
const MAX_RECEIPTS = 500;
|
|
12
|
+
const hostRefreshNote = 'Reload or restart the coding client to refresh skill discovery. Existing chats may still contain previously loaded instructions.';
|
|
13
|
+
const digest = (value) => createHash('sha256').update(value).digest('hex');
|
|
14
|
+
export class ManagedSkillError extends Error {
|
|
15
|
+
constructor(code, message, status) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.code = code;
|
|
18
|
+
this.status = status;
|
|
19
|
+
this.name = 'ManagedSkillError';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const conflict = (message) => { throw new ManagedSkillError('MANAGED_SKILL_CONFLICT', message, 409); };
|
|
23
|
+
const invalid = () => { throw new ManagedSkillError('MANAGED_SKILL_INVALID', 'Choose a managed skill and a supported action.', 400); };
|
|
24
|
+
const receiptPathOf = (id) => `${PROJECT_SKILL_RECEIPT_DIR}/${id}.json`;
|
|
25
|
+
const disabledPathOf = (id) => `${disabledDirectory}/${id}.md`;
|
|
26
|
+
const markerPathOf = (id) => `${PROJECT_SKILL_RECEIPT_DIR}/${id}.lifecycle.json`;
|
|
27
|
+
const markerText = (action, sha256) => JSON.stringify({ action, sha256 });
|
|
28
|
+
function parseRequest(raw, applying) {
|
|
29
|
+
const { id, action, planHash } = raw;
|
|
30
|
+
if (Object.keys(raw).some(key => !['id', 'action', ...(applying ? ['planHash'] : [])].includes(key)) ||
|
|
31
|
+
typeof id !== 'string' || !hash.test(id) || (action !== 'disable' && action !== 'enable' && action !== 'remove') ||
|
|
32
|
+
(applying && (typeof planHash !== 'string' || !hash.test(planHash))))
|
|
33
|
+
return invalid();
|
|
34
|
+
return { id, action, ...(typeof planHash === 'string' ? { planHash } : {}) };
|
|
35
|
+
}
|
|
36
|
+
function receipt(raw, projectId, id) {
|
|
37
|
+
let value;
|
|
38
|
+
try {
|
|
39
|
+
value = JSON.parse(raw.toString('utf8'));
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return conflict('The ownership receipt is invalid.');
|
|
43
|
+
}
|
|
44
|
+
if (!value || value.schemaVersion !== 1 || value.projectId !== projectId || typeof value.relativePath !== 'string' ||
|
|
45
|
+
typeof value.sha256 !== 'string' || !hash.test(value.sha256) || digest(value.relativePath) !== id) {
|
|
46
|
+
return conflict('The ownership receipt does not match this project and skill.');
|
|
47
|
+
}
|
|
48
|
+
const [file, name] = value.relativePath.split('/').slice(-2).reverse();
|
|
49
|
+
if (file !== 'SKILL.md' || !name || name.length > 63 || !/^[a-z0-9]+(?:-[a-z0-9]+)*$/u.test(name) ||
|
|
50
|
+
/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])$/iu.test(name))
|
|
51
|
+
return conflict('The receipt does not point to a supported Project Kit skill path.');
|
|
52
|
+
const targets = Object.keys(WORKFLOW_TARGETS).filter(target => `${WORKFLOW_TARGETS[target].skillRoot}/${name}/SKILL.md` === value.relativePath);
|
|
53
|
+
if (!targets.length)
|
|
54
|
+
return conflict('The receipt does not point to a supported Project Kit skill path.');
|
|
55
|
+
return { value, targets, name };
|
|
56
|
+
}
|
|
57
|
+
function readEntry(root, projectId, id) {
|
|
58
|
+
const receiptPath = receiptPathOf(id), disabledPath = disabledPathOf(id);
|
|
59
|
+
const raw = readProjectFile(root, receiptPath, MAX_RECEIPT_BYTES);
|
|
60
|
+
if (!raw)
|
|
61
|
+
throw new ManagedSkillError('MANAGED_SKILL_NOT_FOUND', 'Project Kit did not record ownership of this skill.', 404);
|
|
62
|
+
const { value, targets, name } = receipt(raw, projectId, id);
|
|
63
|
+
const base = { id, name, targets, relativePath: value.relativePath, sha256: value.sha256 };
|
|
64
|
+
const receiptHash = digest(raw);
|
|
65
|
+
try {
|
|
66
|
+
const marker = readProjectFile(root, markerPathOf(id), MAX_RECEIPT_BYTES);
|
|
67
|
+
const operations = ['disable', 'enable', 'remove'];
|
|
68
|
+
const pending = marker ? operations.find(action => markerText(action, receiptHash) === marker.toString('utf8')) ?? null : null;
|
|
69
|
+
if (marker && !pending)
|
|
70
|
+
return conflict('The pending operation does not match this ownership receipt.');
|
|
71
|
+
const disabled = readProjectFile(root, disabledPath, MAX_PROJECT_SKILL_BYTES);
|
|
72
|
+
const disabledHash = disabled ? digest(disabled) : null;
|
|
73
|
+
const installedPath = projectLocalPath(root, value.relativePath);
|
|
74
|
+
const exists = fs.lstatSync(installedPath, { throwIfNoEntry: false }) !== undefined;
|
|
75
|
+
const install = exists && (!disabled || pending === 'disable' || pending === 'enable') ? readProjectFile(root, value.relativePath, MAX_PROJECT_SKILL_BYTES) : undefined;
|
|
76
|
+
const installedHash = install ? digest(install) : null;
|
|
77
|
+
const expected = value.sha256;
|
|
78
|
+
let state, reason;
|
|
79
|
+
if (disabled && exists) {
|
|
80
|
+
state = 'conflict';
|
|
81
|
+
reason = pending && installedHash === expected && disabledHash === expected ?
|
|
82
|
+
`A verified ${pending} operation is pending. Preview it again to finish.` : 'The disabled copy and its discovery destination both exist. Preserve both and resolve the destination before continuing.';
|
|
83
|
+
}
|
|
84
|
+
else if ((installedHash && installedHash !== expected) || (disabledHash && disabledHash !== expected)) {
|
|
85
|
+
state = 'edited';
|
|
86
|
+
reason = 'The skill bytes differ from the ownership receipt.';
|
|
87
|
+
}
|
|
88
|
+
else if (disabledHash === expected)
|
|
89
|
+
state = 'disabled';
|
|
90
|
+
else if (installedHash === expected)
|
|
91
|
+
state = 'enabled';
|
|
92
|
+
else {
|
|
93
|
+
state = 'missing';
|
|
94
|
+
reason = pending === 'remove' ? 'A verified removal is pending. Preview Remove to finish it.' : 'The managed skill file is missing.';
|
|
95
|
+
}
|
|
96
|
+
return { skill: { ...base, state, ownershipVerified: state === 'enabled' || state === 'disabled', ...(reason ? { reason } : {}),
|
|
97
|
+
...(pending ? { pendingAction: pending } : {}) },
|
|
98
|
+
receiptPath, receiptHash, disabledPath, bytes: install ?? disabled, installedHash, disabledHash, pending };
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return { skill: { ...base, state: 'conflict', ownershipVerified: false, reason: 'A managed path is unsafe or could not be verified.' },
|
|
102
|
+
receiptPath, receiptHash, disabledPath, installedHash: null, disabledHash: null, pending: null };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export function listManagedProjectSkills(directory) {
|
|
106
|
+
const root = projectRoot(directory), projectId = GlobalBrain.projectIdFor(root);
|
|
107
|
+
const dir = projectLocalPath(root, PROJECT_SKILL_RECEIPT_DIR);
|
|
108
|
+
const stat = fs.lstatSync(dir, { throwIfNoEntry: false });
|
|
109
|
+
if (!stat)
|
|
110
|
+
return { projectId, skills: [], invalidReceipts: 0 };
|
|
111
|
+
if (!stat.isDirectory())
|
|
112
|
+
return conflict('Project Kit receipts require an ordinary directory.');
|
|
113
|
+
const skills = [];
|
|
114
|
+
let invalidReceipts = 0, seen = 0;
|
|
115
|
+
const handle = fs.opendirSync(dir);
|
|
116
|
+
try {
|
|
117
|
+
for (let item = handle.readSync(); item; item = handle.readSync()) {
|
|
118
|
+
if (++seen > MAX_RECEIPTS * 4)
|
|
119
|
+
throw new ManagedSkillError('MANAGED_SKILL_LIMIT', 'Project Kit has too many files in its ownership directory.', 422);
|
|
120
|
+
const id = item.name.slice(0, -5);
|
|
121
|
+
if (!item.name.endsWith('.json') || !hash.test(id))
|
|
122
|
+
continue;
|
|
123
|
+
if (skills.length + invalidReceipts >= MAX_RECEIPTS)
|
|
124
|
+
throw new ManagedSkillError('MANAGED_SKILL_LIMIT', 'Project Kit has more than 500 ownership receipts.', 422);
|
|
125
|
+
try {
|
|
126
|
+
skills.push(readEntry(root, projectId, id).skill);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
invalidReceipts++;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
handle.closeSync();
|
|
135
|
+
}
|
|
136
|
+
return { projectId, skills: skills.sort((a, b) => a.relativePath.localeCompare(b.relativePath)), invalidReceipts };
|
|
137
|
+
}
|
|
138
|
+
function plan(root, projectId, input, entry) {
|
|
139
|
+
const { skill, receiptPath, disabledPath, receiptHash, installedHash, disabledHash, pending } = entry;
|
|
140
|
+
const { state, relativePath } = skill;
|
|
141
|
+
const bothVerified = installedHash === skill.sha256 && disabledHash === skill.sha256;
|
|
142
|
+
const ordinary = input.action === 'enable' ? state === 'disabled' : input.action === 'disable' ? state === 'enabled' : skill.ownershipVerified;
|
|
143
|
+
const recovering = pending === input.action && (input.action === 'remove' ? state === 'missing' || skill.ownershipVerified : bothVerified || skill.ownershipVerified);
|
|
144
|
+
const allowed = pending ? recovering : ordinary;
|
|
145
|
+
const conflicts = allowed ? [] : [skill.reason ?? `This skill is ${state}.`];
|
|
146
|
+
const exactPaths = input.action === 'remove' ? [
|
|
147
|
+
...(installedHash ? [relativePath] : []), ...(disabledHash ? [disabledPath] : []), receiptPath,
|
|
148
|
+
] : pending && (input.action === 'enable' ? state === 'enabled' : state === 'disabled') ? [] : [relativePath, disabledPath];
|
|
149
|
+
const expectedHashes = { receipt: receiptHash, installed: installedHash, disabled: disabledHash };
|
|
150
|
+
const effects = pending && !exactPaths.length ? ['Finish the verified operation already recorded on disk.'] : input.action === 'disable' ? ['Move the verified skill outside host discovery.'] : input.action === 'enable' ?
|
|
151
|
+
['Restore the verified skill at its absent discovery path.'] : ['Remove the verified skill and its Project Kit ownership receipt.'];
|
|
152
|
+
const planHash = digest(JSON.stringify({ root, projectId, id: input.id, action: input.action, state, expectedHashes, exactPaths, conflicts, pending }));
|
|
153
|
+
return { projectId, skill, action: input.action, planHash, exactPaths, expectedHashes, conflicts, effects, hostRefreshNote };
|
|
154
|
+
}
|
|
155
|
+
export function previewManagedProjectSkill(directory, raw) {
|
|
156
|
+
const root = projectRoot(directory), projectId = GlobalBrain.projectIdFor(root), input = parseRequest(raw, false);
|
|
157
|
+
return plan(root, projectId, input, readEntry(root, projectId, input.id));
|
|
158
|
+
}
|
|
159
|
+
function unlinkVerified(root, relative, expected, limit) {
|
|
160
|
+
const value = readProjectFile(root, relative, limit);
|
|
161
|
+
if (!value || digest(value) !== expected)
|
|
162
|
+
return conflict('A managed file changed before it could be removed.');
|
|
163
|
+
fs.unlinkSync(projectLocalPath(root, relative));
|
|
164
|
+
}
|
|
165
|
+
export function applyManagedProjectSkill(directory, raw) {
|
|
166
|
+
const root = projectRoot(directory), projectId = GlobalBrain.projectIdFor(root), input = parseRequest(raw, true);
|
|
167
|
+
const initial = readEntry(root, projectId, input.id);
|
|
168
|
+
const initialPlan = plan(root, projectId, input, initial);
|
|
169
|
+
if (initialPlan.planHash !== input.planHash || initialPlan.conflicts.length)
|
|
170
|
+
return conflict(initialPlan.conflicts[0] ?? 'The skill changed. Create a new preview.');
|
|
171
|
+
return withProjectSkillWriteLock(root, () => {
|
|
172
|
+
const entry = readEntry(root, projectId, input.id);
|
|
173
|
+
const preview = plan(root, projectId, input, entry);
|
|
174
|
+
if (preview.planHash !== input.planHash || preview.conflicts.length)
|
|
175
|
+
return conflict(preview.conflicts[0] ?? 'The skill changed. Create a new preview.');
|
|
176
|
+
const { relativePath, sha256 } = entry.skill;
|
|
177
|
+
const { receiptPath, disabledPath, receiptHash, pending } = entry;
|
|
178
|
+
const marker = markerPathOf(input.id), record = markerText(input.action, receiptHash);
|
|
179
|
+
if (!pending)
|
|
180
|
+
replaceProjectFile(root, marker, record);
|
|
181
|
+
if (input.action !== 'remove') {
|
|
182
|
+
const restoring = input.action === 'enable';
|
|
183
|
+
const source = restoring ? disabledPath : relativePath, target = restoring ? relativePath : disabledPath;
|
|
184
|
+
const sourceHash = restoring ? entry.disabledHash : entry.installedHash;
|
|
185
|
+
const targetHash = restoring ? entry.installedHash : entry.disabledHash;
|
|
186
|
+
let copied = false;
|
|
187
|
+
try {
|
|
188
|
+
if (!targetHash) {
|
|
189
|
+
ensureProjectDirectory(root, path.posix.dirname(target));
|
|
190
|
+
replaceProjectFile(root, target, entry.bytes);
|
|
191
|
+
copied = true;
|
|
192
|
+
}
|
|
193
|
+
if (sourceHash)
|
|
194
|
+
unlinkVerified(root, source, sha256, MAX_PROJECT_SKILL_BYTES);
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
try {
|
|
198
|
+
if (copied)
|
|
199
|
+
unlinkVerified(root, target, sha256, MAX_PROJECT_SKILL_BYTES);
|
|
200
|
+
if (!pending)
|
|
201
|
+
unlinkVerified(root, marker, digest(record), MAX_RECEIPT_BYTES);
|
|
202
|
+
}
|
|
203
|
+
catch { /* Preserve changed or recoverable copies. */ }
|
|
204
|
+
throw error;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
if (entry.skill.state !== 'missing')
|
|
209
|
+
unlinkVerified(root, entry.skill.state === 'disabled' ? disabledPath : relativePath, sha256, MAX_PROJECT_SKILL_BYTES);
|
|
210
|
+
// Replace the verified journal with the verified receipt. This atomically removes the active receipt,
|
|
211
|
+
// while keeping evidence of completion outside the inventory if the process stops during cleanup.
|
|
212
|
+
const verified = readProjectFile(root, receiptPath, MAX_RECEIPT_BYTES);
|
|
213
|
+
if (!verified || digest(verified) !== receiptHash)
|
|
214
|
+
return conflict('The ownership receipt changed before removal.');
|
|
215
|
+
const journal = readProjectFile(root, marker, MAX_RECEIPT_BYTES);
|
|
216
|
+
if (!journal || digest(journal) !== digest(record))
|
|
217
|
+
return conflict('The pending removal record changed.');
|
|
218
|
+
fs.renameSync(projectLocalPath(root, receiptPath), projectLocalPath(root, marker));
|
|
219
|
+
try {
|
|
220
|
+
unlinkVerified(root, marker, receiptHash, MAX_RECEIPT_BYTES);
|
|
221
|
+
}
|
|
222
|
+
catch { /* Active receipt removal committed. */ }
|
|
223
|
+
}
|
|
224
|
+
if (input.action !== 'remove')
|
|
225
|
+
unlinkVerified(root, marker, digest(record), MAX_RECEIPT_BYTES);
|
|
226
|
+
return { projectId, id: input.id, finalState: input.action === 'disable' ? 'disabled' : input.action === 'enable' ? 'enabled' : 'removed',
|
|
227
|
+
changedPaths: preview.exactPaths, preservedPaths: input.action === 'remove' ? [] : [receiptPath], hostRefreshNote };
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=managed-project-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed-project-skills.js","sourceRoot":"","sources":["../../src/brain/managed-project-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export declare const MCP_PRESENCE_FILE = "mcp-presence.sqlite";
|
|
2
|
+
export declare const MCP_PRESENCE_LIMITS: Readonly<{
|
|
3
|
+
connections: 128;
|
|
4
|
+
renewMs: 10000;
|
|
5
|
+
ttlMs: 30000;
|
|
6
|
+
storeBytes: number;
|
|
7
|
+
}>;
|
|
8
|
+
export declare class MCPPresenceError extends Error {
|
|
9
|
+
readonly code: 'MCP_PRESENCE_UNAVAILABLE' | 'MCP_PRESENCE_LIMIT' | 'MCP_PRESENCE_BUSY';
|
|
10
|
+
readonly status = 503;
|
|
11
|
+
constructor(code: 'MCP_PRESENCE_UNAVAILABLE' | 'MCP_PRESENCE_LIMIT' | 'MCP_PRESENCE_BUSY', message: string);
|
|
12
|
+
}
|
|
13
|
+
export interface MCPConnectionIdentity {
|
|
14
|
+
id: string;
|
|
15
|
+
tool: string;
|
|
16
|
+
}
|
|
17
|
+
/** A local stdio connection heartbeat, independent of host or model execution. */
|
|
18
|
+
export declare class MCPPresenceStore {
|
|
19
|
+
private readonly root;
|
|
20
|
+
private readonly projectId;
|
|
21
|
+
private readonly now;
|
|
22
|
+
constructor(root: string, projectId: string, now?: () => number);
|
|
23
|
+
private file;
|
|
24
|
+
private create;
|
|
25
|
+
private rows;
|
|
26
|
+
private access;
|
|
27
|
+
report(connection: MCPConnectionIdentity): void;
|
|
28
|
+
remove(connectionId: string): void;
|
|
29
|
+
read(enabled: boolean): {
|
|
30
|
+
projectId: string;
|
|
31
|
+
enabled: boolean;
|
|
32
|
+
count: number | null;
|
|
33
|
+
checkedAt: string;
|
|
34
|
+
expiresAfterMs: 30000;
|
|
35
|
+
connections: {
|
|
36
|
+
id: string;
|
|
37
|
+
tool: string;
|
|
38
|
+
startedAt: string;
|
|
39
|
+
lastSeenAt: string;
|
|
40
|
+
expiresAt: string;
|
|
41
|
+
ageMs: number;
|
|
42
|
+
}[];
|
|
43
|
+
tools: {
|
|
44
|
+
tool: string;
|
|
45
|
+
count: number;
|
|
46
|
+
}[];
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export declare function startMCPPresence(store: MCPPresenceStore, connection: MCPConnectionIdentity, enabled: () => boolean): () => void;
|
|
50
|
+
//# sourceMappingURL=mcp-presence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-presence.d.ts","sourceRoot":"","sources":["../../src/brain/mcp-presence.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,iBAAiB,wBAAwB,CAAC;AACvD,eAAO,MAAM,mBAAmB;;;;;EAA+F,CAAC;AAQhI,qBAAa,gBAAiB,SAAQ,KAAK;IAE7B,QAAQ,CAAC,IAAI,EAAE,0BAA0B,GAAG,oBAAoB,GAAG,mBAAmB;IADlG,QAAQ,CAAC,MAAM,OAAO;gBACD,IAAI,EAAE,0BAA0B,GAAG,oBAAoB,GAAG,mBAAmB,EAAE,OAAO,EAAE,MAAM;CACpH;AAID,MAAM,WAAW,qBAAqB;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAGnE,kFAAkF;AAClF,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAU,OAAO,CAAC,QAAQ,CAAC,SAAS;IAAU,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAtE,IAAI,EAAE,MAAM,EAAmB,SAAS,EAAE,MAAM,EAAmB,GAAG,eAAW;IAE9G,OAAO,CAAC,IAAI;IAqBZ,OAAO,CAAC,MAAM;IAiBd,OAAO,CAAC,IAAI;IAYZ,OAAO,CAAC,MAAM;IAwBd,MAAM,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI;IAe/C,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAOlC,IAAI,CAAC,OAAO,EAAE,OAAO;;;;;;;;;;;;;;;;;;;CAetB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,OAAO,GAAG,MAAM,IAAI,CA2B/H"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { closeSync, linkSync, lstatSync, openSync, unlinkSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
5
|
+
import { ensureProjectDirectory, projectLocalPath } from './project-kit-paths.js';
|
|
6
|
+
export const MCP_PRESENCE_FILE = 'mcp-presence.sqlite';
|
|
7
|
+
export const MCP_PRESENCE_LIMITS = Object.freeze({ connections: 128, renewMs: 10000, ttlMs: 30000, storeBytes: 1024 * 1024 });
|
|
8
|
+
const directory = '.shadow-brain';
|
|
9
|
+
const identity = /^mcp-[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/u;
|
|
10
|
+
const label = /^[A-Za-z0-9][A-Za-z0-9_. -]{0,63}$/u;
|
|
11
|
+
const time = (value) => typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 && value <= 8.64e15 - MCP_PRESENCE_LIMITS.ttlMs;
|
|
12
|
+
const pause = new Int32Array(new SharedArrayBuffer(4));
|
|
13
|
+
const startupRetryMs = [100, 300, 900];
|
|
14
|
+
export class MCPPresenceError extends Error {
|
|
15
|
+
constructor(code, message) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.code = code;
|
|
18
|
+
this.status = 503;
|
|
19
|
+
this.name = 'MCPPresenceError';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const unavailable = () => new MCPPresenceError('MCP_PRESENCE_UNAVAILABLE', 'MCP connection presence could not be read or updated.');
|
|
23
|
+
const busy = () => new MCPPresenceError('MCP_PRESENCE_BUSY', 'MCP connection presence is busy. Retry shortly.');
|
|
24
|
+
/** A local stdio connection heartbeat, independent of host or model execution. */
|
|
25
|
+
export class MCPPresenceStore {
|
|
26
|
+
constructor(root, projectId, now = Date.now) {
|
|
27
|
+
this.root = root;
|
|
28
|
+
this.projectId = projectId;
|
|
29
|
+
this.now = now;
|
|
30
|
+
}
|
|
31
|
+
file() {
|
|
32
|
+
const parent = projectLocalPath(this.root, directory);
|
|
33
|
+
const stat = lstatSync(parent, { throwIfNoEntry: false });
|
|
34
|
+
if (stat && (!stat.isDirectory() || stat.isSymbolicLink()))
|
|
35
|
+
throw unavailable();
|
|
36
|
+
const filename = join(parent, MCP_PRESENCE_FILE);
|
|
37
|
+
for (const suffix of ['-journal', '-wal', '-shm']) {
|
|
38
|
+
const sidecar = lstatSync(filename + suffix, { throwIfNoEntry: false });
|
|
39
|
+
if (sidecar && (!sidecar.isFile() || sidecar.isSymbolicLink() || sidecar.nlink !== 1 || sidecar.size > MCP_PRESENCE_LIMITS.storeBytes))
|
|
40
|
+
throw unavailable();
|
|
41
|
+
}
|
|
42
|
+
const deadline = performance.now() + 100;
|
|
43
|
+
for (;;) {
|
|
44
|
+
const entry = lstatSync(filename, { throwIfNoEntry: false });
|
|
45
|
+
if (!entry)
|
|
46
|
+
return { filename, exists: false };
|
|
47
|
+
if (!entry.isFile() || entry.isSymbolicLink() || entry.size > MCP_PRESENCE_LIMITS.storeBytes)
|
|
48
|
+
throw unavailable();
|
|
49
|
+
if (entry.nlink === 1)
|
|
50
|
+
return { filename, exists: true };
|
|
51
|
+
if (performance.now() >= deadline)
|
|
52
|
+
throw unavailable();
|
|
53
|
+
// A competing first writer briefly links a fully initialized database into place.
|
|
54
|
+
Atomics.wait(pause, 0, 0, 4);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
create(filename) {
|
|
58
|
+
const temporary = projectLocalPath(this.root, `${directory}/${MCP_PRESENCE_FILE}.${randomUUID()}.tmp`);
|
|
59
|
+
closeSync(openSync(temporary, 'wx', 0o600));
|
|
60
|
+
try {
|
|
61
|
+
const db = new DatabaseSync(temporary, { allowExtension: false });
|
|
62
|
+
try {
|
|
63
|
+
db.exec(`PRAGMA trusted_schema=OFF; BEGIN IMMEDIATE;
|
|
64
|
+
CREATE TABLE metadata (project TEXT PRIMARY KEY, version INTEGER NOT NULL) STRICT;
|
|
65
|
+
CREATE TABLE leases (id TEXT PRIMARY KEY, tool TEXT NOT NULL, startedAt INTEGER NOT NULL, lastSeenAt INTEGER NOT NULL) STRICT;`);
|
|
66
|
+
db.prepare('INSERT INTO metadata VALUES (?,1)').run(this.projectId);
|
|
67
|
+
db.exec('COMMIT');
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
db.close();
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
linkSync(temporary, filename);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
if (error.code !== 'EEXIST')
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
unlinkSync(temporary);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
rows(db) {
|
|
85
|
+
const metadata = db.prepare('SELECT project,version FROM metadata LIMIT 2').all();
|
|
86
|
+
if (metadata.length !== 1 || metadata[0].project !== this.projectId || metadata[0].version !== 1)
|
|
87
|
+
throw unavailable();
|
|
88
|
+
const rows = db.prepare('SELECT id,tool,startedAt,lastSeenAt FROM leases LIMIT ?').all(MCP_PRESENCE_LIMITS.connections + 1);
|
|
89
|
+
if (rows.length > MCP_PRESENCE_LIMITS.connections)
|
|
90
|
+
throw unavailable();
|
|
91
|
+
return rows.map(row => {
|
|
92
|
+
if (typeof row.id !== 'string' || !identity.test(row.id) || typeof row.tool !== 'string' || !label.test(row.tool) ||
|
|
93
|
+
!time(row.startedAt) || !time(row.lastSeenAt) || Number(row.startedAt) > Number(row.lastSeenAt))
|
|
94
|
+
throw unavailable();
|
|
95
|
+
return { id: row.id, tool: row.tool, startedAt: Number(row.startedAt), lastSeenAt: Number(row.lastSeenAt) };
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
access(mode, absent, use) {
|
|
99
|
+
let db;
|
|
100
|
+
try {
|
|
101
|
+
const target = this.file();
|
|
102
|
+
if (!target.exists && mode !== 'report')
|
|
103
|
+
return absent;
|
|
104
|
+
if (!target.exists) {
|
|
105
|
+
ensureProjectDirectory(this.root, directory);
|
|
106
|
+
this.create(target.filename);
|
|
107
|
+
if (!this.file().exists)
|
|
108
|
+
throw unavailable();
|
|
109
|
+
}
|
|
110
|
+
db = new DatabaseSync(target.filename, { readOnly: mode === 'read', allowExtension: false });
|
|
111
|
+
db.exec('PRAGMA busy_timeout=100; PRAGMA trusted_schema=OFF; ' + (mode === 'read' ? 'BEGIN;' : 'BEGIN IMMEDIATE;'));
|
|
112
|
+
const result = use(db, this.rows(db));
|
|
113
|
+
db.exec('COMMIT');
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
// Closing a failed transaction rolls it back before returning an unavailable result.
|
|
118
|
+
if (error instanceof MCPPresenceError)
|
|
119
|
+
throw error;
|
|
120
|
+
const sqliteCode = error?.errcode;
|
|
121
|
+
if (typeof sqliteCode === 'number' && [5, 6].includes(sqliteCode & 0xff))
|
|
122
|
+
throw busy();
|
|
123
|
+
throw unavailable();
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
db?.close();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
report(connection) {
|
|
130
|
+
if (!identity.test(connection.id) || !label.test(connection.tool))
|
|
131
|
+
throw unavailable();
|
|
132
|
+
this.access('report', undefined, (db, rows) => {
|
|
133
|
+
const now = this.now();
|
|
134
|
+
if (!time(now))
|
|
135
|
+
throw unavailable();
|
|
136
|
+
const oldest = now - MCP_PRESENCE_LIMITS.ttlMs;
|
|
137
|
+
const retained = rows.filter(row => row.lastSeenAt > oldest);
|
|
138
|
+
const current = retained.find(row => row.id === connection.id);
|
|
139
|
+
if ((current && current.tool !== connection.tool) || (current && current.lastSeenAt > now))
|
|
140
|
+
throw unavailable();
|
|
141
|
+
if (!current && retained.length >= MCP_PRESENCE_LIMITS.connections)
|
|
142
|
+
throw new MCPPresenceError('MCP_PRESENCE_LIMIT', 'The project reached its reporting connection limit.');
|
|
143
|
+
db.prepare('DELETE FROM leases WHERE lastSeenAt<=?').run(oldest);
|
|
144
|
+
db.prepare(`INSERT INTO leases VALUES (?,?,?,?) ON CONFLICT(id) DO UPDATE SET lastSeenAt=excluded.lastSeenAt`).run(connection.id, connection.tool, now, now);
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
remove(connectionId) {
|
|
148
|
+
if (!identity.test(connectionId))
|
|
149
|
+
throw unavailable();
|
|
150
|
+
this.access('remove', undefined, (db, rows) => {
|
|
151
|
+
if (rows.some(row => row.id === connectionId))
|
|
152
|
+
db.prepare('DELETE FROM leases WHERE id=?').run(connectionId);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
read(enabled) {
|
|
156
|
+
const rows = enabled ? this.access('read', [], (_db, stored) => stored) : [];
|
|
157
|
+
// Sample the clock after the snapshot, so a parallel write cannot look newer than the read.
|
|
158
|
+
const checkedAt = this.now();
|
|
159
|
+
if (!time(checkedAt))
|
|
160
|
+
throw unavailable();
|
|
161
|
+
const connections = rows.filter(row => row.lastSeenAt <= checkedAt && checkedAt - row.lastSeenAt < MCP_PRESENCE_LIMITS.ttlMs)
|
|
162
|
+
.sort((a, b) => a.tool.localeCompare(b.tool) || a.id.localeCompare(b.id)).map(row => ({ id: row.id, tool: row.tool,
|
|
163
|
+
startedAt: new Date(row.startedAt).toISOString(), lastSeenAt: new Date(row.lastSeenAt).toISOString(),
|
|
164
|
+
expiresAt: new Date(row.lastSeenAt + MCP_PRESENCE_LIMITS.ttlMs).toISOString(), ageMs: checkedAt - row.lastSeenAt }));
|
|
165
|
+
const counts = new Map();
|
|
166
|
+
for (const connection of connections)
|
|
167
|
+
counts.set(connection.tool, (counts.get(connection.tool) ?? 0) + 1);
|
|
168
|
+
return { projectId: this.projectId, enabled, count: enabled ? connections.length : null, checkedAt: new Date(checkedAt).toISOString(),
|
|
169
|
+
expiresAfterMs: MCP_PRESENCE_LIMITS.ttlMs, connections, tools: [...counts].map(([tool, count]) => ({ tool, count })) };
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
export function startMCPPresence(store, connection, enabled) {
|
|
173
|
+
let recorded = false;
|
|
174
|
+
let retry;
|
|
175
|
+
const remove = () => {
|
|
176
|
+
if (!recorded)
|
|
177
|
+
return;
|
|
178
|
+
try {
|
|
179
|
+
store.remove(connection.id);
|
|
180
|
+
recorded = false;
|
|
181
|
+
}
|
|
182
|
+
catch { /* Expiry remains the fallback. */ }
|
|
183
|
+
};
|
|
184
|
+
const renew = () => {
|
|
185
|
+
let active;
|
|
186
|
+
try {
|
|
187
|
+
active = enabled();
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
active = false;
|
|
191
|
+
}
|
|
192
|
+
try {
|
|
193
|
+
if (!active) {
|
|
194
|
+
remove();
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
store.report(connection);
|
|
198
|
+
recorded = true;
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
// Presence must not affect the MCP transport.
|
|
202
|
+
return error instanceof MCPPresenceError && error.code === 'MCP_PRESENCE_BUSY';
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
const start = (attempt) => {
|
|
206
|
+
if (renew() && attempt < startupRetryMs.length) {
|
|
207
|
+
retry = setTimeout(() => start(attempt + 1), startupRetryMs[attempt]).unref();
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
start(0);
|
|
211
|
+
const timer = setInterval(renew, MCP_PRESENCE_LIMITS.renewMs).unref();
|
|
212
|
+
return () => { clearInterval(timer); clearTimeout(retry); remove(); };
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=mcp-presence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-presence.js","sourceRoot":"","sources":["../../src/brain/mcp-presence.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,8 +18,10 @@ export declare class MCPServer {
|
|
|
18
18
|
private toolHandlers;
|
|
19
19
|
private readonly telemetrySession;
|
|
20
20
|
private telemetryAgent;
|
|
21
|
+
private reportedSessionTool;
|
|
21
22
|
private telemetryInitialized;
|
|
22
23
|
private telemetryWarning;
|
|
24
|
+
private stopStdioPresence?;
|
|
23
25
|
private hub?;
|
|
24
26
|
private hubClosing;
|
|
25
27
|
private readonly hubRequests;
|
|
@@ -63,11 +65,17 @@ export declare class MCPServer {
|
|
|
63
65
|
private handleSubconsciousInject;
|
|
64
66
|
private handleGlobalRecall;
|
|
65
67
|
private handleGlobalRecallScored;
|
|
68
|
+
private recallView;
|
|
69
|
+
private readProjectPolicy;
|
|
70
|
+
private assertToolParticipates;
|
|
71
|
+
private hiddenMemories;
|
|
72
|
+
private handleProjectPolicy;
|
|
66
73
|
private handleGlobalStats;
|
|
67
74
|
private handleGlobalStorageHealth;
|
|
68
75
|
private handleWorkflowAnalyze;
|
|
69
76
|
private handleWorkflowSkills;
|
|
70
77
|
private handleContextPack;
|
|
78
|
+
private handleMemoryEvidence;
|
|
71
79
|
private handleMemoryInspect;
|
|
72
80
|
private handleMemoryHealth;
|
|
73
81
|
private handleFeatureFlags;
|
|
@@ -85,9 +93,13 @@ export declare class MCPServer {
|
|
|
85
93
|
private handleProjectKit;
|
|
86
94
|
private hubAvailable;
|
|
87
95
|
private handleProjectHub;
|
|
96
|
+
private handleProjectSession;
|
|
88
97
|
private telemetryProject;
|
|
89
98
|
private recordMeasured;
|
|
99
|
+
/** Activated by a completed stdio handshake, separately from JSON-RPC initialize. */
|
|
100
|
+
startStdioPresence(): (() => void) | undefined;
|
|
90
101
|
finishMemorySession(): Promise<void>;
|
|
102
|
+
private handleUsageReport;
|
|
91
103
|
private handleActivityReport;
|
|
92
104
|
private validateMemoryArguments;
|
|
93
105
|
private handleInitialize;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/brain/mcp-server.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAW,gBAAgB,EAAc,MAAM,aAAa,CAAC;AAC7F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/brain/mcp-server.ts"],"names":[],"mappings":"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"}
|