musubix2 0.5.8 → 0.5.10

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.
@@ -1 +1 @@
1
- {"generator":"musubix2","version":"0.5.8","timestamp":"2026-07-09T10:18:54.616Z"}
1
+ {"generator":"musubix2","version":"0.5.10","timestamp":"2026-07-09T10:42:36.515Z"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": "1.0",
3
- "generatedAt": "2026-07-09T10:18:54.648Z",
3
+ "generatedAt": "2026-07-09T10:42:36.544Z",
4
4
  "entries": [
5
5
  {
6
6
  "platform": "copilot",
package/dist/cli.js CHANGED
@@ -14180,63 +14180,101 @@ function policyTools() {
14180
14180
  })
14181
14181
  ];
14182
14182
  }
14183
+ async function loadTripleStore(basePath) {
14184
+ const { createOntologyStore: createOntologyStore2 } = await Promise.resolve().then(() => (init_dist3(), dist_exports3));
14185
+ const store = createOntologyStore2();
14186
+ const { existsSync: existsSync12, readFileSync: readFileSync7 } = await import("node:fs");
14187
+ const { join: join8 } = await import("node:path");
14188
+ const file = join8(basePath, ".musubix", "ontology.json");
14189
+ try {
14190
+ if (existsSync12(file)) {
14191
+ store.addTriples(JSON.parse(readFileSync7(file, "utf-8")));
14192
+ }
14193
+ } catch {
14194
+ }
14195
+ return { store, file };
14196
+ }
14197
+ async function saveTripleStore(store, file) {
14198
+ const { writeFileSync: writeFileSync4, mkdirSync: mkdirSync4 } = await import("node:fs");
14199
+ const { dirname: dirname4 } = await import("node:path");
14200
+ mkdirSync4(dirname4(file), { recursive: true });
14201
+ writeFileSync4(file, JSON.stringify(store.getAll(), null, 2), "utf-8");
14202
+ }
14183
14203
  function ontologyTools() {
14184
14204
  return [
14185
- tool("ontology.triple.add", "Add a triple (subject, predicate, object) to the ontology store", "ontology", [
14186
- param("subject", "string", "Subject URI"),
14187
- param("predicate", "string", "Predicate URI"),
14188
- param("object", "string", "Object URI or literal")
14205
+ tool("ontology.triple.add", "Add a triple (subject, predicate, object) to the persisted ontology store", "ontology", [
14206
+ param("subject", "string", "Subject"),
14207
+ param("predicate", "string", "Predicate"),
14208
+ param("object", "string", "Object (URI or literal)"),
14209
+ param("basePath", "string", "Project base path", false, ".")
14189
14210
  ], async (params) => {
14190
14211
  try {
14191
- const ont = await Promise.resolve().then(() => (init_dist3(), dist_exports3));
14192
- const store = ont.createTripleStore?.();
14193
- store?.add(params["subject"], params["predicate"], params["object"]);
14194
- return ok({ added: true, subject: params["subject"], predicate: params["predicate"], object: params["object"] });
14212
+ const { store, file } = await loadTripleStore(params["basePath"] ?? ".");
14213
+ store.addTriple({
14214
+ subject: params["subject"],
14215
+ predicate: params["predicate"],
14216
+ object: params["object"]
14217
+ });
14218
+ await saveTripleStore(store, file);
14219
+ return ok({ added: true, total: store.size() });
14195
14220
  } catch {
14196
- return ok({ added: true, subject: params["subject"], predicate: params["predicate"], object: params["object"] });
14221
+ return fail("Ontology package not available");
14197
14222
  }
14198
14223
  }),
14199
- tool("ontology.triple.query", "Query triples by pattern matching", "ontology", [
14200
- param("subject", "string", "Subject pattern (empty for wildcard)", false),
14201
- param("predicate", "string", "Predicate pattern (empty for wildcard)", false),
14202
- param("object", "string", "Object pattern (empty for wildcard)", false)
14224
+ tool("ontology.triple.query", "Query triples by pattern (omit a term to wildcard it)", "ontology", [
14225
+ param("subject", "string", "Subject pattern", false),
14226
+ param("predicate", "string", "Predicate pattern", false),
14227
+ param("object", "string", "Object pattern", false),
14228
+ param("basePath", "string", "Project base path", false, ".")
14203
14229
  ], async (params) => {
14204
14230
  try {
14205
- const ont = await Promise.resolve().then(() => (init_dist3(), dist_exports3));
14206
- const store = ont.createTripleStore?.();
14207
- const results = store?.query(params["subject"], params["predicate"], params["object"]);
14208
- return ok(results ?? []);
14231
+ const { store } = await loadTripleStore(params["basePath"] ?? ".");
14232
+ const results = store.query({
14233
+ subject: params["subject"],
14234
+ predicate: params["predicate"],
14235
+ object: params["object"]
14236
+ });
14237
+ return ok({ results, count: results.length });
14209
14238
  } catch {
14210
- return ok([]);
14239
+ return fail("Ontology package not available");
14211
14240
  }
14212
14241
  }),
14213
- tool("ontology.rules.apply", "Apply rule engine to infer new triples", "ontology", [param("rules", "array", "Rules to apply", false)], async (params) => {
14242
+ tool("ontology.rules.apply", "Apply the default OWL 2 RL rule engine to infer new triples", "ontology", [param("basePath", "string", "Project base path", false, ".")], async (params) => {
14214
14243
  try {
14215
- const ont = await Promise.resolve().then(() => (init_dist3(), dist_exports3));
14216
- const engine = ont.createRuleEngine?.();
14217
- const result = engine?.apply(params["rules"]);
14218
- return ok(result ?? { inferred: 0, triples: [] });
14244
+ const { createRuleEngine: createRuleEngine2 } = await Promise.resolve().then(() => (init_dist3(), dist_exports3));
14245
+ const { store, file } = await loadTripleStore(params["basePath"] ?? ".");
14246
+ const result = createRuleEngine2(true).applyRules(store);
14247
+ await saveTripleStore(store, file);
14248
+ return ok(result);
14219
14249
  } catch {
14220
- return ok({ inferred: 0, triples: [] });
14250
+ return fail("Ontology package not available");
14221
14251
  }
14222
14252
  }),
14223
- tool("ontology.consistency.check", "Check ontology consistency", "ontology", [], async () => {
14253
+ tool("ontology.consistency.check", "Check ontology consistency against the persisted store", "ontology", [param("basePath", "string", "Project base path", false, ".")], async (params) => {
14224
14254
  try {
14225
- const ont = await Promise.resolve().then(() => (init_dist3(), dist_exports3));
14226
- const checker = ont.createConsistencyChecker?.();
14227
- const result = checker?.check();
14228
- return ok(result ?? { consistent: true, issues: [] });
14255
+ const { createConsistencyValidator: createConsistencyValidator2 } = await Promise.resolve().then(() => (init_dist3(), dist_exports3));
14256
+ const { store } = await loadTripleStore(params["basePath"] ?? ".");
14257
+ return ok(createConsistencyValidator2().validate(store));
14229
14258
  } catch {
14230
- return ok({ consistent: true, issues: [] });
14259
+ return fail("Ontology package not available");
14231
14260
  }
14232
14261
  }),
14233
- tool("ontology.sparql.query", "Execute a SPARQL-like query against the ontology", "ontology", [param("query", "string", "SPARQL-like query string")], async (params) => {
14262
+ tool("ontology.sparql.query", "Pattern query over the store (basic subject/predicate/object matching)", "ontology", [
14263
+ param("subject", "string", "Subject pattern", false),
14264
+ param("predicate", "string", "Predicate pattern", false),
14265
+ param("object", "string", "Object pattern", false),
14266
+ param("basePath", "string", "Project base path", false, ".")
14267
+ ], async (params) => {
14234
14268
  try {
14235
- const ont = await Promise.resolve().then(() => (init_dist3(), dist_exports3));
14236
- const result = ont.sparqlQuery?.(params["query"]);
14237
- return ok(result ?? { bindings: [] });
14269
+ const { store } = await loadTripleStore(params["basePath"] ?? ".");
14270
+ const bindings = store.query({
14271
+ subject: params["subject"],
14272
+ predicate: params["predicate"],
14273
+ object: params["object"]
14274
+ });
14275
+ return ok({ bindings, count: bindings.length });
14238
14276
  } catch {
14239
- return ok({ bindings: [] });
14277
+ return fail("Ontology package not available");
14240
14278
  }
14241
14279
  })
14242
14280
  ];
@@ -14248,47 +14286,78 @@ function codeAnalysisTools() {
14248
14286
  param("language", "string", "Source language: typescript | javascript | python", false, "typescript")
14249
14287
  ], async (params) => {
14250
14288
  try {
14251
- const cg = await Promise.resolve().then(() => (init_dist4(), dist_exports4));
14252
- const ast = cg.parseSource?.(params["source"], params["language"] ?? "typescript");
14253
- return ok(ast ?? { type: "Program", body: [] });
14289
+ const { createASTParser: createASTParser2 } = await Promise.resolve().then(() => (init_dist4(), dist_exports4));
14290
+ const nodes = createASTParser2().parse(params["source"] ?? "", params["language"] ?? "typescript");
14291
+ return ok({ nodes, count: nodes.length });
14254
14292
  } catch {
14255
- return ok({ type: "Program", body: [] });
14293
+ return fail("Codegraph package not available");
14256
14294
  }
14257
14295
  }),
14258
- tool("code.graph.build", "Build a dependency graph from source files", "code-analysis", [
14259
- param("entryPoint", "string", "Entry point file path"),
14260
- param("basePath", "string", "Project base path", false, ".")
14261
- ], async (params) => {
14296
+ tool("code.graph.build", "Build a code graph (nodes) from inline sources", "code-analysis", [param("sources", "array", "Sources as {code, language, filePath} objects")], async (params) => {
14262
14297
  try {
14263
- const cg = await Promise.resolve().then(() => (init_dist4(), dist_exports4));
14264
- const graph = cg.buildDependencyGraph?.(params["entryPoint"], params["basePath"] ?? ".");
14265
- return ok(graph ?? { nodes: [], edges: [] });
14298
+ const { createASTParser: createASTParser2, createGraphEngine: createGraphEngine2 } = await Promise.resolve().then(() => (init_dist4(), dist_exports4));
14299
+ const parser = createASTParser2();
14300
+ const engine = createGraphEngine2();
14301
+ const sources = params["sources"] ?? [];
14302
+ for (const s of sources) {
14303
+ const lang = s.language ?? "typescript";
14304
+ for (const n of parser.parse(s.code ?? "", lang)) {
14305
+ engine.addNode({
14306
+ id: `${s.filePath ?? "inline"}:${n.name}`,
14307
+ name: n.name,
14308
+ kind: n.kind,
14309
+ filePath: s.filePath ?? "inline",
14310
+ language: lang,
14311
+ startLine: n.startLine ?? 0,
14312
+ endLine: n.endLine ?? 0
14313
+ });
14314
+ }
14315
+ }
14316
+ const stats = engine.getStats();
14317
+ return ok({ nodeCount: stats.nodeCount, edgeCount: stats.edgeCount, languages: [...stats.languages] });
14266
14318
  } catch {
14267
- return ok({ nodes: [], edges: [] });
14319
+ return fail("Codegraph package not available");
14268
14320
  }
14269
14321
  }),
14270
- tool("code.graph.search", "Search code graph using GraphRAG techniques", "code-analysis", [
14322
+ tool("code.graph.search", "Search a code graph built from inline sources using GraphRAG", "code-analysis", [
14271
14323
  param("query", "string", "Search query"),
14272
- param("basePath", "string", "Project base path", false, ".")
14324
+ param("sources", "array", "Sources as {code, language, filePath} objects to index")
14273
14325
  ], async (params) => {
14274
14326
  try {
14275
- const cg = await Promise.resolve().then(() => (init_dist4(), dist_exports4));
14276
- const results = cg.graphSearch?.(params["query"], params["basePath"] ?? ".");
14277
- return ok(results ?? []);
14327
+ const { createASTParser: createASTParser2, createGraphEngine: createGraphEngine2, GraphRAGSearch: GraphRAGSearch2 } = await Promise.resolve().then(() => (init_dist4(), dist_exports4));
14328
+ const parser = createASTParser2();
14329
+ const engine = createGraphEngine2();
14330
+ const sources = params["sources"] ?? [];
14331
+ for (const s of sources) {
14332
+ const lang = s.language ?? "typescript";
14333
+ for (const n of parser.parse(s.code ?? "", lang)) {
14334
+ engine.addNode({
14335
+ id: `${s.filePath ?? "inline"}:${n.name}`,
14336
+ name: n.name,
14337
+ kind: n.kind,
14338
+ filePath: s.filePath ?? "inline",
14339
+ language: lang,
14340
+ startLine: n.startLine ?? 0,
14341
+ endLine: n.endLine ?? 0
14342
+ });
14343
+ }
14344
+ }
14345
+ const results = new GraphRAGSearch2(engine).globalSearch(params["query"] ?? "");
14346
+ return ok({ query: params["query"], results });
14278
14347
  } catch {
14279
- return ok([]);
14348
+ return fail("Codegraph package not available");
14280
14349
  }
14281
14350
  }),
14282
- tool("code.dfg.analyze", "Perform data flow analysis on source code", "code-analysis", [
14283
- param("source", "string", "Source code to analyze"),
14284
- param("language", "string", "Source language", false, "typescript")
14351
+ tool("code.dfg.analyze", "Build a data-flow graph from structured statements and report reaching definitions", "code-analysis", [
14352
+ param("statements", "array", "SimpleStatement[] (type/line/variable/value/usedVariables)"),
14353
+ param("scope", "string", "Scope name", false, "global")
14285
14354
  ], async (params) => {
14286
14355
  try {
14287
- const dfg = await Promise.resolve().then(() => (init_dist13(), dist_exports13));
14288
- const result = dfg.analyzeDataFlow?.(params["source"], params["language"] ?? "typescript");
14289
- return ok(result ?? { flows: [], variables: [] });
14356
+ const { createDataFlowAnalyzer: createDataFlowAnalyzer2 } = await Promise.resolve().then(() => (init_dist13(), dist_exports13));
14357
+ const dfg = createDataFlowAnalyzer2().buildDFG(params["statements"] ?? [], params["scope"] ?? "global");
14358
+ return ok(dfg);
14290
14359
  } catch {
14291
- return ok({ flows: [], variables: [] });
14360
+ return fail("DFG package not available");
14292
14361
  }
14293
14362
  })
14294
14363
  ];
@@ -14362,93 +14431,129 @@ function researchTools() {
14362
14431
  param("depth", "string", "Research depth: shallow | medium | deep", false, "medium")
14363
14432
  ], async (params) => {
14364
14433
  try {
14365
- const research = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14366
- const result = research.query?.(params["topic"], params["depth"] ?? "medium");
14367
- return ok(result ?? { findings: [], topic: params["topic"] });
14434
+ const { createResearchEngine: createResearchEngine2 } = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14435
+ const sources = normalizeSources(params["sources"]);
14436
+ const result = createResearchEngine2().research({ topic: params["topic"] ?? "", depth: params["depth"] ?? "medium" }, sources);
14437
+ return ok(result);
14368
14438
  } catch {
14369
- return ok({ findings: [], topic: params["topic"] });
14439
+ return fail("Deep-research package not available");
14370
14440
  }
14371
14441
  }),
14372
- tool("research.iterative", "Perform iterative deep research with progressive refinement", "research", [
14442
+ tool("research.iterative", "Perform iterative research with progressive refinement over provided sources", "research", [
14373
14443
  param("topic", "string", "Research topic"),
14374
- param("iterations", "number", "Number of refinement iterations", false, 3)
14444
+ param("depth", "string", "Depth: shallow | medium | deep", false, "medium"),
14445
+ param("sources", "array", "Sources as {title,type,relevance,content} objects")
14375
14446
  ], async (params) => {
14376
14447
  try {
14377
- const research = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14378
- const result = research.iterativeResearch?.(params["topic"], params["iterations"] ?? 3);
14379
- return ok(result ?? { findings: [], iterations: 0, topic: params["topic"] });
14448
+ const { createResearchEngine: createResearchEngine2 } = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14449
+ const sources = normalizeSources(params["sources"]);
14450
+ const result = createResearchEngine2().researchIterative({ topic: params["topic"] ?? "", depth: params["depth"] ?? "medium" }, () => sources);
14451
+ return ok(result);
14380
14452
  } catch {
14381
- return ok({ findings: [], iterations: 0, topic: params["topic"] });
14453
+ return fail("Deep-research package not available");
14382
14454
  }
14383
14455
  }),
14384
- tool("research.evidence", "Generate evidence chain for a claim or hypothesis", "research", [
14385
- param("claim", "string", "Claim or hypothesis to evaluate"),
14386
- param("sources", "array", "Evidence sources to consider", false)
14456
+ tool("research.evidence", "Accumulate research results and retrieve evidence for a topic", "research", [
14457
+ param("topic", "string", "Topic to gather evidence for"),
14458
+ param("sources", "array", "Sources as {title,type,relevance,content} objects")
14387
14459
  ], async (params) => {
14388
14460
  try {
14389
- const research = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14390
- const result = research.generateEvidence?.(params["claim"], params["sources"]);
14391
- return ok(result ?? { evidence: [], confidence: 0 });
14461
+ const { createResearchEngine: createResearchEngine2, createKnowledgeAccumulator: createKnowledgeAccumulator2 } = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14462
+ const sources = normalizeSources(params["sources"]);
14463
+ const topic = params["topic"] ?? "";
14464
+ const result = createResearchEngine2().research({ topic, depth: "medium" }, sources);
14465
+ const acc = createKnowledgeAccumulator2();
14466
+ acc.accumulate(result);
14467
+ return ok({ evidence: acc.query(topic), summary: result.summary, confidence: result.confidence });
14392
14468
  } catch {
14393
- return ok({ evidence: [], confidence: 0 });
14469
+ return fail("Deep-research package not available");
14394
14470
  }
14395
14471
  })
14396
14472
  ];
14397
14473
  }
14474
+ function normalizeSources(raw) {
14475
+ const valid = /* @__PURE__ */ new Set(["code", "documentation", "article", "api-reference"]);
14476
+ const arr = Array.isArray(raw) ? raw : [];
14477
+ return arr.map((s, i) => {
14478
+ const o = s ?? {};
14479
+ const t = String(o["type"] ?? "documentation");
14480
+ return {
14481
+ title: String(o["title"] ?? `source-${i + 1}`),
14482
+ type: valid.has(t) ? t : "documentation",
14483
+ relevance: typeof o["relevance"] === "number" ? o["relevance"] : 0.5,
14484
+ content: String(o["content"] ?? (typeof s === "string" ? s : ""))
14485
+ };
14486
+ });
14487
+ }
14398
14488
  function neuralTools() {
14399
14489
  return [
14400
- tool("neural.search", "Neural similarity search across embeddings", "neural", [
14490
+ tool("neural.search", "Neural (TF-IDF) similarity search over provided documents", "neural", [
14401
14491
  param("query", "string", "Search query"),
14492
+ param("documents", "array", "Documents to index: strings or {id,text} objects"),
14402
14493
  param("topK", "number", "Number of results", false, 10)
14403
14494
  ], async (params) => {
14404
14495
  try {
14405
- const ns = await Promise.resolve().then(() => (init_dist14(), dist_exports14));
14406
- const results = ns.search?.(params["query"], params["topK"] ?? 10);
14407
- return ok(results ?? []);
14496
+ const { createNeuralSearchEngine: createNeuralSearchEngine2, createTfIdfEmbeddingModel: createTfIdfEmbeddingModel2 } = await Promise.resolve().then(() => (init_dist14(), dist_exports14));
14497
+ const model = createTfIdfEmbeddingModel2();
14498
+ const engine = createNeuralSearchEngine2();
14499
+ const docs = params["documents"] ?? [];
14500
+ const texts = docs.map((d) => typeof d === "string" ? d : d.text ?? "");
14501
+ const model2 = createTfIdfEmbeddingModel2();
14502
+ if (typeof model2.fit === "function") {
14503
+ model2.fit(texts);
14504
+ }
14505
+ const embedder = typeof model2.fit === "function" ? model2 : model;
14506
+ for (let i = 0; i < docs.length; i++) {
14507
+ const d = docs[i];
14508
+ const id = typeof d === "string" ? `doc-${i}` : d.id ?? `doc-${i}`;
14509
+ engine.addDocument(id, await embedder.embed(texts[i]), { text: texts[i] });
14510
+ }
14511
+ const hits = engine.search(await embedder.embed(params["query"] ?? ""), params["topK"] ?? 10);
14512
+ return ok({ query: params["query"], hits });
14408
14513
  } catch {
14409
- return ok([]);
14514
+ return fail("Neural-search package not available");
14410
14515
  }
14411
14516
  }),
14412
- tool("neural.embed", "Generate embeddings for text", "neural", [param("text", "string", "Text to embed")], async (params) => {
14517
+ tool("neural.embed", "Generate a TF-IDF embedding vector for text", "neural", [param("text", "string", "Text to embed")], async (params) => {
14413
14518
  try {
14414
- const ns = await Promise.resolve().then(() => (init_dist14(), dist_exports14));
14415
- const embedding = ns.embed?.(params["text"]);
14416
- return ok(embedding ?? { vector: [], dimensions: 0 });
14519
+ const { createTfIdfEmbeddingModel: createTfIdfEmbeddingModel2 } = await Promise.resolve().then(() => (init_dist14(), dist_exports14));
14520
+ const model = createTfIdfEmbeddingModel2();
14521
+ const text = params["text"] ?? "";
14522
+ if (typeof model.fit === "function") {
14523
+ model.fit([text]);
14524
+ }
14525
+ const vector = await model.embed(text);
14526
+ return ok({ vector, dimensions: Array.isArray(vector) ? vector.length : vector.values?.length ?? 0 });
14417
14527
  } catch {
14418
- return ok({ vector: [], dimensions: 0 });
14528
+ return fail("Neural-search package not available");
14419
14529
  }
14420
14530
  }),
14421
- tool("neural.patterns.extract", "Wake phase: extract patterns from code or data", "neural", [
14422
- param("source", "string", "Source code or data to extract patterns from"),
14423
- param("type", "string", "Pattern type: structural | behavioral | api", false, "structural")
14424
- ], async (params) => {
14531
+ tool("neural.patterns.extract", "Wake phase: extract patterns from a list of items", "neural", [param("items", "array", "Items (strings) to process for pattern extraction")], async (params) => {
14425
14532
  try {
14426
- const ws = await Promise.resolve().then(() => (init_dist15(), dist_exports15));
14427
- const patterns = ws.extractPatterns?.(params["source"], params["type"] ?? "structural");
14428
- return ok(patterns ?? { patterns: [], type: params["type"] ?? "structural" });
14533
+ const { createWakePhase: createWakePhase2 } = await Promise.resolve().then(() => (init_dist15(), dist_exports15));
14534
+ const items = (params["items"] ?? []).map(String);
14535
+ return ok(createWakePhase2().process(items));
14429
14536
  } catch {
14430
- return ok({ patterns: [], type: params["type"] ?? "structural" });
14537
+ return fail("Wake-sleep package not available");
14431
14538
  }
14432
14539
  }),
14433
- tool("neural.patterns.consolidate", "Sleep phase: consolidate and compress learned patterns", "neural", [param("patterns", "array", "Patterns to consolidate", false)], async (params) => {
14540
+ tool("neural.patterns.consolidate", "Sleep phase: consolidate and compress learned patterns", "neural", [param("patterns", "array", "Pattern strings to consolidate")], async (params) => {
14434
14541
  try {
14435
- const ws = await Promise.resolve().then(() => (init_dist15(), dist_exports15));
14436
- const result = ws.consolidatePatterns?.(params["patterns"]);
14437
- return ok(result ?? { consolidated: [], count: 0 });
14542
+ const { createSleepPhase: createSleepPhase2 } = await Promise.resolve().then(() => (init_dist15(), dist_exports15));
14543
+ const patterns = (params["patterns"] ?? []).map(String);
14544
+ return ok(createSleepPhase2().consolidate(patterns));
14438
14545
  } catch {
14439
- return ok({ consolidated: [], count: 0 });
14546
+ return fail("Wake-sleep package not available");
14440
14547
  }
14441
14548
  }),
14442
- tool("neural.library.learn", "Learn patterns from a library or framework", "neural", [
14443
- param("library", "string", "Library name or path"),
14444
- param("depth", "string", "Analysis depth: api | usage | deep", false, "api")
14445
- ], async (params) => {
14549
+ tool("neural.library.learn", "Learn reusable patterns from code snippets (E-graph library learning)", "neural", [param("snippets", "array", "Array of code snippet strings to learn from")], async (params) => {
14446
14550
  try {
14447
- const ll = await Promise.resolve().then(() => (init_dist11(), dist_exports11));
14448
- const result = ll.learnLibrary?.(params["library"], params["depth"] ?? "api");
14449
- return ok(result ?? { patterns: [], library: params["library"] });
14551
+ const { createLibraryLearner: createLibraryLearner2 } = await Promise.resolve().then(() => (init_dist11(), dist_exports11));
14552
+ const snippets = (params["snippets"] ?? []).map(String);
14553
+ const patterns = createLibraryLearner2().learn(snippets);
14554
+ return ok({ patterns, count: patterns.length });
14450
14555
  } catch {
14451
- return ok({ patterns: [], library: params["library"] });
14556
+ return fail("Library-learner package not available");
14452
14557
  }
14453
14558
  })
14454
14559
  ];
@@ -14602,52 +14707,81 @@ function formalVerifyTools() {
14602
14707
  })
14603
14708
  ];
14604
14709
  }
14710
+ async function loadTracker(basePath) {
14711
+ const { createStateTracker: createStateTracker2 } = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14712
+ const { existsSync: existsSync12, readFileSync: readFileSync7 } = await import("node:fs");
14713
+ const { join: join8 } = await import("node:path");
14714
+ const tracker = createStateTracker2();
14715
+ const file = join8(basePath, ".musubix", "workflow-state.json");
14716
+ try {
14717
+ if (existsSync12(file))
14718
+ tracker.restore(JSON.parse(readFileSync7(file, "utf-8")));
14719
+ } catch {
14720
+ }
14721
+ return { tracker, file };
14722
+ }
14723
+ async function saveTracker(tracker, file) {
14724
+ const { writeFileSync: writeFileSync4, mkdirSync: mkdirSync4 } = await import("node:fs");
14725
+ const { dirname: dirname4 } = await import("node:path");
14726
+ mkdirSync4(dirname4(file), { recursive: true });
14727
+ writeFileSync4(file, JSON.stringify(tracker.toJSON(), null, 2), "utf-8");
14728
+ }
14605
14729
  function workflowTools() {
14606
14730
  return [
14607
- tool("workflow.phase.current", "Get the current SDD workflow phase", "workflow", [param("basePath", "string", "Project base path", false, ".")], async (params) => {
14731
+ tool("workflow.phase.current", "Get the current SDD workflow phase and approvals", "workflow", [param("basePath", "string", "Project base path", false, ".")], async (params) => {
14608
14732
  try {
14609
- const wf = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14610
- const engine = wf.createWorkflowEngine?.(params["basePath"] ?? ".");
14611
- const phase = engine?.getCurrentPhase();
14612
- return ok(phase ?? { phase: "requirements", index: 0 });
14733
+ const { PHASE_ORDER: PHASE_ORDER2 } = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14734
+ const { tracker } = await loadTracker(params["basePath"] ?? ".");
14735
+ const state = tracker.getState();
14736
+ return ok({
14737
+ currentPhase: state.currentPhase,
14738
+ approvals: PHASE_ORDER2.map((p) => ({ phase: p, approved: tracker.isApproved(p) }))
14739
+ });
14613
14740
  } catch {
14614
- return ok({ phase: "requirements", index: 0 });
14741
+ return fail("Workflow-engine package not available");
14615
14742
  }
14616
14743
  }),
14617
- tool("workflow.phase.transition", "Transition to the next SDD workflow phase", "workflow", [
14744
+ tool("workflow.phase.transition", "Transition to a target SDD workflow phase (persisted)", "workflow", [
14618
14745
  param("targetPhase", "string", "Target phase to transition to"),
14619
14746
  param("basePath", "string", "Project base path", false, ".")
14620
14747
  ], async (params) => {
14621
14748
  try {
14622
- const wf = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14623
- const engine = wf.createWorkflowEngine?.(params["basePath"] ?? ".");
14624
- const result = engine?.transition(params["targetPhase"]);
14625
- return ok(result ?? { success: false, phase: params["targetPhase"] });
14749
+ const { createPhaseController: createPhaseController2 } = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14750
+ const { tracker, file } = await loadTracker(params["basePath"] ?? ".");
14751
+ const result = await createPhaseController2(tracker).transitionTo(params["targetPhase"]);
14752
+ if (result.success)
14753
+ await saveTracker(tracker, file);
14754
+ return ok(result);
14626
14755
  } catch {
14627
- return ok({ success: false, phase: params["targetPhase"] });
14756
+ return fail("Workflow-engine package not available");
14628
14757
  }
14629
14758
  }),
14630
- tool("workflow.gate.check", "Check if a quality gate can be passed", "workflow", [
14631
- param("gate", "string", "Gate name"),
14759
+ tool("workflow.gate.check", "Check whether the workflow can transition to a target phase (quality gates)", "workflow", [
14760
+ param("targetPhase", "string", "Target phase to check"),
14632
14761
  param("basePath", "string", "Project base path", false, ".")
14633
14762
  ], async (params) => {
14634
14763
  try {
14635
- const wf = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14636
- const engine = wf.createWorkflowEngine?.(params["basePath"] ?? ".");
14637
- const result = engine?.checkGate(params["gate"]);
14638
- return ok(result ?? { passed: false, gate: params["gate"] });
14764
+ const { createPhaseController: createPhaseController2 } = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14765
+ const { tracker } = await loadTracker(params["basePath"] ?? ".");
14766
+ const target = params["targetPhase"] ?? params["gate"];
14767
+ const canTransition = await createPhaseController2(tracker).canTransition(target);
14768
+ return ok({ targetPhase: target, canTransition });
14639
14769
  } catch {
14640
- return ok({ passed: false, gate: params["gate"] });
14770
+ return fail("Workflow-engine package not available");
14641
14771
  }
14642
14772
  }),
14643
- tool("workflow.tasks.list", "List tasks for the current workflow phase", "workflow", [param("basePath", "string", "Project base path", false, ".")], async (params) => {
14773
+ tool("workflow.approve", "Approve the current (or a named) SDD phase (persisted)", "workflow", [
14774
+ param("phase", "string", "Phase to approve"),
14775
+ param("basePath", "string", "Project base path", false, ".")
14776
+ ], async (params) => {
14644
14777
  try {
14645
- const wf = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14646
- const engine = wf.createWorkflowEngine?.(params["basePath"] ?? ".");
14647
- const tasks = engine?.listTasks();
14648
- return ok(tasks ?? []);
14778
+ const { tracker, file } = await loadTracker(params["basePath"] ?? ".");
14779
+ const phase = params["phase"] ?? tracker.getState().currentPhase;
14780
+ tracker.approve(phase);
14781
+ await saveTracker(tracker, file);
14782
+ return ok({ phase, approved: true });
14649
14783
  } catch {
14650
- return ok([]);
14784
+ return fail("Workflow-engine package not available");
14651
14785
  }
14652
14786
  })
14653
14787
  ];
package/dist/index.js CHANGED
@@ -14180,63 +14180,101 @@ function policyTools() {
14180
14180
  })
14181
14181
  ];
14182
14182
  }
14183
+ async function loadTripleStore(basePath) {
14184
+ const { createOntologyStore: createOntologyStore2 } = await Promise.resolve().then(() => (init_dist3(), dist_exports3));
14185
+ const store = createOntologyStore2();
14186
+ const { existsSync: existsSync12, readFileSync: readFileSync7 } = await import("node:fs");
14187
+ const { join: join8 } = await import("node:path");
14188
+ const file = join8(basePath, ".musubix", "ontology.json");
14189
+ try {
14190
+ if (existsSync12(file)) {
14191
+ store.addTriples(JSON.parse(readFileSync7(file, "utf-8")));
14192
+ }
14193
+ } catch {
14194
+ }
14195
+ return { store, file };
14196
+ }
14197
+ async function saveTripleStore(store, file) {
14198
+ const { writeFileSync: writeFileSync4, mkdirSync: mkdirSync4 } = await import("node:fs");
14199
+ const { dirname: dirname4 } = await import("node:path");
14200
+ mkdirSync4(dirname4(file), { recursive: true });
14201
+ writeFileSync4(file, JSON.stringify(store.getAll(), null, 2), "utf-8");
14202
+ }
14183
14203
  function ontologyTools() {
14184
14204
  return [
14185
- tool("ontology.triple.add", "Add a triple (subject, predicate, object) to the ontology store", "ontology", [
14186
- param("subject", "string", "Subject URI"),
14187
- param("predicate", "string", "Predicate URI"),
14188
- param("object", "string", "Object URI or literal")
14205
+ tool("ontology.triple.add", "Add a triple (subject, predicate, object) to the persisted ontology store", "ontology", [
14206
+ param("subject", "string", "Subject"),
14207
+ param("predicate", "string", "Predicate"),
14208
+ param("object", "string", "Object (URI or literal)"),
14209
+ param("basePath", "string", "Project base path", false, ".")
14189
14210
  ], async (params) => {
14190
14211
  try {
14191
- const ont = await Promise.resolve().then(() => (init_dist3(), dist_exports3));
14192
- const store = ont.createTripleStore?.();
14193
- store?.add(params["subject"], params["predicate"], params["object"]);
14194
- return ok({ added: true, subject: params["subject"], predicate: params["predicate"], object: params["object"] });
14212
+ const { store, file } = await loadTripleStore(params["basePath"] ?? ".");
14213
+ store.addTriple({
14214
+ subject: params["subject"],
14215
+ predicate: params["predicate"],
14216
+ object: params["object"]
14217
+ });
14218
+ await saveTripleStore(store, file);
14219
+ return ok({ added: true, total: store.size() });
14195
14220
  } catch {
14196
- return ok({ added: true, subject: params["subject"], predicate: params["predicate"], object: params["object"] });
14221
+ return fail("Ontology package not available");
14197
14222
  }
14198
14223
  }),
14199
- tool("ontology.triple.query", "Query triples by pattern matching", "ontology", [
14200
- param("subject", "string", "Subject pattern (empty for wildcard)", false),
14201
- param("predicate", "string", "Predicate pattern (empty for wildcard)", false),
14202
- param("object", "string", "Object pattern (empty for wildcard)", false)
14224
+ tool("ontology.triple.query", "Query triples by pattern (omit a term to wildcard it)", "ontology", [
14225
+ param("subject", "string", "Subject pattern", false),
14226
+ param("predicate", "string", "Predicate pattern", false),
14227
+ param("object", "string", "Object pattern", false),
14228
+ param("basePath", "string", "Project base path", false, ".")
14203
14229
  ], async (params) => {
14204
14230
  try {
14205
- const ont = await Promise.resolve().then(() => (init_dist3(), dist_exports3));
14206
- const store = ont.createTripleStore?.();
14207
- const results = store?.query(params["subject"], params["predicate"], params["object"]);
14208
- return ok(results ?? []);
14231
+ const { store } = await loadTripleStore(params["basePath"] ?? ".");
14232
+ const results = store.query({
14233
+ subject: params["subject"],
14234
+ predicate: params["predicate"],
14235
+ object: params["object"]
14236
+ });
14237
+ return ok({ results, count: results.length });
14209
14238
  } catch {
14210
- return ok([]);
14239
+ return fail("Ontology package not available");
14211
14240
  }
14212
14241
  }),
14213
- tool("ontology.rules.apply", "Apply rule engine to infer new triples", "ontology", [param("rules", "array", "Rules to apply", false)], async (params) => {
14242
+ tool("ontology.rules.apply", "Apply the default OWL 2 RL rule engine to infer new triples", "ontology", [param("basePath", "string", "Project base path", false, ".")], async (params) => {
14214
14243
  try {
14215
- const ont = await Promise.resolve().then(() => (init_dist3(), dist_exports3));
14216
- const engine = ont.createRuleEngine?.();
14217
- const result = engine?.apply(params["rules"]);
14218
- return ok(result ?? { inferred: 0, triples: [] });
14244
+ const { createRuleEngine: createRuleEngine2 } = await Promise.resolve().then(() => (init_dist3(), dist_exports3));
14245
+ const { store, file } = await loadTripleStore(params["basePath"] ?? ".");
14246
+ const result = createRuleEngine2(true).applyRules(store);
14247
+ await saveTripleStore(store, file);
14248
+ return ok(result);
14219
14249
  } catch {
14220
- return ok({ inferred: 0, triples: [] });
14250
+ return fail("Ontology package not available");
14221
14251
  }
14222
14252
  }),
14223
- tool("ontology.consistency.check", "Check ontology consistency", "ontology", [], async () => {
14253
+ tool("ontology.consistency.check", "Check ontology consistency against the persisted store", "ontology", [param("basePath", "string", "Project base path", false, ".")], async (params) => {
14224
14254
  try {
14225
- const ont = await Promise.resolve().then(() => (init_dist3(), dist_exports3));
14226
- const checker = ont.createConsistencyChecker?.();
14227
- const result = checker?.check();
14228
- return ok(result ?? { consistent: true, issues: [] });
14255
+ const { createConsistencyValidator: createConsistencyValidator2 } = await Promise.resolve().then(() => (init_dist3(), dist_exports3));
14256
+ const { store } = await loadTripleStore(params["basePath"] ?? ".");
14257
+ return ok(createConsistencyValidator2().validate(store));
14229
14258
  } catch {
14230
- return ok({ consistent: true, issues: [] });
14259
+ return fail("Ontology package not available");
14231
14260
  }
14232
14261
  }),
14233
- tool("ontology.sparql.query", "Execute a SPARQL-like query against the ontology", "ontology", [param("query", "string", "SPARQL-like query string")], async (params) => {
14262
+ tool("ontology.sparql.query", "Pattern query over the store (basic subject/predicate/object matching)", "ontology", [
14263
+ param("subject", "string", "Subject pattern", false),
14264
+ param("predicate", "string", "Predicate pattern", false),
14265
+ param("object", "string", "Object pattern", false),
14266
+ param("basePath", "string", "Project base path", false, ".")
14267
+ ], async (params) => {
14234
14268
  try {
14235
- const ont = await Promise.resolve().then(() => (init_dist3(), dist_exports3));
14236
- const result = ont.sparqlQuery?.(params["query"]);
14237
- return ok(result ?? { bindings: [] });
14269
+ const { store } = await loadTripleStore(params["basePath"] ?? ".");
14270
+ const bindings = store.query({
14271
+ subject: params["subject"],
14272
+ predicate: params["predicate"],
14273
+ object: params["object"]
14274
+ });
14275
+ return ok({ bindings, count: bindings.length });
14238
14276
  } catch {
14239
- return ok({ bindings: [] });
14277
+ return fail("Ontology package not available");
14240
14278
  }
14241
14279
  })
14242
14280
  ];
@@ -14248,47 +14286,78 @@ function codeAnalysisTools() {
14248
14286
  param("language", "string", "Source language: typescript | javascript | python", false, "typescript")
14249
14287
  ], async (params) => {
14250
14288
  try {
14251
- const cg = await Promise.resolve().then(() => (init_dist4(), dist_exports4));
14252
- const ast = cg.parseSource?.(params["source"], params["language"] ?? "typescript");
14253
- return ok(ast ?? { type: "Program", body: [] });
14289
+ const { createASTParser: createASTParser2 } = await Promise.resolve().then(() => (init_dist4(), dist_exports4));
14290
+ const nodes = createASTParser2().parse(params["source"] ?? "", params["language"] ?? "typescript");
14291
+ return ok({ nodes, count: nodes.length });
14254
14292
  } catch {
14255
- return ok({ type: "Program", body: [] });
14293
+ return fail("Codegraph package not available");
14256
14294
  }
14257
14295
  }),
14258
- tool("code.graph.build", "Build a dependency graph from source files", "code-analysis", [
14259
- param("entryPoint", "string", "Entry point file path"),
14260
- param("basePath", "string", "Project base path", false, ".")
14261
- ], async (params) => {
14296
+ tool("code.graph.build", "Build a code graph (nodes) from inline sources", "code-analysis", [param("sources", "array", "Sources as {code, language, filePath} objects")], async (params) => {
14262
14297
  try {
14263
- const cg = await Promise.resolve().then(() => (init_dist4(), dist_exports4));
14264
- const graph = cg.buildDependencyGraph?.(params["entryPoint"], params["basePath"] ?? ".");
14265
- return ok(graph ?? { nodes: [], edges: [] });
14298
+ const { createASTParser: createASTParser2, createGraphEngine: createGraphEngine2 } = await Promise.resolve().then(() => (init_dist4(), dist_exports4));
14299
+ const parser = createASTParser2();
14300
+ const engine = createGraphEngine2();
14301
+ const sources = params["sources"] ?? [];
14302
+ for (const s of sources) {
14303
+ const lang = s.language ?? "typescript";
14304
+ for (const n of parser.parse(s.code ?? "", lang)) {
14305
+ engine.addNode({
14306
+ id: `${s.filePath ?? "inline"}:${n.name}`,
14307
+ name: n.name,
14308
+ kind: n.kind,
14309
+ filePath: s.filePath ?? "inline",
14310
+ language: lang,
14311
+ startLine: n.startLine ?? 0,
14312
+ endLine: n.endLine ?? 0
14313
+ });
14314
+ }
14315
+ }
14316
+ const stats = engine.getStats();
14317
+ return ok({ nodeCount: stats.nodeCount, edgeCount: stats.edgeCount, languages: [...stats.languages] });
14266
14318
  } catch {
14267
- return ok({ nodes: [], edges: [] });
14319
+ return fail("Codegraph package not available");
14268
14320
  }
14269
14321
  }),
14270
- tool("code.graph.search", "Search code graph using GraphRAG techniques", "code-analysis", [
14322
+ tool("code.graph.search", "Search a code graph built from inline sources using GraphRAG", "code-analysis", [
14271
14323
  param("query", "string", "Search query"),
14272
- param("basePath", "string", "Project base path", false, ".")
14324
+ param("sources", "array", "Sources as {code, language, filePath} objects to index")
14273
14325
  ], async (params) => {
14274
14326
  try {
14275
- const cg = await Promise.resolve().then(() => (init_dist4(), dist_exports4));
14276
- const results = cg.graphSearch?.(params["query"], params["basePath"] ?? ".");
14277
- return ok(results ?? []);
14327
+ const { createASTParser: createASTParser2, createGraphEngine: createGraphEngine2, GraphRAGSearch: GraphRAGSearch2 } = await Promise.resolve().then(() => (init_dist4(), dist_exports4));
14328
+ const parser = createASTParser2();
14329
+ const engine = createGraphEngine2();
14330
+ const sources = params["sources"] ?? [];
14331
+ for (const s of sources) {
14332
+ const lang = s.language ?? "typescript";
14333
+ for (const n of parser.parse(s.code ?? "", lang)) {
14334
+ engine.addNode({
14335
+ id: `${s.filePath ?? "inline"}:${n.name}`,
14336
+ name: n.name,
14337
+ kind: n.kind,
14338
+ filePath: s.filePath ?? "inline",
14339
+ language: lang,
14340
+ startLine: n.startLine ?? 0,
14341
+ endLine: n.endLine ?? 0
14342
+ });
14343
+ }
14344
+ }
14345
+ const results = new GraphRAGSearch2(engine).globalSearch(params["query"] ?? "");
14346
+ return ok({ query: params["query"], results });
14278
14347
  } catch {
14279
- return ok([]);
14348
+ return fail("Codegraph package not available");
14280
14349
  }
14281
14350
  }),
14282
- tool("code.dfg.analyze", "Perform data flow analysis on source code", "code-analysis", [
14283
- param("source", "string", "Source code to analyze"),
14284
- param("language", "string", "Source language", false, "typescript")
14351
+ tool("code.dfg.analyze", "Build a data-flow graph from structured statements and report reaching definitions", "code-analysis", [
14352
+ param("statements", "array", "SimpleStatement[] (type/line/variable/value/usedVariables)"),
14353
+ param("scope", "string", "Scope name", false, "global")
14285
14354
  ], async (params) => {
14286
14355
  try {
14287
- const dfg = await Promise.resolve().then(() => (init_dist13(), dist_exports13));
14288
- const result = dfg.analyzeDataFlow?.(params["source"], params["language"] ?? "typescript");
14289
- return ok(result ?? { flows: [], variables: [] });
14356
+ const { createDataFlowAnalyzer: createDataFlowAnalyzer2 } = await Promise.resolve().then(() => (init_dist13(), dist_exports13));
14357
+ const dfg = createDataFlowAnalyzer2().buildDFG(params["statements"] ?? [], params["scope"] ?? "global");
14358
+ return ok(dfg);
14290
14359
  } catch {
14291
- return ok({ flows: [], variables: [] });
14360
+ return fail("DFG package not available");
14292
14361
  }
14293
14362
  })
14294
14363
  ];
@@ -14362,93 +14431,129 @@ function researchTools() {
14362
14431
  param("depth", "string", "Research depth: shallow | medium | deep", false, "medium")
14363
14432
  ], async (params) => {
14364
14433
  try {
14365
- const research = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14366
- const result = research.query?.(params["topic"], params["depth"] ?? "medium");
14367
- return ok(result ?? { findings: [], topic: params["topic"] });
14434
+ const { createResearchEngine: createResearchEngine2 } = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14435
+ const sources = normalizeSources(params["sources"]);
14436
+ const result = createResearchEngine2().research({ topic: params["topic"] ?? "", depth: params["depth"] ?? "medium" }, sources);
14437
+ return ok(result);
14368
14438
  } catch {
14369
- return ok({ findings: [], topic: params["topic"] });
14439
+ return fail("Deep-research package not available");
14370
14440
  }
14371
14441
  }),
14372
- tool("research.iterative", "Perform iterative deep research with progressive refinement", "research", [
14442
+ tool("research.iterative", "Perform iterative research with progressive refinement over provided sources", "research", [
14373
14443
  param("topic", "string", "Research topic"),
14374
- param("iterations", "number", "Number of refinement iterations", false, 3)
14444
+ param("depth", "string", "Depth: shallow | medium | deep", false, "medium"),
14445
+ param("sources", "array", "Sources as {title,type,relevance,content} objects")
14375
14446
  ], async (params) => {
14376
14447
  try {
14377
- const research = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14378
- const result = research.iterativeResearch?.(params["topic"], params["iterations"] ?? 3);
14379
- return ok(result ?? { findings: [], iterations: 0, topic: params["topic"] });
14448
+ const { createResearchEngine: createResearchEngine2 } = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14449
+ const sources = normalizeSources(params["sources"]);
14450
+ const result = createResearchEngine2().researchIterative({ topic: params["topic"] ?? "", depth: params["depth"] ?? "medium" }, () => sources);
14451
+ return ok(result);
14380
14452
  } catch {
14381
- return ok({ findings: [], iterations: 0, topic: params["topic"] });
14453
+ return fail("Deep-research package not available");
14382
14454
  }
14383
14455
  }),
14384
- tool("research.evidence", "Generate evidence chain for a claim or hypothesis", "research", [
14385
- param("claim", "string", "Claim or hypothesis to evaluate"),
14386
- param("sources", "array", "Evidence sources to consider", false)
14456
+ tool("research.evidence", "Accumulate research results and retrieve evidence for a topic", "research", [
14457
+ param("topic", "string", "Topic to gather evidence for"),
14458
+ param("sources", "array", "Sources as {title,type,relevance,content} objects")
14387
14459
  ], async (params) => {
14388
14460
  try {
14389
- const research = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14390
- const result = research.generateEvidence?.(params["claim"], params["sources"]);
14391
- return ok(result ?? { evidence: [], confidence: 0 });
14461
+ const { createResearchEngine: createResearchEngine2, createKnowledgeAccumulator: createKnowledgeAccumulator2 } = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14462
+ const sources = normalizeSources(params["sources"]);
14463
+ const topic = params["topic"] ?? "";
14464
+ const result = createResearchEngine2().research({ topic, depth: "medium" }, sources);
14465
+ const acc = createKnowledgeAccumulator2();
14466
+ acc.accumulate(result);
14467
+ return ok({ evidence: acc.query(topic), summary: result.summary, confidence: result.confidence });
14392
14468
  } catch {
14393
- return ok({ evidence: [], confidence: 0 });
14469
+ return fail("Deep-research package not available");
14394
14470
  }
14395
14471
  })
14396
14472
  ];
14397
14473
  }
14474
+ function normalizeSources(raw) {
14475
+ const valid = /* @__PURE__ */ new Set(["code", "documentation", "article", "api-reference"]);
14476
+ const arr = Array.isArray(raw) ? raw : [];
14477
+ return arr.map((s, i) => {
14478
+ const o = s ?? {};
14479
+ const t = String(o["type"] ?? "documentation");
14480
+ return {
14481
+ title: String(o["title"] ?? `source-${i + 1}`),
14482
+ type: valid.has(t) ? t : "documentation",
14483
+ relevance: typeof o["relevance"] === "number" ? o["relevance"] : 0.5,
14484
+ content: String(o["content"] ?? (typeof s === "string" ? s : ""))
14485
+ };
14486
+ });
14487
+ }
14398
14488
  function neuralTools() {
14399
14489
  return [
14400
- tool("neural.search", "Neural similarity search across embeddings", "neural", [
14490
+ tool("neural.search", "Neural (TF-IDF) similarity search over provided documents", "neural", [
14401
14491
  param("query", "string", "Search query"),
14492
+ param("documents", "array", "Documents to index: strings or {id,text} objects"),
14402
14493
  param("topK", "number", "Number of results", false, 10)
14403
14494
  ], async (params) => {
14404
14495
  try {
14405
- const ns = await Promise.resolve().then(() => (init_dist14(), dist_exports14));
14406
- const results = ns.search?.(params["query"], params["topK"] ?? 10);
14407
- return ok(results ?? []);
14496
+ const { createNeuralSearchEngine: createNeuralSearchEngine2, createTfIdfEmbeddingModel: createTfIdfEmbeddingModel2 } = await Promise.resolve().then(() => (init_dist14(), dist_exports14));
14497
+ const model = createTfIdfEmbeddingModel2();
14498
+ const engine = createNeuralSearchEngine2();
14499
+ const docs = params["documents"] ?? [];
14500
+ const texts = docs.map((d) => typeof d === "string" ? d : d.text ?? "");
14501
+ const model2 = createTfIdfEmbeddingModel2();
14502
+ if (typeof model2.fit === "function") {
14503
+ model2.fit(texts);
14504
+ }
14505
+ const embedder = typeof model2.fit === "function" ? model2 : model;
14506
+ for (let i = 0; i < docs.length; i++) {
14507
+ const d = docs[i];
14508
+ const id = typeof d === "string" ? `doc-${i}` : d.id ?? `doc-${i}`;
14509
+ engine.addDocument(id, await embedder.embed(texts[i]), { text: texts[i] });
14510
+ }
14511
+ const hits = engine.search(await embedder.embed(params["query"] ?? ""), params["topK"] ?? 10);
14512
+ return ok({ query: params["query"], hits });
14408
14513
  } catch {
14409
- return ok([]);
14514
+ return fail("Neural-search package not available");
14410
14515
  }
14411
14516
  }),
14412
- tool("neural.embed", "Generate embeddings for text", "neural", [param("text", "string", "Text to embed")], async (params) => {
14517
+ tool("neural.embed", "Generate a TF-IDF embedding vector for text", "neural", [param("text", "string", "Text to embed")], async (params) => {
14413
14518
  try {
14414
- const ns = await Promise.resolve().then(() => (init_dist14(), dist_exports14));
14415
- const embedding = ns.embed?.(params["text"]);
14416
- return ok(embedding ?? { vector: [], dimensions: 0 });
14519
+ const { createTfIdfEmbeddingModel: createTfIdfEmbeddingModel2 } = await Promise.resolve().then(() => (init_dist14(), dist_exports14));
14520
+ const model = createTfIdfEmbeddingModel2();
14521
+ const text = params["text"] ?? "";
14522
+ if (typeof model.fit === "function") {
14523
+ model.fit([text]);
14524
+ }
14525
+ const vector = await model.embed(text);
14526
+ return ok({ vector, dimensions: Array.isArray(vector) ? vector.length : vector.values?.length ?? 0 });
14417
14527
  } catch {
14418
- return ok({ vector: [], dimensions: 0 });
14528
+ return fail("Neural-search package not available");
14419
14529
  }
14420
14530
  }),
14421
- tool("neural.patterns.extract", "Wake phase: extract patterns from code or data", "neural", [
14422
- param("source", "string", "Source code or data to extract patterns from"),
14423
- param("type", "string", "Pattern type: structural | behavioral | api", false, "structural")
14424
- ], async (params) => {
14531
+ tool("neural.patterns.extract", "Wake phase: extract patterns from a list of items", "neural", [param("items", "array", "Items (strings) to process for pattern extraction")], async (params) => {
14425
14532
  try {
14426
- const ws = await Promise.resolve().then(() => (init_dist15(), dist_exports15));
14427
- const patterns = ws.extractPatterns?.(params["source"], params["type"] ?? "structural");
14428
- return ok(patterns ?? { patterns: [], type: params["type"] ?? "structural" });
14533
+ const { createWakePhase: createWakePhase2 } = await Promise.resolve().then(() => (init_dist15(), dist_exports15));
14534
+ const items = (params["items"] ?? []).map(String);
14535
+ return ok(createWakePhase2().process(items));
14429
14536
  } catch {
14430
- return ok({ patterns: [], type: params["type"] ?? "structural" });
14537
+ return fail("Wake-sleep package not available");
14431
14538
  }
14432
14539
  }),
14433
- tool("neural.patterns.consolidate", "Sleep phase: consolidate and compress learned patterns", "neural", [param("patterns", "array", "Patterns to consolidate", false)], async (params) => {
14540
+ tool("neural.patterns.consolidate", "Sleep phase: consolidate and compress learned patterns", "neural", [param("patterns", "array", "Pattern strings to consolidate")], async (params) => {
14434
14541
  try {
14435
- const ws = await Promise.resolve().then(() => (init_dist15(), dist_exports15));
14436
- const result = ws.consolidatePatterns?.(params["patterns"]);
14437
- return ok(result ?? { consolidated: [], count: 0 });
14542
+ const { createSleepPhase: createSleepPhase2 } = await Promise.resolve().then(() => (init_dist15(), dist_exports15));
14543
+ const patterns = (params["patterns"] ?? []).map(String);
14544
+ return ok(createSleepPhase2().consolidate(patterns));
14438
14545
  } catch {
14439
- return ok({ consolidated: [], count: 0 });
14546
+ return fail("Wake-sleep package not available");
14440
14547
  }
14441
14548
  }),
14442
- tool("neural.library.learn", "Learn patterns from a library or framework", "neural", [
14443
- param("library", "string", "Library name or path"),
14444
- param("depth", "string", "Analysis depth: api | usage | deep", false, "api")
14445
- ], async (params) => {
14549
+ tool("neural.library.learn", "Learn reusable patterns from code snippets (E-graph library learning)", "neural", [param("snippets", "array", "Array of code snippet strings to learn from")], async (params) => {
14446
14550
  try {
14447
- const ll = await Promise.resolve().then(() => (init_dist11(), dist_exports11));
14448
- const result = ll.learnLibrary?.(params["library"], params["depth"] ?? "api");
14449
- return ok(result ?? { patterns: [], library: params["library"] });
14551
+ const { createLibraryLearner: createLibraryLearner2 } = await Promise.resolve().then(() => (init_dist11(), dist_exports11));
14552
+ const snippets = (params["snippets"] ?? []).map(String);
14553
+ const patterns = createLibraryLearner2().learn(snippets);
14554
+ return ok({ patterns, count: patterns.length });
14450
14555
  } catch {
14451
- return ok({ patterns: [], library: params["library"] });
14556
+ return fail("Library-learner package not available");
14452
14557
  }
14453
14558
  })
14454
14559
  ];
@@ -14602,52 +14707,81 @@ function formalVerifyTools() {
14602
14707
  })
14603
14708
  ];
14604
14709
  }
14710
+ async function loadTracker(basePath) {
14711
+ const { createStateTracker: createStateTracker2 } = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14712
+ const { existsSync: existsSync12, readFileSync: readFileSync7 } = await import("node:fs");
14713
+ const { join: join8 } = await import("node:path");
14714
+ const tracker = createStateTracker2();
14715
+ const file = join8(basePath, ".musubix", "workflow-state.json");
14716
+ try {
14717
+ if (existsSync12(file))
14718
+ tracker.restore(JSON.parse(readFileSync7(file, "utf-8")));
14719
+ } catch {
14720
+ }
14721
+ return { tracker, file };
14722
+ }
14723
+ async function saveTracker(tracker, file) {
14724
+ const { writeFileSync: writeFileSync4, mkdirSync: mkdirSync4 } = await import("node:fs");
14725
+ const { dirname: dirname4 } = await import("node:path");
14726
+ mkdirSync4(dirname4(file), { recursive: true });
14727
+ writeFileSync4(file, JSON.stringify(tracker.toJSON(), null, 2), "utf-8");
14728
+ }
14605
14729
  function workflowTools() {
14606
14730
  return [
14607
- tool("workflow.phase.current", "Get the current SDD workflow phase", "workflow", [param("basePath", "string", "Project base path", false, ".")], async (params) => {
14731
+ tool("workflow.phase.current", "Get the current SDD workflow phase and approvals", "workflow", [param("basePath", "string", "Project base path", false, ".")], async (params) => {
14608
14732
  try {
14609
- const wf = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14610
- const engine = wf.createWorkflowEngine?.(params["basePath"] ?? ".");
14611
- const phase = engine?.getCurrentPhase();
14612
- return ok(phase ?? { phase: "requirements", index: 0 });
14733
+ const { PHASE_ORDER: PHASE_ORDER2 } = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14734
+ const { tracker } = await loadTracker(params["basePath"] ?? ".");
14735
+ const state = tracker.getState();
14736
+ return ok({
14737
+ currentPhase: state.currentPhase,
14738
+ approvals: PHASE_ORDER2.map((p) => ({ phase: p, approved: tracker.isApproved(p) }))
14739
+ });
14613
14740
  } catch {
14614
- return ok({ phase: "requirements", index: 0 });
14741
+ return fail("Workflow-engine package not available");
14615
14742
  }
14616
14743
  }),
14617
- tool("workflow.phase.transition", "Transition to the next SDD workflow phase", "workflow", [
14744
+ tool("workflow.phase.transition", "Transition to a target SDD workflow phase (persisted)", "workflow", [
14618
14745
  param("targetPhase", "string", "Target phase to transition to"),
14619
14746
  param("basePath", "string", "Project base path", false, ".")
14620
14747
  ], async (params) => {
14621
14748
  try {
14622
- const wf = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14623
- const engine = wf.createWorkflowEngine?.(params["basePath"] ?? ".");
14624
- const result = engine?.transition(params["targetPhase"]);
14625
- return ok(result ?? { success: false, phase: params["targetPhase"] });
14749
+ const { createPhaseController: createPhaseController2 } = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14750
+ const { tracker, file } = await loadTracker(params["basePath"] ?? ".");
14751
+ const result = await createPhaseController2(tracker).transitionTo(params["targetPhase"]);
14752
+ if (result.success)
14753
+ await saveTracker(tracker, file);
14754
+ return ok(result);
14626
14755
  } catch {
14627
- return ok({ success: false, phase: params["targetPhase"] });
14756
+ return fail("Workflow-engine package not available");
14628
14757
  }
14629
14758
  }),
14630
- tool("workflow.gate.check", "Check if a quality gate can be passed", "workflow", [
14631
- param("gate", "string", "Gate name"),
14759
+ tool("workflow.gate.check", "Check whether the workflow can transition to a target phase (quality gates)", "workflow", [
14760
+ param("targetPhase", "string", "Target phase to check"),
14632
14761
  param("basePath", "string", "Project base path", false, ".")
14633
14762
  ], async (params) => {
14634
14763
  try {
14635
- const wf = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14636
- const engine = wf.createWorkflowEngine?.(params["basePath"] ?? ".");
14637
- const result = engine?.checkGate(params["gate"]);
14638
- return ok(result ?? { passed: false, gate: params["gate"] });
14764
+ const { createPhaseController: createPhaseController2 } = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14765
+ const { tracker } = await loadTracker(params["basePath"] ?? ".");
14766
+ const target = params["targetPhase"] ?? params["gate"];
14767
+ const canTransition = await createPhaseController2(tracker).canTransition(target);
14768
+ return ok({ targetPhase: target, canTransition });
14639
14769
  } catch {
14640
- return ok({ passed: false, gate: params["gate"] });
14770
+ return fail("Workflow-engine package not available");
14641
14771
  }
14642
14772
  }),
14643
- tool("workflow.tasks.list", "List tasks for the current workflow phase", "workflow", [param("basePath", "string", "Project base path", false, ".")], async (params) => {
14773
+ tool("workflow.approve", "Approve the current (or a named) SDD phase (persisted)", "workflow", [
14774
+ param("phase", "string", "Phase to approve"),
14775
+ param("basePath", "string", "Project base path", false, ".")
14776
+ ], async (params) => {
14644
14777
  try {
14645
- const wf = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14646
- const engine = wf.createWorkflowEngine?.(params["basePath"] ?? ".");
14647
- const tasks = engine?.listTasks();
14648
- return ok(tasks ?? []);
14778
+ const { tracker, file } = await loadTracker(params["basePath"] ?? ".");
14779
+ const phase = params["phase"] ?? tracker.getState().currentPhase;
14780
+ tracker.approve(phase);
14781
+ await saveTracker(tracker, file);
14782
+ return ok({ phase, approved: true });
14649
14783
  } catch {
14650
- return ok([]);
14784
+ return fail("Workflow-engine package not available");
14651
14785
  }
14652
14786
  })
14653
14787
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "musubix2",
3
- "version": "0.5.8",
3
+ "version": "0.5.10",
4
4
  "description": "MUSUBIX2 — Specification Driven Development System",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",