neoagent 2.4.1-beta.35 → 2.4.1-beta.36

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neoagent",
3
- "version": "2.4.1-beta.35",
3
+ "version": "2.4.1-beta.36",
4
4
  "description": "Proactive personal AI agent with no limits",
5
5
  "license": "AGPL-3.0-only",
6
6
  "main": "server/index.js",
@@ -1 +1 @@
1
- ddef1ad4fea366bdfef04805d0a9528b
1
+ cd629bebff6e6d3f781e6810f13e3583
@@ -37,6 +37,6 @@ _flutter.buildConfig = {"engineRevision":"c416acfeb8126e097f758c664aaa3da929e27d
37
37
 
38
38
  _flutter.loader.load({
39
39
  serviceWorkerSettings: {
40
- serviceWorkerVersion: "1175396021" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */
40
+ serviceWorkerVersion: "4109168282" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */
41
41
  }
42
42
  });
@@ -133818,7 +133818,7 @@ r===$&&A.b()
133818
133818
  o.push(A.jO(p,A.jc(!1,new A.a2(B.un,A.dt(new A.cy(B.ho,new A.a7n(r,p),p),p,p),p),!1,B.I,!0),p,p,0,0,0,p))}r=!1
133819
133819
  if(!s.ay)if(!s.ch){r=s.e
133820
133820
  r===$&&A.b()
133821
- r=B.b.t("mq2quzni-1b60f84").length!==0&&r.b}if(r){r=s.d
133821
+ r=B.b.t("mq43a2ce-3df14ac").length!==0&&r.b}if(r){r=s.d
133822
133822
  r===$&&A.b()
133823
133823
  r=r.av&&!r.aP?84:0
133824
133824
  q=s.e
@@ -139302,7 +139302,7 @@ $S:0}
139302
139302
  A.ZM.prototype={}
139303
139303
  A.Su.prototype={
139304
139304
  nc(a){var s=this
139305
- if(B.b.t("mq2quzni-1b60f84").length===0||s.a!=null)return
139305
+ if(B.b.t("mq43a2ce-3df14ac").length===0||s.a!=null)return
139306
139306
  s.AO()
139307
139307
  s.a=A.qf(B.R4,new A.b9P(s))},
139308
139308
  AO(){var s=0,r=A.l(t.H),q,p=2,o=[],n=this,m,l,k,j,i,h,g,f
@@ -139320,7 +139320,7 @@ if(!t.f.b(k)){s=1
139320
139320
  break}i=J.T(k,"buildId")
139321
139321
  h=i==null?null:B.b.t(J.p(i))
139322
139322
  j=h==null?"":h
139323
- if(J.be(j)===0||J.d(j,"mq2quzni-1b60f84")){s=1
139323
+ if(J.be(j)===0||J.d(j,"mq43a2ce-3df14ac")){s=1
139324
139324
  break}n.b=!0
139325
139325
  n.D()
139326
139326
  p=2
@@ -139337,7 +139337,7 @@ case 2:return A.i(o.at(-1),r)}})
139337
139337
  return A.k($async$AO,r)},
