@mcp-abap-adt/llm-agent-server-libs 19.1.2 → 20.0.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 (112) hide show
  1. package/dist/factories/controller-factory.d.ts +20 -6
  2. package/dist/factories/controller-factory.d.ts.map +1 -1
  3. package/dist/factories/controller-factory.js +52 -11
  4. package/dist/factories/controller-factory.js.map +1 -1
  5. package/dist/generated/version.d.ts +1 -1
  6. package/dist/generated/version.js +1 -1
  7. package/dist/index.d.ts +1 -0
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +1 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/pipelines/controller.d.ts +4 -2
  12. package/dist/pipelines/controller.d.ts.map +1 -1
  13. package/dist/pipelines/controller.js +55 -5
  14. package/dist/pipelines/controller.js.map +1 -1
  15. package/dist/pipelines/dag.d.ts +2 -2
  16. package/dist/pipelines/dag.d.ts.map +1 -1
  17. package/dist/pipelines/dag.js +4 -3
  18. package/dist/pipelines/dag.js.map +1 -1
  19. package/dist/pipelines/flat.d.ts.map +1 -1
  20. package/dist/pipelines/flat.js +2 -1
  21. package/dist/pipelines/flat.js.map +1 -1
  22. package/dist/pipelines/linear.d.ts.map +1 -1
  23. package/dist/pipelines/linear.js +2 -1
  24. package/dist/pipelines/linear.js.map +1 -1
  25. package/dist/pipelines/register-skill-sources.d.ts +21 -0
  26. package/dist/pipelines/register-skill-sources.d.ts.map +1 -0
  27. package/dist/pipelines/register-skill-sources.js +57 -0
  28. package/dist/pipelines/register-skill-sources.js.map +1 -0
  29. package/dist/pipelines/server-context.d.ts +37 -1
  30. package/dist/pipelines/server-context.d.ts.map +1 -1
  31. package/dist/pipelines/server-context.js.map +1 -1
  32. package/dist/pipelines/stepper.d.ts +2 -2
  33. package/dist/pipelines/stepper.js +2 -2
  34. package/dist/smart-agent/config.d.ts +1 -1
  35. package/dist/smart-agent/config.d.ts.map +1 -1
  36. package/dist/smart-agent/config.js +7 -3
  37. package/dist/smart-agent/config.js.map +1 -1
  38. package/dist/smart-agent/controller/artifacts.d.ts +116 -0
  39. package/dist/smart-agent/controller/artifacts.d.ts.map +1 -0
  40. package/dist/smart-agent/controller/artifacts.js +192 -0
  41. package/dist/smart-agent/controller/artifacts.js.map +1 -0
  42. package/dist/smart-agent/controller/board.d.ts +73 -0
  43. package/dist/smart-agent/controller/board.d.ts.map +1 -0
  44. package/dist/smart-agent/controller/board.js +233 -0
  45. package/dist/smart-agent/controller/board.js.map +1 -0
  46. package/dist/smart-agent/controller/controller-coordinator-handler.d.ts +75 -7
  47. package/dist/smart-agent/controller/controller-coordinator-handler.d.ts.map +1 -1
  48. package/dist/smart-agent/controller/controller-coordinator-handler.js +929 -66
  49. package/dist/smart-agent/controller/controller-coordinator-handler.js.map +1 -1
  50. package/dist/smart-agent/controller/finalizer.d.ts +48 -0
  51. package/dist/smart-agent/controller/finalizer.d.ts.map +1 -0
  52. package/dist/smart-agent/controller/finalizer.js +126 -0
  53. package/dist/smart-agent/controller/finalizer.js.map +1 -0
  54. package/dist/smart-agent/controller/memorizer.d.ts +2 -2
  55. package/dist/smart-agent/controller/memorizer.d.ts.map +1 -1
  56. package/dist/smart-agent/controller/memorizer.js +2 -2
  57. package/dist/smart-agent/controller/memorizer.js.map +1 -1
  58. package/dist/smart-agent/controller/outcome.d.ts +28 -0
  59. package/dist/smart-agent/controller/outcome.d.ts.map +1 -0
  60. package/dist/smart-agent/controller/outcome.js +30 -0
  61. package/dist/smart-agent/controller/outcome.js.map +1 -0
  62. package/dist/smart-agent/controller/planner.d.ts +41 -14
  63. package/dist/smart-agent/controller/planner.d.ts.map +1 -1
  64. package/dist/smart-agent/controller/planner.js +149 -73
  65. package/dist/smart-agent/controller/planner.js.map +1 -1
  66. package/dist/smart-agent/controller/reviewer.d.ts +48 -0
  67. package/dist/smart-agent/controller/reviewer.d.ts.map +1 -0
  68. package/dist/smart-agent/controller/reviewer.js +116 -0
  69. package/dist/smart-agent/controller/reviewer.js.map +1 -0
  70. package/dist/smart-agent/controller/run-scope.d.ts +50 -0
  71. package/dist/smart-agent/controller/run-scope.d.ts.map +1 -0
  72. package/dist/smart-agent/controller/run-scope.js +99 -0
  73. package/dist/smart-agent/controller/run-scope.js.map +1 -0
  74. package/dist/smart-agent/controller/session-bundle.d.ts +5 -0
  75. package/dist/smart-agent/controller/session-bundle.d.ts.map +1 -1
  76. package/dist/smart-agent/controller/session-bundle.js +27 -0
  77. package/dist/smart-agent/controller/session-bundle.js.map +1 -1
  78. package/dist/smart-agent/controller/types.d.ts +124 -15
  79. package/dist/smart-agent/controller/types.d.ts.map +1 -1
  80. package/dist/smart-agent/controller/types.js +30 -1
  81. package/dist/smart-agent/controller/types.js.map +1 -1
  82. package/dist/smart-agent/embedder-knowledge-index.d.ts +28 -0
  83. package/dist/smart-agent/embedder-knowledge-index.d.ts.map +1 -0
  84. package/dist/smart-agent/embedder-knowledge-index.js +71 -0
  85. package/dist/smart-agent/embedder-knowledge-index.js.map +1 -0
  86. package/dist/smart-agent/jsonl-knowledge-backend.d.ts +26 -10
  87. package/dist/smart-agent/jsonl-knowledge-backend.d.ts.map +1 -1
  88. package/dist/smart-agent/jsonl-knowledge-backend.js +81 -9
  89. package/dist/smart-agent/jsonl-knowledge-backend.js.map +1 -1
  90. package/dist/smart-agent/pg-pool.d.ts +58 -0
  91. package/dist/smart-agent/pg-pool.d.ts.map +1 -0
  92. package/dist/smart-agent/pg-pool.js +149 -0
  93. package/dist/smart-agent/pg-pool.js.map +1 -0
  94. package/dist/smart-agent/skill-plugins-config.d.ts +97 -0
  95. package/dist/smart-agent/skill-plugins-config.d.ts.map +1 -0
  96. package/dist/smart-agent/skill-plugins-config.js +318 -0
  97. package/dist/smart-agent/skill-plugins-config.js.map +1 -0
  98. package/dist/smart-agent/skill-plugins-config.test.d.ts +2 -0
  99. package/dist/smart-agent/skill-plugins-config.test.d.ts.map +1 -0
  100. package/dist/smart-agent/skill-plugins-config.test.js.map +1 -0
  101. package/dist/smart-agent/skill-plugins-host-factory.d.ts +98 -0
  102. package/dist/smart-agent/skill-plugins-host-factory.d.ts.map +1 -0
  103. package/dist/smart-agent/skill-plugins-host-factory.js +284 -0
  104. package/dist/smart-agent/skill-plugins-host-factory.js.map +1 -0
  105. package/dist/smart-agent/skill-plugins-host-factory.test.d.ts +2 -0
  106. package/dist/smart-agent/skill-plugins-host-factory.test.d.ts.map +1 -0
  107. package/dist/smart-agent/skill-plugins-host-factory.test.js.map +1 -0
  108. package/dist/smart-agent/smart-server.d.ts +25 -0
  109. package/dist/smart-agent/smart-server.d.ts.map +1 -1
  110. package/dist/smart-agent/smart-server.js +141 -7
  111. package/dist/smart-agent/smart-server.js.map +1 -1
  112. package/package.json +9 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-scope.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/controller/run-scope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAMhD;2DAC2D;AAC3D,MAAM,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC;AAEvC;;iEAEiE;AACjE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAG1D;AAQD,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AASrC;;;gCAGgC;AAChC,wBAAsB,aAAa,CACjC,EAAE,EAAE,gBAAgB,EACpB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,eAAe,EAChC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAef;AAED,4EAA4E;AAC5E,wBAAsB,YAAY,CAChC,EAAE,EAAE,gBAAgB,EACpB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAgBtC;AAED;gDACgD;AAChD,wBAAsB,UAAU,CAC9B,EAAE,EAAE,gBAAgB,EACpB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,EAAE,CAAC,CAcnB;AAMD,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC;AAE1B,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,aAAa,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;yDACqD;IACrD,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CAwBpE"}
