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 CHANGED
@@ -547,7 +547,7 @@ Soul is free and open-source. These amazing people help keep it alive:
547
547
 
548
548
  ## Star History
549
549
 
550
- If you find Soul helpful, please consider giving us a star! ⭐
550
+ No coffee? A star is fine too ☕→⭐
551
551
 
552
552
  ---
553
553
 
package/index.js CHANGED
@@ -1,21 +1,18 @@
1
- // Soul MCP v7.0 — Entry point. Multi-agent session orchestrator with KV-Cache + Ark + Arachne.
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 + code context
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
- // ArkTHE LAST SHIELD
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 || {}, _arkWrap(name, handler));
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 Ark ═══
31
+ // ═══ End shim ═══
70
32
 
71
- // Register core modules (all tools pass through Ark)
72
- registerBootSequence(server, z, config, ark.workflows);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n2-soul",
3
- "version": "7.0.5",
3
+ "version": "7.0.6",
4
4
  "description": "Multi-agent session orchestrator with KV-Cache, Ark safety, and Arachne code context for MCP",
5
5
  "main": "index.js",
6
6
  "scripts": {
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;