n2-soul 7.0.5 → 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 +1 -1
- package/index.js +8 -66
- package/package.json +1 -1
- package/sequences/boot.js +0 -8
package/README.md
CHANGED
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;
|