@@ -0,0 +1,99 @@
1
+ import { createHash } from 'node:crypto';
2
+ /** Canonical identity fingerprint of a request: a hash of the NORMALIZED text
3
+ * (trimmed, internal whitespace collapsed). Used only for identity comparison —
4
+ * the verbatim request is kept separately for the finalizer. */
5
+ export function fingerprintRequest(request) {
6
+ const normalized = request.trim().replace(/\s+/g, ' ');
7
+ return createHash('sha256').update(normalized).digest('hex');
8
+ }
9
+ // ---------------------------------------------------------------------------
10
+ // Terminal store (separate keyed TTL store)
11
+ // ---------------------------------------------------------------------------
12
+ const TERMINAL_ARTIFACT_TYPE = 'controller-terminal';
13
+ /** Persist a terminal outcome keyed by runId with a TTL. Written into the same
14
+ * KnowledgeBackend as the bundle but under a distinct artifactType so it
15
+ * survives the next run's bundle reset (the TTL promise). `nowIso` is passed so
16
+ * the caller controls time. */
17
+ export async function writeTerminal(be, sessionId, runId, terminalOutcome, ttlMs, nowIso) {
18
+ const expiresAt = new Date(new Date(nowIso).getTime() + ttlMs).toISOString();
19
+ const entry = { runId, terminalOutcome, expiresAt };
20
+ await be.put(sessionId, {
21
+ content: JSON.stringify(entry),
22
+ metadata: {
23
+ traceId: sessionId,
24
+ turnId: sessionId,
25
+ stepperId: 'controller',
26
+ task: 'terminal',
27
+ artifactType: TERMINAL_ARTIFACT_TYPE,
28
+ runId,
29
+ createdAt: nowIso,
30
+ },
31
+ });
32
+ }
33
+ /** Read the latest non-expired terminal outcome for runId, or undefined. */
34
+ export async function readTerminal(be, sessionId, runId, nowIso) {
35
+ const now = new Date(nowIso).getTime();
36
+ const entries = await be.scan(sessionId);
37
+ for (let i = entries.length - 1; i >= 0; i--) {
38
+ const e = entries[i];
39
+ if (e.metadata.artifactType !== TERMINAL_ARTIFACT_TYPE)
40
+ continue;
41
+ if (e.metadata.runId !== runId)
42
+ continue;
43
+ try {
44
+ const parsed = JSON.parse(e.content);
45
+ if (new Date(parsed.expiresAt).getTime() <= now)
46
+ return undefined;
47
+ return parsed.terminalOutcome;
48
+ }
49
+ catch {
50
+ // malformed — keep scanning backwards
51
+ }
52
+ }
53
+ return undefined;
54
+ }
55
+ /** The runIds whose terminal entries are expired as of nowIso (backends without
56
+ * delete simply ignore stale rows on read). */
57
+ export async function gcTerminal(be, sessionId, nowIso) {
58
+ const now = new Date(nowIso).getTime();
59
+ const expired = [];
60
+ for (const e of await be.scan(sessionId)) {
61
+ if (e.metadata.artifactType !== TERMINAL_ARTIFACT_TYPE)
62
+ continue;
63
+ try {
64
+ const parsed = JSON.parse(e.content);
65
+ if (new Date(parsed.expiresAt).getTime() <= now)
66
+ expired.push(parsed.runId);
67
+ }
68
+ catch {
69
+ // ignore
70
+ }
71
+ }
72
+ return expired;
73
+ }
74
+ /** Strict ordered request classification. First matching branch wins. */
75
+ export function classifyRequest(input) {
76
+ const { bundle, incomingRequest, explicitKey, newRun, terminalExists } = input;
77
+ // 1. newRun overrides any replay.
78
+ if (newRun)
79
+ return { kind: 'fresh' };
80
+ // 2. Explicit key → STRICT routing, no fingerprint fallback.
81
+ if (explicitKey) {
82
+ if (terminalExists)
83
+ return { kind: 'replay', runId: explicitKey };
84
+ const live = bundle.runState === 'active' || bundle.runState === 'suspended';
85
+ if (explicitKey === bundle.runId && live)
86
+ return { kind: 'resume' };
87
+ return { kind: 'not-found' };
88
+ }
89
+ // 3. No key → fingerprint recovers ONLY an in-flight active run of the same
90
+ // request; a terminal fingerprint match starts fresh.
91
+ const live = bundle.runState === 'active' || bundle.runState === 'suspended';
92
+ const sameRequest = bundle.originalRequest !== undefined &&
93
+ fingerprintRequest(bundle.originalRequest) ===
94
+ fingerprintRequest(incomingRequest);
95
+ if (live && sameRequest)
96
+ return { kind: 'resume' };
97
+ return { kind: 'fresh' };
98
+ }
99
+ //# sourceMappingURL=run-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-scope.js","sourceRoot":"","sources":["../../../src/smart-agent/controller/run-scope.ts"],"names":[],"mappings":"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"}
@@ -12,4 +12,9 @@ export declare function persistBundle(be: KnowledgeBackend, sessionId: string, b
12
12
  * bundle if none exists or if the stored content cannot be parsed.
13
13
  */
14
14
  export declare function hydrateBundle(be: KnowledgeBackend, sessionId: string): Promise<SessionBundle>;
15
+ /** Atomic fresh-run reset: clears EVERY run-scoped field and starts in
16
+ * `evaluating`. The caller mints + assigns a fresh `runId` and the new
17
+ * `originalRequest`. The terminal store (a separate keyed TTL store) is NOT
18
+ * touched here so a prior run's outcome stays replayable by its `runId`. */
19
+ export declare function resetRun(bundle: SessionBundle, originalRequest: string): void;
15
20
  //# sourceMappingURL=session-bundle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-bundle.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/controller/session-bundle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAkBhD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,EAAE,EAAE,gBAAgB,EACpB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,EAAE,EAAE,gBAAgB,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC,CAaxB"}
1
+ {"version":3,"file":"session-bundle.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/controller/session-bundle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,KAAK,EAAY,aAAa,EAAE,MAAM,YAAY,CAAC;AAkB1D;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,EAAE,EAAE,gBAAgB,EACpB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,EAAE,EAAE,gBAAgB,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC,CAaxB;AAED;;;6EAG6E;AAC7E,wBAAgB,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,CAsB7E"}
@@ -50,4 +50,31 @@ export async function hydrateBundle(be, sessionId) {
50
50
  }
51
51
  return emptyBundle();
52
52
  }
