n2-soul 7.0.4 → 7.0.6
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/README.md +15 -17
- package/index.js +8 -66
- package/package.json +1 -1
- package/sequences/boot.js +0 -8
package/README.md
CHANGED
|
@@ -468,23 +468,21 @@ All runtime data is stored in `data/` (gitignored, auto-created):
|
|
|
468
468
|
|
|
469
469
|
```
|
|
470
470
|
soul/
|
|
471
|
-
├── rules/ # Ark safety rules (active) ← v6.0
|
|
472
|
-
│ └── default.n2 # Default ruleset (125 patterns)
|
|
473
471
|
├── lib/
|
|
474
|
-
│ ├──
|
|
475
|
-
│
|
|
476
|
-
│
|
|
477
|
-
│
|
|
478
|
-
│
|
|
479
|
-
│
|
|
480
|
-
│ └──
|
|
481
|
-
|
|
482
|
-
│
|
|
483
|
-
│
|
|
484
|
-
|
|
485
|
-
│
|
|
486
|
-
│
|
|
487
|
-
│
|
|
472
|
+
│ ├── config.default.js # Default configuration
|
|
473
|
+
│ ├── soul-engine.js # Core Soul engine
|
|
474
|
+
│ ├── core-memory.js # Core Memory (per-agent facts)
|
|
475
|
+
│ ├── entity-memory.js # Entity Memory (auto-tracked)
|
|
476
|
+
│ ├── intercom-log.js # Inter-agent communication logs
|
|
477
|
+
│ ├── kv-cache/ # KV-Cache backend
|
|
478
|
+
│ └── utils.js # Shared utilities
|
|
479
|
+
├── tools/
|
|
480
|
+
│ ├── brain.js # Brain read/write tools
|
|
481
|
+
│ └── kv-cache.js # KV-Cache tools
|
|
482
|
+
├── sequences/
|
|
483
|
+
│ ├── boot.js # Boot sequence
|
|
484
|
+
│ ├── work.js # Work sequence
|
|
485
|
+
│ └── end.js # End sequence
|
|
488
486
|
├── data/
|
|
489
487
|
│ ├── memory/ # Shared brain (n2_brain_read/write)
|
|
490
488
|
│ │ ├── entities.json # Entity Memory (auto-tracked)
|
|
@@ -549,7 +547,7 @@ Soul is free and open-source. These amazing people help keep it alive:
|
|
|
549
547
|
|
|
550
548
|
## Star History
|
|
551
549
|
|
|
552
|
-
|
|
550
|
+
No coffee? A star is fine too ☕→⭐
|
|
553
551
|
|
|
554
552
|
---
|
|
555
553
|
|
package/index.js
CHANGED
|
@@ -1,21 +1,18 @@
|
|
|
1
|
-
// Soul MCP v7.
|
|
1
|
+
// Soul MCP v7.1 — Entry point. Multi-agent session orchestrator with KV-Cache.
|
|
2
2
|
const path = require('path');
|
|
3
3
|
const { McpServer } = require('@modelcontextprotocol/sdk/server/mcp.js');
|
|
4
4
|
const { StdioServerTransport } = require('@modelcontextprotocol/sdk/server/stdio.js');
|
|
5
5
|
const { z } = require('zod');
|
|
6
6
|
const config = require('./lib/config');
|
|
7
|
-
const { createArk } = require('./lib/ark');
|
|
8
|
-
const { createArachne } = require('./lib/arachne');
|
|
9
7
|
|
|
10
8
|
// Sequences — agent lifecycle management
|
|
11
9
|
const { registerBootSequence } = require('./sequences/boot');
|
|
12
10
|
const { registerWorkSequence } = require('./sequences/work');
|
|
13
11
|
const { registerEndSequence } = require('./sequences/end');
|
|
14
12
|
|
|
15
|
-
// Tools — shared memory + KV-Cache persistence
|
|
13
|
+
// Tools — shared memory + KV-Cache persistence
|
|
16
14
|
const { registerBrainTools } = require('./tools/brain');
|
|
17
15
|
const { registerKVCacheTools } = require('./tools/kv-cache');
|
|
18
|
-
const { registerArachneTools } = require('./tools/arachne');
|
|
19
16
|
|
|
20
17
|
const pkg = require('./package.json');
|
|
21
18
|
const server = new McpServer({
|
|
@@ -24,79 +21,24 @@ const server = new McpServer({
|
|
|
24
21
|
});
|
|
25
22
|
|
|
26
23
|
// ═══════════════════════════════════════════════════════
|
|
27
|
-
//
|
|
28
|
-
// "You shall not pass."
|
|
29
|
-
//
|
|
30
|
-
// Pure & simple: every tool call → check against rules.
|
|
31
|
-
// No tool classification. No special cases.
|
|
32
|
-
// The RULES decide what's blocked — not the code.
|
|
24
|
+
// registerTool shim — bridges legacy registerTool() to SDK v1.6.1 server.tool()
|
|
33
25
|
// ═══════════════════════════════════════════════════════
|
|
34
|
-
const ark = createArk({
|
|
35
|
-
rulesDir: config.ARK?.rulesDir ?? path.join(__dirname, 'rules'),
|
|
36
|
-
auditDir: config.ARK?.auditDir ?? path.join(config.DATA_DIR, 'ark-audit'),
|
|
37
|
-
strictMode: config.ARK?.strictMode ?? false,
|
|
38
|
-
auditMaxAgeDays: config.ARK?.auditMaxAgeDays ?? 7,
|
|
39
|
-
auditEnabled: true,
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
// Ark-wrapped registerTool shim — bridges legacy registerTool() to SDK v1.6.1 server.tool()
|
|
43
26
|
const _origTool = server.tool.bind(server);
|
|
44
|
-
const _arkWrap = (name, handler) => async (args) => {
|
|
45
|
-
const content = JSON.stringify(args);
|
|
46
|
-
const result = ark.check(name, content, 'tool_call');
|
|
47
|
-
if (!result.allowed) {
|
|
48
|
-
return {
|
|
49
|
-
content: [{
|
|
50
|
-
type: 'text',
|
|
51
|
-
text: `[n2-ark] BLOCKED: ${result.reason}\n` +
|
|
52
|
-
`Rule: ${result.rule} | Action: ${result.action}\n` +
|
|
53
|
-
`This action requires human approval.`,
|
|
54
|
-
}],
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
return handler(args);
|
|
58
|
-
};
|
|
59
|
-
// Shim: server.registerTool(name, {title, description, inputSchema}, handler) → server.tool()
|
|
60
27
|
server.registerTool = (name, schema, handler) => {
|
|
61
28
|
const desc = schema.description || schema.title || name;
|
|
62
|
-
_origTool(name, desc, schema.inputSchema || {},
|
|
63
|
-
};
|
|
64
|
-
// Override: server.tool() with Ark check (for files using new API directly, e.g. arachne.js)
|
|
65
|
-
server.tool = (name, ...rest) => {
|
|
66
|
-
const handler = rest.pop();
|
|
67
|
-
_origTool(name, ...rest, _arkWrap(name, handler));
|
|
29
|
+
_origTool(name, desc, schema.inputSchema || {}, handler);
|
|
68
30
|
};
|
|
69
|
-
// ═══ End
|
|
31
|
+
// ═══ End shim ═══
|
|
70
32
|
|
|
71
|
-
// Register core modules
|
|
72
|
-
registerBootSequence(server, z, config
|
|
33
|
+
// Register core modules
|
|
34
|
+
registerBootSequence(server, z, config);
|
|
73
35
|
registerWorkSequence(server, z, config);
|
|
74
36
|
registerEndSequence(server, z, config);
|
|
75
37
|
registerBrainTools(server, z, config);
|
|
76
38
|
registerKVCacheTools(server, z, config);
|
|
77
39
|
|
|
78
|
-
//
|
|
79
|
-
// Arachne — THE GREATEST WEAVER
|
|
80
|
-
// Code context assembly engine — indexes codebase,
|
|
81
|
-
// picks exactly what AI needs.
|
|
82
|
-
// Only activates when ARACHNE config is present.
|
|
83
|
-
// ═══════════════════════════════════════════════════════
|
|
40
|
+
// Start MCP transport
|
|
84
41
|
async function boot() {
|
|
85
|
-
// Initialize Arachne (if configured)
|
|
86
|
-
if (config.ARACHNE?.projectDir) {
|
|
87
|
-
try {
|
|
88
|
-
const arachne = await createArachne({
|
|
89
|
-
...config.ARACHNE,
|
|
90
|
-
dataDir: config.ARACHNE.dataDir ?? path.join(config.DATA_DIR, 'arachne'),
|
|
91
|
-
});
|
|
92
|
-
registerArachneTools(server, z, arachne, config);
|
|
93
|
-
console.error(`[n2-soul] Arachne enabled: ${config.ARACHNE.projectDir}`);
|
|
94
|
-
} catch (err) {
|
|
95
|
-
console.error(`[n2-soul] Arachne init failed: ${err.message}`);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// Start MCP transport
|
|
100
42
|
const transport = new StdioServerTransport();
|
|
101
43
|
await server.connect(transport);
|
|
102
44
|
}
|
package/package.json
CHANGED
package/sequences/boot.js
CHANGED
|
@@ -38,14 +38,6 @@ function registerBootSequence(server, z, config, workflows = {}) {
|
|
|
38
38
|
lines.push(`Agents: ${agents.map(a => `${a.name}[${a.model}]`).join(', ')}`);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
// Ark safety status — always shown, no opt-out
|
|
42
|
-
try {
|
|
43
|
-
const rulesDir = config.ARK?.rulesDir || path.join(config.SOUL_ROOT, 'rules');
|
|
44
|
-
const ruleFiles = fs.readdirSync(rulesDir).filter(f => f.endsWith('.n2'));
|
|
45
|
-
lines.push(`Ark: ${ruleFiles.length} rule files loaded — ACTIVE`);
|
|
46
|
-
} catch (e) {
|
|
47
|
-
lines.push(`Ark: LOAD FAILED — ${e.message}`);
|
|
48
|
-
}
|
|
49
41
|
|
|
50
42
|
// -- Soul Board: handoff + TODO (auto-detect latest project) --
|
|
51
43
|
let targetProject = project;
|