nexus-prime 4.3.2 → 4.4.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.
Files changed (129) hide show
  1. package/README.md +10 -0
  2. package/dist/agents/adapters/mcp.d.ts.map +1 -1
  3. package/dist/agents/adapters/mcp.js +19 -1
  4. package/dist/agents/adapters/mcp.js.map +1 -1
  5. package/dist/dashboard/index.html +22 -2
  6. package/dist/dashboard/server.d.ts.map +1 -1
  7. package/dist/dashboard/server.js +36 -3
  8. package/dist/dashboard/server.js.map +1 -1
  9. package/dist/engines/client-bootstrap.d.ts +1 -0
  10. package/dist/engines/client-bootstrap.d.ts.map +1 -1
  11. package/dist/engines/client-bootstrap.js +36 -6
  12. package/dist/engines/client-bootstrap.js.map +1 -1
  13. package/dist/engines/context-assembler.d.ts +17 -0
  14. package/dist/engines/context-assembler.d.ts.map +1 -1
  15. package/dist/engines/context-assembler.js +72 -31
  16. package/dist/engines/context-assembler.js.map +1 -1
  17. package/dist/engines/embedder.d.ts +3 -1
  18. package/dist/engines/embedder.d.ts.map +1 -1
  19. package/dist/engines/embedder.js +20 -4
  20. package/dist/engines/embedder.js.map +1 -1
  21. package/dist/engines/event-bus.d.ts +9 -1
  22. package/dist/engines/event-bus.d.ts.map +1 -1
  23. package/dist/engines/event-bus.js +21 -0
  24. package/dist/engines/event-bus.js.map +1 -1
  25. package/dist/engines/index.d.ts +1 -1
  26. package/dist/engines/index.d.ts.map +1 -1
  27. package/dist/engines/index.js +1 -1
  28. package/dist/engines/index.js.map +1 -1
  29. package/dist/engines/instruction-gateway.d.ts.map +1 -1
  30. package/dist/engines/instruction-gateway.js +18 -7
  31. package/dist/engines/instruction-gateway.js.map +1 -1
  32. package/dist/engines/knowledge-fabric.d.ts +9 -0
  33. package/dist/engines/knowledge-fabric.d.ts.map +1 -1
  34. package/dist/engines/knowledge-fabric.js +56 -4
  35. package/dist/engines/knowledge-fabric.js.map +1 -1
  36. package/dist/engines/lifetime-tokens.d.ts +14 -0
  37. package/dist/engines/lifetime-tokens.d.ts.map +1 -0
  38. package/dist/engines/lifetime-tokens.js +37 -0
  39. package/dist/engines/lifetime-tokens.js.map +1 -0
  40. package/dist/engines/memory-bridge.d.ts +49 -19
  41. package/dist/engines/memory-bridge.d.ts.map +1 -1
  42. package/dist/engines/memory-bridge.js +141 -29
  43. package/dist/engines/memory-bridge.js.map +1 -1
  44. package/dist/engines/memory-control-plane.d.ts +27 -0
  45. package/dist/engines/memory-control-plane.d.ts.map +1 -1
  46. package/dist/engines/memory-control-plane.js +100 -0
  47. package/dist/engines/memory-control-plane.js.map +1 -1
  48. package/dist/engines/memory-extractor.d.ts +35 -0
  49. package/dist/engines/memory-extractor.d.ts.map +1 -0
  50. package/dist/engines/memory-extractor.js +164 -0
  51. package/dist/engines/memory-extractor.js.map +1 -0
  52. package/dist/engines/memory-fingerprint.d.ts +7 -0
  53. package/dist/engines/memory-fingerprint.d.ts.map +1 -0
  54. package/dist/engines/memory-fingerprint.js +22 -0
  55. package/dist/engines/memory-fingerprint.js.map +1 -0
  56. package/dist/engines/memory.d.ts +62 -8
  57. package/dist/engines/memory.d.ts.map +1 -1
  58. package/dist/engines/memory.js +445 -82
  59. package/dist/engines/memory.js.map +1 -1
  60. package/dist/engines/nexus-layer.d.ts +1 -6
  61. package/dist/engines/nexus-layer.d.ts.map +1 -1
  62. package/dist/engines/ngram-index.d.ts +2 -0
  63. package/dist/engines/ngram-index.d.ts.map +1 -1
  64. package/dist/engines/ngram-index.js +32 -0
  65. package/dist/engines/ngram-index.js.map +1 -1
  66. package/dist/engines/orchestrator.d.ts +3 -1
  67. package/dist/engines/orchestrator.d.ts.map +1 -1
  68. package/dist/engines/orchestrator.js +157 -31
  69. package/dist/engines/orchestrator.js.map +1 -1
  70. package/dist/engines/pattern-registry.d.ts.map +1 -1
  71. package/dist/engines/pattern-registry.js +9 -2
  72. package/dist/engines/pattern-registry.js.map +1 -1
  73. package/dist/engines/rag-collections.d.ts +8 -0
  74. package/dist/engines/rag-collections.d.ts.map +1 -1
  75. package/dist/engines/rag-collections.js +63 -14
  76. package/dist/engines/rag-collections.js.map +1 -1
  77. package/dist/engines/runtime-registry.d.ts +1 -0
  78. package/dist/engines/runtime-registry.d.ts.map +1 -1
  79. package/dist/engines/runtime-registry.js +9 -11
  80. package/dist/engines/runtime-registry.js.map +1 -1
  81. package/dist/engines/semantic-ranking.d.ts +27 -0
  82. package/dist/engines/semantic-ranking.d.ts.map +1 -0
  83. package/dist/engines/semantic-ranking.js +83 -0
  84. package/dist/engines/semantic-ranking.js.map +1 -0
  85. package/dist/engines/skill-runtime.d.ts +1 -0
  86. package/dist/engines/skill-runtime.d.ts.map +1 -1
  87. package/dist/engines/skill-runtime.js +58 -61
  88. package/dist/engines/skill-runtime.js.map +1 -1
  89. package/dist/engines/token-optimizer.d.ts +0 -16
  90. package/dist/engines/token-optimizer.d.ts.map +1 -1
  91. package/dist/engines/token-optimizer.js +0 -40
  92. package/dist/engines/token-optimizer.js.map +1 -1
  93. package/dist/engines/token-supremacy.d.ts +5 -1
  94. package/dist/engines/token-supremacy.d.ts.map +1 -1
  95. package/dist/engines/token-supremacy.js +8 -2
  96. package/dist/engines/token-supremacy.js.map +1 -1
  97. package/dist/engines/workflow-runtime.d.ts +2 -0
  98. package/dist/engines/workflow-runtime.d.ts.map +1 -1
  99. package/dist/engines/workflow-runtime.js +74 -38
  100. package/dist/engines/workflow-runtime.js.map +1 -1
  101. package/dist/index.d.ts +4 -2
  102. package/dist/index.d.ts.map +1 -1
  103. package/dist/index.js +37 -9
  104. package/dist/index.js.map +1 -1
  105. package/dist/nexus-prime.d.ts +1 -1
  106. package/dist/nexus-prime.d.ts.map +1 -1
  107. package/dist/nexus-prime.js +1 -1
  108. package/dist/nexus-prime.js.map +1 -1
  109. package/dist/phantom/index.d.ts +12 -2
  110. package/dist/phantom/index.d.ts.map +1 -1
  111. package/dist/phantom/index.js +29 -9
  112. package/dist/phantom/index.js.map +1 -1
  113. package/dist/phantom/runtime.d.ts +3 -2
  114. package/dist/phantom/runtime.d.ts.map +1 -1
  115. package/dist/phantom/runtime.js +80 -8
  116. package/dist/phantom/runtime.js.map +1 -1
  117. package/dist/postinstall-bootstrap.js +4 -1
  118. package/dist/postinstall-bootstrap.js.map +1 -1
  119. package/dist/synapse/bootstrap.d.ts.map +1 -1
  120. package/dist/synapse/bootstrap.js +9 -2
  121. package/dist/synapse/bootstrap.js.map +1 -1
  122. package/dist/synapse/mandate/asset-matcher.d.ts.map +1 -1
  123. package/dist/synapse/mandate/asset-matcher.js +26 -15
  124. package/dist/synapse/mandate/asset-matcher.js.map +1 -1
  125. package/package.json +2 -3
  126. package/dist/core/memory.d.ts +0 -96
  127. package/dist/core/memory.d.ts.map +0 -1
  128. package/dist/core/memory.js +0 -304
  129. package/dist/core/memory.js.map +0 -1