53
+ /** Atomic fresh-run reset: clears EVERY run-scoped field and starts in
54
+ * `evaluating`. The caller mints + assigns a fresh `runId` and the new
55
+ * `originalRequest`. The terminal store (a separate keyed TTL store) is NOT
56
+ * touched here so a prior run's outcome stays replayable by its `runId`. */
57
+ export function resetRun(bundle, originalRequest) {
58
+ bundle.goal = '';
59
+ bundle.plannerPrivate = '';
60
+ bundle.budgets = { stepsUsed: 0, rewindsUsed: 0 };
61
+ bundle.plan = undefined;
62
+ bundle.planCursor = undefined;
63
+ bundle.pendingPlanDecisions = undefined;
64
+ bundle.pending = undefined;
65
+ bundle.lastOutcome = undefined;
66
+ bundle.runState = 'active';
67
+ bundle.runPhase = 'evaluating';
68
+ bundle.originalRequest = originalRequest;
69
+ bundle.nextSeq = 0;
70
+ bundle.inFlightStep = undefined;
71
+ bundle.evalCallInFlight = false;
72
+ bundle.plannerCallInFlight = false;
73
+ bundle.finalizeCallInFlight = false;
74
+ bundle.evalResumeCount = 0;
75
+ bundle.plannerResumeCount = 0;
76
+ bundle.finalizeAttempt = 0;
77
+ bundle.legacyFinalAnswer = undefined;
78
+ bundle.writeOrdinal = 0;
79
+ }
53
80
  //# sourceMappingURL=session-bundle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-bundle.js","sourceRoot":"","sources":["../../../src/smart-agent/controller/session-bundle.ts"],"names":[],"mappings":"AAGA,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;AAEjD,MAAM,YAAY,GAAkB;IAClC,IAAI,EAAE,EAAE;IACR,cAAc,EAAE,EAAE;IAClB,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;CAC1C,CAAC;AAEF,SAAS,WAAW;IAClB,OAAO;QACL,IAAI,EAAE,YAAY,CAAC,IAAI;QACvB,cAAc,EAAE,YAAY,CAAC,cAAc;QAC3C,OAAO,EAAE,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE;KACrC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAAoB,EACpB,SAAiB,EACjB,MAAqB;IAErB,MAAM,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE;QACtB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QAC/B,QAAQ,EAAE;YACR,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,YAAY;YACvB,IAAI,EAAE,gBAAgB;YACtB,YAAY,EAAE,oBAAoB;YAClC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAAoB,EACpB,SAAiB;IAEjB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzC,2EAA2E;IAC3E,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,KAAK,oBAAoB;YAAE,SAAS;QACnE,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAkB,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,4DAA4D;QAC9D,CAAC;IACH,CAAC;IACD,OAAO,WAAW,EAAE,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"session-bundle.js","sourceRoot":"","sources":["../../../src/smart-agent/controller/session-bundle.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
