@theihtisham/agent-shadow-brain 7.1.0 → 7.1.3
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 +22 -0
- package/README.md +47 -407
- package/dist/activity-cli.d.ts +3 -0
- package/dist/activity-cli.d.ts.map +1 -0
- package/dist/activity-cli.js +78 -0
- package/dist/activity-cli.js.map +1 -0
- package/dist/adapters/index.d.ts +2 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +3 -2
- package/dist/adapters/index.js.map +1 -1
- package/dist/brain/activity-journal.d.ts +82 -0
- package/dist/brain/activity-journal.d.ts.map +1 -0
- package/dist/brain/activity-journal.js +314 -0
- package/dist/brain/activity-journal.js.map +1 -0
- package/dist/brain/activity-reporting.d.ts +14 -0
- package/dist/brain/activity-reporting.d.ts.map +1 -0
- package/dist/brain/activity-reporting.js +17 -0
- package/dist/brain/activity-reporting.js.map +1 -0
- package/dist/brain/auto-update.js +1 -1
- package/dist/brain/brain-portability.js +1 -1
- package/dist/brain/client-integrations.d.ts +61 -0
- package/dist/brain/client-integrations.d.ts.map +1 -0
- package/dist/brain/client-integrations.js +98 -0
- package/dist/brain/client-integrations.js.map +1 -0
- package/dist/brain/context-assembly.d.ts +76 -0
- package/dist/brain/context-assembly.d.ts.map +1 -0
- package/dist/brain/context-assembly.js +305 -0
- package/dist/brain/context-assembly.js.map +1 -0
- package/dist/brain/feature-settings.d.ts +58 -0
- package/dist/brain/feature-settings.d.ts.map +1 -0
- package/dist/brain/feature-settings.js +241 -0
- package/dist/brain/feature-settings.js.map +1 -0
- package/dist/brain/global-brain.d.ts +7 -0
- package/dist/brain/global-brain.d.ts.map +1 -1
- package/dist/brain/global-brain.js +19 -4
- package/dist/brain/global-brain.js.map +1 -1
- package/dist/brain/mcp-server.d.ts +21 -1
- package/dist/brain/mcp-server.d.ts.map +1 -1
- package/dist/brain/mcp-server.js +191 -25
- package/dist/brain/mcp-server.js.map +1 -1
- package/dist/brain/mcp-stdio.d.ts +12 -0
- package/dist/brain/mcp-stdio.d.ts.map +1 -0
- package/dist/brain/mcp-stdio.js +134 -0
- package/dist/brain/mcp-stdio.js.map +1 -0
- package/dist/brain/memory-annotations.d.ts +97 -0
- package/dist/brain/memory-annotations.d.ts.map +1 -0
- package/dist/brain/memory-annotations.js +388 -0
- package/dist/brain/memory-annotations.js.map +1 -0
- package/dist/brain/memory-graph.d.ts.map +1 -1
- package/dist/brain/memory-graph.js +12 -23
- package/dist/brain/memory-graph.js.map +1 -1
- package/dist/brain/memory-sources.d.ts +8 -0
- package/dist/brain/memory-sources.d.ts.map +1 -0
- package/dist/brain/memory-sources.js +27 -0
- package/dist/brain/memory-sources.js.map +1 -0
- package/dist/brain/orchestrator.js +1 -1
- package/dist/brain/subconscious.d.ts +21 -24
- package/dist/brain/subconscious.d.ts.map +1 -1
- package/dist/brain/subconscious.js +82 -218
- package/dist/brain/subconscious.js.map +1 -1
- package/dist/brain/workflow-skills.d.ts +5 -5
- package/dist/cli.js +19 -2
- package/dist/cli.js.map +1 -1
- package/dist/context-cli.d.ts +3 -0
- package/dist/context-cli.d.ts.map +1 -0
- package/dist/context-cli.js +56 -0
- package/dist/context-cli.js.map +1 -0
- package/dist/curation-cli.d.ts +4 -0
- package/dist/curation-cli.d.ts.map +1 -0
- package/dist/curation-cli.js +118 -0
- package/dist/curation-cli.js.map +1 -0
- package/dist/dashboard/live-workspace-html.d.ts +2 -0
- package/dist/dashboard/live-workspace-html.d.ts.map +1 -0
- package/dist/dashboard/live-workspace-html.js +893 -0
- package/dist/dashboard/live-workspace-html.js.map +1 -0
- package/dist/dashboard/server.d.ts +1 -0
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +53 -18
- 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 +7 -29
- package/dist/dashboard/v6-dashboard-html.js.map +1 -1
- package/dist/dashboard/workspace-api.d.ts +16 -0
- package/dist/dashboard/workspace-api.d.ts.map +1 -0
- package/dist/dashboard/workspace-api.js +309 -0
- package/dist/dashboard/workspace-api.js.map +1 -0
- package/dist/dashboard/workspace-html.d.ts +2 -0
- package/dist/dashboard/workspace-html.d.ts.map +1 -0
- package/dist/dashboard/workspace-html.js +2132 -0
- package/dist/dashboard/workspace-html.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/integration-cli.d.ts +3 -0
- package/dist/integration-cli.d.ts.map +1 -0
- package/dist/integration-cli.js +14 -0
- package/dist/integration-cli.js.map +1 -0
- package/dist/types.d.ts +12 -3
- package/dist/types.d.ts.map +1 -1
- package/docs/WORKSPACE.md +111 -0
- package/docs/assets/context-flow-v7.2.png +0 -0
- package/docs/assets/live-v7.1.3.png +0 -0
- package/docs/assets/memory-detail-v7.1.3.png +0 -0
- package/docs/assets/overview-v7.1.3.png +0 -0
- package/docs/assets/workspace-graph-v7.2.png +0 -0
- package/docs/assets/workspace-overview-v7.2.png +0 -0
- package/docs/launch/RELEASE_NOTES_v7.1.3.md +40 -0
- package/docs/launch/RELEASE_NOTES_v7.2.0.md +24 -0
- package/package.json +20 -121
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import { WORKFLOW_TARGETS, listBundledSkills } from './workflow-skills.js';
|
|
5
|
+
export const CLIENT_CAPABILITIES = Object.freeze([
|
|
6
|
+
{ id: 'codex', label: 'Codex', target: 'codex', docs: 'https://developers.openai.com/codex/mcp/' },
|
|
7
|
+
{ id: 'claude-code', label: 'Claude Code', target: 'claude-code', docs: 'https://code.claude.com/docs/en/mcp' },
|
|
8
|
+
{ id: 'opencode', label: 'OpenCode', target: 'opencode', docs: 'https://opencode.ai/docs/mcp-servers/' },
|
|
9
|
+
{ id: 'deepseek-harness', label: 'DeepSeek Harness', target: 'deepseek-harness', docs: 'https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/mcp/mcp-client/README.md' },
|
|
10
|
+
{ id: 'portable', label: 'Other compatible clients', target: 'portable', docs: 'https://modelcontextprotocol.io/specification/2025-06-18/basic/transports' },
|
|
11
|
+
]);
|
|
12
|
+
/** Inspect only explicitly selected project skill files, never client profiles or credentials. */
|
|
13
|
+
function safeProject(projectDir) {
|
|
14
|
+
const resolved = path.resolve(projectDir);
|
|
15
|
+
const root = path.parse(resolved).root;
|
|
16
|
+
const home = path.resolve(os.homedir());
|
|
17
|
+
const relative = path.relative(home, resolved);
|
|
18
|
+
const first = relative.split(path.sep)[0].toLowerCase();
|
|
19
|
+
if (resolved === root || !relative || ['.codex', '.claude', '.opencode', '.dsh', '.config', '.agents', '.ssh', '.shadow-brain'].includes(first)) {
|
|
20
|
+
throw new Error('Select a project directory outside home and global configuration roots.');
|
|
21
|
+
}
|
|
22
|
+
let current = root;
|
|
23
|
+
for (const part of resolved.slice(root.length).split(path.sep)) {
|
|
24
|
+
current = path.join(current, part);
|
|
25
|
+
let stat;
|
|
26
|
+
try {
|
|
27
|
+
stat = fs.lstatSync(current, { throwIfNoEntry: false });
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
throw new Error('The selected project cannot be inspected. Check directory access.');
|
|
31
|
+
}
|
|
32
|
+
if (!stat?.isDirectory() || stat.isSymbolicLink())
|
|
33
|
+
throw new Error('The selected project must exist without linked ancestors.');
|
|
34
|
+
}
|
|
35
|
+
return resolved;
|
|
36
|
+
}
|
|
37
|
+
function inspectSkill(root, relativePath) {
|
|
38
|
+
const parts = relativePath.split('/');
|
|
39
|
+
let current = root;
|
|
40
|
+
for (let i = 0; i < parts.length; i++) {
|
|
41
|
+
current = path.join(current, parts[i]);
|
|
42
|
+
let stat;
|
|
43
|
+
try {
|
|
44
|
+
stat = fs.lstatSync(current, { throwIfNoEntry: false });
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return 'blocked';
|
|
48
|
+
}
|
|
49
|
+
if (!stat)
|
|
50
|
+
return 'missing';
|
|
51
|
+
if (stat.isSymbolicLink() || (i < parts.length - 1 ? !stat.isDirectory() : !stat.isFile()))
|
|
52
|
+
return 'blocked';
|
|
53
|
+
}
|
|
54
|
+
return 'present';
|
|
55
|
+
}
|
|
56
|
+
export function inspectClientIntegrations(options = {}) {
|
|
57
|
+
let root;
|
|
58
|
+
let projectError;
|
|
59
|
+
if (options.projectDir) {
|
|
60
|
+
try {
|
|
61
|
+
root = safeProject(options.projectDir);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
projectError = error instanceof Error ? error.message : 'Project inspection failed.';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const skills = listBundledSkills().map(skill => skill.name);
|
|
68
|
+
const agents = CLIENT_CAPABILITIES.map(client => {
|
|
69
|
+
const skillRoot = WORKFLOW_TARGETS[client.target].skillRoot;
|
|
70
|
+
const checks = root ? skills.map(name => inspectSkill(root, skillRoot + '/' + name + '/SKILL.md')) : [];
|
|
71
|
+
const present = checks.filter(state => state === 'present').length;
|
|
72
|
+
const blocked = checks.includes('blocked');
|
|
73
|
+
const installation = projectError || blocked ? 'blocked' : !root ? 'not-checked' : present === skills.length ? 'complete' : present ? 'partial' : 'missing';
|
|
74
|
+
return {
|
|
75
|
+
id: client.id, label: client.label, installation, presentSkills: present, totalSkills: skills.length,
|
|
76
|
+
capabilities: ['Project workflow skills', 'MCP stdio when configured', 'Scoped context packs'],
|
|
77
|
+
detail: projectError || (blocked ? 'A skill path is linked or not a regular file. It was not read.' : root
|
|
78
|
+
? present + ' of ' + skills.length + ' skill files found. Host loading and live connections are not checked.'
|
|
79
|
+
: 'Choose a project to check skill-file presence. No client profile is inspected.'),
|
|
80
|
+
command: 'shadow-brain skills install . --target ' + client.target + ' --apply', docs: client.docs,
|
|
81
|
+
...(client.id === 'deepseek-harness' ? { note: 'Enable the filesystem-skill and MCP client plugins in the host; no MCP server is enabled by default.' } : {}),
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
const [major, minor] = process.versions.node.split('.').map(Number);
|
|
85
|
+
const supported = (major === 22 && minor >= 12) || major === 24 || major >= 26;
|
|
86
|
+
const health = options.brain?.getStorageHealth();
|
|
87
|
+
const checks = [
|
|
88
|
+
{ id: 'node', label: 'Node.js runtime', status: supported ? 'pass' : 'error', detail: process.versions.node },
|
|
89
|
+
{ id: 'project', label: 'Selected project', status: projectError ? 'error' : root ? 'pass' : 'unknown', detail: projectError || (root ? 'Project skill paths checked without reading client profiles.' : 'No project selected.') },
|
|
90
|
+
{ id: 'storage', label: 'Memory storage', status: health?.lastError ? 'error' : health?.initialized ? 'pass' : 'unknown',
|
|
91
|
+
detail: health?.lastError ? 'Storage reports ' + health.lastError.code + '.' : health?.initialized ? 'Store initialized; ' + health.pendingOperations + ' pending operations.' : 'Not initialized in this process. No read success is claimed.' },
|
|
92
|
+
{ id: 'stdio', label: 'MCP transport', status: 'pass', detail: 'Standalone memory/workflow stdio service is included. This is capability information, not a connected-client claim.', command: 'shadow-brain mcp --stdio' },
|
|
93
|
+
];
|
|
94
|
+
const result = { checkedAt: new Date().toISOString(), version: '7.1.3', checks, agents };
|
|
95
|
+
return { ...result, diagnostics: JSON.stringify({ version: result.version, checkedAt: result.checkedAt, node: process.versions.node,
|
|
96
|
+
checks, agents: agents.map(({ id, installation, presentSkills, totalSkills }) => ({ id, installation, presentSkills, totalSkills })) }, null, 2) };
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=client-integrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-integrations.js","sourceRoot":"","sources":["../../src/brain/client-integrations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { type GlobalBrain } from './global-brain.js';
|
|
2
|
+
import { type FeatureFlags } from './feature-settings.js';
|
|
3
|
+
import type { MemoryAnnotationSnapshot, MemoryRelationType } from './memory-annotations.js';
|
|
4
|
+
import type { AgentTool } from '../types.js';
|
|
5
|
+
export interface ContextAssemblyOptions {
|
|
6
|
+
projectId: string;
|
|
7
|
+
query?: string;
|
|
8
|
+
maxEntries?: number;
|
|
9
|
+
tokenBudget?: number;
|
|
10
|
+
maxChars?: number;
|
|
11
|
+
includeCrossProject?: boolean;
|
|
12
|
+
features?: Pick<FeatureFlags, 'contextAssembly' | 'crossProjectContext'>;
|
|
13
|
+
minImportance?: number;
|
|
14
|
+
lookbackHours?: number;
|
|
15
|
+
alwaysInclude?: readonly string[];
|
|
16
|
+
annotations?: MemoryAnnotationSnapshot;
|
|
17
|
+
}
|
|
18
|
+
export interface ContextMemoryRelation {
|
|
19
|
+
id: string;
|
|
20
|
+
type: MemoryRelationType;
|
|
21
|
+
memoryId: string;
|
|
22
|
+
otherMemoryId: string;
|
|
23
|
+
title?: string;
|
|
24
|
+
direction: 'incoming' | 'outgoing';
|
|
25
|
+
}
|
|
26
|
+
export interface ContextPackEntry {
|
|
27
|
+
id: string;
|
|
28
|
+
projectId: string;
|
|
29
|
+
projectName: string;
|
|
30
|
+
agentTool: AgentTool;
|
|
31
|
+
category: string;
|
|
32
|
+
excerpt: string;
|
|
33
|
+
excerptTruncated: boolean;
|
|
34
|
+
score: number;
|
|
35
|
+
createdAt: string | null;
|
|
36
|
+
matchedKeywords: string[];
|
|
37
|
+
sources: string[];
|
|
38
|
+
sourceReferences: Array<{
|
|
39
|
+
source: string;
|
|
40
|
+
memoryId: string;
|
|
41
|
+
}>;
|
|
42
|
+
duplicateIds: string[];
|
|
43
|
+
reasons: string[];
|
|
44
|
+
state: 'active';
|
|
45
|
+
related: ContextMemoryRelation[];
|
|
46
|
+
}
|
|
47
|
+
type InactiveReason = 'archived' | 'contested' | 'superseded';
|
|
48
|
+
type ContextExclusion = {
|
|
49
|
+
id: string;
|
|
50
|
+
projectId?: string;
|
|
51
|
+
title?: string;
|
|
52
|
+
reason: 'duplicate' | 'budget' | 'limit' | 'empty' | 'lookback' | InactiveReason;
|
|
53
|
+
};
|
|
54
|
+
export interface ContextPack {
|
|
55
|
+
enabled: boolean;
|
|
56
|
+
projectId: string;
|
|
57
|
+
scope: 'project' | 'cross-project';
|
|
58
|
+
queryKeywords: string[];
|
|
59
|
+
entries: ContextPackEntry[];
|
|
60
|
+
excluded: ContextExclusion[];
|
|
61
|
+
budget: {
|
|
62
|
+
tokenBudget: number;
|
|
63
|
+
maxChars: number;
|
|
64
|
+
usedChars: number;
|
|
65
|
+
estimatedTokens: number;
|
|
66
|
+
};
|
|
67
|
+
warnings: string[];
|
|
68
|
+
markdown: string;
|
|
69
|
+
}
|
|
70
|
+
type RecallSource = Pick<GlobalBrain, 'recallScored'> & Partial<Pick<GlobalBrain, 'getEntry'>>;
|
|
71
|
+
/** Share query cleanup with explained recall and limit the number of searched terms. */
|
|
72
|
+
export declare function contextQueryKeywords(query: string | undefined): string[];
|
|
73
|
+
/** Assemble bounded reference context from explained recall without reading files or writing memories. */
|
|
74
|
+
export declare function assembleContext(brain: RecallSource, options: ContextAssemblyOptions): ContextPack;
|
|
75
|
+
export {};
|
|
76
|
+
//# sourceMappingURL=context-assembly.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-assembly.d.ts","sourceRoot":"","sources":["../../src/brain/context-assembly.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { normalizeRecallKeywords } from './global-brain.js';
|
|
2
|
+
import { DEFAULT_FEATURE_FLAGS } from './feature-settings.js';
|
|
3
|
+
import { normalizeMemorySources } from './memory-sources.js';
|
|
4
|
+
const MAX_CANDIDATES = 200;
|
|
5
|
+
const MAX_ENTRIES = 30;
|
|
6
|
+
const DEFAULT_ENTRIES = 12;
|
|
7
|
+
const DEFAULT_TOKEN_BUDGET = 2000;
|
|
8
|
+
const MAX_CHARS = 48000;
|
|
9
|
+
const MAX_EXCERPT_CHARS = 800;
|
|
10
|
+
const MAX_QUERY_CHARS = 4096;
|
|
11
|
+
const MAX_QUERY_TERMS = 16;
|
|
12
|
+
const MAX_SOURCE_REFS = 4;
|
|
13
|
+
const MAX_SOURCE_CHARS = 180;
|
|
14
|
+
const MAX_CONTEXT_RELATIONS = 8;
|
|
15
|
+
const MAX_HIDDEN_REPORT = 200;
|
|
16
|
+
const MAX_TITLE_CHARS = 130;
|
|
17
|
+
const HOUR_MS = 60 * 60 * 1000;
|
|
18
|
+
const CONTRADICTION_REASON = 'Review the recorded contradiction before relying on this memory.';
|
|
19
|
+
function boundedInteger(value, fallback, max) {
|
|
20
|
+
return typeof value === 'number' && Number.isFinite(value)
|
|
21
|
+
? Math.max(0, Math.min(max, Math.trunc(value)))
|
|
22
|
+
: fallback;
|
|
23
|
+
}
|
|
24
|
+
function textLine(value) {
|
|
25
|
+
return value.replace(/[\u0000-\u0020\u007f-\u009f\s]+/g, ' ').trim();
|
|
26
|
+
}
|
|
27
|
+
function clip(value, maxChars) {
|
|
28
|
+
if (value.length <= maxChars)
|
|
29
|
+
return value;
|
|
30
|
+
return value.slice(0, maxChars - 1).replace(/[\ud800-\udbff]$/, '').trimEnd() + '…';
|
|
31
|
+
}
|
|
32
|
+
function safeMarkdown(value) {
|
|
33
|
+
return value.replace(/[\\\x60*_{}\[\]()<>#!|~]/g, '\\$&');
|
|
34
|
+
}
|
|
35
|
+
function scopedMemoryDetails(brain, projectId, broaden) {
|
|
36
|
+
const cache = new Map();
|
|
37
|
+
return (id, origin) => {
|
|
38
|
+
if ((!broaden && origin !== projectId) || !brain.getEntry)
|
|
39
|
+
return undefined;
|
|
40
|
+
const key = JSON.stringify([origin, id]);
|
|
41
|
+
if (!cache.has(key)) {
|
|
42
|
+
const memory = brain.getEntry(id);
|
|
43
|
+
if (memory?.id !== id || memory.projectId !== origin) {
|
|
44
|
+
cache.set(key, undefined);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
const title = clip(textLine(memory.content.trimStart().split(/\r\n?|\n/, 1)[0]), MAX_TITLE_CHARS);
|
|
48
|
+
cache.set(key, { projectId: origin, ...(title ? { title } : {}) });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return cache.get(key);
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/** Share query cleanup with explained recall and limit the number of searched terms. */
|
|
55
|
+
export function contextQueryKeywords(query) {
|
|
56
|
+
if (query === undefined)
|
|
57
|
+
return [];
|
|
58
|
+
if (typeof query !== 'string')
|
|
59
|
+
throw new TypeError('Context query must be text.');
|
|
60
|
+
const words = query.slice(0, MAX_QUERY_CHARS).match(/[\p{L}\p{N}_]+/gu) ?? [];
|
|
61
|
+
return normalizeRecallKeywords(words).slice(0, MAX_QUERY_TERMS);
|
|
62
|
+
}
|
|
63
|
+
function timestamp(date) {
|
|
64
|
+
const value = date.getTime();
|
|
65
|
+
return Number.isFinite(value) && value > 0 ? value : 0;
|
|
66
|
+
}
|
|
67
|
+
function sourceRefs(memory) {
|
|
68
|
+
return normalizeMemorySources(memory.metadata, { limit: MAX_SOURCE_REFS, maxChars: MAX_SOURCE_CHARS });
|
|
69
|
+
}
|
|
70
|
+
function describeMemory(memory, content, queryKeywords, related) {
|
|
71
|
+
const createdAt = timestamp(memory.createdAt);
|
|
72
|
+
const matchedKeywords = memory.confidence.explanation?.matchedKeywords ?? [];
|
|
73
|
+
const sources = sourceRefs(memory);
|
|
74
|
+
const reasons = [
|
|
75
|
+
queryKeywords.length
|
|
76
|
+
? 'Matches ' + matchedKeywords.length + ' of ' + queryKeywords.length + ' query terms.'
|
|
77
|
+
: 'Ranked by stored recall signals.',
|
|
78
|
+
];
|
|
79
|
+
if (sources.length)
|
|
80
|
+
reasons.push('Includes recorded source references.');
|
|
81
|
+
if (!createdAt)
|
|
82
|
+
reasons.push('Creation date is unavailable.');
|
|
83
|
+
if (related.some(relation => relation.type === 'contradicts'))
|
|
84
|
+
reasons.push(CONTRADICTION_REASON);
|
|
85
|
+
return {
|
|
86
|
+
id: memory.id,
|
|
87
|
+
projectId: memory.projectId,
|
|
88
|
+
projectName: memory.projectName,
|
|
89
|
+
agentTool: memory.agentTool,
|
|
90
|
+
category: memory.category,
|
|
91
|
+
excerpt: clip(content, MAX_EXCERPT_CHARS),
|
|
92
|
+
excerptTruncated: content.length > MAX_EXCERPT_CHARS,
|
|
93
|
+
score: memory.confidence.score,
|
|
94
|
+
createdAt: createdAt ? new Date(createdAt).toISOString() : null,
|
|
95
|
+
matchedKeywords: [...matchedKeywords],
|
|
96
|
+
sources,
|
|
97
|
+
sourceReferences: sources.map(source => ({ source, memoryId: memory.id })),
|
|
98
|
+
duplicateIds: [],
|
|
99
|
+
reasons,
|
|
100
|
+
state: 'active',
|
|
101
|
+
related,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function readCuration(brain, annotations, projectId, broaden, details) {
|
|
105
|
+
const hidden = new Map();
|
|
106
|
+
const related = new Map();
|
|
107
|
+
let orphanedReplacements = 0;
|
|
108
|
+
if (!annotations)
|
|
109
|
+
return { hidden, related, orphanedReplacements };
|
|
110
|
+
const inScope = (origin) => broaden || origin === projectId;
|
|
111
|
+
const exists = (origin, id) => !brain.getEntry || !!details(id, origin);
|
|
112
|
+
const attach = (id, relation) => {
|
|
113
|
+
const existing = related.get(id);
|
|
114
|
+
if (existing)
|
|
115
|
+
existing.push(relation);
|
|
116
|
+
else
|
|
117
|
+
related.set(id, [relation]);
|
|
118
|
+
};
|
|
119
|
+
for (const [id, review] of Object.entries(annotations.reviews)) {
|
|
120
|
+
if (review.state !== 'active' && inScope(review.projectId) && exists(review.projectId, id)) {
|
|
121
|
+
hidden.set(id, { id, projectId: review.projectId, reason: review.state, ...details(id, review.projectId) });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
for (const link of annotations.links) {
|
|
125
|
+
if (!inScope(link.projectId))
|
|
126
|
+
continue;
|
|
127
|
+
const fromExists = exists(link.projectId, link.fromId);
|
|
128
|
+
const toExists = exists(link.projectId, link.toId);
|
|
129
|
+
if (link.type === 'supersedes' && toExists) {
|
|
130
|
+
hidden.set(link.toId, {
|
|
131
|
+
id: link.toId, projectId: link.projectId, reason: 'superseded', ...details(link.toId, link.projectId),
|
|
132
|
+
});
|
|
133
|
+
if (!fromExists)
|
|
134
|
+
orphanedReplacements++;
|
|
135
|
+
}
|
|
136
|
+
if (!fromExists || !toExists)
|
|
137
|
+
continue;
|
|
138
|
+
const fromTitle = details(link.fromId, link.projectId)?.title;
|
|
139
|
+
const toTitle = details(link.toId, link.projectId)?.title;
|
|
140
|
+
attach(link.fromId, {
|
|
141
|
+
id: link.id, type: link.type, memoryId: link.fromId, otherMemoryId: link.toId, direction: 'outgoing',
|
|
142
|
+
...(toTitle ? { title: toTitle } : {}),
|
|
143
|
+
});
|
|
144
|
+
attach(link.toId, {
|
|
145
|
+
id: link.id, type: link.type, memoryId: link.toId, otherMemoryId: link.fromId, direction: 'incoming',
|
|
146
|
+
...(fromTitle ? { title: fromTitle } : {}),
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
return { hidden, related, orphanedReplacements };
|
|
150
|
+
}
|
|
151
|
+
function limitedRelations(relations = []) {
|
|
152
|
+
// Keep cautionary relations visible ahead of descriptive links when space is limited.
|
|
153
|
+
const priority = { contradicts: 0, supersedes: 1, supports: 2, related: 3 };
|
|
154
|
+
return [...relations].sort((a, b) => priority[a.type] - priority[b.type] ||
|
|
155
|
+
(a.id < b.id ? -1 : a.id > b.id ? 1 : 0)).slice(0, MAX_CONTEXT_RELATIONS);
|
|
156
|
+
}
|
|
157
|
+
function renderEntry(entry) {
|
|
158
|
+
const project = safeMarkdown(clip(textLine(entry.projectName || entry.projectId), 80));
|
|
159
|
+
const id = safeMarkdown(clip(textLine(entry.id), 100));
|
|
160
|
+
const category = safeMarkdown(clip(textLine(entry.category), 48));
|
|
161
|
+
const agent = safeMarkdown(clip(textLine(entry.agentTool), 36));
|
|
162
|
+
const references = entry.sources.map(safeMarkdown).join(', ');
|
|
163
|
+
const label = entry.excerptTruncated ? 'Excerpt: ' : '';
|
|
164
|
+
const contradictions = entry.related.filter(relation => relation.type === 'contradicts').slice(0, 3)
|
|
165
|
+
.map(relation => safeMarkdown(clip(textLine(relation.otherMemoryId), 100))).join(', ');
|
|
166
|
+
return [
|
|
167
|
+
'\n\n- ' + project + ' · ' + category + ' · ' + agent + ' · ' + id,
|
|
168
|
+
' > ' + label + safeMarkdown(entry.excerpt),
|
|
169
|
+
...(references ? [' Recorded references: ' + references] : []),
|
|
170
|
+
...(contradictions ? [' Recorded contradiction with: ' + contradictions + '. Check the conflicting evidence.'] : []),
|
|
171
|
+
].join('\n');
|
|
172
|
+
}
|
|
173
|
+
/** Assemble bounded reference context from explained recall without reading files or writing memories. */
|
|
174
|
+
export function assembleContext(brain, options) {
|
|
175
|
+
if (typeof options.projectId !== 'string' || !options.projectId.trim()) {
|
|
176
|
+
throw new TypeError('A nonempty project ID is required for context assembly.');
|
|
177
|
+
}
|
|
178
|
+
if (options.includeCrossProject !== undefined && typeof options.includeCrossProject !== 'boolean') {
|
|
179
|
+
throw new TypeError('Cross-project context opt-in must be a boolean.');
|
|
180
|
+
}
|
|
181
|
+
const projectId = options.projectId.trim();
|
|
182
|
+
const queryKeywords = contextQueryKeywords(options.query);
|
|
183
|
+
const features = options.features ?? DEFAULT_FEATURE_FLAGS;
|
|
184
|
+
const broaden = features.crossProjectContext === true && options.includeCrossProject === true;
|
|
185
|
+
const maxEntries = boundedInteger(options.maxEntries, DEFAULT_ENTRIES, MAX_ENTRIES);
|
|
186
|
+
const tokenBudget = boundedInteger(options.tokenBudget, DEFAULT_TOKEN_BUDGET, MAX_CHARS / 4);
|
|
187
|
+
const maxChars = Math.min(boundedInteger(options.maxChars, tokenBudget * 4, MAX_CHARS), tokenBudget * 4);
|
|
188
|
+
const pack = {
|
|
189
|
+
enabled: features.contextAssembly === true,
|
|
190
|
+
projectId,
|
|
191
|
+
scope: broaden ? 'cross-project' : 'project',
|
|
192
|
+
queryKeywords,
|
|
193
|
+
entries: [],
|
|
194
|
+
excluded: [],
|
|
195
|
+
budget: { tokenBudget, maxChars, usedChars: 0, estimatedTokens: 0 },
|
|
196
|
+
warnings: [],
|
|
197
|
+
markdown: '',
|
|
198
|
+
};
|
|
199
|
+
if (!pack.enabled) {
|
|
200
|
+
pack.warnings.push('Context assembly is disabled.');
|
|
201
|
+
return pack;
|
|
202
|
+
}
|
|
203
|
+
if (options.includeCrossProject && !broaden)
|
|
204
|
+
pack.warnings.push('Cross-project context is disabled in feature settings.');
|
|
205
|
+
const details = scopedMemoryDetails(brain, projectId, broaden);
|
|
206
|
+
const { hidden, related, orphanedReplacements } = readCuration(brain, options.annotations, projectId, broaden, details);
|
|
207
|
+
const exclude = (id, origin, reason) => {
|
|
208
|
+
pack.excluded.push({ id, reason, ...details(id, origin) });
|
|
209
|
+
};
|
|
210
|
+
if (hidden.size) {
|
|
211
|
+
pack.excluded.push(...[...hidden.values()].slice(0, MAX_HIDDEN_REPORT));
|
|
212
|
+
pack.warnings.push('Context hid ' + hidden.size + ' archived, contested, or superseded memories in scope before ranking.');
|
|
213
|
+
if (hidden.size > MAX_HIDDEN_REPORT)
|
|
214
|
+
pack.warnings.push('The excluded list shows the first ' + MAX_HIDDEN_REPORT + ' hidden memories.');
|
|
215
|
+
}
|
|
216
|
+
if (orphanedReplacements) {
|
|
217
|
+
pack.warnings.push(orphanedReplacements + ' superseded memories remain hidden after their replacements became unavailable.');
|
|
218
|
+
}
|
|
219
|
+
const ranked = brain.recallScored({
|
|
220
|
+
...(broaden ? {} : { projectId }),
|
|
221
|
+
keywords: queryKeywords,
|
|
222
|
+
limit: MAX_CANDIDATES + 1,
|
|
223
|
+
minImportance: options.minImportance,
|
|
224
|
+
...(hidden.size ? { excludeIds: new Set(hidden.keys()) } : {}),
|
|
225
|
+
});
|
|
226
|
+
const scoped = ranked.filter(memory => (broaden || memory.projectId === projectId) &&
|
|
227
|
+
hidden.get(memory.id)?.projectId !== memory.projectId);
|
|
228
|
+
if (scoped.length > MAX_CANDIDATES) {
|
|
229
|
+
pack.warnings.push('Context considered the highest-ranked ' + MAX_CANDIDATES + ' matching memories.');
|
|
230
|
+
}
|
|
231
|
+
// A task query can match an older lesson. The lookback is for the general recent briefing.
|
|
232
|
+
const cutoff = !queryKeywords.length && typeof options.lookbackHours === 'number' && Number.isFinite(options.lookbackHours)
|
|
233
|
+
? Date.now() - Math.max(0, options.lookbackHours) * HOUR_MS
|
|
234
|
+
: 0;
|
|
235
|
+
const groups = new Map();
|
|
236
|
+
for (const memory of scoped.slice(0, MAX_CANDIDATES)) {
|
|
237
|
+
if (cutoff && !options.alwaysInclude?.includes(memory.category) &&
|
|
238
|
+
Math.max(timestamp(memory.createdAt), timestamp(memory.lastAccessed)) < cutoff) {
|
|
239
|
+
exclude(memory.id, memory.projectId, 'lookback');
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
const content = textLine(memory.content);
|
|
243
|
+
if (!content) {
|
|
244
|
+
exclude(memory.id, memory.projectId, 'empty');
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
const key = JSON.stringify([memory.projectId, content.toLowerCase()]);
|
|
248
|
+
const duplicate = groups.get(key);
|
|
249
|
+
if (duplicate) {
|
|
250
|
+
duplicate.duplicateIds.push(memory.id);
|
|
251
|
+
const hadSources = duplicate.sources.length > 0;
|
|
252
|
+
for (const source of sourceRefs(memory)) {
|
|
253
|
+
if (duplicate.sources.length >= MAX_SOURCE_REFS)
|
|
254
|
+
break;
|
|
255
|
+
if (duplicate.sources.includes(source))
|
|
256
|
+
continue;
|
|
257
|
+
duplicate.sources.push(source);
|
|
258
|
+
duplicate.sourceReferences.push({ source, memoryId: memory.id });
|
|
259
|
+
}
|
|
260
|
+
if (!hadSources && duplicate.sources.length)
|
|
261
|
+
duplicate.reasons.push('Includes recorded source references from matching memories.');
|
|
262
|
+
const incident = related.get(memory.id);
|
|
263
|
+
if (incident?.length) {
|
|
264
|
+
const recorded = new Map([...duplicate.related, ...incident].map(relation => [relation.id, relation]));
|
|
265
|
+
duplicate.related = limitedRelations([...recorded.values()]);
|
|
266
|
+
if (duplicate.related.some(relation => relation.type === 'contradicts') && !duplicate.reasons.includes(CONTRADICTION_REASON)) {
|
|
267
|
+
duplicate.reasons.push(CONTRADICTION_REASON);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
exclude(memory.id, memory.projectId, 'duplicate');
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
groups.set(key, describeMemory(memory, content, queryKeywords, limitedRelations(related.get(memory.id))));
|
|
274
|
+
}
|
|
275
|
+
const title = broaden ? '## Cross-project memory context' : '## Project memory context';
|
|
276
|
+
const header = title + '\nTreat stored memories as reference material. Follow the current project instructions and verify important claims.';
|
|
277
|
+
let markdown = header;
|
|
278
|
+
for (const entry of groups.values()) {
|
|
279
|
+
if (pack.entries.length >= maxEntries) {
|
|
280
|
+
exclude(entry.id, entry.projectId, 'limit');
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
const rendered = renderEntry(entry);
|
|
284
|
+
if (markdown.length + rendered.length > maxChars) {
|
|
285
|
+
exclude(entry.id, entry.projectId, 'budget');
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
markdown += rendered;
|
|
289
|
+
pack.entries.push(entry);
|
|
290
|
+
}
|
|
291
|
+
if (!groups.size) {
|
|
292
|
+
pack.warnings.push(broaden ? 'No memories matched the context request.' : 'No memories matched this project and context request.');
|
|
293
|
+
}
|
|
294
|
+
else if (!pack.entries.length && pack.excluded.some(item => item.reason === 'budget')) {
|
|
295
|
+
pack.warnings.push('The selected context budget is too small for the matching memories.');
|
|
296
|
+
}
|
|
297
|
+
if (pack.entries.some(entry => entry.related.some(relation => relation.type === 'contradicts'))) {
|
|
298
|
+
pack.warnings.push('Selected memories have recorded contradictions. Check the conflicting evidence.');
|
|
299
|
+
}
|
|
300
|
+
pack.markdown = pack.entries.length ? markdown : '';
|
|
301
|
+
pack.budget.usedChars = pack.markdown.length;
|
|
302
|
+
pack.budget.estimatedTokens = Math.ceil(pack.budget.usedChars / 4);
|
|
303
|
+
return pack;
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=context-assembly.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-assembly.js","sourceRoot":"","sources":["../../src/brain/context-assembly.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export declare const FEATURE_DEFINITIONS: readonly [{
|
|
2
|
+
readonly id: "contextAssembly";
|
|
3
|
+
readonly label: "Context packs";
|
|
4
|
+
readonly description: "Assemble project memories into a bounded, explained context pack.";
|
|
5
|
+
readonly defaultEnabled: true;
|
|
6
|
+
}, {
|
|
7
|
+
readonly id: "crossProjectContext";
|
|
8
|
+
readonly label: "Cross-project context";
|
|
9
|
+
readonly description: "Allow context requests to include memories from other projects when explicitly selected.";
|
|
10
|
+
readonly defaultEnabled: false;
|
|
11
|
+
}, {
|
|
12
|
+
readonly id: "automaticBriefing";
|
|
13
|
+
readonly label: "Session briefings";
|
|
14
|
+
readonly description: "Generate the automatic project briefing at session start.";
|
|
15
|
+
readonly defaultEnabled: true;
|
|
16
|
+
}, {
|
|
17
|
+
readonly id: "liveActivity";
|
|
18
|
+
readonly label: "Live dashboard activity";
|
|
19
|
+
readonly description: "Show activity updates and the recent activity feed in the dashboard.";
|
|
20
|
+
readonly defaultEnabled: true;
|
|
21
|
+
}, {
|
|
22
|
+
readonly id: "activityRecording";
|
|
23
|
+
readonly label: "Record agent activity";
|
|
24
|
+
readonly description: "Record bounded tool timing and explicitly reported session phases. Arguments, memory text, and credentials are not captured.";
|
|
25
|
+
readonly defaultEnabled: true;
|
|
26
|
+
}];
|
|
27
|
+
export type FeatureId = typeof FEATURE_DEFINITIONS[number]['id'];
|
|
28
|
+
export type FeatureFlags = Record<FeatureId, boolean>;
|
|
29
|
+
export declare const DEFAULT_FEATURE_FLAGS: Readonly<FeatureFlags>;
|
|
30
|
+
export declare const FEATURE_SETTINGS_FILENAME = "feature-settings.json";
|
|
31
|
+
export interface FeatureSettingsSnapshot {
|
|
32
|
+
schemaVersion: 1;
|
|
33
|
+
revision: number;
|
|
34
|
+
updatedAt: string | null;
|
|
35
|
+
features: FeatureFlags;
|
|
36
|
+
}
|
|
37
|
+
export interface FeatureSettingsOptions {
|
|
38
|
+
filePath?: string;
|
|
39
|
+
lockTimeoutMs?: number;
|
|
40
|
+
}
|
|
41
|
+
export declare class FeatureSettingsError extends Error {
|
|
42
|
+
readonly code: 'FEATURE_SETTINGS_INVALID_PATCH' | 'FEATURE_SETTINGS_CONFLICT' | 'FEATURE_SETTINGS_INVALID_STORE' | 'FEATURE_SETTINGS_READ_FAILED' | 'FEATURE_SETTINGS_WRITE_FAILED' | 'FEATURE_SETTINGS_LOCK_TIMEOUT' | 'FEATURE_SETTINGS_LOCK_FAILED';
|
|
43
|
+
constructor(code: 'FEATURE_SETTINGS_INVALID_PATCH' | 'FEATURE_SETTINGS_CONFLICT' | 'FEATURE_SETTINGS_INVALID_STORE' | 'FEATURE_SETTINGS_READ_FAILED' | 'FEATURE_SETTINGS_WRITE_FAILED' | 'FEATURE_SETTINGS_LOCK_TIMEOUT' | 'FEATURE_SETTINGS_LOCK_FAILED', message: string);
|
|
44
|
+
}
|
|
45
|
+
/** Read and patch the local feature settings file without accessing provider configuration. */
|
|
46
|
+
export declare class FeatureSettingsStore {
|
|
47
|
+
readonly filePath: string;
|
|
48
|
+
private readonly lockTimeoutMs;
|
|
49
|
+
constructor(options?: FeatureSettingsOptions);
|
|
50
|
+
get(): FeatureSettingsSnapshot;
|
|
51
|
+
isEnabled(id: FeatureId): boolean;
|
|
52
|
+
update(patch: unknown, expectedRevision?: number): Promise<FeatureSettingsSnapshot>;
|
|
53
|
+
private checkRevision;
|
|
54
|
+
private acquireLock;
|
|
55
|
+
private replace;
|
|
56
|
+
}
|
|
57
|
+
export declare function getFeatureSettings(): FeatureSettingsStore;
|
|
58
|
+
//# sourceMappingURL=feature-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-settings.d.ts","sourceRoot":"","sources":["../../src/brain/feature-settings.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;EA+BtB,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AACjE,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAEtD,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,YAAY,CAMvD,CAAC;AAEH,eAAO,MAAM,yBAAyB,0BAA0B,CAAC;AAEjE,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,CAAC,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAOD,qBAAa,oBAAqB,SAAQ,KAAK;IAE3C,QAAQ,CAAC,IAAI,EAAE,gCAAgC,GAAG,2BAA2B,GAC3E,gCAAgC,GAAG,8BAA8B,GACjE,+BAA+B,GAAG,+BAA+B,GAAG,8BAA8B;gBAF3F,IAAI,EAAE,gCAAgC,GAAG,2BAA2B,GAC3E,gCAAgC,GAAG,8BAA8B,GACjE,+BAA+B,GAAG,+BAA+B,GAAG,8BAA8B,EACpG,OAAO,EAAE,MAAM;CAKlB;AAqCD,+FAA+F;AAC/F,qBAAa,oBAAoB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,OAAO,GAAE,sBAA2B;IAOhD,GAAG,IAAI,uBAAuB;IAgB9B,SAAS,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO;IAO3B,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAiCzF,OAAO,CAAC,aAAa;YAOP,WAAW;IAwCzB,OAAO,CAAC,OAAO;CAsBhB;AAED,wBAAgB,kBAAkB,IAAI,oBAAoB,CAEzD"}
|