@mcp-abap-adt/llm-agent-libs 18.0.1 → 18.1.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 (63) hide show
  1. package/dist/agent.d.ts.map +1 -1
  2. package/dist/agent.js +5 -2
  3. package/dist/agent.js.map +1 -1
  4. package/dist/builder.d.ts +7 -0
  5. package/dist/builder.d.ts.map +1 -1
  6. package/dist/builder.js +20 -3
  7. package/dist/builder.js.map +1 -1
  8. package/dist/coordinator/dispatch/self.d.ts +5 -0
  9. package/dist/coordinator/dispatch/self.d.ts.map +1 -1
  10. package/dist/coordinator/dispatch/self.js +80 -0
  11. package/dist/coordinator/dispatch/self.js.map +1 -1
  12. package/dist/coordinator/stepper/cyclic-react-executor.d.ts +22 -0
  13. package/dist/coordinator/stepper/cyclic-react-executor.d.ts.map +1 -1
  14. package/dist/coordinator/stepper/cyclic-react-executor.js +132 -13
  15. package/dist/coordinator/stepper/cyclic-react-executor.js.map +1 -1
  16. package/dist/coordinator/stepper/index.d.ts +1 -0
  17. package/dist/coordinator/stepper/index.d.ts.map +1 -1
  18. package/dist/coordinator/stepper/index.js +1 -0
  19. package/dist/coordinator/stepper/index.js.map +1 -1
  20. package/dist/coordinator/stepper/llm-evaluator.d.ts +29 -0
  21. package/dist/coordinator/stepper/llm-evaluator.d.ts.map +1 -0
  22. package/dist/coordinator/stepper/llm-evaluator.js +94 -0
  23. package/dist/coordinator/stepper/llm-evaluator.js.map +1 -0
  24. package/dist/coordinator/stepper/llm-stepper-planner.d.ts +1 -1
  25. package/dist/coordinator/stepper/llm-stepper-planner.d.ts.map +1 -1
  26. package/dist/coordinator/stepper/llm-stepper-planner.js +28 -8
  27. package/dist/coordinator/stepper/llm-stepper-planner.js.map +1 -1
  28. package/dist/coordinator/stepper/need-resolver.d.ts +1 -0
  29. package/dist/coordinator/stepper/need-resolver.d.ts.map +1 -1
  30. package/dist/coordinator/stepper/need-resolver.js +12 -4
  31. package/dist/coordinator/stepper/need-resolver.js.map +1 -1
  32. package/dist/coordinator/stepper/stepper-interpreter.d.ts.map +1 -1
  33. package/dist/coordinator/stepper/stepper-interpreter.js +61 -4
  34. package/dist/coordinator/stepper/stepper-interpreter.js.map +1 -1
  35. package/dist/coordinator/stepper/stepper.d.ts +8 -1
  36. package/dist/coordinator/stepper/stepper.d.ts.map +1 -1
  37. package/dist/coordinator/stepper/stepper.js +78 -18
  38. package/dist/coordinator/stepper/stepper.js.map +1 -1
  39. package/dist/index.d.ts +1 -1
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +1 -1
  42. package/dist/index.js.map +1 -1
  43. package/dist/logger/default-request-logger.d.ts.map +1 -1
  44. package/dist/logger/default-request-logger.js +1 -0
  45. package/dist/logger/default-request-logger.js.map +1 -1
  46. package/dist/pipeline/handlers/coordinator.d.ts.map +1 -1
  47. package/dist/pipeline/handlers/coordinator.js +26 -0
  48. package/dist/pipeline/handlers/coordinator.js.map +1 -1
  49. package/dist/pipeline/handlers/dag-coordinator.d.ts.map +1 -1
  50. package/dist/pipeline/handlers/dag-coordinator.js +13 -4
  51. package/dist/pipeline/handlers/dag-coordinator.js.map +1 -1
  52. package/dist/pipeline/handlers/tool-loop.d.ts.map +1 -1
  53. package/dist/pipeline/handlers/tool-loop.js +9 -2
  54. package/dist/pipeline/handlers/tool-loop.js.map +1 -1
  55. package/dist/pipeline/index.d.ts +2 -1
  56. package/dist/pipeline/index.d.ts.map +1 -1
  57. package/dist/pipeline/index.js +4 -0
  58. package/dist/pipeline/index.js.map +1 -1
  59. package/dist/rag/knowledge-rag.d.ts +15 -0
  60. package/dist/rag/knowledge-rag.d.ts.map +1 -1
  61. package/dist/rag/knowledge-rag.js +47 -0
  62. package/dist/rag/knowledge-rag.js.map +1 -1
  63. package/package.json +4 -4
@@ -1,4 +1,7 @@
1
1
  import { composeTask } from './compose-task.js';