- import type { LlmUsage, StreamToolCall } from '@mcp-abap-adt/llm-agent';
1
+ import type { CallOptions, LlmUsage, Message, StreamToolCall } from '@mcp-abap-adt/llm-agent';
2
2
  import type { SmartServerLlmConfig } from '../smart-server.js';
3
+ import type { PlanDecision } from './artifacts.js';
3
4
  export type SubagentResult = {
4
5
  kind: 'content';
5
6
  content: string;
@@ -14,10 +15,32 @@ export type SubagentResult = {
14
15
  usage?: LlmUsage;
15
16
  };
16
17
  export interface Step {
18
+ /** Stable plan-time identity (§F). 1:1 with a board entry; assigned at
19
+ * create-plan or fan-out. Optional only so older call-sites compile during
20
+ * the migration; the planner/handler always set it. */
21
+ stepId?: string;
17
22
  name: string;
18
23
  instructions: string;
19
24
  type?: string;
25
+ /** Marks a discovery step whose result enumerates remaining work (§D). */
26
+ discovery?: true;
27
+ /** When this step REPLACES a failed step on replan, the superseded `stepId` (§F). */
28
+ supersedesStepId?: string;
29
+ /** Plain-language references this step depends on (English — planner invariant).
30
+ * Decided by the reviewer, not the doer; drives the per-reference evidence map. */
31
+ requires?: string[];
20
32
  }
33
+ /** Contract cap on a step's dependency references. */
34
+ export declare const MAX_REQUIRES = 8;
35
+ /** A reference is a SHORT phrase, not a payload. */
36
+ export declare const MAX_REQUIRE_CHARS = 200;
37
+ /** Validate a step's optional `requires`. `undefined` for absent OR `[]` (a step
38
+ * with no deps — normalize to undefined; downstream falls back to whole-step
39
+ * recall); the trimmed array when valid; `false` (→ parse failure / retry) when
40
+ * malformed: a non-array, > MAX_REQUIRES entries, a non-string entry, or an entry
41
+ * empty / > MAX_REQUIRE_CHARS after trim (a huge reference must not reach the
42
+ * semantic query / embedder). */
43
+ export declare function validateRequires(v: unknown): string[] | undefined | false;
21
44
  export type NextStep = {
22
45
  kind: 'next';
23
46
  step: Step;
@@ -42,6 +65,33 @@ export type PendingMarker = {
42
65
  * a plain confirmation ("yes") commits IT rather than the literal answer. */
43
66
  proposedTarget?: string;
44
67
  };
68
+ export type RunState = 'idle' | 'active' | 'suspended' | 'terminal';
69
+ export type RunPhase = 'evaluating' | 'planning' | 'executing' | 'finalizing';
70
+ /** Controller-level (non-reviewer) failure that drives a replan with no reviewable
71
+ * artifact (e.g. the maxToolCalls budget). Persisted atomically with
72
+ * inFlightStep.phase='awaiting-replan' so a crash before the replan keeps the
73
+ * reason; fed to the planner, then cleared when the revised step is set. */
74
+ export interface ControlFailure {
75
+ reason: 'maxToolCalls';
76
+ seq: number;
77
+ }
78
+ export interface InFlightStep {
79
+ seq: number;
80
+ step: Step;
81
+ /** Fresh-execution counter (first dispatch / revised replan step). Part of the
82
+ * artifact identity (runId, seq, attempt). */
83
+ attempt: number;
84
+ /** Crash-replay counter of ONE attempt; reset on commit / fresh attempt. */
85
+ resumeCount: number;
86
+ phase: 'executing' | 'awaiting-replan';
87
+ /** Durable executor message log for this seq — the suspend/resume + crash-replay
88
+ * rebuild source; external tool results are appended here. */
89
+ transcript: Message[];
90
+ /** Durable external round-trip count; ++ persisted BEFORE each surfaced call. */
91
+ toolCallCount: number;
92
+ /** Why a controller-level replan (no reviewable artifact) — fed to the planner. */
93
+ controlFailure?: ControlFailure;
94
+ }
45
95
  export interface SessionBundle {
46
96
  goal: string;
47
97
  plannerPrivate: string;
@@ -51,11 +101,38 @@ export interface SessionBundle {
51
101
  };
52
102
  plan?: Step[];
53
103
  planCursor?: number;
104
+ /** Plan decisions the planner produced this turn (create/replan), NOT yet
105
+ * persisted. The controller drains + `writePlanDecision`s them after
106
+ * `planner.next()` returns and BEFORE dispatch (§A: planner constructs, controller
107
+ * persists; §F: every decision is a durable artifact). Cleared once drained, and
108
+ * on `resetRun`. */
109
+ pendingPlanDecisions?: PlanDecision[];
54
110
  pending?: PendingMarker;
55
- /** Outcome of the last executed step, persisted so a resume after a FAILED step
56
- * makes the adaptive planner replan (rather than repeat the step). Set by
57
- * runStep.settle() together with the step result + cursor advance. */
58
- lastOutcome?: 'advanced' | 'failed';
111
+ /** Last reviewed step outcome that drives the planner transition. */
112
+ lastOutcome?: 'advanced' | 'failed' | 'partial';
113
+ runId?: string;
114
+ runState?: RunState;
115
+ runPhase?: RunPhase;
116
+ /** The verbatim request that started this run (finalizer input + identity
117
+ * fingerprint source). */
118
+ originalRequest?: string;
119
+ nextSeq?: number;
120
+ inFlightStep?: InFlightStep;
121
+ evalCallInFlight?: boolean;
122
+ plannerCallInFlight?: boolean;
123
+ finalizeCallInFlight?: boolean;
124
+ evalResumeCount?: number;
125
+ plannerResumeCount?: number;
126
+ finalizeAttempt?: number;
127
+ /** Legacy (no-finalizer) answer: the planner's composed done.result, persisted
128
+ * durably in the same write that enters `finalizing`, so a crash before the
129
+ * terminal write recovers it (rather than emitting empty). Cleared by reset. */
130
+ legacyFinalAnswer?: string;
131
+ /** Monotonic per-run write ordinal; incremented BEFORE each artifact write so
132
+ * recall dedup can break createdAt ties by latest-write order. Reset to 0 by
133
+ * resetRun(); run-scoped ordinals are always comparable (recall filters by
134
+ * runId). */
135
+ writeOrdinal?: number;
59
136
  }
60
137
  /** A controller subagent role: a standalone LLM config plus an OPTIONAL
61
138
  * per-role `hint`. The hint is appended to that role's system prompt and gives
@@ -76,6 +153,9 @@ export interface ControllerConfig {
76
153
  evaluator: ControllerSubagentConfig;
77
154
  planner: ControllerSubagentConfig;
78
155
  executor: ControllerSubagentConfig;
156
+ /** Optional; default to the planner's config when absent (no breaking change). */
157
+ reviewer?: ControllerSubagentConfig;
158
+ finalizer?: ControllerSubagentConfig;
79
159
  };
80
160
  targetState: {
81
161
  strategy: 'consumer-confirm' | 'semantic-distance' | 'auto';
@@ -84,38 +164,67 @@ export interface ControllerConfig {
84
164
  sessionMemory: {
85
165
  collection: string;
86
166
  };
87
- planner?: 'incremental' | 'adaptive';
88
167
  budgets: {
89
168
  maxSteps: number;
90
169
  maxRetries: number;
91
170
  maxRewinds: number;
92
171
  maxToolCalls?: number;
172
+ /** Durable fresh-attempt cap per step (bounds the non-advancing replan loop). */
173
+ maxStepAttempts?: number;
174
+ /** Durable crash-replay caps (one per LLM-invoking phase). */
175
+ maxStepResumes?: number;
176
+ maxPlannerResumes?: number;
177
+ maxEvalResumes?: number;
178
+ maxFinalizeRetries?: number;
179
+ /** In-process re-ask budget for judge (reviewer) provider/malformed failures. */
180
+ maxReviewRetries?: number;
181
+ /** Board render budget (§B). Defaulted in parseConfig; validated at load. */
182
+ maxDigestChars?: number;
183
+ maxIntentChars?: number;
184
+ maxActiveSteps?: number;
185
+ maxBoardChars?: number;
186
+ keepRecentDigests?: number;
93
187
  };
188
+ /** Behaviour when the finalizer's retry budget is exhausted: 'error' → terminal
189
+ * control error (default); 'best-effort' → compose from approved results with an
190
+ * explicit incomplete marker. */
191
+ onFinalizeExhausted?: 'error' | 'best-effort';
94
192
  }
95
- export type PlannerKind = 'incremental' | 'adaptive';
193
+ export type PlannerKind = 'smart-executor' | 'weak-executor';
96
194
  export interface PlannerNextInput {
97
195
  bundle: SessionBundle;
98
196
  prompt: string;
99
197
  /** Outcome of the step run since the previous `next()` (undefined on the first
100
- * call / after a rewind / on resume). The adaptive planner replans on 'failed';
101
- * the incremental planner ignores it. Cursor advance on 'advanced' happens in
198
+ * call / after a rewind / on resume). The plan-first planner replans on 'failed';
199
+ * a planner that does not implement commit() ignores it. Cursor advance on 'advanced' happens in
102
200
  * commit(), not here. */
103
- lastOutcome?: 'advanced' | 'failed';
201
+ lastOutcome?: 'advanced' | 'failed' | 'partial';
104
202
  /** True when re-asking after an unparsable reply (stern format reminder). */
105
203
  retrying: boolean;
106
204
  /** True on the first call of a turn that just resumed an EXTERNAL-tool result
107
- * (the result is now in `bundle.plannerPrivate`). The adaptive planner replans
205
+ * (the result is now in `bundle.plannerPrivate`). The plan-first planner replans
108
206
  * from the cursor so it incorporates the result via the planner — which reads
109
207
  * plannerPrivate — instead of blindly re-running the suspended step (the
110
- * executor prompt does NOT include plannerPrivate). Incremental ignores it. */
208
+ * executor prompt does NOT include plannerPrivate). A no-op planner ignores it. */
111
209
  resumedExternal?: boolean;
210
+ /** The rendered step-state digest board (§B), reconstructed by the controller
211
+ * from artifacts before each call. When present + non-empty it is the
212
+ * AUTHORITATIVE step-state context, rendered ADDITIVELY ahead of the
213
+ * `plannerPrivate` tail (which still carries non-board deltas — clarify answers,
214
+ * the legacy external result). Empty/absent → the planner uses `plannerPrivate`
215
+ * alone (board-less path; prompt byte-identical to the pre-board baseline). */
216
+ boardText?: string;
112
217
  logUsage?: (role: string, u?: LlmUsage) => void;
218
+ /** Request-scoped call options (request logger / trace / cancellation signal).
219
+ * Threaded into the skills-recall hook so the recall embedding is metered,
220
+ * cancellable, and joins the request trace. */
221
+ options?: CallOptions;
113
222
  }
114
223
  export interface IControllerPlanner {
115
224
  next(input: PlannerNextInput): Promise<NextStep | null>;
116
225
  /** Optional: record a just-finished step's outcome so the planner's durable
117
- * bookkeeping (e.g. the adaptive cursor) is updated and can be persisted in the
118
- * SAME write that follows. Incremental does not implement it (no-op). */
119
- commit?(bundle: SessionBundle, outcome: 'advanced' | 'failed'): void;
226
+ * bookkeeping (e.g. the plan-first cursor) is updated and can be persisted in the
227
+ * SAME write that follows. A planner that does not track state need not implement it (no-op). */
228
+ commit?(bundle: SessionBundle, outcome: 'advanced' | 'failed' | 'partial'): void;
120
229
  }
121
230
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/controller/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/controller/types.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,31 @@
1
- export {};
1
+ /** Contract cap on a step's dependency references. */
2
+ export const MAX_REQUIRES = 8;
3
+ /** A reference is a SHORT phrase, not a payload. */
4
+ export const MAX_REQUIRE_CHARS = 200;
5
+ /** Validate a step's optional `requires`. `undefined` for absent OR `[]` (a step
6
+ * with no deps — normalize to undefined; downstream falls back to whole-step
7
+ * recall); the trimmed array when valid; `false` (→ parse failure / retry) when
8
+ * malformed: a non-array, > MAX_REQUIRES entries, a non-string entry, or an entry
9
+ * empty / > MAX_REQUIRE_CHARS after trim (a huge reference must not reach the
10
+ * semantic query / embedder). */
11
+ export function validateRequires(v) {
12
+ if (v === undefined)
13
+ return undefined;
14
+ if (!Array.isArray(v))
15
+ return false;
16
+ if (v.length === 0)
17
+ return undefined;
18
+ if (v.length > MAX_REQUIRES)
19
+ return false;
20
+ const out = [];
21
+ for (const r of v) {
22
+ if (typeof r !== 'string')
23
+ return false;
24
+ const t = r.trim();
25
+ if (t.length === 0 || t.length > MAX_REQUIRE_CHARS)
26
+ return false;
27
+ out.push(t);
28
+ }
29
+ return out;
30
+ }
2
31
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/smart-agent/controller/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/smart-agent/controller/types.ts"],"names":[],"mappings":"AA+BA,sDAAsD;AACtD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAC9B,oDAAoD;AACpD,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AACrC;;;;;kCAKkC;AAClC,MAAM,UAAU,gBAAgB,CAAC,CAAU;IACzC,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACrC,IAAI,CAAC,CAAC,MAAM,GAAG,YAAY;QAAE,OAAO,KAAK,CAAC;IAC1C,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACnB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,iBAAiB;YAAE,OAAO,KAAK,CAAC;QACjE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { CallOptions, IEmbedder, KnowledgeEntry, KnowledgeFilter } from '@mcp-abap-adt/llm-agent';
2
+ /** Cosine similarity of two vectors (0 when either is zero-length). Exported:
3
+ * reused by the controller's relevantExtract fragment-selector. */
4
+ export declare function cosine(a: number[], b: number[]): number;
5
+ /** Embedder-backed semantic index for the knowledge backend: filter PRE-cap, then
6
+ * cosine-rank, then top-K. The runId filter is applied to the candidate set
7
+ * BEFORE the cap, so a run's hits are never starved by other runs.
8
+ *
9
+ * Infrastructure artifact types (e.g. `controller-bundle`, `controller-terminal`)
10
+ * are skipped on upsert — they carry the full durable transcript and must NOT be
11
+ * embedded: they waste tokens and, once the bundle grows beyond the embedder's
12
+ * input limit, the JSONL rebuild fails permanently.
13
+ *
14
+ * Recallable content (a tool/step result) is embedded from a BOUNDED PREFIX
15
+ * (`maxEmbedChars`): a large MCP result (e.g. a full dictionary dump) can exceed
16
+ * the embedder's input limit (SAP AI Core text-embedding-3-small: 8192 tokens),
17
+ * which would 400 on upsert and break the JSONL rebuild permanently — and, since
18
+ * recall runs mid-run, stall the whole controller turn. Only the embedding VECTOR
19
+ * uses the prefix; the STORED entry keeps the full content, so recall still
20
+ * returns the complete result. The default (16000 chars ≈ ≤ 8000 tokens even at a
21
+ * pessimistic 2 chars/token) stays safely under the limit with ample ranking
22
+ * signal; override per deployment if needed. */
23
+ export declare function makeKnowledgeSemanticIndex(embedder: IEmbedder, skipArtifactTypes?: readonly string[], maxEmbedChars?: number): {
24
+ upsert(sid: string, e: KnowledgeEntry, options?: CallOptions): Promise<void>;
25
+ query(sid: string, text: string, k?: number, filter?: KnowledgeFilter, options?: CallOptions): Promise<readonly KnowledgeEntry[]>;
26
+ deleteSession(sid: string): void;
27
+ };
28
+ //# sourceMappingURL=embedder-knowledge-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedder-knowledge-index.d.ts","sourceRoot":"","sources":["../../src/smart-agent/embedder-knowledge-index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,cAAc,EACd,eAAe,EAChB,MAAM,yBAAyB,CAAC;AAQjC;oEACoE;AACpE,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAUvD;AAED;;;;;;;;;;;;;;;;;iDAiBiD;AACjD,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,SAAS,EACnB,iBAAiB,GAAE,SAAS,MAAM,EAGjC,EACD,aAAa,SAAQ;gBASZ,MAAM,KACR,cAAc,YACP,WAAW,GACpB,OAAO,CAAC,IAAI,CAAC;eAST,MAAM,QACL,MAAM,MACR,MAAM,WACD,eAAe,YACd,WAAW,GACpB,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC;uBAalB,MAAM,GAAG,IAAI;EAInC"}
@@ -0,0 +1,71 @@
1
+ import { matchesKnowledgeFilter } from '@mcp-abap-adt/llm-agent-libs';
2
+ /** Cosine similarity of two vectors (0 when either is zero-length). Exported:
3
+ * reused by the controller's relevantExtract fragment-selector. */
4
+ export function cosine(a, b) {
5
+ let dot = 0;
6
+ let na = 0;
7
+ let nb = 0;
8
+ for (let i = 0; i < a.length; i++) {
9
+ dot += a[i] * b[i];
10
+ na += a[i] * a[i];
11
+ nb += b[i] * b[i];
12
+ }
13
+ return na && nb ? dot / (Math.sqrt(na) * Math.sqrt(nb)) : 0;
14
+ }
15
+ /** Embedder-backed semantic index for the knowledge backend: filter PRE-cap, then
16
+ * cosine-rank, then top-K. The runId filter is applied to the candidate set
17
+ * BEFORE the cap, so a run's hits are never starved by other runs.
18
+ *
19
+ * Infrastructure artifact types (e.g. `controller-bundle`, `controller-terminal`)
20
+ * are skipped on upsert — they carry the full durable transcript and must NOT be
21
+ * embedded: they waste tokens and, once the bundle grows beyond the embedder's
22
+ * input limit, the JSONL rebuild fails permanently.
23
+ *
24
+ * Recallable content (a tool/step result) is embedded from a BOUNDED PREFIX
25
+ * (`maxEmbedChars`): a large MCP result (e.g. a full dictionary dump) can exceed
26
+ * the embedder's input limit (SAP AI Core text-embedding-3-small: 8192 tokens),
27
+ * which would 400 on upsert and break the JSONL rebuild permanently — and, since
28
+ * recall runs mid-run, stall the whole controller turn. Only the embedding VECTOR
29
+ * uses the prefix; the STORED entry keeps the full content, so recall still
30
+ * returns the complete result. The default (16000 chars ≈ ≤ 8000 tokens even at a
31
+ * pessimistic 2 chars/token) stays safely under the limit with ample ranking
32
+ * signal; override per deployment if needed. */
33
+ export function makeKnowledgeSemanticIndex(embedder, skipArtifactTypes = [
34
+ 'controller-bundle',
35
+ 'controller-terminal',
36
+ ], maxEmbedChars = 16000) {
37
+ const bySession = new Map();
38
+ // Bound the text handed to the embedder so an over-limit document never 400s
39
+ // (the full content is stored separately and returned by recall unchanged).
40
+ const embedInput = (text) => text.length > maxEmbedChars ? text.slice(0, maxEmbedChars) : text;
41
+ return {
42
+ async upsert(sid, e, options) {
43
+ // Skip infrastructure artifact types — never embed, never index.
44
+ if (skipArtifactTypes.includes(e.metadata.artifactType))
45
+ return;
46
+ const { vector } = await embedder.embed(embedInput(e.content), options);
47
+ const arr = bySession.get(sid);
48
+ if (arr)
49
+ arr.push({ entry: e, vector });
50
+ else
51
+ bySession.set(sid, [{ entry: e, vector }]);
52
+ },
53
+ async query(sid, text, k, filter, options) {
54
+ const all = bySession.get(sid) ?? [];
55
+ const scoped = filter
56
+ ? all.filter((x) => matchesKnowledgeFilter(x.entry.metadata, filter))
57
+ : all; // PRE-cap
58
+ const { vector: q } = await embedder.embed(embedInput(text), options);
59
+ const ranked = scoped
60
+ .map((x) => ({ e: x.entry, s: cosine(q, x.vector) }))
61
+ .sort((a, b) => b.s - a.s)
62
+ .map((x) => x.e);
63
+ return k ? ranked.slice(0, k) : ranked;
64
+ },
65
+ // Session reuse must NOT return a deleted session's vectors.
66
+ deleteSession(sid) {
67
+ bySession.delete(sid);
68
+ },
69
+ };
70
+ }
71
+ //# sourceMappingURL=embedder-knowledge-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedder-knowledge-index.js","sourceRoot":"","sources":["../../src/smart-agent/embedder-knowledge-index.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,35 @@
1
- import type { KnowledgeEntry } from '@mcp-abap-adt/llm-agent';
2
- import type { KnowledgeBackend } from '@mcp-abap-adt/llm-agent-libs';
1
+ import type { CallOptions, KnowledgeEntry, KnowledgeFilter } from '@mcp-abap-adt/llm-agent';
2
+ import { type KnowledgeBackend } from '@mcp-abap-adt/llm-agent-libs';
3
+ /** Injected semantic index (embedder-backed); see makeKnowledgeSemanticIndex. */
4
+ interface SemanticIndex {
5
+ upsert(sid: string, e: KnowledgeEntry, options?: CallOptions): Promise<void>;
6
+ query(sid: string, text: string, k?: number, filter?: KnowledgeFilter, options?: CallOptions): Promise<readonly KnowledgeEntry[]>;
7
+ deleteSession(sid: string): void;
8
+ }
3
9
  export declare class JsonlKnowledgeBackend implements KnowledgeBackend {
4
10
  private readonly logDir;
5
- /** Optional semantic index for query(); when absent, query falls back to recency. */
11
+ /** Optional semantic index; when present query() ranks by similarity and the
12
+ * index is lazily rehydrated from the durable JSONL on first use. */
6
13
  private readonly semantic?;
7
14
  constructor(logDir: string,
8
- /** Optional semantic index for query(); when absent, query falls back to recency. */
9
- semantic?: {
10
- upsert(sid: string, e: KnowledgeEntry): Promise<void>;
11
- query(sid: string, text: string, k?: number): Promise<readonly KnowledgeEntry[]>;
12
- } | undefined);
15
+ /** Optional semantic index; when present query() ranks by similarity and the
16
+ * index is lazily rehydrated from the durable JSONL on first use. */
17
+ semantic?: SemanticIndex | undefined);
13
18
  private file;
14
- put(sid: string, entry: KnowledgeEntry): Promise<void>;
15
- semanticQuery(sid: string, text: string, k?: number): Promise<readonly KnowledgeEntry[]>;
19
+ private readonly built;
20
+ private readonly chain;
21
+ private run;
22
+ /** Lazy rehydration of the in-process index from the durable JSONL. `options`
23
+ * is forwarded into every re-index `upsert` so the embedder receives the
24
+ * triggering request's requestLogger — the lazy rebuild's embedding cost is
25
+ * metered against the request that triggered it (not silently dropped). */
26
+ private build;
27
+ private append;
28
+ put(sid: string, entry: KnowledgeEntry, options?: CallOptions): Promise<void>;
29
+ semanticQuery(sid: string, text: string, k?: number, filter?: KnowledgeFilter, options?: CallOptions): Promise<readonly KnowledgeEntry[]>;
16
30
  scan(sid: string): Promise<readonly KnowledgeEntry[]>;
17
31
  deleteSession(sid: string): Promise<void>;
32
+ get semanticRecallCapable(): boolean;
18
33
  }