@@ -702,10 +702,11 @@ export class SubAgentRuntime {
702
702
  run.state = 'running';
703
703
  const coderManifests = manifests.filter((manifest) => manifest.role === 'coder');
704
704
  const coderResults = await Promise.all(coderManifests.map((manifest) => this.runCoderWorker(runId, recorder, manifest)));
705
+ const mergeableCoderResults = coderResults.filter((result) => !result.budgetExceeded);
705
706
  // Phase 3E: Inter-pod sync point using Byzantine consensus
706
707
  const activePods = new Set(coderManifests.map(m => m.podId).filter(Boolean));
707
708
  if (activePods.size > 1) {
708
- coderResults.forEach((res) => {
709
+ mergeableCoderResults.forEach((res) => {
709
710
  if (res.outcome !== 'failed') {
710
711
  // Submit candidate magnitude to inter-pod consensus
711
712
  podNetwork.resolveConflict(res.workerId, 1, [res.tokensUsed, res.diff.length]);
@@ -745,12 +746,28 @@ export class SubAgentRuntime {
745
746
  run.state = 'verifying';
746
747
  const verifierManifests = manifests.filter((manifest) => manifest.role === 'verifier');
747
748
  const verificationResults = await Promise.all(verifierManifests.map((manifest) => {
749
+ const target = coderResults.find((result) => result.workerId === manifest.targetWorkerId);
750
+ if (!target || target.budgetExceeded) {
751
+ return Promise.resolve({
752
+ workerId: manifest.targetWorkerId ?? manifest.workerId,
753
+ verifierId: manifest.workerId,
754
+ passed: false,
755
+ commands: [],
756
+ summary: target?.budgetExceeded
757
+ ? 'Skipped verification for over-budget worker.'
758
+ : 'Skipped verification because no coder result was produced.',
759
+ artifactsPath: recorder.workerDir(manifest.workerId),
760
+ });
761
+ }
748
762
  manifest.verifyCommands = beforeVerifyResolved.verifyCommands;
749
- return this.runVerifierWorker(runId, recorder, manifest, coderResults.find((result) => result.workerId === manifest.targetWorkerId));
763
+ return this.runVerifierWorker(runId, recorder, manifest, target);
750
764
  }));
751
765
  run.verificationResults = verificationResults;
752
766
  recorder.writeJson('verification-results.json', verificationResults);
753
767
  for (const result of run.workerResults) {
768
+ if (result.budgetExceeded) {
769
+ continue;
770
+ }
754
771
  const verification = verificationResults.find((entry) => entry.workerId === result.workerId);
755
772
  if (verification) {
756
773
  result.verification = verification;
@@ -759,7 +776,7 @@ export class SubAgentRuntime {
759
776
  result.outcome = verification.passed ? 'success' : (result.diff.trim() ? 'partial' : 'failed');
760
777
  }
761
778
  }
762
- const decision = await consensusPolicy.merge(run.workerResults);
779
+ const decision = await consensusPolicy.merge(mergeableCoderResults);
763
780
  run.finalDecision = decision;
764
781
  run.backendEvidence.consensus = consensusPolicy.shadowStats();
765
782
  recorder.writeJson('decision.json', decision);
@@ -1932,7 +1949,6 @@ export class SubAgentRuntime {
1932
1949
  }
1933
1950
  async runCoderWorker(runId, recorder, manifest) {
1934
1951
  const session = new WorktreeSession(this.repoRoot, `${runId}-${manifest.workerId}`, 'coder', recorder, (snapshot) => this.recordWorktreeHealth(snapshot));
1935
- const start = Date.now();
1936
1952
  const learnings = [];
1937
1953
  const workerDir = recorder.workerDir(manifest.workerId);
1938
1954
  try {
@@ -1966,6 +1982,32 @@ export class SubAgentRuntime {
1966
1982
  if (allowedActions.length > 0) {
1967
1983
  learnings.push(`Applied ${allowedActions.length} runtime binding(s): ${allowedActions.map((binding) => binding.type).join(', ')}`);
1968
1984
  }
1985
+ const instructionPacket = this.runs.get(runId)?.instructionPacket;
1986
+ const preflightTokens = this.estimateRuntimeWorkerTokens(manifest, allowedActions, learnings, '', instructionPacket);
1987
+ if (manifest.tokenBudget > 0 && preflightTokens > manifest.tokenBudget) {
1988
+ const budgetLearnings = [
1989
+ ...learnings,
1990
+ `Token budget exceeded before mutation: used ${preflightTokens}, budget ${manifest.tokenBudget}`,
1991
+ ];
1992
+ nexusEventBus.emit('phantom.worker.complete', { workerId: manifest.workerId, confidence: 0.05 });
1993
+ return {
1994
+ workerId: manifest.workerId,
1995
+ role: manifest.role,
1996
+ taskId: runId,
1997
+ approach: manifest.strategy,
1998
+ diff: '',
1999
+ outcome: 'budgetExceeded',
2000
+ confidence: 0.05,
2001
+ tokensUsed: preflightTokens,
2002
+ tokenEstimateSource: 'runtime-estimate',
2003
+ budgetExceeded: true,
2004
+ learnings: budgetLearnings,
2005
+ testsPassing: 0,
2006
+ verified: false,
2007
+ artifactsPath: workerDir,
2008
+ modifiedFiles: [],
2009
+ };
2010
+ }
1969
2011
  const modifiedFiles = await session.applyBindings(allowedActions);
1970
2012
  modifiedFiles.forEach(file => {
1971
2013
  this.sessionDNA?.recordFileModified(file);
@@ -1974,16 +2016,23 @@ export class SubAgentRuntime {
1974
2016
  const diff = await session.captureDiff();
1975
2017
  recorder.writeText(path.join('workers', manifest.workerId, 'diff.patch'), diff);
1976
2018
  podNetwork.publish(manifest.workerId, `Produced ${modifiedFiles.length} modified files`, 0.8, ['#runtime-worker']);
1977
- nexusEventBus.emit('phantom.worker.complete', { workerId: manifest.workerId, confidence: diff.trim() ? 0.7 : 0.2 });
2019
+ const estimatedTokens = this.estimateRuntimeWorkerTokens(manifest, allowedActions, learnings, diff, instructionPacket);
2020
+ const budgetExceeded = manifest.tokenBudget > 0 && estimatedTokens > manifest.tokenBudget;
2021
+ if (budgetExceeded) {
2022
+ learnings.push(`Token budget exceeded: used ${estimatedTokens}, budget ${manifest.tokenBudget}`);
2023
+ }
2024
+ nexusEventBus.emit('phantom.worker.complete', { workerId: manifest.workerId, confidence: budgetExceeded ? 0.1 : (diff.trim() ? 0.7 : 0.2) });
1978
2025
  return {
1979
2026
  workerId: manifest.workerId,
1980
2027
  role: manifest.role,
1981
2028
  taskId: runId,
1982
2029
  approach: manifest.strategy,
1983
2030
  diff,
1984
- outcome: diff.trim() ? 'partial' : 'failed',
1985
- confidence: diff.trim() ? 0.68 : 0.18,
1986
- tokensUsed: Math.max(1, Math.round((Date.now() - start) / 100)),
2031
+ outcome: budgetExceeded ? 'budgetExceeded' : (diff.trim() ? 'partial' : 'failed'),
2032
+ confidence: budgetExceeded ? 0.1 : (diff.trim() ? 0.68 : 0.18),
2033
+ tokensUsed: estimatedTokens,
2034
+ tokenEstimateSource: 'runtime-estimate',
2035
+ budgetExceeded,
1987
2036
  learnings,
1988
2037
  testsPassing: 0,
1989
2038
  verified: false,
@@ -2005,6 +2054,8 @@ export class SubAgentRuntime {
2005
2054
  outcome: 'failed',
2006
2055
  confidence: 0,
2007
2056
  tokensUsed: 0,
2057
+ tokenEstimateSource: 'none',
2058
+ budgetExceeded: false,
2008
2059
  learnings,
2009
2060
  verified: false,
2010
2061
  artifactsPath: workerDir,
@@ -2015,6 +2066,27 @@ export class SubAgentRuntime {
2015
2066
  await session.cleanup();
2016
2067
  }
2017
2068
  }
2069
+ estimateRuntimeWorkerTokens(manifest, allowedActions, learnings, diff, instructionPacket) {
2070
+ const actionPayloadTokens = allowedActions.reduce((sum, binding) => (sum + estimateTokenCount({
2071
+ type: binding.type,
2072
+ path: 'path' in binding ? binding.path : undefined,
2073
+ content: 'content' in binding ? binding.content : undefined,
2074
+ command: 'command' in binding ? binding.command : undefined,
2075
+ })), 0);
2076
+ return Math.max(1, estimateTokenCount({
2077
+ workerId: manifest.workerId,
2078
+ role: manifest.role,
2079
+ strategy: manifest.strategy,
2080
+ files: manifest.files.map((file) => path.basename(file.path)),
2081
+ allowedTools: manifest.allowedTools,
2082
+ verifyCommands: manifest.verifyCommands,
2083
+ instructionPacketHash: instructionPacket?.packetHash,
2084
+ actionCount: allowedActions.length,
2085
+ actionPayloadTokens,
2086
+ learningCount: learnings.length,
2087
+ diff,
2088
+ }));
2089
+ }
2018
2090
  async runVerifierWorker(runId, recorder, manifest, target) {
2019
2091
  const verifier = new WorktreeSession(this.repoRoot, `${runId}-${manifest.workerId}`, 'verifier', recorder, (snapshot) => this.recordWorktreeHealth(snapshot));
2020
2092
  const records = [];