2
+ /** Bound on the self-dispatch tool-loop — enough for a read→observe→answer
3
+ * cycle without runaway. */
4
+ const MAX_TOOL_ITERATIONS = 6;
2
5
  export class SelfDispatch {
3
6
  llm;
4
7
  systemPrompt;
@@ -17,6 +20,22 @@ export class SelfDispatch {
17
20
  const userMsg = `${composeTask(step, ctx)}\n\nResults so far:\n${priorBlock}`;
18
21
  const started = Date.now();
19
22
  try {
23
+ // #157: when the coordinator threaded the per-request RAG-selected tools
24
+ // and a tool executor, run a bounded tool-loop so a self-dispatched step
25
+ // can actually CALL MCP (read a table, list a package, …) instead of a
26
+ // single toolless chat that hallucinates the result. No tools / no
27
+ // executor → the legacy single-chat behaviour (below).
28
+ const tools = (ctx.selectedTools ?? []);
29
+ if (tools.length > 0 && typeof ctx.callTool === 'function') {
30
+ const r = await this.runToolLoop(sys, userMsg, tools, ctx);
31
+ return {
32
+ stepId: step.id,
33
+ output: r.content,
34
+ usage: r.usage,
35
+ durationMs: Date.now() - started,
36
+ ok: true,
37
+ };
38
+ }
20
39
  const res = await this.llm.chat([
21
40
  { role: 'system', content: sys },
22
41
  { role: 'user', content: userMsg },
@@ -41,5 +60,66 @@ export class SelfDispatch {
41
60
  };
42
61
  }
43
62
  }
63
+ /** Bounded ReAct loop: chat with tools → execute any tool calls via
64
+ * `ctx.callTool` → feed results back → repeat until the model answers with no
65
+ * tool call (or the cap is hit). Mirrors the wire shape providers expect
66
+ * (assistant `tool_calls` followed by matching `tool` messages). */
67
+ async runToolLoop(sys, userMsg, tools, ctx) {
68
+ const callTool = ctx.callTool;
69
+ const messages = [
70
+ { role: 'system', content: sys },
71
+ { role: 'user', content: userMsg },
72
+ ];
73
+ let usage;
74
+ const add = (u) => {
75
+ if (!u)
76
+ return;
77
+ usage = usage
78
+ ? {
79
+ promptTokens: usage.promptTokens + u.promptTokens,
80
+ completionTokens: usage.completionTokens + u.completionTokens,
81
+ totalTokens: usage.totalTokens + u.totalTokens,
82
+ }
83
+ : { ...u };
84
+ };
85
+ for (let iter = 0; iter < MAX_TOOL_ITERATIONS; iter++) {
86
+ const res = await this.llm.chat(messages, tools, {
87
+ signal: ctx.signal,
88
+ sessionId: ctx.sessionId,
89
+ });
90
+ if (!res.ok)
91
+ throw res.error;
92
+ add(res.value.usage);
93
+ const toolCalls = res.value.toolCalls ?? [];
94
+ if (toolCalls.length === 0)
95
+ return { content: res.value.content, usage };
96
+ messages.push({
97
+ role: 'assistant',
98
+ content: res.value.content || null,
99
+ tool_calls: toolCalls.map((tc) => ({
100
+ id: tc.id,
101
+ type: 'function',
102
+ function: {
103
+ name: tc.name,
104
+ arguments: JSON.stringify(tc.arguments ?? {}),
105
+ },
106
+ })),
107
+ });
108
+ for (const tc of toolCalls) {
109
+ const out = await callTool(tc.name, tc.arguments ?? {}, ctx.signal);
110
+ messages.push({ role: 'tool', content: out, tool_call_id: tc.id });
111
+ }
112
+ }
113
+ // Iteration cap hit: one final tool-free turn so we answer from what was
114
+ // gathered instead of returning empty.
115
+ const final = await this.llm.chat(messages, [], {
116
+ signal: ctx.signal,
117
+ sessionId: ctx.sessionId,
118
+ });
119
+ if (!final.ok)
120
+ throw final.error;
121
+ add(final.value.usage);
122
+ return { content: final.value.content, usage };
123
+ }
44
124
  }
45
125
  //# sourceMappingURL=self.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"self.js","sourceRoot":"","sources":["../../../src/coordinator/dispatch/self.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,OAAO,YAAY;IAIJ;IACA;IAJV,IAAI,GAAG,MAAM,CAAC;IAEvB,YACmB,GAAS,EACT,YAAqB;QADrB,QAAG,GAAH,GAAG,CAAM;QACT,iBAAY,GAAZ,YAAY,CAAS;IACrC,CAAC;IAEJ,KAAK,CAAC,QAAQ,CACZ,IAAc,EACd,GAAwB;QAExB,MAAM,GAAG,GACP,IAAI,CAAC,YAAY;YACjB,GAAG,CAAC,YAAY;YAChB,yEAAyE,CAAC;QAC5E,MAAM,UAAU,GACd,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;aAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;aACtD,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;QAC5B,MAAM,OAAO,GAAG,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,wBAAwB,UAAU,EAAE,CAAC;QAE9E,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAC7B;gBACE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE;gBAChC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;aACnC,EACD,EAAE,EACF,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CACjD,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,GAAG,CAAC,KAAK,CAAC;YAC7B,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO;gBACzB,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK;gBACtB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;gBAChC,EAAE,EAAE,IAAI;aACT,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,MAAM,EAAE,EAAE;gBACV,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;gBAChC,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"self.js","sourceRoot":"","sources":["../../../src/coordinator/dispatch/self.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,28 @@ export interface CyclicReActExecutorDeps {
22
22
  * EXECUTOR_SYSTEM, keeps the default prompt agnostic.
23
23
  */
24
24
  systemPrompt?: string;
25
+ /**
26
+ * How many CONSECUTIVE unmet-need iterations whose tool re-query surfaces NO
27
+ * new tool are tolerated before the executor escalates to the consumer
28
+ * (18.1): analyze answer → find tools → add (preserving existing) → retry; if
29
+ * after this many rounds nothing new helps, the capability is genuinely
30
+ * unavailable → throw ClarifySignal (exit, ask the consumer) instead of
31
+ * returning a silent partial. Default 2 (clamped to ≥ 1).
32
+ */
33
+ maxNoProgressNeeds?: number;
34
+ /**
35
+ * Guard 2b — explicit "no capability" error instead of silent hallucination.
36
+ * When the executor starts with NO tools (empty `input.tools`), the toolsRag
37
+ * seed + needs search return NOTHING, and there are no external tools, the
38
+ * tool subsystem yielded zero capability. A model handed an empty toolset for
39
+ * a task that needs tools will fabricate an answer (observed live: a DAG
40
+ * worker that hit a dead MCP proxy got 0 tools and invented a review from the
41
+ * program name, promptTokens=1224 vs 507650 with a live proxy). By default the
42
+ * executor REFUSES to run toolless and throws ClarifySignal so the consumer
43
+ * learns the capability is missing. Set `true` only for genuinely tool-free
44
+ * reasoning steps. Default false.
45
+ */
46
+ allowToolless?: boolean;
25
47
  }
26
48
  /**
27
49
  * Task-agnostic tool-use protocol for the executor. It says NOTHING about the
@@ -1 +1 @@
1
- {"version":3,"file":"cyclic-react-executor.d.ts","sourceRoot":"","sources":["../../../src/coordinator/stepper/cyclic-react-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,YAAY,EAKlB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,OAAO,yBAAyB,EAAE,IAAI,CAAC;IAC5C,wEAAwE;IACxE,OAAO,EAAE,CACP,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,SAAS,EAAE,YAAY,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;GAQG;AASH,eAAO,MAAM,eAAe,gbAA4a,CAAC;AAYzc,qBAAa,mBAAoB,YAAW,SAAS;IAEvC,OAAO,CAAC,QAAQ,CAAC,IAAI;IADjC,QAAQ,CAAC,IAAI,kBAAkB;gBACF,IAAI,EAAE,uBAAuB;IAEpD,OAAO,CACX,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GACzC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;CAyPpC"}
1
+ {"version":3,"file":"cyclic-react-executor.d.ts","sourceRoot":"","sources":["../../../src/coordinator/stepper/cyclic-react-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,YAAY,EAKlB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,OAAO,yBAAyB,EAAE,IAAI,CAAC;IAC5C,wEAAwE;IACxE,OAAO,EAAE,CACP,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,SAAS,EAAE,YAAY,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;GAQG;AASH,eAAO,MAAM,eAAe,gbAA4a,CAAC;AAYzc,qBAAa,mBAAoB,YAAW,SAAS;IAEvC,OAAO,CAAC,QAAQ,CAAC,IAAI;IADjC,QAAQ,CAAC,IAAI,kBAAkB;gBACF,IAAI,EAAE,uBAAuB;IAEpD,OAAO,CACX,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GACzC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;CA2XpC"}
@@ -1,4 +1,4 @@
1
- import { renderTaskSpec, } from '@mcp-abap-adt/llm-agent';
1
+ import { artifactIdentityKey, ClarifySignal, renderTaskSpec, } from '@mcp-abap-adt/llm-agent';
2
2
  /**
3
3
  * Task-agnostic tool-use protocol for the executor. It says NOTHING about the
4
4
  * task type or any specific tool/MCP — only how to behave when a needed
@@ -73,6 +73,12 @@ export class CyclicReActExecutor {
73
73
  ];
74
74
  const tools = [...input.tools];
75
75
  let usage = ZERO;
76
+ // Phase 2 identity dedup: remember every (tool, canonical-args) fetched THIS
77
+ // run. A repeat call short-circuits — no MCP round-trip and, crucially, no
78
+ // re-injection of the (often large) payload into the context. The model is
79
+ // told it already has the data instead. Cuts the redundant include re-reads
80
+ // seen live (gi≈34 calls for 6 includes) + the context bloat they cause.
81
+ const fetched = new Set();
76
82
  // Counts consecutive unmet-need iterations whose tool re-query surfaced NO
77
83
  // new tool. One such "nudge" is allowed (the tool may already be present and
78
84
  // the model just needs prompting); a second consecutive no-progress need
@@ -89,16 +95,33 @@ export class CyclicReActExecutor {
89
95
  // program" task, so the model would fall back to the wrong tool. This is the
90
96
  // contextual-RAG-then-tool-search ordering.
91
97
  if (tools.length === 0) {
92
- // The seed query reflects the OVERALL intent (taskSpec) + shared guidance
93
- // (factsPrefix) + this node's prompt — so tool-search ranks tools for the
94
- // whole task, not just the narrow sub-goal.
98
+ // TWO ADDITIVE single-intent searches, UNIONed — never one mixed query.
99
+ // (1) PROMPT search: the overall intent (taskSpec) + guidance + node prompt
100
+ // → the main-task tools (e.g. GetProgram for the program shell).
101
+ // (2) NEEDS search: each Evaluator gap ("read the include bodies") queried
102
+ // SEPARATELY → the specific tool for that gap (GetInclude /
103
+ // GetIncludesList). Kept separate because a single mixed query DILUTES
104
+ // and DEMOTES the prompt-driven tools (measured: GetProgram #8 → #18
105
+ // when needs are mixed in). Single-intent queries each match their tool
106
+ // cleanly; the union covers both intents without lexical collision.
95
107
  const seedQuery = `${taskAnchor ? `${renderTaskSpec(taskSpec)}\n` : ''}${factsPrefix}${prompt}`;
96
108
  const seeded = await toolsRag.query(seedQuery, 10);
97
109
  for (const t of seeded)
98
110
  tools.push(t);
111
+ let needSeeded = 0;
112
+ if (input.evaluatorNeeds && input.evaluatorNeeds.length > 0) {
113
+ const have = new Set(tools.map((t) => t.name));
114
+ const byNeeds = await toolsRag.query(input.evaluatorNeeds.join('; '), 10);
115
+ for (const t of byNeeds)
116
+ if (!have.has(t.name)) {
117
+ tools.push(t);
118
+ needSeeded++;
119
+ }
120
+ }
99
121
  input.sessionLogger?.logStep('executor_tool_seed', {
100
122
  source: ref,
101
123
  seededCount: seeded.length,
124
+ needSeededCount: needSeeded,
102
125
  });
103
126
  }
104
127
  // Issue #167: MERGE client-provided external tools (consumer-executed, e.g.
@@ -111,6 +134,35 @@ export class CyclicReActExecutor {
111
134
  if (!have.has(t.name))
112
135
  tools.push(t);
113
136
  }
137
+ // Guard 2b — explicit "no capability" error, never a silent hallucination.
138
+ // The trigger is precise: the Evaluator established a NEED for this step
139
+ // (evaluatorNeeds non-empty → it judged the input needs-work and named the
140
+ // missing data/capability), yet every seeding path (input tools, prompt
141
+ // search, the needs search itself, external tools) left the toolset EMPTY.
142
+ // So a need exists and NO tool in RAG can satisfy it — calling the LLM now
143
+ // would fabricate the missing data (the live DAG-on-dead-proxy failure:
144
+ // 0 tools → invented review, promptTokens=1224 vs 507650 with a live proxy).
145
+ // We surface the gap to the consumer instead of returning invented content.
146
+ // NOTE the condition is gated on evaluatorNeeds — a step with NO established
147
+ // need is allowed to answer tool-free (legitimate reasoning); only an UNMET
148
+ // established need is an error. Opt out entirely with deps.allowToolless.
149
+ if (tools.length === 0 &&
150
+ !this.deps.allowToolless &&
151
+ (input.evaluatorNeeds?.length ?? 0) > 0) {
152
+ input.sessionLogger?.logStep('executor_no_tools', {
153
+ source: ref,
154
+ reason: 'evaluator established a need but the toolset is empty',
155
+ evaluatorNeeds: input.evaluatorNeeds ?? [],
156
+ });
157
+ throw new ClarifySignal(`I cannot complete this task: it requires ${(input.evaluatorNeeds ?? []).join('; ')}, but no tool is available to provide that (the tool subsystem returned an empty set — the MCP connection may be down, or no tool matches). I am stopping rather than inventing an answer.`);
158
+ }
159
+ // Guard 1 — groundedness/hallucination detector (token-based). Track whether
160
+ // the model ever actually called a tool and the size of the context the final
161
+ // answer was produced from. An answer emitted with ZERO tool calls, no seeded
162
+ // facts, and a tiny prompt — while tools WERE offered — is the hallucination
163
+ // signature (answered from the model's prior, not from retrieved data).
164
+ let toolCallsMade = 0;
165
+ let lastPromptTokens = 0;
114
166
  for (let iter = 0; iter < maxIterations; iter++) {
115
167
  // Gate BEFORE any further work (review R2-F1/R6-F1). The ledger is the
116
168
  // SHARED run-wide counter (not a local snapshot). If it is exhausted we
@@ -144,6 +196,8 @@ export class CyclicReActExecutor {
144
196
  };
145
197
  const v = res.value;
146
198
  usage = add(usage, v.usage);
199
+ if (v.usage)
200
+ lastPromptTokens = v.usage.promptTokens;
147
201
  if (v.usage) {
148
202
  budget.tokens.spend(v.usage); // decrement the shared ledger immediately
149
203
  onProgress?.({
@@ -155,6 +209,7 @@ export class CyclicReActExecutor {
155
209
  }
156
210
  const toolCalls = v.toolCalls ?? [];
157
211
  if (toolCalls.length > 0) {
212
+ toolCallsMade += toolCalls.length;
158
213
  // Relay the assistant turn WITH its tool_calls, then one tool message
159
214
  // per call carrying the matching tool_call_id. Anthropic/SAP AI SDK (and
160
215
  // the DeepSeek/OpenAI protocol) reject a `tool` message that does not
@@ -174,6 +229,53 @@ export class CyclicReActExecutor {
174
229
  });
175
230
  for (const tc of toolCalls) {
176
231
  const toolName = tc.name;
232
+ const identityKey = artifactIdentityKey(toolName, tc.arguments ?? {});
233
+ // Already fetched THIS run → do NOT re-call MCP and do NOT re-inject the
234
+ // payload; reply with a short note so the model stops re-requesting it
235
+ // (the full result is already earlier in this conversation + the store).
236
+ if (fetched.has(identityKey)) {
237
+ input.sessionLogger?.logStep('executor_fetch_dedup', {
238
+ source: ref,
239
+ scope: 'in-loop',
240
+ tool: toolName,
241
+ identityKey,
242
+ });
243
+ messages.push({
244
+ role: 'tool',
245
+ content: `(Already retrieved ${toolName} with these exact arguments earlier in this run — reuse the prior result above; do not fetch it again.)`,
246
+ tool_call_id: tc.id,
247
+ });
248
+ continue;
249
+ }
250
+ // CROSS-step dedup: another step already fetched this exact artefact
251
+ // into the shared session store. Inject the STORED content (it is NOT
252
+ // in this executor's history) instead of re-calling the tool. No
253
+ // mcp-call, no duplicate write.
254
+ if (knowledgeRag.hasArtifact && knowledgeRag.getArtifact) {
255
+ let priorContent;
256
+ try {
257
+ if (await knowledgeRag.hasArtifact(identityKey))
258
+ priorContent = await knowledgeRag.getArtifact(identityKey);
259
+ }
260
+ catch {
261
+ // store unavailable → fall through to a live fetch
262
+ }
263
+ if (priorContent !== undefined) {
264
+ fetched.add(identityKey);
265
+ input.sessionLogger?.logStep('executor_fetch_dedup', {
266
+ source: ref,
267
+ scope: 'cross-step',
268
+ tool: toolName,
269
+ identityKey,
270
+ });
271
+ messages.push({
272
+ role: 'tool',
273
+ content: priorContent,
274
+ tool_call_id: tc.id,
275
+ });
276
+ continue;
277
+ }
278
+ }
177
279
  onProgress?.({
178
280
  kind: 'mcp-call',
179
281
  source: ref,
@@ -181,6 +283,7 @@ export class CyclicReActExecutor {
181
283
  args: tc.arguments,
182
284
  });
183
285
  const result = await callMcp(toolName, tc.arguments, signal);
286
+ fetched.add(identityKey);
184
287
  onProgress?.({
185
288
  kind: 'mcp-result',
186
289
  source: ref,
@@ -198,6 +301,7 @@ export class CyclicReActExecutor {
198
301
  task: prompt,
199
302
  artifactType: 'mcp-result',
200
303
  toolName,
304
+ identityKey,
201
305
  createdAt: nowIso(),
202
306
  },
203
307
  });
@@ -229,15 +333,13 @@ export class CyclicReActExecutor {
229
333
  added++;
230
334
  }
231
335
  if (added === 0) {
232
- // Re-query surfaced nothing new. Allow one nudge (tool may already be
233
- // present); on a second consecutive no-progress need, the capability
234
- // is genuinely unavailable — stop honestly.
235
- if (++noProgressNeeds >= 2) {
236
- return {
237
- status: 'incomplete',
238
- missing: [need.queryToolsRag],
239
- usage,
240
- };
336
+ // Re-query surfaced nothing new. Allow a few nudges (the tool may
337
+ // already be present); once the cap is hit the capability is genuinely
338
+ // unavailable → escalate to the CONSUMER (18.1) rather than returning a
339
+ // silent partial: analyze → find tools → add → retry exhausted, so ask.
340
+ const cap = Math.max(1, this.deps.maxNoProgressNeeds ?? 2);
341
+ if (++noProgressNeeds >= cap) {
342
+ throw new ClarifySignal(`I could not complete the task: I still need to ${need.queryToolsRag}, and no available tool provides that capability.`);
241
343
  }
242
344
  }
243
345
  else {
@@ -250,6 +352,23 @@ export class CyclicReActExecutor {
250
352
  });
251
353
  continue;
252
354
  }
355
+ // Guard 1 — flag a likely hallucination BEFORE accepting the answer. The
356
+ // model produced a final answer without ever calling a tool, with no seeded
357
+ // facts to ground it, while tools WERE on offer — and the answer-producing
358
+ // call ingested only a small prompt (no retrieved data). That is content
359
+ // generated from the model's prior, not from this session's sources. We do
360
+ // not hard-fail (a legitimately tool-free answer is possible) but we emit a
361
+ // structured, token-backed signal so the coordinator/consumer can audit it.
362
+ if (toolCallsMade === 0 && factsPrefix === '' && tools.length > 0) {
363
+ input.sessionLogger?.logStep('hallucination_suspected', {
364
+ source: ref,
365
+ reason: 'final answer produced with no tool calls and no grounding facts',
366
+ toolsOffered: tools.length,
367
+ toolCallsMade,
368
+ finalPromptTokens: lastPromptTokens,
369
+ answerChars: (v.content ?? '').length,
370
+ });
371
+ }
253
372
  // Clean final answer → write + return ok.
254
373
  await knowledgeRag.write({
255
374
  content: v.content ?? '',
@@ -1 +1 @@
1
- {"version":3,"file":"cyclic-react-executor.js","sourceRoot":"","sources":["../../../src/coordinator/stepper/cyclic-react-executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cyclic-react-executor.js","sourceRoot":"","sources":["../../../src/coordinator/stepper/cyclic-react-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,aAAa,EAOb,cAAc,GACf,MAAM,yBAAyB,CAAC;AAqDjC;;;;;;;;GAQG;AACH,uEAAuE;AACvE,6EAA6E;AAC7E,gFAAgF;AAChF,+EAA+E;AAC/E,6EAA6E;AAC7E,8EAA8E;AAC9E,uEAAuE;AACvE,2EAA2E;AAC3E,MAAM,CAAC,MAAM,eAAe,GAAG,yaAAya,CAAC;AAEzc,MAAM,IAAI,GAAa,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;AAChF,MAAM,GAAG,GAAG,CAAC,CAAW,EAAE,CAAY,EAAY,EAAE,CAClD,CAAC;IACC,CAAC,CAAC;QACE,YAAY,EAAE,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY;QAC7C,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,gBAAgB;QACzD,WAAW,EAAE,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW;KAC3C;IACH,CAAC,CAAC,CAAC,CAAC;AAER,MAAM,OAAO,mBAAmB;IAED;IADpB,IAAI,GAAG,cAAc,CAAC;IAC/B,YAA6B,IAA6B;QAA7B,SAAI,GAAJ,IAAI,CAAyB;IAAG,CAAC;IAE9D,KAAK,CAAC,OAAO,CACX,KAA0C;QAE1C,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;QAC7D,MAAM,EACJ,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,UAAU,GACX,GAAG,KAAK,CAAC;QACV,yEAAyE;QACzE,6EAA6E;QAC7E,4EAA4E;QAC5E,iDAAiD;QACjD,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,qEAAqE;QACrE,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;QAClE,MAAM,GAAG,GAAG;YACV,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;QAEF,4EAA4E;QAC5E,6EAA6E;QAC7E,4EAA4E;QAC5E,6EAA6E;QAC7E,0EAA0E;QAC1E,0EAA0E;QAC1E,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACzD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,WAAW,GAAG,GAAG,+DAA+D,GAAG,KAAK;qBACrF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;qBAC/C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YACtB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,2DAA2D;QAC7D,CAAC;QAED,MAAM,QAAQ,GAAc;YAC1B;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,eAAe,GAAG,UAAU,EAAE;aACrE;YACD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,GAAG,MAAM,EAAE,EAAE;SACrD,CAAC;QACF,MAAM,KAAK,GAAc,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,6EAA6E;QAC7E,2EAA2E;QAC3E,2EAA2E;QAC3E,4EAA4E;QAC5E,yEAAyE;QACzE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,2EAA2E;QAC3E,6EAA6E;QAC7E,yEAAyE;QACzE,4EAA4E;QAC5E,kEAAkE;QAClE,IAAI,eAAe,GAAG,CAAC,CAAC;QAExB,6EAA6E;QAC7E,yEAAyE;QACzE,uDAAuD;QACvD,uEAAuE;QACvE,4EAA4E;QAC5E,4EAA4E;QAC5E,uEAAuE;QACvE,6EAA6E;QAC7E,4CAA4C;QAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,wEAAwE;YACxE,4EAA4E;YAC5E,qEAAqE;YACrE,2EAA2E;YAC3E,gEAAgE;YAChE,2EAA2E;YAC3E,yEAAyE;YACzE,4EAA4E;YAC5E,wEAAwE;YACxE,MAAM,SAAS,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,QAAwC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,GAAG,MAAM,EAAE,CAAC;YAChI,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACnD,KAAK,MAAM,CAAC,IAAI,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAY,CAAC,CAAC;YACjD,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,IAAI,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC/C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,KAAK,CAClC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAC/B,EAAE,CACH,CAAC;gBACF,KAAK,MAAM,CAAC,IAAI,OAAO;oBACrB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAE,CAAa,CAAC,IAAI,CAAC,EAAE,CAAC;wBACnC,KAAK,CAAC,IAAI,CAAC,CAAY,CAAC,CAAC;wBACzB,UAAU,EAAE,CAAC;oBACf,CAAC;YACL,CAAC;YACD,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,oBAAoB,EAAE;gBACjD,MAAM,EAAE,GAAG;gBACX,WAAW,EAAE,MAAM,CAAC,MAAM;gBAC1B,eAAe,EAAE,UAAU;aAC5B,CAAC,CAAC;QACL,CAAC;QAED,4EAA4E;QAC5E,4EAA4E;QAC5E,2EAA2E;QAC3E,iEAAiE;QACjE,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/C,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa;gBACjC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,CAAY,CAAC,CAAC;QACpD,CAAC;QAED,2EAA2E;QAC3E,yEAAyE;QACzE,2EAA2E;QAC3E,wEAAwE;QACxE,2EAA2E;QAC3E,2EAA2E;QAC3E,wEAAwE;QACxE,6EAA6E;QAC7E,4EAA4E;QAC5E,6EAA6E;QAC7E,4EAA4E;QAC5E,0EAA0E;QAC1E,IACE,KAAK,CAAC,MAAM,KAAK,CAAC;YAClB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa;YACxB,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,EACvC,CAAC;YACD,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,mBAAmB,EAAE;gBAChD,MAAM,EAAE,GAAG;gBACX,MAAM,EAAE,uDAAuD;gBAC/D,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,EAAE;aAC3C,CAAC,CAAC;YACH,MAAM,IAAI,aAAa,CACrB,4CAA4C,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,4LAA4L,CAChR,CAAC;QACJ,CAAC;QAED,6EAA6E;QAC7E,8EAA8E;QAC9E,8EAA8E;QAC9E,6EAA6E;QAC7E,wEAAwE;QACxE,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,gBAAgB,GAAG,CAAC,CAAC;QAEzB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC;YAChD,uEAAuE;YACvE,wEAAwE;YACxE,uEAAuE;YACvE,qEAAqE;YACrE,sEAAsE;YACtE,sEAAsE;YACtE,sEAAsE;YACtE,yEAAyE;YACzE,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC9B,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC;YAC/C,CAAC;YACD,UAAU,EAAE,CAAC;gBACX,IAAI,EAAE,gBAAgB;gBACtB,MAAM,EAAE,GAAG;gBACX,SAAS;gBACT,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,SAAS;aAC9B,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACxD,UAAU,EAAE,CAAC;gBACX,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE,GAAG;gBACX,SAAS;gBACT,UAAU,EAAE,CAAC;aACd,CAAC,CAAC;YACH,IAAI,GAAG,CAAC,EAAE,KAAK,KAAK;gBAClB,OAAO;oBACL,MAAM,EAAE,YAAY;oBACpB,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,WAAW,CAAC;oBAC5C,KAAK;iBACN,CAAC;YACJ,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;YACpB,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,CAAC,CAAC,KAAK;gBAAE,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC;YACrD,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;gBACZ,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,0CAA0C;gBACxE,UAAU,EAAE,CAAC;oBACX,IAAI,EAAE,aAAa;oBACnB,MAAM,EAAE,GAAG;oBACX,SAAS;oBACT,KAAK,EAAE,CAAC,CAAC,KAAK;iBACf,CAAC,CAAC;YACL,CAAC;YAED,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC;YACpC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,aAAa,IAAI,SAAS,CAAC,MAAM,CAAC;gBAClC,sEAAsE;gBACtE,yEAAyE;gBACzE,sEAAsE;gBACtE,kEAAkE;gBAClE,sEAAsE;gBACtE,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI;oBAC1B,UAAU,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;wBACjC,EAAE,EAAE,EAAE,CAAC,EAAE;wBACT,IAAI,EAAE,UAAmB;wBACzB,QAAQ,EAAE;4BACR,IAAI,EAAE,EAAE,CAAC,IAAI;4BACb,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC;yBAC9C;qBACF,CAAC,CAAC;iBACJ,CAAC,CAAC;gBACH,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;oBAC3B,MAAM,QAAQ,GAAG,EAAE,CAAC,IAAI,CAAC;oBACzB,MAAM,WAAW,GAAG,mBAAmB,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;oBACtE,yEAAyE;oBACzE,uEAAuE;oBACvE,yEAAyE;oBACzE,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;wBAC7B,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,sBAAsB,EAAE;4BACnD,MAAM,EAAE,GAAG;4BACX,KAAK,EAAE,SAAS;4BAChB,IAAI,EAAE,QAAQ;4BACd,WAAW;yBACZ,CAAC,CAAC;wBACH,QAAQ,CAAC,IAAI,CAAC;4BACZ,IAAI,EAAE,MAAM;4BACZ,OAAO,EAAE,sBAAsB,QAAQ,yGAAyG;4BAChJ,YAAY,EAAE,EAAE,CAAC,EAAE;yBACpB,CAAC,CAAC;wBACH,SAAS;oBACX,CAAC;oBACD,qEAAqE;oBACrE,sEAAsE;oBACtE,iEAAiE;oBACjE,gCAAgC;oBAChC,IAAI,YAAY,CAAC,WAAW,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC;wBACzD,IAAI,YAAgC,CAAC;wBACrC,IAAI,CAAC;4BACH,IAAI,MAAM,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC;gCAC7C,YAAY,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;wBAC/D,CAAC;wBAAC,MAAM,CAAC;4BACP,mDAAmD;wBACrD,CAAC;wBACD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;4BAC/B,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;4BACzB,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,sBAAsB,EAAE;gCACnD,MAAM,EAAE,GAAG;gCACX,KAAK,EAAE,YAAY;gCACnB,IAAI,EAAE,QAAQ;gCACd,WAAW;6BACZ,CAAC,CAAC;4BACH,QAAQ,CAAC,IAAI,CAAC;gCACZ,IAAI,EAAE,MAAM;gCACZ,OAAO,EAAE,YAAY;gCACrB,YAAY,EAAE,EAAE,CAAC,EAAE;6BACpB,CAAC,CAAC;4BACH,SAAS;wBACX,CAAC;oBACH,CAAC;oBACD,UAAU,EAAE,CAAC;wBACX,IAAI,EAAE,UAAU;wBAChB,MAAM,EAAE,GAAG;wBACX,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,EAAE,CAAC,SAAS;qBACnB,CAAC,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;oBAC7D,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBACzB,UAAU,EAAE,CAAC;wBACX,IAAI,EAAE,YAAY;wBAClB,MAAM,EAAE,GAAG;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE,CAAC;wBACb,KAAK,EAAE,MAAM,CAAC,MAAM;qBACrB,CAAC,CAAC;oBACH,MAAM,YAAY,CAAC,KAAK,CAAC;wBACvB,OAAO,EAAE,MAAM;wBACf,QAAQ,EAAE;4BACR,OAAO,EAAE,QAAQ,CAAC,OAAO;4BACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;4BACvB,SAAS,EAAE,QAAQ,CAAC,SAAS;4BAC7B,eAAe,EAAE,QAAQ,CAAC,eAAe;4BACzC,IAAI,EAAE,MAAM;4BACZ,YAAY,EAAE,YAAY;4BAC1B,QAAQ;4BACR,WAAW;4BACX,SAAS,EAAE,MAAM,EAAE;yBACpB;qBACF,CAAC,CAAC;oBACH,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,MAAM;wBACf,YAAY,EAAE,EAAE,CAAC,EAAE;qBACpB,CAAC,CAAC;gBACL,CAAC;gBACD,eAAe,GAAG,CAAC,CAAC,CAAC,uDAAuD;gBAC5E,SAAS;YACX,CAAC;YAED,yEAAyE;YACzE,yEAAyE;YACzE,0EAA0E;YAC1E,yEAAyE;YACzE,0EAA0E;YAC1E,8BAA8B;YAC9B,MAAM,IAAI,GAAG,YAAY;gBACvB,CAAC,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;gBAC7C,CAAC,CAAC,SAAS,CAAC;YACd,IAAI,IAAI,EAAE,aAAa,EAAE,CAAC;gBACxB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;gBAC1D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC/C,IAAI,KAAK,GAAG,CAAC,CAAC;gBACd,KAAK,MAAM,CAAC,IAAI,KAAK;oBACnB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;wBACtB,KAAK,CAAC,IAAI,CAAC,CAAY,CAAC,CAAC;wBACzB,KAAK,EAAE,CAAC;oBACV,CAAC;gBACH,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;oBAChB,kEAAkE;oBAClE,uEAAuE;oBACvE,wEAAwE;oBACxE,wEAAwE;oBACxE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC,CAAC;oBAC3D,IAAI,EAAE,eAAe,IAAI,GAAG,EAAE,CAAC;wBAC7B,MAAM,IAAI,aAAa,CACrB,kDAAkD,IAAI,CAAC,aAAa,mDAAmD,CACxH,CAAC;oBACJ,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,eAAe,GAAG,CAAC,CAAC;gBACtB,CAAC;gBACD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC/D,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,4CAA4C,MAAM,EAAE;iBAC9D,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,yEAAyE;YACzE,4EAA4E;YAC5E,2EAA2E;YAC3E,yEAAyE;YACzE,2EAA2E;YAC3E,4EAA4E;YAC5E,4EAA4E;YAC5E,IAAI,aAAa,KAAK,CAAC,IAAI,WAAW,KAAK,EAAE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClE,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,yBAAyB,EAAE;oBACtD,MAAM,EAAE,GAAG;oBACX,MAAM,EACJ,iEAAiE;oBACnE,YAAY,EAAE,KAAK,CAAC,MAAM;oBAC1B,aAAa;oBACb,iBAAiB,EAAE,gBAAgB;oBACnC,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM;iBACtC,CAAC,CAAC;YACL,CAAC;YAED,0CAA0C;YAC1C,MAAM,YAAY,CAAC,KAAK,CAAC;gBACvB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;gBACxB,QAAQ,EAAE;oBACR,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,SAAS,EAAE,QAAQ,CAAC,SAAS;oBAC7B,eAAe,EAAE,QAAQ,CAAC,eAAe;oBACzC,IAAI,EAAE,MAAM;oBACZ,YAAY,EAAE,kBAAkB;oBAChC,SAAS,EAAE,MAAM,EAAE;iBACpB;aACF,CAAC,CAAC;YACH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,wBAAwB,CAAC,EAAE,KAAK,EAAE,CAAC;IAC9E,CAAC;CACF;AAED,2EAA2E;AAC3E,yEAAyE;AACzE,SAAS,MAAM;IACb,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED;;8EAE8E;AAC9E,SAAS,YAAY,CAAC,CAAS,EAAE,CAAS;IACxC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export { CyclicReActExecutor } from './cyclic-react-executor.js';
2
+ export { EVALUATOR_SYSTEM, LlmEvaluator, parseVerdict, } from './llm-evaluator.js';
2
3
  export { LlmStepperPlanner, STEPPER_PLANNER_SYSTEM, } from './llm-stepper-planner.js';
3
4
  export { LlmTaskFormalizer, parseTaskSpec, TASK_FORMALIZER_SYSTEM, } from './llm-task-formalizer.js';
4
5
  export { LoggingLlm } from './logging-llm.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/coordinator/stepper/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EACL,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/coordinator/stepper/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export { CyclicReActExecutor } from './cyclic-react-executor.js';
2
+ export { EVALUATOR_SYSTEM, LlmEvaluator, parseVerdict, } from './llm-evaluator.js';
2
3
  export { LlmStepperPlanner, STEPPER_PLANNER_SYSTEM, } from './llm-stepper-planner.js';
3
4
  export { LlmTaskFormalizer, parseTaskSpec, TASK_FORMALIZER_SYSTEM, } from './llm-task-formalizer.js';
4
5
  export { LoggingLlm } from './logging-llm.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/coordinator/stepper/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EACL,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAoB,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/coordinator/stepper/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAoB,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { EvaluatorVerdict, IEvaluator, IKnowledgeRagHandle, ILlm, ITaskSpec, IToolsRagHandle, RunIdentity } from '@mcp-abap-adt/llm-agent';
2
+ /**
3
+ * Task-agnostic Evaluator prompt. It judges the INPUT (the sub-prompt) against
4
+ * the RAG context — NOT how to do the task. "What completeness means" comes from
5
+ * the Known facts (the consumer's RAG skills); the prompt names no tools or
6
+ * domain rules. The three routes ARE the recursion control: executable =
7
+ * terminal, needs-work = recurse with gaps, needs-consumer = ask the human.
8
+ */
9
+ export declare const EVALUATOR_SYSTEM = "You assess whether a TASK can be executed as stated, using ONLY the provided context. Do NOT perform the task. Decide ONE route:\n- \"executable\": the task can be carried out unambiguously with what is already known (see \"Known facts\") or with a single available tool call. Nothing essential is missing.\n- \"needs-work\": something essential is missing BUT it can be obtained by the agent \u2014 fetched via an available tool, or produced by decomposing/gathering first. List each missing item.\n- \"needs-consumer\": something essential is missing that ONLY the human/consumer can resolve (a decision, or knowledge external to the system that no available tool can obtain). List the question(s).\nUse \"Known facts\" to decide what \"complete\" means for this domain \u2014 e.g. if a review needs the COMPLETE artifact (all parts/sub-parts) and the facts show only a part is present, that is \"needs-work\" (fetch the rest). If an available tool could obtain the missing data, the route is \"needs-work\", NEVER \"needs-consumer\".\nRespond with ONLY JSON: {\"route\":\"executable|needs-work|needs-consumer\",\"missing\":[\"...\"],\"reason\":\"<one line>\"}";
10
+ export declare class LlmEvaluator implements IEvaluator {
11
+ private readonly llm;
12
+ readonly name = "llm-evaluator";
13
+ readonly model?: string;
14
+ private readonly systemPrompt;
15
+ constructor(llm: ILlm, systemPrompt?: string);
16
+ evaluate(input: {
17
+ prompt: string;
18
+ knowledgeRag: IKnowledgeRagHandle;
19
+ toolsRag: IToolsRagHandle;
20
+ taskSpec?: ITaskSpec;
21
+ identity: RunIdentity;
22
+ signal?: AbortSignal;
23
+ }): Promise<EvaluatorVerdict>;
24
+ }
25
+ /** Parse the JSON verdict; tolerate code fences and stray prose around it.
26
+ * Defaults to a safe `needs-work` if the route is missing/unknown (never
27
+ * silently treat an unparseable answer as executable). */
28
+ export declare function parseVerdict(raw: string): EvaluatorVerdict;
29
+ //# sourceMappingURL=llm-evaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-evaluator.d.ts","sourceRoot":"","sources":["../../../src/coordinator/stepper/llm-evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,gBAAgB,EAChB,UAAU,EACV,mBAAmB,EACnB,IAAI,EACJ,SAAS,EACT,eAAe,EACf,WAAW,EACZ,MAAM,yBAAyB,CAAC;AAGjC;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,+oCAKoF,CAAC;AAQlH,qBAAa,YAAa,YAAW,UAAU;IAM3C,OAAO,CAAC,QAAQ,CAAC,GAAG;IALtB,QAAQ,CAAC,IAAI,mBAAmB;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAGnB,GAAG,EAAE,IAAI,EAC1B,YAAY,GAAE,MAAyB;IAMnC,QAAQ,CAAC,KAAK,EAAE;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,mBAAmB,CAAC;QAClC,QAAQ,EAAE,eAAe,CAAC;QAC1B,QAAQ,CAAC,EAAE,SAAS,CAAC;QACrB,QAAQ,EAAE,WAAW,CAAC;QACtB,MAAM,CAAC,EAAE,WAAW,CAAC;KACtB,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA+C9B;AAED;;2DAE2D;AAC3D,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAc1D"}
@@ -0,0 +1,94 @@
1
+ import { renderTaskSpec } from '@mcp-abap-adt/llm-agent';
2
+ /**
3
+ * Task-agnostic Evaluator prompt. It judges the INPUT (the sub-prompt) against
4
+ * the RAG context — NOT how to do the task. "What completeness means" comes from
5
+ * the Known facts (the consumer's RAG skills); the prompt names no tools or
6
+ * domain rules. The three routes ARE the recursion control: executable =
7
+ * terminal, needs-work = recurse with gaps, needs-consumer = ask the human.
8
+ */
9
+ export const EVALUATOR_SYSTEM = `You assess whether a TASK can be executed as stated, using ONLY the provided context. Do NOT perform the task. Decide ONE route:
10
+ - "executable": the task can be carried out unambiguously with what is already known (see "Known facts") or with a single available tool call. Nothing essential is missing.
11
+ - "needs-work": something essential is missing BUT it can be obtained by the agent — fetched via an available tool, or produced by decomposing/gathering first. List each missing item.
12
+ - "needs-consumer": something essential is missing that ONLY the human/consumer can resolve (a decision, or knowledge external to the system that no available tool can obtain). List the question(s).
13
+ Use "Known facts" to decide what "complete" means for this domain — e.g. if a review needs the COMPLETE artifact (all parts/sub-parts) and the facts show only a part is present, that is "needs-work" (fetch the rest). If an available tool could obtain the missing data, the route is "needs-work", NEVER "needs-consumer".
14
+ Respond with ONLY JSON: {"route":"executable|needs-work|needs-consumer","missing":["..."],"reason":"<one line>"}`;
15
+ const ROUTES = new Set([
16
+ 'executable',
17
+ 'needs-work',
18
+ 'needs-consumer',
19
+ ]);
20
+ export class LlmEvaluator {
21
+ llm;
22
+ name = 'llm-evaluator';
23
+ model;
24
+ systemPrompt;
25
+ constructor(llm, systemPrompt = EVALUATOR_SYSTEM) {
26
+ this.llm = llm;
27
+ this.model = llm.model;
28
+ this.systemPrompt = systemPrompt;
29
+ }
30
+ async evaluate(input) {
31
+ const facts = await input.knowledgeRag.query(input.prompt, { k: 8 });
32
+ const factBlock = facts.length
33
+ ? `Known facts (already in the knowledge store):\n${facts
34
+ .map((f) => `- [${f.metadata.artifactType}] ${truncate(f.content, 400)}`)
35
+ .join('\n')}\n\n`
36
+ : 'Known facts: (none yet)\n\n';
37
+ let toolsBlock = '';
38
+ try {
39
+ const tools = await input.toolsRag.query(input.prompt, 15);
40
+ if (tools.length > 0) {
41
+ toolsBlock =
42
+ `Available tools (the agent can call these to obtain data):\n` +
43
+ tools
44
+ .map((t) => `- ${t.name}: ${truncate(t.description ?? '', 200)}`)
45
+ .join('\n') +
46
+ '\n\n';
47
+ }
48
+ }
49
+ catch {
50
+ // toolsRag unavailable — omit gracefully (fewer obtainable options known)
51
+ }
52
+ const taskBlock = input.taskSpec
53
+ ? `${renderTaskSpec(input.taskSpec)}\n\n`
54
+ : '';
55
+ const user = `${taskBlock}${factBlock}${toolsBlock}Task: ${input.prompt}`;
56
+ const res = await this.llm.chat([
57
+ { role: 'system', content: this.systemPrompt },
58
+ { role: 'user', content: user },
59
+ ], [], { signal: input.signal });
60
+ if (res.ok === false)
61
+ throw new Error(`evaluator: ${res.error?.message ?? 'llm error'}`);
62
+ return parseVerdict(res.value.content);
63
+ }
64
+ }
65
+ /** Parse the JSON verdict; tolerate code fences and stray prose around it.
66
+ * Defaults to a safe `needs-work` if the route is missing/unknown (never
67
+ * silently treat an unparseable answer as executable). */
68
+ export function parseVerdict(raw) {
69
+ const json = extractJson(raw);
70
+ const route = json && typeof json.route === 'string' && ROUTES.has(json.route)
71
+ ? json.route
72
+ : 'needs-work';
73
+ const missing = Array.isArray(json?.missing)
74
+ ? (json?.missing).filter((m) => typeof m === 'string')
75
+ : [];
76
+ const reason = json && typeof json.reason === 'string' ? json.reason : undefined;
77
+ return { route, missing, ...(reason ? { reason } : {}) };
78
+ }
79
+ function extractJson(s) {
80
+ const start = s.indexOf('{');
81
+ const end = s.lastIndexOf('}');
82
+ if (start === -1 || end === -1 || end < start)
83
+ return undefined;
84
+ try {
85
+ return JSON.parse(s.slice(start, end + 1));
86
+ }
87
+ catch {
88
+ return undefined;
89
+ }
90
+ }
91
+ function truncate(s, n) {
92
+ return s.length > n ? `${s.slice(0, n)}…` : s;
93
+ }
94
+ //# sourceMappingURL=llm-evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-evaluator.js","sourceRoot":"","sources":["../../../src/coordinator/stepper/llm-evaluator.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { DagPlan, IKnowledgeRagHandle, ILlm, IStepperPlanner, ITaskSpec, IToolsRagHandle, RunIdentity } from '@mcp-abap-adt/llm-agent';
2
- export declare const STEPPER_PLANNER_SYSTEM = "You are a planner in a recursive Stepper hierarchy. Decompose the task into a SHALLOW DAG of steps.\nCOMPLETENESS: first assess whether the task states everything needed to execute it. If a prerequisite is implied but not stated \u2014 e.g. an analysis/review needs the COMPLETE artifact (all of its parts/sub-parts), not only its top level \u2014 add explicit steps to obtain it FIRST. Use the \"Known facts\" to decide what \"complete\" means for this domain.\nRAG-FIRST: the \"Known facts\" section lists what is already in the shared knowledge store. If a fact you need is already there, DO NOT add a step to re-fetch it \u2014 use it. Only add a step to obtain information that is genuinely missing.\nFETCH STEPS \u2014 NOT needInfo: Workers can read the live system by calling the tools listed in the \"Available tools\" section below. For ANY data a worker could fetch (program source, includes, table contents, object metadata, search results), emit a fetch STEP whose goal names the fetch \u2014 NEVER use needInfo for fetchable data.\nDECOMPOSE TO CONCRETE LEAVES: if a task is achievable by ONE tool call, emit a single-step plan whose goal is that concrete leaf call \u2014 do NOT re-emit the parent's task verbatim (that causes infinite recursion). Each node spawns a fresh worker that does NOT share your context; over-decomposition multiplies cost.\nDELEGATION: if an \"Available workers\" section is listed below, you MAY set a node's \"agent\" to one of those worker names to delegate a SUB-GOAL to that recursive worker (it will plan and execute the sub-goal itself). Omit \"agent\" for a concrete leaf you want executed directly. Only delegate when the sub-goal is a distinct unit of work that benefits from its own planning \u2014 otherwise emit a direct leaf.\nEach node: {\"id\",\"goal\",\"agent\"(optional worker name),\"dependsOn\"(optional ids)}.\nRespond with ONLY one of:\n{\"objective\":\"...\",\"nodes\":[...]}\n{\"needInfo\":\"<query>\"} \u2014 ONLY for a fact that NO listed tool can obtain (e.g. a human decision, or knowledge external to the system). If a listed tool below could get it, plan a step instead.\n{\"clarify\":\"<question>\"} \u2014 you need a human decision before planning";
2
+ export declare const STEPPER_PLANNER_SYSTEM = "You are a planner in a recursive Stepper hierarchy. Decompose the task into a SHALLOW DAG of steps.\nRAG-FIRST: the \"Known facts\" section lists what is already in the shared knowledge store. If a fact you need is already there, DO NOT add a step to re-fetch it \u2014 use it. Only add a step to obtain information that is genuinely missing.\nFETCHING IS THE EXECUTOR'S JOB \u2014 plan WORK, not granular fetches. A worker reads whatever its step needs (program source, includes, tables, metadata) at EXECUTION time via the available tools; do NOT decompose a task into many tiny fetch steps. Emit a separate \"gather\" step ONLY when its result must be SHARED by MULTIPLE later steps \u2014 and then emit ONE gather step they all \"dependsOn\" (fetched once, threaded to them), NEVER several fetch steps. (Use needInfo ONLY for a fact no listed tool can obtain \u2014 see below.)\nDECOMPOSE TO CONCRETE LEAVES: if a task is achievable by ONE tool call, emit a single-step plan whose goal is that concrete leaf call \u2014 do NOT re-emit the parent's task verbatim (that causes infinite recursion). Each node spawns a fresh worker that does NOT share your context; over-decomposition multiplies cost.\nDELEGATION: if an \"Available workers\" section is listed below, you MAY set a node's \"agent\" to one of those worker names to delegate a SUB-GOAL to that recursive worker (it will plan and execute the sub-goal itself). Omit \"agent\" for a concrete leaf you want executed directly. Only delegate when the sub-goal is a distinct unit of work that benefits from its own planning \u2014 otherwise emit a direct leaf.\nDEPENDENCIES \u2014 DATAFLOW + ORDERING. A step receives another step's output ONLY if that step is in its \"dependsOn\"; steps WITHOUT dependsOn run in PARALLEL and do NOT see each other's data. THEREFORE: NEVER place in parallel two steps that depend on, build on, or read the SAME data \u2014 that is the most common planning error. If step B uses, refines, or overlaps step A, set B.\"dependsOn\" = [A] so they run sequentially and A's output flows into B. Emit parallel (no-dependsOn) steps ONLY for GENUINELY INDEPENDENT, DISJOINT work. Prose like \"using step 1\" is NOT enough \u2014 encode it as dependsOn. When unsure whether two steps are independent, CHAIN them (sequential is safe; wrong parallelism re-fetches and races).\nONE READ PER ARTEFACT \u2014 discovery (list/shell to find what exists) and reading the bodies are SEQUENTIAL: the read step \"dependsOn\" the discovery; never two parallel steps that both fetch the same object.\nEach node: {\"id\",\"goal\",\"agent\"(optional worker name),\"dependsOn\"(ids of steps whose OUTPUT this step needs)}.\nRespond with ONLY one of:\n{\"objective\":\"...\",\"nodes\":[...]}\n{\"needInfo\":\"<query>\"} \u2014 ONLY for a fact that NO listed tool can obtain (e.g. a human decision, or knowledge external to the system). If a listed tool below could get it, plan a step instead.\n{\"clarify\":\"<question>\"} \u2014 you need a human decision before planning";
3
3
  export declare class LlmStepperPlanner implements IStepperPlanner {
4
4
  private readonly llm;
5
5
  readonly name = "llm-stepper";
@@ -1 +1 @@
1
- {"version":3,"file":"llm-stepper-planner.d.ts","sourceRoot":"","sources":["../../../src/coordinator/stepper/llm-stepper-planner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,mBAAmB,EACnB,IAAI,EACJ,eAAe,EACf,SAAS,EACT,eAAe,EACf,WAAW,EACZ,MAAM,yBAAyB,CAAC;AAQjC,eAAO,MAAM,sBAAsB,mrEAUmC,CAAC;AAYvE,qBAAa,iBAAkB,YAAW,eAAe;IAUrD,OAAO,CAAC,QAAQ,CAAC,GAAG;IATtB,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyB;IACrD;;4EAEwE;IACxE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAGnB,GAAG,EAAE,IAAI,EAC1B,WAAW,GAAE,SAAS,GAAG,UAAsB,EAC/C,YAAY,GAAE,MAA+B;IAOzC,IAAI,CAAC,KAAK,EAAE;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,mBAAmB,CAAC;QAClC,QAAQ,EAAE,eAAe,CAAC;QAC1B,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,QAAQ,EAAE,WAAW,CAAC;QACtB,MAAM,CAAC,EAAE,aAAa,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC/D,QAAQ,CAAC,EAAE,SAAS,CAAC;QACrB,MAAM,CAAC,EAAE,WAAW,CAAC;KACtB,GAAG,OAAO,CAAC,OAAO,CAAC;CA0DrB"}
1
+ {"version":3,"file":"llm-stepper-planner.d.ts","sourceRoot":"","sources":["../../../src/coordinator/stepper/llm-stepper-planner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,mBAAmB,EACnB,IAAI,EACJ,eAAe,EACf,SAAS,EACT,eAAe,EACf,WAAW,EACZ,MAAM,yBAAyB,CAAC;AAUjC,eAAO,MAAM,sBAAsB,o+FAWmC,CAAC;AAYvE,qBAAa,iBAAkB,YAAW,eAAe;IAUrD,OAAO,CAAC,QAAQ,CAAC,GAAG;IATtB,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyB;IACrD;;4EAEwE;IACxE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAGnB,GAAG,EAAE,IAAI,EAC1B,WAAW,GAAE,SAAS,GAAG,UAAsB,EAC/C,YAAY,GAAE,MAA+B;IAOzC,IAAI,CAAC,KAAK,EAAE;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,mBAAmB,CAAC;QAClC,QAAQ,EAAE,eAAe,CAAC;QAC1B,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,QAAQ,EAAE,WAAW,CAAC;QACtB,MAAM,CAAC,EAAE,aAAa,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC/D,QAAQ,CAAC,EAAE,SAAS,CAAC;QACrB,MAAM,CAAC,EAAE,WAAW,CAAC;KACtB,GAAG,OAAO,CAAC,OAAO,CAAC;CA2ErB"}