34
+ export {};
19
35
  //# sourceMappingURL=jsonl-knowledge-backend.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"jsonl-knowledge-backend.d.ts","sourceRoot":"","sources":["../../src/smart-agent/jsonl-knowledge-backend.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAErE,qBAAa,qBAAsB,YAAW,gBAAgB;IAE1D,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,qFAAqF;IACrF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAFT,MAAM,EAAE,MAAM;IAC/B,qFAAqF;IACpE,QAAQ,CAAC,EAAE;QAC1B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACtD,KAAK,CACH,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,CAAC,CAAC,EAAE,MAAM,GACT,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC,CAAC;KACvC,YAAA;IAGH,OAAO,CAAC,IAAI;IAIN,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAOtD,aAAa,CACjB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,CAAC,CAAC,EAAE,MAAM,GACT,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC;IAM/B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC;IAarD,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIhD"}
1
+ {"version":3,"file":"jsonl-knowledge-backend.d.ts","sourceRoot":"","sources":["../../src/smart-agent/jsonl-knowledge-backend.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,eAAe,EAChB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,KAAK,gBAAgB,EAEtB,MAAM,8BAA8B,CAAC;AAEtC,iFAAiF;AACjF,UAAU,aAAa;IACrB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,KAAK,CACH,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,CAAC,CAAC,EAAE,MAAM,EACV,MAAM,CAAC,EAAE,eAAe,EACxB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC,CAAC;IACtC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,qBAAa,qBAAsB,YAAW,gBAAgB;IAE1D,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB;0EACsE;IACtE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAHT,MAAM,EAAE,MAAM;IAC/B;0EACsE;IACrD,QAAQ,CAAC,EAAE,aAAa,YAAA;IAG3C,OAAO,CAAC,IAAI;IAUZ,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuC;IAC7D,OAAO,CAAC,GAAG;IAaX;;;gFAG4E;YAC9D,KAAK;YAOL,MAAM;IAMd,GAAG,CACP,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,cAAc,EACrB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,IAAI,CAAC;IA0BV,aAAa,CACjB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,CAAC,CAAC,EAAE,MAAM,EACV,MAAM,CAAC,EAAE,eAAe,EACxB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC;IAiB/B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC;IAarD,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/C,IAAI,qBAAqB,IAAI,OAAO,CAEnC;CACF"}