cortex-engine 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +154 -0
- package/dist/bin/cli.d.ts +13 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +92 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/bin/config-cmd.d.ts +12 -0
- package/dist/bin/config-cmd.d.ts.map +1 -0
- package/dist/bin/config-cmd.js +184 -0
- package/dist/bin/config-cmd.js.map +1 -0
- package/dist/bin/config-loader.d.ts +12 -0
- package/dist/bin/config-loader.d.ts.map +1 -0
- package/dist/bin/config-loader.js +42 -0
- package/dist/bin/config-loader.js.map +1 -0
- package/dist/bin/digest-cmd.d.ts +13 -0
- package/dist/bin/digest-cmd.d.ts.map +1 -0
- package/dist/bin/digest-cmd.js +286 -0
- package/dist/bin/digest-cmd.js.map +1 -0
- package/dist/bin/init.d.ts +33 -0
- package/dist/bin/init.d.ts.map +1 -0
- package/dist/bin/init.js +355 -0
- package/dist/bin/init.js.map +1 -0
- package/dist/bin/serve.d.ts +15 -0
- package/dist/bin/serve.d.ts.map +1 -0
- package/dist/bin/serve.js +21 -0
- package/dist/bin/serve.js.map +1 -0
- package/dist/bridges/bridge.d.ts +46 -0
- package/dist/bridges/bridge.d.ts.map +1 -0
- package/dist/bridges/bridge.js +128 -0
- package/dist/bridges/bridge.js.map +1 -0
- package/dist/bridges/registry.d.ts +19 -0
- package/dist/bridges/registry.d.ts.map +1 -0
- package/dist/bridges/registry.js +36 -0
- package/dist/bridges/registry.js.map +1 -0
- package/dist/core/config.d.ts +108 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +29 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/embed.d.ts +16 -0
- package/dist/core/embed.d.ts.map +1 -0
- package/dist/core/embed.js +7 -0
- package/dist/core/embed.js.map +1 -0
- package/dist/core/llm.d.ts +31 -0
- package/dist/core/llm.d.ts.map +1 -0
- package/dist/core/llm.js +13 -0
- package/dist/core/llm.js.map +1 -0
- package/dist/core/nli.d.ts +26 -0
- package/dist/core/nli.d.ts.map +1 -0
- package/dist/core/nli.js +11 -0
- package/dist/core/nli.js.map +1 -0
- package/dist/core/session.d.ts +26 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +71 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/store.d.ts +58 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +8 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/types.d.ts +148 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +8 -0
- package/dist/core/types.js.map +1 -0
- package/dist/engines/cognition.d.ts +76 -0
- package/dist/engines/cognition.d.ts.map +1 -0
- package/dist/engines/cognition.js +441 -0
- package/dist/engines/cognition.js.map +1 -0
- package/dist/engines/digest.d.ts +52 -0
- package/dist/engines/digest.d.ts.map +1 -0
- package/dist/engines/digest.js +351 -0
- package/dist/engines/digest.js.map +1 -0
- package/dist/engines/fsrs.d.ts +44 -0
- package/dist/engines/fsrs.d.ts.map +1 -0
- package/dist/engines/fsrs.js +122 -0
- package/dist/engines/fsrs.js.map +1 -0
- package/dist/engines/keywords.d.ts +12 -0
- package/dist/engines/keywords.d.ts.map +1 -0
- package/dist/engines/keywords.js +45 -0
- package/dist/engines/keywords.js.map +1 -0
- package/dist/engines/memory.d.ts +55 -0
- package/dist/engines/memory.d.ts.map +1 -0
- package/dist/engines/memory.js +147 -0
- package/dist/engines/memory.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +12 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +173 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +45 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +814 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/namespace/manager.d.ts +28 -0
- package/dist/namespace/manager.d.ts.map +1 -0
- package/dist/namespace/manager.js +73 -0
- package/dist/namespace/manager.js.map +1 -0
- package/dist/namespace/scoped-store.d.ts +43 -0
- package/dist/namespace/scoped-store.d.ts.map +1 -0
- package/dist/namespace/scoped-store.js +91 -0
- package/dist/namespace/scoped-store.js.map +1 -0
- package/dist/plugins/loader.d.ts +18 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +71 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/providers/nli-http.d.ts +34 -0
- package/dist/providers/nli-http.d.ts.map +1 -0
- package/dist/providers/nli-http.js +83 -0
- package/dist/providers/nli-http.js.map +1 -0
- package/dist/providers/ollama.d.ts +37 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +103 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/vertex-embed.d.ts +38 -0
- package/dist/providers/vertex-embed.d.ts.map +1 -0
- package/dist/providers/vertex-embed.js +69 -0
- package/dist/providers/vertex-embed.js.map +1 -0
- package/dist/providers/vertex-llm.d.ts +25 -0
- package/dist/providers/vertex-llm.d.ts.map +1 -0
- package/dist/providers/vertex-llm.js +75 -0
- package/dist/providers/vertex-llm.js.map +1 -0
- package/dist/stores/firestore.d.ts +59 -0
- package/dist/stores/firestore.d.ts.map +1 -0
- package/dist/stores/firestore.js +530 -0
- package/dist/stores/firestore.js.map +1 -0
- package/dist/stores/sqlite.d.ts +43 -0
- package/dist/stores/sqlite.d.ts.map +1 -0
- package/dist/stores/sqlite.js +593 -0
- package/dist/stores/sqlite.js.map +1 -0
- package/dist/triggers/pipeline.d.ts +21 -0
- package/dist/triggers/pipeline.d.ts.map +1 -0
- package/dist/triggers/pipeline.js +30 -0
- package/dist/triggers/pipeline.js.map +1 -0
- package/dist/triggers/registry.d.ts +17 -0
- package/dist/triggers/registry.d.ts.map +1 -0
- package/dist/triggers/registry.js +32 -0
- package/dist/triggers/registry.js.map +1 -0
- package/package.json +94 -0
package/dist/bin/init.js
ADDED
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* init.ts — cortex-kit init command.
|
|
3
|
+
*
|
|
4
|
+
* Scaffolds a new agent workspace with cortex-engine configuration.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* cortex-kit init <name> [options]
|
|
8
|
+
* cortex-kit init --here [options]
|
|
9
|
+
*
|
|
10
|
+
* Options:
|
|
11
|
+
* --store sqlite|firestore Storage backend (default: sqlite)
|
|
12
|
+
* --embed ollama|vertex|openai Embedding provider (default: ollama)
|
|
13
|
+
* --llm ollama|gemini|anthropic|openai LLM provider (default: ollama)
|
|
14
|
+
* --namespace <name> Default namespace name (default: default)
|
|
15
|
+
* --here Scaffold into current directory instead of creating <name>/
|
|
16
|
+
* --obsidian Create .obsidian/ structure
|
|
17
|
+
*/
|
|
18
|
+
import { mkdirSync, writeFileSync, existsSync, readFileSync, cpSync, readdirSync, chmodSync } from 'node:fs';
|
|
19
|
+
import { resolve, join, dirname } from 'node:path';
|
|
20
|
+
import { fileURLToPath } from 'node:url';
|
|
21
|
+
// ─── Arg Parsing ───────────────────────────────────────────────────────────
|
|
22
|
+
export function parseInitArgs(args) {
|
|
23
|
+
const opts = {
|
|
24
|
+
name: '',
|
|
25
|
+
store: 'sqlite',
|
|
26
|
+
embed: 'ollama',
|
|
27
|
+
llm: 'ollama',
|
|
28
|
+
namespace: 'default',
|
|
29
|
+
here: false,
|
|
30
|
+
obsidian: false,
|
|
31
|
+
};
|
|
32
|
+
let i = 0;
|
|
33
|
+
while (i < args.length) {
|
|
34
|
+
const arg = args[i];
|
|
35
|
+
if (arg === '--here') {
|
|
36
|
+
opts.here = true;
|
|
37
|
+
}
|
|
38
|
+
else if (arg === '--obsidian') {
|
|
39
|
+
opts.obsidian = true;
|
|
40
|
+
}
|
|
41
|
+
else if (arg === '--store') {
|
|
42
|
+
const val = args[++i];
|
|
43
|
+
if (val !== 'sqlite' && val !== 'firestore') {
|
|
44
|
+
console.error(`[cortex-kit] Invalid --store value: ${val}. Must be sqlite or firestore.`);
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
opts.store = val;
|
|
48
|
+
}
|
|
49
|
+
else if (arg === '--embed') {
|
|
50
|
+
const val = args[++i];
|
|
51
|
+
if (val !== 'ollama' && val !== 'vertex' && val !== 'openai') {
|
|
52
|
+
console.error(`[cortex-kit] Invalid --embed value: ${val}. Must be ollama, vertex, or openai.`);
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
opts.embed = val;
|
|
56
|
+
}
|
|
57
|
+
else if (arg === '--llm') {
|
|
58
|
+
const val = args[++i];
|
|
59
|
+
if (val !== 'ollama' && val !== 'gemini' && val !== 'anthropic' && val !== 'openai') {
|
|
60
|
+
console.error(`[cortex-kit] Invalid --llm value: ${val}. Must be ollama, gemini, anthropic, or openai.`);
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
opts.llm = val;
|
|
64
|
+
}
|
|
65
|
+
else if (arg === '--namespace') {
|
|
66
|
+
opts.namespace = args[++i] ?? 'default';
|
|
67
|
+
}
|
|
68
|
+
else if (!arg.startsWith('--')) {
|
|
69
|
+
opts.name = arg;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
console.error(`[cortex-kit] Unknown option: ${arg}`);
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
i++;
|
|
76
|
+
}
|
|
77
|
+
if (!opts.here && !opts.name) {
|
|
78
|
+
console.error('[cortex-kit] init requires a name argument or --here flag.');
|
|
79
|
+
console.error(' Usage: cortex-kit init <name>');
|
|
80
|
+
console.error(' cortex-kit init --here');
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
// When --here, derive name from current directory
|
|
84
|
+
if (opts.here && !opts.name) {
|
|
85
|
+
opts.name = process.cwd().split(/[\\/]/).pop() ?? 'agent';
|
|
86
|
+
}
|
|
87
|
+
return opts;
|
|
88
|
+
}
|
|
89
|
+
// ─── Templates ─────────────────────────────────────────────────────────────
|
|
90
|
+
function buildConfigYaml(opts) {
|
|
91
|
+
return `agent:
|
|
92
|
+
name: ${opts.name}
|
|
93
|
+
type: general
|
|
94
|
+
|
|
95
|
+
cortex:
|
|
96
|
+
store: ${opts.store}
|
|
97
|
+
embed: ${opts.embed}
|
|
98
|
+
llm: ${opts.llm}
|
|
99
|
+
|
|
100
|
+
namespaces:
|
|
101
|
+
${opts.namespace}:
|
|
102
|
+
default: true
|
|
103
|
+
description: "Default namespace"
|
|
104
|
+
cognitive_tools:
|
|
105
|
+
- observe
|
|
106
|
+
- query
|
|
107
|
+
- recall
|
|
108
|
+
- neighbors
|
|
109
|
+
- predict
|
|
110
|
+
- reflect
|
|
111
|
+
- dream
|
|
112
|
+
collections_prefix: ""
|
|
113
|
+
`;
|
|
114
|
+
}
|
|
115
|
+
const MCP_JSON = `{
|
|
116
|
+
"mcpServers": {
|
|
117
|
+
"cortex": {
|
|
118
|
+
"command": "npx",
|
|
119
|
+
"args": ["cortex-engine"]
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
`;
|
|
124
|
+
const COGNITIVE_TOOLS_REFERENCE = `# Cognitive Tools
|
|
125
|
+
|
|
126
|
+
This workspace uses cortex-engine for persistent memory and cognition.
|
|
127
|
+
|
|
128
|
+
## Available Tools
|
|
129
|
+
|
|
130
|
+
| Tool | What it does |
|
|
131
|
+
|------|-------------|
|
|
132
|
+
| \`observe\` | Record an observation — cortex decides if it's novel, similar, or duplicate |
|
|
133
|
+
| \`query\` | Semantic search across memory with HyDE expansion |
|
|
134
|
+
| \`recall\` | Browse recent observations and memories by time |
|
|
135
|
+
| \`neighbors\` | Explore the memory graph from a specific concept |
|
|
136
|
+
| \`predict\` | Proactive retrieval — what's relevant given current context |
|
|
137
|
+
| \`validate\` | Check a prediction against an outcome (FSRS learning) |
|
|
138
|
+
| \`believe\` | Record a belief change with reason tracking |
|
|
139
|
+
| \`reflect\` | Generate reflective insights connecting observations |
|
|
140
|
+
| \`dream\` | Run consolidation — cluster, refine, create, connect, score, abstract |
|
|
141
|
+
| \`digest\` | Process a document through the ingestion pipeline |
|
|
142
|
+
| \`stats\` | Memory counts and namespace health |
|
|
143
|
+
| \`ops_append\` | Log operational breadcrumbs |
|
|
144
|
+
| \`ops_query\` | Query the operational log |
|
|
145
|
+
| \`ops_update\` | Update an ops entry |
|
|
146
|
+
| \`wander\` | Random graph walk for serendipitous discovery |
|
|
147
|
+
|
|
148
|
+
## Usage Pattern
|
|
149
|
+
|
|
150
|
+
Before working on any topic, query cortex first:
|
|
151
|
+
\`\`\`
|
|
152
|
+
query("the topic you're working on")
|
|
153
|
+
\`\`\`
|
|
154
|
+
|
|
155
|
+
When you learn something interesting:
|
|
156
|
+
\`\`\`
|
|
157
|
+
observe("what you noticed")
|
|
158
|
+
\`\`\`
|
|
159
|
+
|
|
160
|
+
At session end, run dream to consolidate:
|
|
161
|
+
\`\`\`
|
|
162
|
+
dream()
|
|
163
|
+
\`\`\`
|
|
164
|
+
|
|
165
|
+
## Installed Hooks
|
|
166
|
+
|
|
167
|
+
Cortex-kit hooks are installed in \`.claude/hooks/\`. They fire automatically:
|
|
168
|
+
|
|
169
|
+
- **cognitive-grounding** — reminds you to \`query()\` before evaluation/design/review work
|
|
170
|
+
- **observe-first** — warns before writing to memory directories without \`observe()\`/\`query()\`
|
|
171
|
+
- **cortex-telemetry** — tracks retrieval patterns for quality feedback
|
|
172
|
+
- **session-lifecycle** — resets session state on startup
|
|
173
|
+
- **project-board-gate** — gates \`git push\` on board updates (configure via \`.claude/state/project-boards.json\`)
|
|
174
|
+
|
|
175
|
+
To disable any hook, delete its \`.sh\` file from \`.claude/hooks/\`.
|
|
176
|
+
|
|
177
|
+
## Installed Skills
|
|
178
|
+
|
|
179
|
+
- **/cortex-query** — best practices for querying cortex memory
|
|
180
|
+
- **/cortex-review** — structured review workflow grounded in cortex context
|
|
181
|
+
`;
|
|
182
|
+
const OBSIDIAN_APP_JSON = `{
|
|
183
|
+
"legacyEditor": false,
|
|
184
|
+
"livePreview": true,
|
|
185
|
+
"defaultViewMode": "source",
|
|
186
|
+
"vimMode": false
|
|
187
|
+
}
|
|
188
|
+
`;
|
|
189
|
+
const OBSIDIAN_APPEARANCE_JSON = `{
|
|
190
|
+
"theme": "obsidian"
|
|
191
|
+
}
|
|
192
|
+
`;
|
|
193
|
+
// ─── Manifest & Asset Installation ────────────────────────────────────────
|
|
194
|
+
/** Resolve the package root (where cortex-kit.json lives). */
|
|
195
|
+
function getPackageRoot() {
|
|
196
|
+
const thisFile = fileURLToPath(import.meta.url);
|
|
197
|
+
// dist/bin/init.js → package root (two levels up)
|
|
198
|
+
return resolve(dirname(thisFile), '..', '..');
|
|
199
|
+
}
|
|
200
|
+
function loadManifest(packageRoot) {
|
|
201
|
+
const manifestPath = join(packageRoot, 'cortex-kit.json');
|
|
202
|
+
if (!existsSync(manifestPath)) {
|
|
203
|
+
console.error('[cortex-kit] Warning: cortex-kit.json not found — skipping hook/skill installation.');
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
try {
|
|
207
|
+
return JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
211
|
+
console.error(`[cortex-kit] Warning: Failed to parse cortex-kit.json: ${msg} — skipping hook/skill installation.`);
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
function installHooks(packageRoot, targetDir, hooks) {
|
|
216
|
+
const sourceDir = join(packageRoot, 'hooks');
|
|
217
|
+
const destDir = join(targetDir, '.claude', 'hooks');
|
|
218
|
+
const installed = [];
|
|
219
|
+
if (!existsSync(sourceDir)) {
|
|
220
|
+
console.error('[cortex-kit] Warning: hooks/ directory not found in package — skipping hook installation.');
|
|
221
|
+
return installed;
|
|
222
|
+
}
|
|
223
|
+
mkdirSync(destDir, { recursive: true });
|
|
224
|
+
for (const hook of hooks) {
|
|
225
|
+
const hookFile = `${hook}.sh`;
|
|
226
|
+
const src = join(sourceDir, hookFile);
|
|
227
|
+
if (!existsSync(src)) {
|
|
228
|
+
console.error(`[cortex-kit] Warning: hook not found: ${hookFile} — skipping.`);
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
const dest = join(destDir, hookFile);
|
|
232
|
+
cpSync(src, dest);
|
|
233
|
+
// Set execute bit on Unix (no-op failure on Windows is fine)
|
|
234
|
+
try {
|
|
235
|
+
chmodSync(dest, 0o755);
|
|
236
|
+
}
|
|
237
|
+
catch { /* Windows — no execute bit */ }
|
|
238
|
+
installed.push(hookFile);
|
|
239
|
+
}
|
|
240
|
+
return installed;
|
|
241
|
+
}
|
|
242
|
+
function installSkills(packageRoot, targetDir, skills) {
|
|
243
|
+
const sourceDir = join(packageRoot, 'skills');
|
|
244
|
+
const destDir = join(targetDir, '.claude', 'skills');
|
|
245
|
+
const installed = [];
|
|
246
|
+
if (!existsSync(sourceDir)) {
|
|
247
|
+
console.error('[cortex-kit] Warning: skills/ directory not found in package — skipping skill installation.');
|
|
248
|
+
return installed;
|
|
249
|
+
}
|
|
250
|
+
mkdirSync(destDir, { recursive: true });
|
|
251
|
+
for (const skill of skills) {
|
|
252
|
+
const src = join(sourceDir, skill);
|
|
253
|
+
if (!existsSync(src)) {
|
|
254
|
+
console.error(`[cortex-kit] Warning: skill not found: ${skill}/ — skipping.`);
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
const dest = join(destDir, skill);
|
|
258
|
+
mkdirSync(dest, { recursive: true });
|
|
259
|
+
// Copy all files in the skill directory
|
|
260
|
+
for (const file of readdirSync(src)) {
|
|
261
|
+
cpSync(join(src, file), join(dest, file));
|
|
262
|
+
}
|
|
263
|
+
installed.push(skill);
|
|
264
|
+
}
|
|
265
|
+
return installed;
|
|
266
|
+
}
|
|
267
|
+
// ─── Scaffold ──────────────────────────────────────────────────────────────
|
|
268
|
+
export function runInit(args) {
|
|
269
|
+
const opts = parseInitArgs(args);
|
|
270
|
+
if (!opts) {
|
|
271
|
+
process.exit(1);
|
|
272
|
+
}
|
|
273
|
+
const targetDir = opts.here
|
|
274
|
+
? process.cwd()
|
|
275
|
+
: resolve(process.cwd(), opts.name);
|
|
276
|
+
if (!opts.here && existsSync(targetDir)) {
|
|
277
|
+
console.error(`[cortex-kit] Directory already exists: ${targetDir}`);
|
|
278
|
+
console.error(' Use --here to scaffold into the current directory.');
|
|
279
|
+
process.exit(1);
|
|
280
|
+
}
|
|
281
|
+
// Create target directory
|
|
282
|
+
mkdirSync(targetDir, { recursive: true });
|
|
283
|
+
// .fozikio/config.yaml
|
|
284
|
+
const fozikioDir = join(targetDir, '.fozikio');
|
|
285
|
+
mkdirSync(fozikioDir, { recursive: true });
|
|
286
|
+
writeFileSync(join(fozikioDir, 'config.yaml'), buildConfigYaml(opts), 'utf-8');
|
|
287
|
+
// .mcp.json
|
|
288
|
+
writeFileSync(join(targetDir, '.mcp.json'), MCP_JSON, 'utf-8');
|
|
289
|
+
// CLAUDE.md
|
|
290
|
+
writeFileSync(join(targetDir, 'CLAUDE.md'), COGNITIVE_TOOLS_REFERENCE, 'utf-8');
|
|
291
|
+
// AGENTS.md
|
|
292
|
+
writeFileSync(join(targetDir, 'AGENTS.md'), COGNITIVE_TOOLS_REFERENCE, 'utf-8');
|
|
293
|
+
// .obsidian/
|
|
294
|
+
if (opts.obsidian) {
|
|
295
|
+
const obsidianDir = join(targetDir, '.obsidian');
|
|
296
|
+
mkdirSync(obsidianDir, { recursive: true });
|
|
297
|
+
writeFileSync(join(obsidianDir, 'app.json'), OBSIDIAN_APP_JSON, 'utf-8');
|
|
298
|
+
writeFileSync(join(obsidianDir, 'appearance.json'), OBSIDIAN_APPEARANCE_JSON, 'utf-8');
|
|
299
|
+
}
|
|
300
|
+
// Install hooks and skills from manifest
|
|
301
|
+
const packageRoot = getPackageRoot();
|
|
302
|
+
const manifest = loadManifest(packageRoot);
|
|
303
|
+
const installedHooks = [];
|
|
304
|
+
const installedSkills = [];
|
|
305
|
+
let hasHookifyRules = false;
|
|
306
|
+
if (manifest?.contents) {
|
|
307
|
+
if (manifest.contents.hooks && manifest.contents.hooks.length > 0) {
|
|
308
|
+
installedHooks.push(...installHooks(packageRoot, targetDir, manifest.contents.hooks));
|
|
309
|
+
}
|
|
310
|
+
if (manifest.contents.skills && manifest.contents.skills.length > 0) {
|
|
311
|
+
installedSkills.push(...installSkills(packageRoot, targetDir, manifest.contents.skills));
|
|
312
|
+
}
|
|
313
|
+
hasHookifyRules = (manifest.contents.hookify_rules ?? []).length > 0;
|
|
314
|
+
}
|
|
315
|
+
// Success message
|
|
316
|
+
const relativePath = opts.here ? '.' : opts.name;
|
|
317
|
+
console.error(`[cortex-kit] Workspace scaffolded at: ${targetDir}`);
|
|
318
|
+
console.error('');
|
|
319
|
+
console.error('Files created:');
|
|
320
|
+
console.error(` ${relativePath}/.fozikio/config.yaml`);
|
|
321
|
+
console.error(` ${relativePath}/.mcp.json`);
|
|
322
|
+
console.error(` ${relativePath}/CLAUDE.md`);
|
|
323
|
+
console.error(` ${relativePath}/AGENTS.md`);
|
|
324
|
+
if (opts.obsidian) {
|
|
325
|
+
console.error(` ${relativePath}/.obsidian/app.json`);
|
|
326
|
+
console.error(` ${relativePath}/.obsidian/appearance.json`);
|
|
327
|
+
}
|
|
328
|
+
if (installedHooks.length > 0) {
|
|
329
|
+
console.error('');
|
|
330
|
+
console.error('Hooks installed:');
|
|
331
|
+
for (const hook of installedHooks) {
|
|
332
|
+
console.error(` ${relativePath}/.claude/hooks/${hook}`);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
if (installedSkills.length > 0) {
|
|
336
|
+
console.error('');
|
|
337
|
+
console.error('Skills installed:');
|
|
338
|
+
for (const skill of installedSkills) {
|
|
339
|
+
console.error(` ${relativePath}/.claude/skills/${skill}/`);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
if (hasHookifyRules) {
|
|
343
|
+
console.error('');
|
|
344
|
+
console.error('Recommended hookify rules available. Run `cortex-kit install-rules` to install.');
|
|
345
|
+
}
|
|
346
|
+
console.error('');
|
|
347
|
+
console.error('Next steps:');
|
|
348
|
+
if (!opts.here) {
|
|
349
|
+
console.error(` cd ${opts.name}`);
|
|
350
|
+
}
|
|
351
|
+
console.error(` # Edit .fozikio/config.yaml to configure your store and providers`);
|
|
352
|
+
console.error(` # Add cortex to your MCP client using .mcp.json`);
|
|
353
|
+
console.error(` npx cortex-engine # start the MCP server`);
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/bin/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* cortex-engine MCP server entry point.
|
|
4
|
+
*
|
|
5
|
+
* Searches for a config file in standard locations, merges with defaults,
|
|
6
|
+
* then starts the stdio MCP server.
|
|
7
|
+
*
|
|
8
|
+
* Config search order:
|
|
9
|
+
* 1. .fozikio/config.yaml (agent workspace)
|
|
10
|
+
* 2. cortex.config.yaml (project root)
|
|
11
|
+
* 3. config.yaml (project root)
|
|
12
|
+
* 4. defaults (sqlite + ollama)
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=serve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/bin/serve.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* cortex-engine MCP server entry point.
|
|
4
|
+
*
|
|
5
|
+
* Searches for a config file in standard locations, merges with defaults,
|
|
6
|
+
* then starts the stdio MCP server.
|
|
7
|
+
*
|
|
8
|
+
* Config search order:
|
|
9
|
+
* 1. .fozikio/config.yaml (agent workspace)
|
|
10
|
+
* 2. cortex.config.yaml (project root)
|
|
11
|
+
* 3. config.yaml (project root)
|
|
12
|
+
* 4. defaults (sqlite + ollama)
|
|
13
|
+
*/
|
|
14
|
+
import { loadConfig } from './config-loader.js';
|
|
15
|
+
import { startServer } from '../mcp/server.js';
|
|
16
|
+
const config = loadConfig();
|
|
17
|
+
startServer(config).catch(err => {
|
|
18
|
+
console.error('[cortex-engine] Fatal error:', err);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/bin/serve.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAE5B,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { ResolvedBridgeRule } from './registry.js';
|
|
2
|
+
export interface BridgeContext {
|
|
3
|
+
/** Current bridge chain depth (0 = top-level event, 1 = first bridge, etc.) */
|
|
4
|
+
depth: number;
|
|
5
|
+
/** Source namespace that triggered this bridge */
|
|
6
|
+
sourceNamespace: string;
|
|
7
|
+
/** Bridge name for audit trail */
|
|
8
|
+
bridgeName: string;
|
|
9
|
+
}
|
|
10
|
+
export interface BridgeResult {
|
|
11
|
+
bridgeName: string;
|
|
12
|
+
from: string;
|
|
13
|
+
to: string;
|
|
14
|
+
event: string;
|
|
15
|
+
status: 'executed' | 'skipped_condition' | 'skipped_depth' | 'failed';
|
|
16
|
+
error?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Evaluate a simple condition expression against a result object.
|
|
20
|
+
* Supports: field > value, field < value, field == value, field != value
|
|
21
|
+
*
|
|
22
|
+
* Examples:
|
|
23
|
+
* "confidence > 0.7"
|
|
24
|
+
* "prediction_error > 0.7"
|
|
25
|
+
* "dimension == \"beliefs\""
|
|
26
|
+
*/
|
|
27
|
+
export declare function evaluateCondition(condition: string, data: Record<string, unknown>): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Interpolate a template string with values from data.
|
|
30
|
+
* Replaces {{field}} with data[field].
|
|
31
|
+
*
|
|
32
|
+
* Example: "Prediction {{outcome}}: {{summary}}" with {outcome: "correct", summary: "BTC > 100k"}
|
|
33
|
+
* → "Prediction correct: BTC > 100k"
|
|
34
|
+
*/
|
|
35
|
+
export declare function interpolateTemplate(template: string, data: Record<string, unknown>): string;
|
|
36
|
+
/**
|
|
37
|
+
* Check and execute bridge rules for a given event.
|
|
38
|
+
*
|
|
39
|
+
* @param rules - Bridge rules to evaluate (from BridgeRegistry.getRulesForEvent)
|
|
40
|
+
* @param eventData - The result data from the source event
|
|
41
|
+
* @param executePipeline - Callback to execute a pipeline in the target namespace
|
|
42
|
+
* @param context - Current bridge context (for depth tracking)
|
|
43
|
+
* @returns Array of bridge results
|
|
44
|
+
*/
|
|
45
|
+
export declare function checkBridges(rules: ResolvedBridgeRule[], eventData: Record<string, unknown>, executePipeline: (namespace: string, text: string, metadata: Record<string, unknown>) => Promise<void>, context?: BridgeContext): Promise<BridgeResult[]>;
|
|
46
|
+
//# sourceMappingURL=bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/bridges/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAKxD,MAAM,WAAW,aAAa;IAC5B,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,eAAe,EAAE,MAAM,CAAC;IACxB,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,GAAG,mBAAmB,GAAG,eAAe,GAAG,QAAQ,CAAC;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CA2B3F;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAM3F;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,kBAAkB,EAAE,EAC3B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,eAAe,EAAE,CACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC9B,OAAO,CAAC,IAAI,CAAC,EAClB,OAAO,GAAE,aAAiE,GACzE,OAAO,CAAC,YAAY,EAAE,CAAC,CAgEzB"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// Maximum bridge chain depth to prevent infinite loops (A→B→C→stop)
|
|
2
|
+
const MAX_BRIDGE_DEPTH = 3;
|
|
3
|
+
/**
|
|
4
|
+
* Evaluate a simple condition expression against a result object.
|
|
5
|
+
* Supports: field > value, field < value, field == value, field != value
|
|
6
|
+
*
|
|
7
|
+
* Examples:
|
|
8
|
+
* "confidence > 0.7"
|
|
9
|
+
* "prediction_error > 0.7"
|
|
10
|
+
* "dimension == \"beliefs\""
|
|
11
|
+
*/
|
|
12
|
+
export function evaluateCondition(condition, data) {
|
|
13
|
+
// Parse: field operator value
|
|
14
|
+
const match = condition.match(/^\s*(\w+)\s*(==|!=|>=|<=|>|<)\s*(.+)\s*$/);
|
|
15
|
+
if (!match)
|
|
16
|
+
return false;
|
|
17
|
+
const [, field, op, rawValue] = match;
|
|
18
|
+
const actual = data[field];
|
|
19
|
+
if (actual === undefined)
|
|
20
|
+
return false;
|
|
21
|
+
// Parse the value — number, quoted string, or boolean
|
|
22
|
+
let expected;
|
|
23
|
+
const trimmed = rawValue.trim();
|
|
24
|
+
if (trimmed === 'true')
|
|
25
|
+
expected = true;
|
|
26
|
+
else if (trimmed === 'false')
|
|
27
|
+
expected = false;
|
|
28
|
+
else if (/^".*"$/.test(trimmed) || /^'.*'$/.test(trimmed))
|
|
29
|
+
expected = trimmed.slice(1, -1);
|
|
30
|
+
else if (!isNaN(Number(trimmed)))
|
|
31
|
+
expected = Number(trimmed);
|
|
32
|
+
else
|
|
33
|
+
expected = trimmed; // bare string
|
|
34
|
+
switch (op) {
|
|
35
|
+
case '==': return actual === expected;
|
|
36
|
+
case '!=': return actual !== expected;
|
|
37
|
+
case '>': return typeof actual === 'number' && typeof expected === 'number' && actual > expected;
|
|
38
|
+
case '<': return typeof actual === 'number' && typeof expected === 'number' && actual < expected;
|
|
39
|
+
case '>=': return typeof actual === 'number' && typeof expected === 'number' && actual >= expected;
|
|
40
|
+
case '<=': return typeof actual === 'number' && typeof expected === 'number' && actual <= expected;
|
|
41
|
+
default: return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Interpolate a template string with values from data.
|
|
46
|
+
* Replaces {{field}} with data[field].
|
|
47
|
+
*
|
|
48
|
+
* Example: "Prediction {{outcome}}: {{summary}}" with {outcome: "correct", summary: "BTC > 100k"}
|
|
49
|
+
* → "Prediction correct: BTC > 100k"
|
|
50
|
+
*/
|
|
51
|
+
export function interpolateTemplate(template, data) {
|
|
52
|
+
return template.replace(/\{\{(\w+)\}\}/g, (_, key) => {
|
|
53
|
+
const val = data[key];
|
|
54
|
+
if (val === undefined || val === null)
|
|
55
|
+
return `{{${key}}}`;
|
|
56
|
+
return String(val);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check and execute bridge rules for a given event.
|
|
61
|
+
*
|
|
62
|
+
* @param rules - Bridge rules to evaluate (from BridgeRegistry.getRulesForEvent)
|
|
63
|
+
* @param eventData - The result data from the source event
|
|
64
|
+
* @param executePipeline - Callback to execute a pipeline in the target namespace
|
|
65
|
+
* @param context - Current bridge context (for depth tracking)
|
|
66
|
+
* @returns Array of bridge results
|
|
67
|
+
*/
|
|
68
|
+
export async function checkBridges(rules, eventData, executePipeline, context = { depth: 0, sourceNamespace: '', bridgeName: '' }) {
|
|
69
|
+
const results = [];
|
|
70
|
+
// Cycle detection: stop at max depth
|
|
71
|
+
if (context.depth >= MAX_BRIDGE_DEPTH) {
|
|
72
|
+
for (const rule of rules) {
|
|
73
|
+
results.push({
|
|
74
|
+
bridgeName: rule.bridgeName,
|
|
75
|
+
from: rule.from,
|
|
76
|
+
to: rule.to,
|
|
77
|
+
event: rule.event,
|
|
78
|
+
status: 'skipped_depth',
|
|
79
|
+
error: `Bridge depth ${context.depth} >= max ${MAX_BRIDGE_DEPTH}`,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return results;
|
|
83
|
+
}
|
|
84
|
+
for (const rule of rules) {
|
|
85
|
+
// Evaluate condition
|
|
86
|
+
if (rule.condition && !evaluateCondition(rule.condition, eventData)) {
|
|
87
|
+
results.push({
|
|
88
|
+
bridgeName: rule.bridgeName,
|
|
89
|
+
from: rule.from,
|
|
90
|
+
to: rule.to,
|
|
91
|
+
event: rule.event,
|
|
92
|
+
status: 'skipped_condition',
|
|
93
|
+
});
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
// Interpolate template or stringify event data
|
|
97
|
+
const text = rule.template
|
|
98
|
+
? interpolateTemplate(rule.template, eventData)
|
|
99
|
+
: JSON.stringify(eventData);
|
|
100
|
+
try {
|
|
101
|
+
await executePipeline(rule.to, text, {
|
|
102
|
+
_bridge_source: rule.from,
|
|
103
|
+
_bridge_name: rule.bridgeName,
|
|
104
|
+
_bridge_depth: context.depth + 1,
|
|
105
|
+
});
|
|
106
|
+
results.push({
|
|
107
|
+
bridgeName: rule.bridgeName,
|
|
108
|
+
from: rule.from,
|
|
109
|
+
to: rule.to,
|
|
110
|
+
event: rule.event,
|
|
111
|
+
status: 'executed',
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
116
|
+
results.push({
|
|
117
|
+
bridgeName: rule.bridgeName,
|
|
118
|
+
from: rule.from,
|
|
119
|
+
to: rule.to,
|
|
120
|
+
event: rule.event,
|
|
121
|
+
status: 'failed',
|
|
122
|
+
error: message,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return results;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/bridges/bridge.ts"],"names":[],"mappings":"AAEA,oEAAoE;AACpE,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAoB3B;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB,EAAE,IAA6B;IAChF,8BAA8B;IAC9B,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC1E,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAEvC,sDAAsD;IACtD,IAAI,QAAiB,CAAC;IACtB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,OAAO,KAAK,MAAM;QAAE,QAAQ,GAAG,IAAI,CAAC;SACnC,IAAI,OAAO,KAAK,OAAO;QAAE,QAAQ,GAAG,KAAK,CAAC;SAC1C,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SACtF,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAAE,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;;QACxD,QAAQ,GAAG,OAAO,CAAC,CAAC,cAAc;IAEvC,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,IAAI,CAAC,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC;QACtC,KAAK,IAAI,CAAC,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC;QACtC,KAAK,GAAG,CAAC,CAAC,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,GAAG,QAAQ,CAAC;QACjG,KAAK,GAAG,CAAC,CAAC,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,GAAG,QAAQ,CAAC;QACjG,KAAK,IAAI,CAAC,CAAC,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,IAAI,QAAQ,CAAC;QACnG,KAAK,IAAI,CAAC,CAAC,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,IAAI,QAAQ,CAAC;QACnG,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,IAA6B;IACjF,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,KAAK,GAAG,IAAI,CAAC;QAC3D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAA2B,EAC3B,SAAkC,EAClC,eAIkB,EAClB,UAAyB,EAAE,KAAK,EAAE,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;IAE1E,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,qCAAqC;IACrC,IAAI,OAAO,CAAC,KAAK,IAAI,gBAAgB,EAAE,CAAC;QACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC;gBACX,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,eAAe;gBACvB,KAAK,EAAE,gBAAgB,OAAO,CAAC,KAAK,WAAW,gBAAgB,EAAE;aAClE,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,qBAAqB;QACrB,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC;gBACX,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,mBAAmB;aAC5B,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,+CAA+C;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ;YACxB,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;YAC/C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAE9B,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE;gBACnC,cAAc,EAAE,IAAI,CAAC,IAAI;gBACzB,YAAY,EAAE,IAAI,CAAC,UAAU;gBAC7B,aAAa,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC;aACjC,CAAC,CAAC;YAEH,OAAO,CAAC,IAAI,CAAC;gBACX,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,UAAU;aACnB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC;gBACX,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,QAAQ;gBAChB,KAAK,EAAE,OAAO;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { BridgeConfig } from '../core/config.js';
|
|
2
|
+
export interface ResolvedBridgeRule {
|
|
3
|
+
bridgeName: string;
|
|
4
|
+
from: string;
|
|
5
|
+
to: string;
|
|
6
|
+
event: string;
|
|
7
|
+
condition?: string;
|
|
8
|
+
pipeline: string[];
|
|
9
|
+
template?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare class BridgeRegistry {
|
|
12
|
+
private readonly rules;
|
|
13
|
+
constructor(bridges?: BridgeConfig[]);
|
|
14
|
+
/** Get bridge rules triggered by event in source namespace. */
|
|
15
|
+
getRulesForEvent(sourceNamespace: string, event: string): ResolvedBridgeRule[];
|
|
16
|
+
/** Get all registered bridge names. */
|
|
17
|
+
getBridgeNames(): string[];
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/bridges/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgD;gBAE1D,OAAO,GAAE,YAAY,EAAO;IAoBxC,+DAA+D;IAC/D,gBAAgB,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAI9E,uCAAuC;IACvC,cAAc,IAAI,MAAM,EAAE;CAO3B"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export class BridgeRegistry {
|
|
2
|
+
rules = new Map();
|
|
3
|
+
constructor(bridges = []) {
|
|
4
|
+
for (const bridge of bridges) {
|
|
5
|
+
for (const rule of bridge.on) {
|
|
6
|
+
const key = `${bridge.from}:${rule.event}`;
|
|
7
|
+
const resolved = {
|
|
8
|
+
bridgeName: bridge.name,
|
|
9
|
+
from: bridge.from,
|
|
10
|
+
to: bridge.to,
|
|
11
|
+
event: rule.event,
|
|
12
|
+
condition: rule.condition,
|
|
13
|
+
pipeline: rule.pipeline,
|
|
14
|
+
template: rule.template,
|
|
15
|
+
};
|
|
16
|
+
const existing = this.rules.get(key) || [];
|
|
17
|
+
existing.push(resolved);
|
|
18
|
+
this.rules.set(key, existing);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** Get bridge rules triggered by event in source namespace. */
|
|
23
|
+
getRulesForEvent(sourceNamespace, event) {
|
|
24
|
+
return this.rules.get(`${sourceNamespace}:${event}`) || [];
|
|
25
|
+
}
|
|
26
|
+
/** Get all registered bridge names. */
|
|
27
|
+
getBridgeNames() {
|
|
28
|
+
const names = new Set();
|
|
29
|
+
for (const rules of this.rules.values()) {
|
|
30
|
+
for (const rule of rules)
|
|
31
|
+
names.add(rule.bridgeName);
|
|
32
|
+
}
|
|
33
|
+
return Array.from(names);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=registry.js.map
|