@theihtisham/agent-shadow-brain 7.1.0 → 7.1.4
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 +42 -0
- package/README.md +125 -450
- 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 +315 -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-config.d.ts +19 -0
- package/dist/brain/client-config.d.ts.map +1 -0
- package/dist/brain/client-config.js +40 -0
- package/dist/brain/client-config.js.map +1 -0
- package/dist/brain/client-integrations.d.ts +63 -0
- package/dist/brain/client-integrations.d.ts.map +1 -0
- package/dist/brain/client-integrations.js +79 -0
- package/dist/brain/client-integrations.js.map +1 -0
- package/dist/brain/context-assembly.d.ts +84 -0
- package/dist/brain/context-assembly.d.ts.map +1 -0
- package/dist/brain/context-assembly.js +529 -0
- package/dist/brain/context-assembly.js.map +1 -0
- package/dist/brain/context-request.d.ts +4 -0
- package/dist/brain/context-request.d.ts.map +1 -0
- package/dist/brain/context-request.js +22 -0
- package/dist/brain/context-request.js.map +1 -0
- package/dist/brain/context-retrieval.d.ts +88 -0
- package/dist/brain/context-retrieval.d.ts.map +1 -0
- package/dist/brain/context-retrieval.js +300 -0
- package/dist/brain/context-retrieval.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 +242 -0
- package/dist/brain/feature-settings.js.map +1 -0
- package/dist/brain/file-identity.d.ts +4 -0
- package/dist/brain/file-identity.d.ts.map +1 -0
- package/dist/brain/file-identity.js +27 -0
- package/dist/brain/file-identity.js.map +1 -0
- package/dist/brain/global-brain.d.ts +18 -1
- package/dist/brain/global-brain.d.ts.map +1 -1
- package/dist/brain/global-brain.js +77 -10
- package/dist/brain/global-brain.js.map +1 -1
- package/dist/brain/mcp-server.d.ts +30 -1
- package/dist/brain/mcp-server.d.ts.map +1 -1
- package/dist/brain/mcp-server.js +378 -28
- 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 +140 -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 +389 -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-inspection.d.ts +72 -0
- package/dist/brain/memory-inspection.d.ts.map +1 -0
- package/dist/brain/memory-inspection.js +131 -0
- package/dist/brain/memory-inspection.js.map +1 -0
- package/dist/brain/memory-mcp-content.d.ts +44 -0
- package/dist/brain/memory-mcp-content.d.ts.map +1 -0
- package/dist/brain/memory-mcp-content.js +91 -0
- package/dist/brain/memory-mcp-content.js.map +1 -0
- 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/project-feedback.d.ts +63 -0
- package/dist/brain/project-feedback.d.ts.map +1 -0
- package/dist/brain/project-feedback.js +289 -0
- package/dist/brain/project-feedback.js.map +1 -0
- package/dist/brain/project-hub-contract.d.ts +326 -0
- package/dist/brain/project-hub-contract.d.ts.map +1 -0
- package/dist/brain/project-hub-contract.js +56 -0
- package/dist/brain/project-hub-contract.js.map +1 -0
- package/dist/brain/project-hub-mcp.d.ts +168 -0
- package/dist/brain/project-hub-mcp.d.ts.map +1 -0
- package/dist/brain/project-hub-mcp.js +41 -0
- package/dist/brain/project-hub-mcp.js.map +1 -0
- package/dist/brain/project-hub-pdf-worker.d.ts +13 -0
- package/dist/brain/project-hub-pdf-worker.d.ts.map +1 -0
- package/dist/brain/project-hub-pdf-worker.js +84 -0
- package/dist/brain/project-hub-pdf-worker.js.map +1 -0
- package/dist/brain/project-hub-store.d.ts +38 -0
- package/dist/brain/project-hub-store.d.ts.map +1 -0
- package/dist/brain/project-hub-store.js +189 -0
- package/dist/brain/project-hub-store.js.map +1 -0
- package/dist/brain/project-hub.d.ts +127 -0
- package/dist/brain/project-hub.d.ts.map +1 -0
- package/dist/brain/project-hub.js +381 -0
- package/dist/brain/project-hub.js.map +1 -0
- package/dist/brain/project-kit-inspection.d.ts +28 -0
- package/dist/brain/project-kit-inspection.d.ts.map +1 -0
- package/dist/brain/project-kit-inspection.js +200 -0
- package/dist/brain/project-kit-inspection.js.map +1 -0
- package/dist/brain/project-kit-paths.d.ts +13 -0
- package/dist/brain/project-kit-paths.d.ts.map +1 -0
- package/dist/brain/project-kit-paths.js +141 -0
- package/dist/brain/project-kit-paths.js.map +1 -0
- package/dist/brain/project-kit.d.ts +41 -0
- package/dist/brain/project-kit.d.ts.map +1 -0
- package/dist/brain/project-kit.js +255 -0
- package/dist/brain/project-kit.js.map +1 -0
- package/dist/brain/project-memory.d.ts +38 -0
- package/dist/brain/project-memory.d.ts.map +1 -0
- package/dist/brain/project-memory.js +76 -0
- package/dist/brain/project-memory.js.map +1 -0
- 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/brain/workflow-skills.d.ts.map +1 -1
- package/dist/brain/workflow-skills.js +3 -2
- package/dist/brain/workflow-skills.js.map +1 -1
- package/dist/cli.js +40 -4
- 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 +90 -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/brain-hub-actions.d.ts +2 -0
- package/dist/dashboard/brain-hub-actions.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-actions.js +137 -0
- package/dist/dashboard/brain-hub-actions.js.map +1 -0
- package/dist/dashboard/brain-hub-client.d.ts +2 -0
- package/dist/dashboard/brain-hub-client.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-client.js +335 -0
- package/dist/dashboard/brain-hub-client.js.map +1 -0
- package/dist/dashboard/brain-hub-graph.d.ts +2 -0
- package/dist/dashboard/brain-hub-graph.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-graph.js +176 -0
- package/dist/dashboard/brain-hub-graph.js.map +1 -0
- package/dist/dashboard/brain-hub-html.d.ts +2 -0
- package/dist/dashboard/brain-hub-html.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-html.js +30 -0
- package/dist/dashboard/brain-hub-html.js.map +1 -0
- package/dist/dashboard/brain-hub-project-views.d.ts +2 -0
- package/dist/dashboard/brain-hub-project-views.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-project-views.js +79 -0
- package/dist/dashboard/brain-hub-project-views.js.map +1 -0
- package/dist/dashboard/brain-hub-views.d.ts +2 -0
- package/dist/dashboard/brain-hub-views.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-views.js +150 -0
- package/dist/dashboard/brain-hub-views.js.map +1 -0
- package/dist/dashboard/demo-workspace.d.ts +11 -0
- package/dist/dashboard/demo-workspace.d.ts.map +1 -0
- package/dist/dashboard/demo-workspace.js +178 -0
- package/dist/dashboard/demo-workspace.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 +1042 -0
- package/dist/dashboard/live-workspace-html.js.map +1 -0
- package/dist/dashboard/project-feedback-html.d.ts +5 -0
- package/dist/dashboard/project-feedback-html.d.ts.map +1 -0
- package/dist/dashboard/project-feedback-html.js +216 -0
- package/dist/dashboard/project-feedback-html.js.map +1 -0
- package/dist/dashboard/project-hub-api.d.ts +5 -0
- package/dist/dashboard/project-hub-api.d.ts.map +1 -0
- package/dist/dashboard/project-hub-api.js +121 -0
- package/dist/dashboard/project-hub-api.js.map +1 -0
- package/dist/dashboard/project-kit-html.d.ts +4 -0
- package/dist/dashboard/project-kit-html.d.ts.map +1 -0
- package/dist/dashboard/project-kit-html.js +359 -0
- package/dist/dashboard/project-kit-html.js.map +1 -0
- package/dist/dashboard/project-workspace.d.ts +16 -0
- package/dist/dashboard/project-workspace.d.ts.map +1 -0
- package/dist/dashboard/project-workspace.js +106 -0
- package/dist/dashboard/project-workspace.js.map +1 -0
- package/dist/dashboard/server.d.ts +2 -0
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +65 -19
- 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 +34 -56
- package/dist/dashboard/v6-dashboard-html.js.map +1 -1
- package/dist/dashboard/workspace-api.d.ts +22 -0
- package/dist/dashboard/workspace-api.d.ts.map +1 -0
- package/dist/dashboard/workspace-api.js +429 -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 +2538 -0
- package/dist/dashboard/workspace-html.js.map +1 -0
- package/dist/dashboard/workspace-status.d.ts +50 -0
- package/dist/dashboard/workspace-status.d.ts.map +1 -0
- package/dist/dashboard/workspace-status.js +22 -0
- package/dist/dashboard/workspace-status.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -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 +16 -0
- package/dist/integration-cli.js.map +1 -0
- package/dist/project-cli.d.ts +3 -0
- package/dist/project-cli.d.ts.map +1 -0
- package/dist/project-cli.js +100 -0
- package/dist/project-cli.js.map +1 -0
- package/dist/types.d.ts +12 -3
- package/dist/types.d.ts.map +1 -1
- package/docs/COMPARISON.md +22 -0
- package/docs/COMPONENTS.md +66 -0
- package/docs/CONTEXT_LAB.md +79 -0
- package/docs/FEATURES_AND_LIMITS.md +24 -0
- package/docs/INTEGRATIONS.md +68 -0
- package/docs/LEARNING.md +46 -0
- package/docs/PROJECT_KIT.md +93 -0
- package/docs/QUICKSTART.md +44 -0
- package/docs/README.md +33 -0
- package/docs/ROADMAP-v7.md +147 -0
- package/docs/SHARING.md +13 -0
- package/docs/SHOWCASE.md +87 -0
- package/docs/STATS.md +21 -0
- package/docs/TROUBLESHOOTING.md +42 -0
- package/docs/UPGRADE_PLAN_v7.0.0.md +203 -0
- package/docs/VIRAL-PLAYBOOK.md +259 -0
- package/docs/VISUAL_GUIDE_v7.1.4.md +70 -0
- package/docs/WORKFLOW_INTEGRATION.md +19 -1
- package/docs/WORKSPACE.md +37 -0
- package/docs/assets/7.1.4-collaboration-design-preview.png +0 -0
- package/docs/assets/7.1.4-comparison.png +0 -0
- package/docs/assets/7.1.4-context-lab.png +0 -0
- package/docs/assets/7.1.4-control-room-dense-preview.png +0 -0
- package/docs/assets/7.1.4-control-room-focus-preview.png +0 -0
- package/docs/assets/7.1.4-features.png +0 -0
- package/docs/assets/7.1.4-graph.png +0 -0
- package/docs/assets/7.1.4-hub-control-room.png +0 -0
- package/docs/assets/7.1.4-hub-empty.png +0 -0
- package/docs/assets/7.1.4-hub-knowledge.png +0 -0
- package/docs/assets/7.1.4-hub-learning.png +0 -0
- package/docs/assets/7.1.4-hub-mobile.png +0 -0
- package/docs/assets/7.1.4-hub-public-docs-source.png +0 -0
- package/docs/assets/7.1.4-hub-public-docs.gif +0 -0
- package/docs/assets/7.1.4-hub-public-docs.png +0 -0
- package/docs/assets/7.1.4-hub-setup.png +0 -0
- package/docs/assets/7.1.4-hub-walkthrough.gif +0 -0
- package/docs/assets/7.1.4-integrations.png +0 -0
- package/docs/assets/7.1.4-knowledge-design-preview.png +0 -0
- package/docs/assets/7.1.4-learning-design-preview.png +0 -0
- package/docs/assets/7.1.4-learning.png +0 -0
- package/docs/assets/7.1.4-live.png +0 -0
- package/docs/assets/7.1.4-memory-review.png +0 -0
- package/docs/assets/7.1.4-mobile.png +0 -0
- package/docs/assets/7.1.4-models-design-preview.png +0 -0
- package/docs/assets/7.1.4-outcome-ranking.png +0 -0
- package/docs/assets/7.1.4-overview.png +0 -0
- package/docs/assets/7.1.4-project-kit.png +0 -0
- package/docs/assets/7.1.4-project-skill-preview.png +0 -0
- package/docs/assets/7.1.4-replay.png +0 -0
- package/docs/assets/7.1.4-setup-design-preview.png +0 -0
- package/docs/assets/7.1.4-usage-design-preview.png +0 -0
- package/docs/assets/context-flow-v7.2.png +0 -0
- package/docs/assets/context-v7.1.3.png +0 -0
- package/docs/assets/features-v7.1.3.png +0 -0
- package/docs/assets/graph-v7.1.3.png +0 -0
- package/docs/assets/integrations-v7.1.3.png +0 -0
- package/docs/assets/live-v7.1.3.png +0 -0
- package/docs/assets/live-v7.1.4.gif +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/evaluation/CONTEXT_EVALUATION_v7.1.4.json +1818 -0
- package/docs/evaluation/CONTEXT_EVALUATION_v7.1.4.md +36 -0
- package/docs/launch/COMPONENT_MAP_v7.1.4.md +307 -0
- package/docs/launch/PROJECT_KIT_PLAN_v7.1.4.md +110 -0
- package/docs/launch/PROJECT_LEARNING_PLAN_v7.1.4.md +63 -0
- package/docs/launch/RELEASE_NOTES_v7.1.3.md +40 -0
- package/docs/launch/RELEASE_NOTES_v7.1.4.md +30 -0
- package/docs/launch/RELEASE_NOTES_v7.2.0.md +24 -0
- package/docs/launch/RESEARCH_AND_PLAN_v7.1.4.md +255 -0
- package/package.json +43 -126
- package/skills/shadow-research/SKILL.md +2 -0
- package/skills/shadow-workflow/SKILL.md +6 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
4
|
+
import { inspectProject } from './project-kit-inspection.js';
|
|
5
|
+
import { ensureProjectDirectory, projectLocalPath, projectRoot, ProjectKitError, readProjectFile } from './project-kit-paths.js';
|
|
6
|
+
import { WORKFLOW_TARGETS } from './workflow-skills.js';
|
|
7
|
+
import { matchesFileIdentity } from './file-identity.js';
|
|
8
|
+
export { inspectProject } from './project-kit-inspection.js';
|
|
9
|
+
export { ensureProjectDirectory, projectLocalPath, projectRoot, ProjectKitError } from './project-kit-paths.js';
|
|
10
|
+
const MAX_INPUT = 8000;
|
|
11
|
+
const MAX_SKILL = 64 * 1024;
|
|
12
|
+
const RECEIPT_DIR = '.shadow-brain/project-kit-skills';
|
|
13
|
+
const HASH_PATTERN = /^[a-f0-9]{64}$/u;
|
|
14
|
+
const NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/u;
|
|
15
|
+
const RESERVED_NAME = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])$/iu;
|
|
16
|
+
const CONTROL = /[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/u;
|
|
17
|
+
function sha(value) {
|
|
18
|
+
return createHash('sha256').update(value).digest('hex');
|
|
19
|
+
}
|
|
20
|
+
function inputText(value, label) {
|
|
21
|
+
if (typeof value !== 'string' || value.length > MAX_INPUT || CONTROL.test(value)) {
|
|
22
|
+
throw new TypeError(label + ' must be text of at most 8000 characters without control codes.');
|
|
23
|
+
}
|
|
24
|
+
return value.replace(/\r\n?/g, '\n').trim();
|
|
25
|
+
}
|
|
26
|
+
function inputs(params, project) {
|
|
27
|
+
if (!params || typeof params !== 'object' || Array.isArray(params) ||
|
|
28
|
+
Object.keys(params).some(key => !['requirement', 'target', 'name', 'knowledge'].includes(key))) {
|
|
29
|
+
throw new TypeError('Provide a requirement, target, and optional name and knowledge.');
|
|
30
|
+
}
|
|
31
|
+
const requirement = inputText(params.requirement, 'Requirement');
|
|
32
|
+
if (!requirement)
|
|
33
|
+
throw new TypeError('Provide a nonempty requirement.');
|
|
34
|
+
if (typeof params.target !== 'string' || !Object.hasOwn(WORKFLOW_TARGETS, params.target))
|
|
35
|
+
throw new TypeError('Choose a supported skill target.');
|
|
36
|
+
const task = requirement.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '').slice(0, 46).replace(/-$/g, '') || 'project-task';
|
|
37
|
+
const name = params.name ?? task + '-' + sha(project.projectId + '\0' + requirement).slice(0, 10);
|
|
38
|
+
if (typeof name !== 'string' || name.length > 63 || !NAME_PATTERN.test(name) || RESERVED_NAME.test(name)) {
|
|
39
|
+
throw new TypeError('Skill name must be 1 to 63 lowercase letters, digits, or hyphen-separated words.');
|
|
40
|
+
}
|
|
41
|
+
const raw = params.knowledge ?? '';
|
|
42
|
+
if (Array.isArray(raw) && raw.length > 100)
|
|
43
|
+
throw new TypeError('Provide at most 100 knowledge notes.');
|
|
44
|
+
const knowledge = Array.isArray(raw) ? raw.map(note => inputText(note, 'Knowledge')).filter(Boolean).join('\n\n') : inputText(raw, 'Knowledge');
|
|
45
|
+
if (knowledge.length > MAX_INPUT)
|
|
46
|
+
throw new TypeError('Combined knowledge must be at most 8000 characters.');
|
|
47
|
+
return { requirement, target: params.target, name, knowledge };
|
|
48
|
+
}
|
|
49
|
+
function quote(text) {
|
|
50
|
+
return text.split('\n').map(line => '> ' + line).join('\n');
|
|
51
|
+
}
|
|
52
|
+
function inline(value) {
|
|
53
|
+
return value.replace(/[\\`*_{}\[\]()<>#!|~]/g, '\\$&');
|
|
54
|
+
}
|
|
55
|
+
function renderSkill(profile, selected) {
|
|
56
|
+
const { requirement, name, knowledge } = selected;
|
|
57
|
+
const trigger = requirement.replace(/\s+/g, ' ').slice(0, 150);
|
|
58
|
+
const rows = [
|
|
59
|
+
'---',
|
|
60
|
+
'name: ' + JSON.stringify(name),
|
|
61
|
+
'description: ' + JSON.stringify('Use for this project task: ' + trigger),
|
|
62
|
+
'---',
|
|
63
|
+
'',
|
|
64
|
+
'# ' + name,
|
|
65
|
+
'',
|
|
66
|
+
'Use this skill within the selected project. Follow current user instructions and applicable project rules first. Recheck saved observations when the project changes.',
|
|
67
|
+
'',
|
|
68
|
+
'## Requirement supplied by the user',
|
|
69
|
+
'',
|
|
70
|
+
quote(requirement),
|
|
71
|
+
...(knowledge ? ['', '## Project knowledge supplied by the user', '', quote(knowledge)] : []),
|
|
72
|
+
'',
|
|
73
|
+
'## Observed project markers',
|
|
74
|
+
'',
|
|
75
|
+
...(profile.evidence.length ? profile.evidence.slice(0, 16).map(item => '- ' + inline(item.path) + ' indicates ' + item.signals.map(inline).join(', ') + '.') :
|
|
76
|
+
['- The bounded inspection found no recognized project markers. Confirm the stack before choosing a verification command.']),
|
|
77
|
+
'',
|
|
78
|
+
'## Work and verify',
|
|
79
|
+
'',
|
|
80
|
+
'1. Confirm the requested result, the affected project files, and any current constraints.',
|
|
81
|
+
'2. Use the supplied requirement and project knowledge as task context. Verify evidence before relying on it.',
|
|
82
|
+
'3. Make the requested change and inspect it through the normal project entry point.',
|
|
83
|
+
'4. Run the relevant declared checks after confirming they still apply and review the actual result.',
|
|
84
|
+
'',
|
|
85
|
+
...(profile.checks.length ? ['Declared checks observed in project manifests. Use each check from the directory containing its source.',
|
|
86
|
+
...profile.checks.slice(0, 12).map(item => '- ' + inline(item.label) + ' uses `' + item.command + '` from ' + inline(item.source) + '.')] :
|
|
87
|
+
['The bounded inspection found no recognized declared checks. Use the project’s current verification procedure.']),
|
|
88
|
+
'',
|
|
89
|
+
'If the project exposes `project_feedback`, report a memory ID and observed outcome only when a check or the user’s feedback supports the rating. Describe the evidence and uncertainty. Retrieval rank and successful tool execution alone do not establish a useful or correct memory.',
|
|
90
|
+
'',
|
|
91
|
+
];
|
|
92
|
+
return rows.join('\n');
|
|
93
|
+
}
|
|
94
|
+
function receiptPath(relative) {
|
|
95
|
+
return RECEIPT_DIR + '/' + sha(relative) + '.json';
|
|
96
|
+
}
|
|
97
|
+
function readReceipt(profile, relative) {
|
|
98
|
+
const bytes = readProjectFile(profile.root, receiptPath(relative), 4096);
|
|
99
|
+
if (!bytes)
|
|
100
|
+
return undefined;
|
|
101
|
+
try {
|
|
102
|
+
const receipt = JSON.parse(bytes.toString('utf8'));
|
|
103
|
+
if (receipt?.schemaVersion === 1 && receipt.projectId === profile.projectId && receipt.relativePath === relative && HASH_PATTERN.test(receipt.sha256)) {
|
|
104
|
+
return { receipt, bytes };
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch { /* Invalid ownership data cannot establish ownership. */ }
|
|
108
|
+
throw new ProjectKitError('PROJECT_KIT_CONFLICT', 'The project skill ownership receipt is invalid.');
|
|
109
|
+
}
|
|
110
|
+
function destinationState(profile, relativePath, content) {
|
|
111
|
+
const file = { relativePath, content };
|
|
112
|
+
try {
|
|
113
|
+
const filename = projectLocalPath(profile.root, relativePath);
|
|
114
|
+
const existing = fs.lstatSync(filename, { throwIfNoEntry: false });
|
|
115
|
+
const ownership = readReceipt(profile, relativePath);
|
|
116
|
+
if (!existing && !ownership)
|
|
117
|
+
return { ...file, status: 'create' };
|
|
118
|
+
if (!existing || !ownership) {
|
|
119
|
+
return { ...file, status: 'conflict', reason: existing ? 'An existing file is outside Project Kit ownership.' : 'The previously owned skill file is missing.' };
|
|
120
|
+
}
|
|
121
|
+
const bytes = readProjectFile(profile.root, relativePath, MAX_SKILL);
|
|
122
|
+
if (!bytes)
|
|
123
|
+
return { ...file, status: 'conflict', reason: 'The skill file changed during preview.' };
|
|
124
|
+
const existingHash = sha(bytes);
|
|
125
|
+
if (existingHash !== ownership.receipt.sha256)
|
|
126
|
+
return { ...file, existingHash, status: 'conflict', reason: 'The owned skill was edited after its last application.' };
|
|
127
|
+
return { ...file, existingHash, status: existingHash === sha(content) ? 'unchanged' : 'update' };
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
if (!(error instanceof ProjectKitError))
|
|
131
|
+
throw error;
|
|
132
|
+
return { ...file, status: 'conflict', reason: error.message };
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/** Produce a read-only, root-bound preview. Existing unowned skill bytes are never read. */
|
|
136
|
+
export function planProjectSkill(root, params) {
|
|
137
|
+
const profile = inspectProject(root);
|
|
138
|
+
const selected = inputs(params, profile);
|
|
139
|
+
const relative = WORKFLOW_TARGETS[selected.target].skillRoot + '/' + selected.name + '/SKILL.md';
|
|
140
|
+
const content = renderSkill(profile, selected);
|
|
141
|
+
const file = destinationState(profile, relative, content);
|
|
142
|
+
const { projectId, root: projectDirectory, stack, packageManagers, evidence, checks } = profile;
|
|
143
|
+
const planHash = sha(JSON.stringify({ schemaVersion: 1, projectId, root: projectDirectory, stack, packageManagers, evidence, checks, ...selected, file }));
|
|
144
|
+
return { projectId: profile.projectId, profile, requirement: selected.requirement, target: selected.target,
|
|
145
|
+
name: selected.name, files: [file], planHash, warnings: [...profile.warnings] };
|
|
146
|
+
}
|
|
147
|
+
function replaceProjectFile(root, relative, content, expectedHash) {
|
|
148
|
+
const filename = projectLocalPath(root, relative);
|
|
149
|
+
const temporary = filename + '.' + randomUUID() + '.tmp';
|
|
150
|
+
const fd = fs.openSync(temporary, 'wx', 0o600);
|
|
151
|
+
try {
|
|
152
|
+
try {
|
|
153
|
+
fs.writeFileSync(fd, content);
|
|
154
|
+
fs.fsyncSync(fd);
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
fs.closeSync(fd);
|
|
158
|
+
}
|
|
159
|
+
projectLocalPath(root, relative);
|
|
160
|
+
if (expectedHash) {
|
|
161
|
+
const before = readProjectFile(root, relative, MAX_SKILL);
|
|
162
|
+
if (!before || sha(before) !== expectedHash)
|
|
163
|
+
throw new ProjectKitError('PROJECT_KIT_STALE_PLAN', 'A managed file changed during application.');
|
|
164
|
+
fs.renameSync(temporary, filename);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
// Linking a prepared sibling creates the destination exclusively without clobbering an intervening file.
|
|
168
|
+
fs.linkSync(temporary, filename);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
finally {
|
|
172
|
+
try {
|
|
173
|
+
fs.unlinkSync(temporary);
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
if (error.code !== 'ENOENT')
|
|
177
|
+
throw error;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function assertPlan(plan, expectedPlanHash) {
|
|
182
|
+
if (plan.files[0].status === 'conflict') {
|
|
183
|
+
throw new ProjectKitError('PROJECT_KIT_CONFLICT', plan.files[0].reason ?? 'The skill has a destination conflict.');
|
|
184
|
+
}
|
|
185
|
+
if (plan.planHash !== expectedPlanHash) {
|
|
186
|
+
throw new ProjectKitError('PROJECT_KIT_STALE_PLAN', 'The project skill preview changed. Create a new preview before applying.');
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/** Rebuild the reviewed preview under a project-local write lock, then save only its managed skill and receipt. */
|
|
190
|
+
export async function applyProjectSkill(root, params, expectedPlanHash) {
|
|
191
|
+
if (typeof expectedPlanHash !== 'string' || !HASH_PATTERN.test(expectedPlanHash))
|
|
192
|
+
throw new TypeError('A current project skill plan hash is required.');
|
|
193
|
+
const initial = planProjectSkill(root, params);
|
|
194
|
+
assertPlan(initial, expectedPlanHash);
|
|
195
|
+
const canonical = projectRoot(initial.profile.root);
|
|
196
|
+
const result = (status) => ({
|
|
197
|
+
projectId: initial.projectId, planHash: initial.planHash, files: [{ relativePath: initial.files[0].relativePath, status }], warnings: initial.warnings,
|
|
198
|
+
});
|
|
199
|
+
if (initial.files[0].status === 'unchanged')
|
|
200
|
+
return result('unchanged');
|
|
201
|
+
const lockDirectory = ensureProjectDirectory(canonical, RECEIPT_DIR);
|
|
202
|
+
const lock = path.join(lockDirectory, 'write.lock');
|
|
203
|
+
let fd;
|
|
204
|
+
try {
|
|
205
|
+
fd = fs.openSync(lock, 'wx', 0o600);
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
if (error.code === 'EEXIST')
|
|
209
|
+
throw new ProjectKitError('PROJECT_KIT_CONFLICT', 'Another Project Kit write is in progress.');
|
|
210
|
+
throw new ProjectKitError('PROJECT_KIT_WRITE_FAILED', 'Could not acquire the project skill write lock.');
|
|
211
|
+
}
|
|
212
|
+
const owner = fs.fstatSync(fd, { bigint: true });
|
|
213
|
+
try {
|
|
214
|
+
const plan = planProjectSkill(canonical, params);
|
|
215
|
+
assertPlan(plan, expectedPlanHash);
|
|
216
|
+
const file = plan.files[0];
|
|
217
|
+
ensureProjectDirectory(canonical, path.posix.dirname(file.relativePath));
|
|
218
|
+
const prior = file.existingHash ? readProjectFile(canonical, file.relativePath, MAX_SKILL) : undefined;
|
|
219
|
+
const receipt = readReceipt(plan.profile, file.relativePath);
|
|
220
|
+
if (file.existingHash !== receipt?.receipt.sha256) {
|
|
221
|
+
throw new ProjectKitError('PROJECT_KIT_STALE_PLAN', 'The project skill ownership changed during application.');
|
|
222
|
+
}
|
|
223
|
+
const newHash = sha(file.content);
|
|
224
|
+
const next = { schemaVersion: 1, projectId: plan.projectId, relativePath: file.relativePath, sha256: newHash };
|
|
225
|
+
try {
|
|
226
|
+
replaceProjectFile(canonical, file.relativePath, file.content, file.existingHash);
|
|
227
|
+
try {
|
|
228
|
+
replaceProjectFile(canonical, receiptPath(file.relativePath), JSON.stringify(next) + '\n', receipt ? sha(receipt.bytes) : undefined);
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
const written = readProjectFile(canonical, file.relativePath, MAX_SKILL);
|
|
232
|
+
if (written && sha(written) === newHash) {
|
|
233
|
+
if (prior)
|
|
234
|
+
replaceProjectFile(canonical, file.relativePath, prior, newHash);
|
|
235
|
+
else
|
|
236
|
+
fs.unlinkSync(projectLocalPath(canonical, file.relativePath));
|
|
237
|
+
}
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
if (error instanceof ProjectKitError)
|
|
243
|
+
throw error;
|
|
244
|
+
throw new ProjectKitError('PROJECT_KIT_WRITE_FAILED', 'Could not save the project skill and ownership receipt.');
|
|
245
|
+
}
|
|
246
|
+
return result(file.status === 'create' ? 'created' : 'updated');
|
|
247
|
+
}
|
|
248
|
+
finally {
|
|
249
|
+
fs.closeSync(fd);
|
|
250
|
+
const current = fs.lstatSync(lock, { throwIfNoEntry: false, bigint: true });
|
|
251
|
+
if (matchesFileIdentity(lock, owner, current))
|
|
252
|
+
fs.unlinkSync(lock);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=project-kit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-kit.js","sourceRoot":"","sources":["../../src/brain/project-kit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { GlobalBrain } from './global-brain.js';
|
|
2
|
+
export interface ProjectKnowledgeInput {
|
|
3
|
+
title: string;
|
|
4
|
+
content: string;
|
|
5
|
+
category?: string;
|
|
6
|
+
source?: string;
|
|
7
|
+
}
|
|
8
|
+
/** Explicit project-local paths only; never consults the default global store. */
|
|
9
|
+
export declare function projectStorage(directory: string): {
|
|
10
|
+
root: string;
|
|
11
|
+
projectId: string;
|
|
12
|
+
projectName: string;
|
|
13
|
+
storagePath: string;
|
|
14
|
+
settingsPath: string;
|
|
15
|
+
annotationsPath: string;
|
|
16
|
+
journalPath: string;
|
|
17
|
+
feedbackPath: string;
|
|
18
|
+
};
|
|
19
|
+
/** Identify an explicit project store even when Windows launch paths use different spellings. */
|
|
20
|
+
export declare function resolveProjectStore(directory: string, dbPath: string | undefined): ReturnType<typeof projectStorage> | undefined;
|
|
21
|
+
export declare function requireProjectStore(directory: string, brain: GlobalBrain): {
|
|
22
|
+
root: string;
|
|
23
|
+
projectId: string;
|
|
24
|
+
projectName: string;
|
|
25
|
+
storagePath: string;
|
|
26
|
+
settingsPath: string;
|
|
27
|
+
annotationsPath: string;
|
|
28
|
+
journalPath: string;
|
|
29
|
+
feedbackPath: string;
|
|
30
|
+
};
|
|
31
|
+
export declare function parseProjectKnowledge(input: unknown): ProjectKnowledgeInput;
|
|
32
|
+
/** Only explicit user knowledge. Source references are labels and are never opened. */
|
|
33
|
+
export declare function addProjectKnowledge(directory: string, brain: GlobalBrain, input: unknown): Promise<{
|
|
34
|
+
ok: true;
|
|
35
|
+
memoryId: string;
|
|
36
|
+
projectId: string;
|
|
37
|
+
}>;
|
|
38
|
+
//# sourceMappingURL=project-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-memory.d.ts","sourceRoot":"","sources":["../../src/brain/project-memory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,MAAM,WAAW,qBAAqB;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;AAE7G,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM;;;;;;;;;EAY/C;AAED,iGAAiG;AACjG,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,GAAG,SAAS,CAWhI;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW;;;;;;;;;EAIxE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,CAY3E;AAED,uFAAuF;AACvF,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO;;;;GAY9F"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import { GlobalBrain } from './global-brain.js';
|
|
4
|
+
import { projectRoot, projectLocalPath } from './project-kit.js';
|
|
5
|
+
/** Explicit project-local paths only; never consults the default global store. */
|
|
6
|
+
export function projectStorage(directory) {
|
|
7
|
+
const root = projectRoot(directory);
|
|
8
|
+
const storagePath = projectLocalPath(root, '.shadow-brain/project-memory.json');
|
|
9
|
+
const settingsPath = projectLocalPath(root, '.shadow-brain/feature-settings.json');
|
|
10
|
+
const annotationsPath = projectLocalPath(root, '.shadow-brain/memory-annotations.json');
|
|
11
|
+
const journalPath = projectLocalPath(root, '.shadow-brain/activity-journal.json');
|
|
12
|
+
const feedbackPath = projectLocalPath(root, '.shadow-brain/memory-feedback.json');
|
|
13
|
+
for (const filename of [storagePath, settingsPath, annotationsPath, journalPath, feedbackPath]) {
|
|
14
|
+
const stat = fs.lstatSync(filename, { throwIfNoEntry: false });
|
|
15
|
+
if (stat && (!stat.isFile() || stat.nlink !== 1))
|
|
16
|
+
throw new Error('Project storage paths must be ordinary unlinked files.');
|
|
17
|
+
}
|
|
18
|
+
return { root, projectId: GlobalBrain.projectIdFor(root), projectName: path.basename(root), storagePath, settingsPath, annotationsPath, journalPath, feedbackPath };
|
|
19
|
+
}
|
|
20
|
+
/** Identify an explicit project store even when Windows launch paths use different spellings. */
|
|
21
|
+
export function resolveProjectStore(directory, dbPath) {
|
|
22
|
+
if (!dbPath)
|
|
23
|
+
return undefined;
|
|
24
|
+
const absolute = path.resolve(dbPath);
|
|
25
|
+
const parent = path.dirname(absolute);
|
|
26
|
+
if (path.relative(path.join(parent, 'project-memory.json'), absolute) ||
|
|
27
|
+
path.relative(path.join(path.dirname(parent), '.shadow-brain'), parent))
|
|
28
|
+
return undefined;
|
|
29
|
+
// Validate the supplied project ancestor before using its canonical spelling. The store and its directory can be absent.
|
|
30
|
+
const requestedRoot = projectRoot(path.dirname(parent));
|
|
31
|
+
const local = projectStorage(directory);
|
|
32
|
+
if (path.relative(local.root, requestedRoot))
|
|
33
|
+
throw new TypeError('The explicit project store must belong to the selected project.');
|
|
34
|
+
return local;
|
|
35
|
+
}
|
|
36
|
+
export function requireProjectStore(directory, brain) {
|
|
37
|
+
const store = projectStorage(directory);
|
|
38
|
+
if (path.resolve(brain.dbPath) !== store.storagePath)
|
|
39
|
+
throw new Error('Project Kit requires its project-local store. Start shadow-brain project workspace in this project, or use its generated MCP recipe.');
|
|
40
|
+
return store;
|
|
41
|
+
}
|
|
42
|
+
export function parseProjectKnowledge(input) {
|
|
43
|
+
if (!input || typeof input !== 'object' || Array.isArray(input))
|
|
44
|
+
throw new TypeError('Knowledge must be an object.');
|
|
45
|
+
const value = input;
|
|
46
|
+
if (Object.keys(value).some(key => !['title', 'content', 'category', 'source'].includes(key)))
|
|
47
|
+
throw new TypeError('Unknown knowledge field.');
|
|
48
|
+
const title = value.title;
|
|
49
|
+
const content = value.content;
|
|
50
|
+
if (typeof title !== 'string' || !title.trim() || title.length > 160 || /[\u0000-\u001f\u007f]/.test(title))
|
|
51
|
+
throw new TypeError('Use a single-line title from 1 to 160 characters.');
|
|
52
|
+
if (typeof content !== 'string' || !content.trim() || content.length > 8000 || content.includes('\0'))
|
|
53
|
+
throw new TypeError('Knowledge content must contain 1 to 8000 characters without null bytes.');
|
|
54
|
+
if (value.category !== undefined && (typeof value.category !== 'string' || !/^[A-Za-z0-9][A-Za-z0-9 _.-]{0,63}$/.test(value.category.trim())))
|
|
55
|
+
throw new TypeError('Use a category from 1 to 64 plain characters.');
|
|
56
|
+
if (value.source !== undefined && (typeof value.source !== 'string' || value.source.length > 500 || /[\u0000-\u001f\u007f]/.test(value.source)))
|
|
57
|
+
throw new TypeError('A source reference must be at most 500 characters without control characters.');
|
|
58
|
+
return { title: title.trim(), content, ...(value.category ? { category: value.category.trim() } : {}),
|
|
59
|
+
...(value.source && value.source.trim() ? { source: value.source.trim() } : {}) };
|
|
60
|
+
}
|
|
61
|
+
/** Only explicit user knowledge. Source references are labels and are never opened. */
|
|
62
|
+
export async function addProjectKnowledge(directory, brain, input) {
|
|
63
|
+
const knowledge = parseProjectKnowledge(input);
|
|
64
|
+
const store = requireProjectStore(directory, brain);
|
|
65
|
+
await brain.init();
|
|
66
|
+
brain.refresh();
|
|
67
|
+
if (brain.getStorageHealth().lastError)
|
|
68
|
+
throw new Error('Project memory could not be read; no knowledge was added.');
|
|
69
|
+
const memoryId = brain.writeSync({ projectId: store.projectId, projectName: store.projectName,
|
|
70
|
+
agentTool: 'user', category: knowledge.category ?? 'knowledge', content: knowledge.title + '\n' + knowledge.content,
|
|
71
|
+
importance: 0.7, metadata: { origin: 'project-kit-user', inputKind: 'explicit-knowledge', title: knowledge.title,
|
|
72
|
+
...(knowledge.source ? { sources: [knowledge.source] } : {}) } });
|
|
73
|
+
await brain.sync();
|
|
74
|
+
return { ok: true, memoryId, projectId: store.projectId };
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=project-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-memory.js","sourceRoot":"","sources":["../../src/brain/project-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,34 +1,31 @@
|
|
|
1
|
-
import { AgentTool,
|
|
1
|
+
import type { AgentTool, SubconsciousBriefing, SubconsciousConfig, SubconsciousStats } from '../types.js';
|
|
2
|
+
import { FeatureSettingsStore } from './feature-settings.js';
|
|
2
3
|
import { GlobalBrain } from './global-brain.js';
|
|
4
|
+
import { type MemoryAnnotationsStore } from './memory-annotations.js';
|
|
5
|
+
interface BriefingOptions {
|
|
6
|
+
agentTool: AgentTool;
|
|
7
|
+
projectDir: string;
|
|
8
|
+
projectId?: string;
|
|
9
|
+
projectName?: string;
|
|
10
|
+
currentTask?: string;
|
|
11
|
+
includeCrossProject?: boolean;
|
|
12
|
+
}
|
|
3
13
|
export declare class SubconsciousEngine {
|
|
4
14
|
private config;
|
|
5
|
-
private brain;
|
|
6
|
-
private
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
projectName?: string;
|
|
14
|
-
currentTask?: string;
|
|
15
|
-
}): Promise<SubconsciousBriefing>;
|
|
16
|
-
/** Get current stats */
|
|
15
|
+
private readonly brain;
|
|
16
|
+
private readonly settings;
|
|
17
|
+
private readonly annotations;
|
|
18
|
+
private readonly cache;
|
|
19
|
+
private readonly stats;
|
|
20
|
+
constructor(config?: Partial<SubconsciousConfig>, brain?: GlobalBrain, settings?: Pick<FeatureSettingsStore, 'get'>, annotations?: Pick<MemoryAnnotationsStore, 'get'>);
|
|
21
|
+
/** Generate a session-start briefing from the current project and task. */
|
|
22
|
+
generateBriefing(opts: BriefingOptions): Promise<SubconsciousBriefing>;
|
|
17
23
|
getStats(): SubconsciousStats;
|
|
18
|
-
/** Update config at runtime */
|
|
19
24
|
configure(patch: Partial<SubconsciousConfig>): void;
|
|
20
25
|
getConfig(): SubconsciousConfig;
|
|
21
|
-
private
|
|
22
|
-
private fetchCrossAgentInsights;
|
|
23
|
-
private fetchProjectStateSummary;
|
|
24
|
-
private fetchSimilarWork;
|
|
25
|
-
private fetchTopPatterns;
|
|
26
|
-
private extractKeywords;
|
|
27
|
-
private formatEntry;
|
|
28
|
-
private assembleBriefing;
|
|
29
|
-
private trimToBudget;
|
|
26
|
+
private addSection;
|
|
30
27
|
private emptyBriefing;
|
|
31
|
-
private runningAvg;
|
|
32
28
|
}
|
|
33
29
|
export declare function getSubconscious(config?: Partial<SubconsciousConfig>): SubconsciousEngine;
|
|
30
|
+
export {};
|
|
34
31
|
//# sourceMappingURL=subconscious.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subconscious.d.ts","sourceRoot":"","sources":["../../src/brain/subconscious.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"subconscious.d.ts","sourceRoot":"","sources":["../../src/brain/subconscious.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE1G,OAAO,EAA6B,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EAAkB,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhE,OAAO,EAAwB,KAAK,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAW5F,UAAU,eAAe;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;IAC7D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAClE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsE;IAC5F,OAAO,CAAC,QAAQ,CAAC,KAAK,CAOpB;gBAGA,MAAM,GAAE,OAAO,CAAC,kBAAkB,CAAM,EACxC,KAAK,CAAC,EAAE,WAAW,EACnB,QAAQ,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,KAAK,CAAC,EAC5C,WAAW,CAAC,EAAE,IAAI,CAAC,sBAAsB,EAAE,KAAK,CAAC;IAUnD,2EAA2E;IACrE,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAkD5E,QAAQ,IAAI,iBAAiB;IAI7B,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,IAAI;IAKnD,SAAS,IAAI,kBAAkB;IAI/B,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,aAAa;CAkBtB;AAID,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAIxF"}
|