139338
139338
  vv(){var s=0,r=A.l(t.H),q,p=2,o=[],n=this,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1
139339
139339
  var $async$vv=A.h(function(a2,a3){if(a2===1){o.push(a3)
139340
- s=p}for(;;)switch(s){case 0:if(B.b.t("mq2quzni-1b60f84").length===0||n.c){s=1
139340
+ s=p}for(;;)switch(s){case 0:if(B.b.t("mq43a2ce-3df14ac").length===0||n.c){s=1
139341
139341
  break}n.c=!0
139342
139342
  n.D()
139343
139343
  p=4
@@ -1177,6 +1177,7 @@ class AgentEngine {
1177
1177
  model,
1178
1178
  messages,
1179
1179
  analysis,
1180
+ tools,
1180
1181
  toolExecutions,
1181
1182
  finalReply,
1182
1183
  options,
@@ -1193,6 +1194,7 @@ class AgentEngine {
1193
1194
  messages,
1194
1195
  prompt: buildVerifierPrompt({
1195
1196
  analysis,
1197
+ tools,
1196
1198
  toolExecutionSummary: summarizeToolExecutions(toolExecutions),
1197
1199
  evidenceSources,
1198
1200
  finalReply,
@@ -1746,6 +1748,23 @@ class AgentEngine {
1746
1748
  const integrationManager = app?.locals?.integrationManager || null;
1747
1749
  const mcpTools = mcpManager ? mcpManager.getAllTools(userId, { agentId }) : [];
1748
1750
  const tools = selectToolsForTask(userMessage, builtInTools, mcpTools, options);
1751
+ const toolNames = tools.map((tool) => tool.name).filter(Boolean);
1752
+ const coreToolStatus = {
1753
+ send_message: toolNames.includes('send_message'),
1754
+ create_task: toolNames.includes('create_task'),
1755
+ list_tasks: toolNames.includes('list_tasks'),
1756
+ update_task: toolNames.includes('update_task'),
1757
+ delete_task: toolNames.includes('delete_task'),
1758
+ };
1759
+ this.recordRunEvent(userId, runId, 'tool_inventory', {
1760
+ total: toolNames.length,
1761
+ builtInTotal: builtInTools.length,
1762
+ mcpTotal: mcpTools.length,
1763
+ core: coreToolStatus,
1764
+ }, { agentId });
1765
+ console.info(
1766
+ `[Run ${shortenRunId(runId)}] tools total=${toolNames.length} builtIns=${builtInTools.length} mcp=${mcpTools.length} core=${JSON.stringify(coreToolStatus)}`
1767
+ );
1749
1768
  const capabilityHealth = await getCapabilityHealth({ userId, agentId, app, engine: this });
1750
1769
  const capabilitySummary = summarizeCapabilityHealth(capabilityHealth);
1751
1770
  const integrationSummary = integrationManager?.summarizeConnectedProviders?.(userId, agentId) || '';
@@ -2684,6 +2703,7 @@ class AgentEngine {
2684
2703
  model,
2685
2704
  messages,
2686
2705
  analysis,
2706
+ tools,
2687
2707
  toolExecutions,
2688
2708
  finalReply: finalResponseText,
2689
2709
  options,
@@ -561,10 +561,13 @@ function buildExecutionGuidance({ analysis, plan = null, capabilityHealth }) {
561
561
  return lines.filter(Boolean).join('\n\n');
562
562
  }
563
563
 
564
- function buildVerifierPrompt({ analysis, toolExecutionSummary, evidenceSources, finalReply }) {
564
+ function buildVerifierPrompt({ analysis, tools = [], toolExecutionSummary, evidenceSources, finalReply }) {
565
+ const toolNames = summarizeTools(tools).join(', ');
565
566
  return composeJsonPrompt([
566
567
  JSON_ONLY_RESPONSE_RULE,
567
568
  ...VERIFIER_PROMPT_INSTRUCTIONS,
569
+ formatAvailableToolsLine(toolNames),
570
+ 'Do not claim a tool or capability was unavailable if it is listed as available in this run. A missing tool execution is missing evidence, not proof of missing tool exposure.',
568
571
  `Freshness risk: ${analysis.freshness_risk}`,
569
572
  `Verification need: ${analysis.verification_need}`,
570
573
  `Completion confidence required: ${analysis.completion_confidence_required || 'medium'}`,
@@ -14,9 +14,16 @@
14
14
 
15
15
  const MCP_ALWAYS_INCLUDE_THRESHOLD = 20;
16
16
  const MAX_TOOLS = 128; // Strict provider limit (e.g. Github Copilot / OpenAI)
17
+ const ALWAYS_INCLUDE_BUILT_INS = [
18
+ 'send_message',
19
+ 'create_task',
20
+ 'list_tasks',
21
+ 'delete_task',
22
+ 'update_task',
23
+ ];
17
24
 
18
25
  function ensureRequiredTools(selectedTools = [], builtInTools = [], options = {}) {
19
- const requiredNames = [];
26
+ const requiredNames = [...ALWAYS_INCLUDE_BUILT_INS];
20
27
  if (options.widgetId) requiredNames.push('save_widget_snapshot');
21
28
  if (!requiredNames.length) return selectedTools;
22
29