@mcp-abap-adt/llm-agent 3.0.0 → 3.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 (48) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/smart-agent/adapters/cline-client-adapter.d.ts +18 -0
  6. package/dist/smart-agent/adapters/cline-client-adapter.d.ts.map +1 -0
  7. package/dist/smart-agent/adapters/cline-client-adapter.js +21 -0
  8. package/dist/smart-agent/adapters/cline-client-adapter.js.map +1 -0
  9. package/dist/smart-agent/agent.d.ts +2 -0
  10. package/dist/smart-agent/agent.d.ts.map +1 -1
  11. package/dist/smart-agent/agent.js +45 -6
  12. package/dist/smart-agent/agent.js.map +1 -1
  13. package/dist/smart-agent/builder.d.ts +4 -0
  14. package/dist/smart-agent/builder.d.ts.map +1 -1
  15. package/dist/smart-agent/builder.js +12 -0
  16. package/dist/smart-agent/builder.js.map +1 -1
  17. package/dist/smart-agent/context/client-context-bridge.d.ts +19 -0
  18. package/dist/smart-agent/context/client-context-bridge.d.ts.map +1 -0
  19. package/dist/smart-agent/context/client-context-bridge.js +92 -0
  20. package/dist/smart-agent/context/client-context-bridge.js.map +1 -0
  21. package/dist/smart-agent/interfaces/client-adapter.d.ts +23 -0
  22. package/dist/smart-agent/interfaces/client-adapter.d.ts.map +1 -0
  23. package/dist/smart-agent/interfaces/client-adapter.js +10 -0
  24. package/dist/smart-agent/interfaces/client-adapter.js.map +1 -0
  25. package/dist/smart-agent/interfaces/client-context-bridge.d.ts +39 -0
  26. package/dist/smart-agent/interfaces/client-context-bridge.d.ts.map +1 -0
  27. package/dist/smart-agent/interfaces/client-context-bridge.js +17 -0
  28. package/dist/smart-agent/interfaces/client-context-bridge.js.map +1 -0
  29. package/dist/smart-agent/interfaces/index.d.ts +1 -0
  30. package/dist/smart-agent/interfaces/index.d.ts.map +1 -1
  31. package/dist/smart-agent/interfaces/index.js.map +1 -1
  32. package/dist/smart-agent/interfaces/prompt-tool-extractor.d.ts +39 -0
  33. package/dist/smart-agent/interfaces/prompt-tool-extractor.d.ts.map +1 -0
  34. package/dist/smart-agent/interfaces/prompt-tool-extractor.js +11 -0
  35. package/dist/smart-agent/interfaces/prompt-tool-extractor.js.map +1 -0
  36. package/dist/smart-agent/plugins/types.d.ts +4 -0
  37. package/dist/smart-agent/plugins/types.d.ts.map +1 -1
  38. package/dist/smart-agent/plugins/types.js +5 -0
  39. package/dist/smart-agent/plugins/types.js.map +1 -1
  40. package/dist/smart-agent/prompt-tool-extractor.d.ts +30 -0
  41. package/dist/smart-agent/prompt-tool-extractor.d.ts.map +1 -0
  42. package/dist/smart-agent/prompt-tool-extractor.js +101 -0
  43. package/dist/smart-agent/prompt-tool-extractor.js.map +1 -0
  44. package/dist/smart-agent/smart-server.d.ts +3 -0
  45. package/dist/smart-agent/smart-server.d.ts.map +1 -1
  46. package/dist/smart-agent/smart-server.js +12 -1
  47. package/dist/smart-agent/smart-server.js.map +1 -1
  48. package/package.json +1 -1
@@ -0,0 +1,19 @@
1
+ /**
2
+ * DefaultClientContextBridge — heuristic-based bridge that separates
3
+ * client context from agent context.
4
+ *
5
+ * Works with any OpenAI-compatible client. Does NOT contain client-specific
6
+ * logic (no Cline patterns, no Continue patterns). Instead, it operates
7
+ * on the structural level:
8
+ *
9
+ * - Client system prompt ≠ agent system prompt → strip system messages
10
+ * - Client conversation history → extract meaningful user/assistant exchanges
11
+ * - Client framework metadata in user messages → best-effort cleanup
12
+ */
13
+ import type { Message } from '../../types.js';
14
+ import type { ClientIntent, IClientContextBridge } from '../interfaces/client-context-bridge.js';
15
+ import { type CallOptions, type LlmTool, type Result, SmartAgentError } from '../interfaces/types.js';
16
+ export declare class DefaultClientContextBridge implements IClientContextBridge {
17
+ extractIntent(clientMessages: Message[], _clientTools: LlmTool[], _options?: CallOptions): Promise<Result<ClientIntent, SmartAgentError>>;
18
+ }
19
+ //# sourceMappingURL=client-context-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-context-bridge.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/context/client-context-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACrB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,MAAM,EACX,eAAe,EAChB,MAAM,wBAAwB,CAAC;AAkEhC,qBAAa,0BAA2B,YAAW,oBAAoB;IAC/D,aAAa,CACjB,cAAc,EAAE,OAAO,EAAE,EACzB,YAAY,EAAE,OAAO,EAAE,EACvB,QAAQ,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;CA0BlD"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * DefaultClientContextBridge — heuristic-based bridge that separates
3
+ * client context from agent context.
4
+ *
5
+ * Works with any OpenAI-compatible client. Does NOT contain client-specific
6
+ * logic (no Cline patterns, no Continue patterns). Instead, it operates
7
+ * on the structural level:
8
+ *
9
+ * - Client system prompt ≠ agent system prompt → strip system messages
10
+ * - Client conversation history → extract meaningful user/assistant exchanges
11
+ * - Client framework metadata in user messages → best-effort cleanup
12
+ */
13
+ import { SmartAgentError, } from '../interfaces/types.js';
14
+ // ---------------------------------------------------------------------------
15
+ // Helpers
16
+ // ---------------------------------------------------------------------------
17
+ /**
18
+ * Extract the last meaningful user text from client messages.
19
+ * Walks backward from the end to find the last user message.
20
+ */
21
+ function extractLastUserText(messages) {
22
+ for (let i = messages.length - 1; i >= 0; i--) {
23
+ const msg = messages[i];
24
+ if (msg.role === 'user' &&
25
+ typeof msg.content === 'string' &&
26
+ msg.content.trim()) {
27
+ return msg.content.trim();
28
+ }
29
+ }
30
+ return '';
31
+ }
32
+ /**
33
+ * Build clean conversation history from client messages.
34
+ *
35
+ * Rules:
36
+ * - Drop system messages (client system prompt is not agent's context)
37
+ * - Drop tool/function role messages (client tool protocol, not our concern)
38
+ * - Keep user and assistant messages as conversation context
39
+ * - Strip assistant messages that have tool_calls but no text content
40
+ * (these are client framework protocol messages, not meaningful conversation)
41
+ */
42
+ function buildCleanHistory(messages) {
43
+ const cleaned = [];
44
+ for (const msg of messages) {
45
+ // Skip system messages — client system prompt is not agent context
46
+ if (msg.role === 'system')
47
+ continue;
48
+ // Skip tool result messages — client tool protocol
49
+ if (msg.role === 'tool')
50
+ continue;
51
+ // Skip assistant messages that are pure tool calls (no text content)
52
+ if (msg.role === 'assistant') {
53
+ const hasToolCalls = Array.isArray(msg.tool_calls) && msg.tool_calls.length > 0;
54
+ const hasContent = typeof msg.content === 'string' && msg.content.trim().length > 0;
55
+ if (hasToolCalls && !hasContent)
56
+ continue;
57
+ }
58
+ cleaned.push({
59
+ role: msg.role,
60
+ content: typeof msg.content === 'string' ? msg.content : '',
61
+ });
62
+ }
63
+ return cleaned;
64
+ }
65
+ // ---------------------------------------------------------------------------
66
+ // DefaultClientContextBridge
67
+ // ---------------------------------------------------------------------------
68
+ export class DefaultClientContextBridge {
69
+ async extractIntent(clientMessages, _clientTools, _options) {
70
+ try {
71
+ const text = extractLastUserText(clientMessages);
72
+ if (!text) {
73
+ return {
74
+ ok: false,
75
+ error: new SmartAgentError('No user message found in client messages', 'BRIDGE_ERROR'),
76
+ };
77
+ }
78
+ const conversationHistory = buildCleanHistory(clientMessages);
79
+ return {
80
+ ok: true,
81
+ value: { text, conversationHistory },
82
+ };
83
+ }
84
+ catch (err) {
85
+ return {
86
+ ok: false,
87
+ error: new SmartAgentError(String(err), 'BRIDGE_ERROR'),
88
+ };
89
+ }
90
+ }
91
+ }
92
+ //# sourceMappingURL=client-context-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-context-bridge.js","sourceRoot":"","sources":["../../../src/smart-agent/context/client-context-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,EAIL,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAEhC,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,mBAAmB,CAAC,QAAmB;IAC9C,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxB,IACE,GAAG,CAAC,IAAI,KAAK,MAAM;YACnB,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;YAC/B,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAClB,CAAC;YACD,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,iBAAiB,CAAC,QAAmB;IAC5C,MAAM,OAAO,GAAc,EAAE,CAAC;IAE9B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,mEAAmE;QACnE,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QAEpC,mDAAmD;QACnD,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QAElC,qEAAqE;QACrE,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC7B,MAAM,YAAY,GAChB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7D,MAAM,UAAU,GACd,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YACnE,IAAI,YAAY,IAAI,CAAC,UAAU;gBAAE,SAAS;QAC5C,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;SAC5D,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAE9E,MAAM,OAAO,0BAA0B;IACrC,KAAK,CAAC,aAAa,CACjB,cAAyB,EACzB,YAAuB,EACvB,QAAsB;QAEtB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;YACjD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,IAAI,eAAe,CACxB,0CAA0C,EAC1C,cAAc,CACf;iBACF,CAAC;YACJ,CAAC;YAED,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,cAAc,CAAC,CAAC;YAE9D,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,KAAK,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE;aACrC,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,IAAI,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC;aACxD,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Contract for adapting agent responses to a specific client format.
3
+ *
4
+ * Some clients (e.g. Cline) are prompt-based agents that expect tool
5
+ * calls formatted as XML inside the assistant `content` field rather
6
+ * than as native OpenAI `tool_calls`. A client adapter detects such
7
+ * clients and wraps the final response accordingly.
8
+ */
9
+ export interface IClientAdapter {
10
+ /** Human-readable name used in logs. */
11
+ readonly name: string;
12
+ /**
13
+ * Return `true` if this adapter should handle the given request.
14
+ * Called once per request with the client's system prompt (if any).
15
+ */
16
+ detect(systemPrompt: string): boolean;
17
+ /**
18
+ * Wrap the final assistant content before it is sent to the client.
19
+ * Only called when {@link detect} returned `true` for this request.
20
+ */
21
+ wrapResponse(content: string): string;
22
+ }
23
+ //# sourceMappingURL=client-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-adapter.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/interfaces/client-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;IAEtC;;;OAGG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CACvC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Contract for adapting agent responses to a specific client format.
3
+ *
4
+ * Some clients (e.g. Cline) are prompt-based agents that expect tool
5
+ * calls formatted as XML inside the assistant `content` field rather
6
+ * than as native OpenAI `tool_calls`. A client adapter detects such
7
+ * clients and wraps the final response accordingly.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=client-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-adapter.js","sourceRoot":"","sources":["../../../src/smart-agent/interfaces/client-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * IClientContextBridge — separates client context from agent internal context.
3
+ *
4
+ * When a client (Cline, Continue, cursor, or any OpenAI-compatible tool)
5
+ * sends messages to SmartServer, those messages belong to the CLIENT context:
6
+ * the client's system prompt, history, tool definitions, etc.
7
+ *
8
+ * The agent has its OWN internal context: its own system prompt, RAG results,
9
+ * MCP tools, classifier output, etc.
10
+ *
11
+ * The bridge:
12
+ * 1. Extracts clean user intent from client messages (input to the agent)
13
+ * 2. Preserves conversation history for context understanding
14
+ * 3. Keeps client context separate so it does not leak into the agent's LLM calls
15
+ */
16
+ import type { Message } from '../../types.js';
17
+ import type { CallOptions, LlmTool, Result, SmartAgentError } from './types.js';
18
+ export interface ClientIntent {
19
+ /** Clean user request text extracted from client messages. */
20
+ text: string;
21
+ /**
22
+ * Conversation history cleaned from client framework noise.
23
+ * Contains only semantically meaningful exchanges (user questions,
24
+ * assistant answers), without client system prompts or framework metadata.
25
+ */
26
+ conversationHistory: Message[];
27
+ }
28
+ export interface IClientContextBridge {
29
+ /**
30
+ * Extract clean user intent and conversation history from client messages.
31
+ *
32
+ * The client's system prompt, tool definitions, framework metadata,
33
+ * and protocol-specific messages are stripped. What remains is:
34
+ * - The user's actual request (text)
35
+ * - Meaningful conversation history (conversationHistory)
36
+ */
37
+ extractIntent(clientMessages: Message[], clientTools: LlmTool[], options?: CallOptions): Promise<Result<ClientIntent, SmartAgentError>>;
38
+ }
39
+ //# sourceMappingURL=client-context-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-context-bridge.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/interfaces/client-context-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAMhF,MAAM,WAAW,YAAY;IAC3B,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,mBAAmB,EAAE,OAAO,EAAE,CAAC;CAChC;AAMD,MAAM,WAAW,oBAAoB;IACnC;;;;;;;OAOG;IACH,aAAa,CACX,cAAc,EAAE,OAAO,EAAE,EACzB,WAAW,EAAE,OAAO,EAAE,EACtB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC;CACnD"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * IClientContextBridge — separates client context from agent internal context.
3
+ *
4
+ * When a client (Cline, Continue, cursor, or any OpenAI-compatible tool)
5
+ * sends messages to SmartServer, those messages belong to the CLIENT context:
6
+ * the client's system prompt, history, tool definitions, etc.
7
+ *
8
+ * The agent has its OWN internal context: its own system prompt, RAG results,
9
+ * MCP tools, classifier output, etc.
10
+ *
11
+ * The bridge:
12
+ * 1. Extracts clean user intent from client messages (input to the agent)
13
+ * 2. Preserves conversation history for context understanding
14
+ * 3. Keeps client context separate so it does not leak into the agent's LLM calls
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=client-context-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-context-bridge.js","sourceRoot":"","sources":["../../../src/smart-agent/interfaces/client-context-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
@@ -7,6 +7,7 @@ export type { ISpan, ITracer, SpanOptions, SpanStatus, } from '../tracer/types.j
7
7
  export type { IOutputValidator, ValidationResult, } from '../validator/types.js';
8
8
  export type { IContextAssembler } from './assembler.js';
9
9
  export type { ISubpromptClassifier } from './classifier.js';
10
+ export type { IClientAdapter } from './client-adapter.js';
10
11
  export type { ILlm } from './llm.js';
11
12
  export type { IMcpClient } from './mcp-client.js';
12
13
  export type { EmbedderFactory, EmbedderFactoryConfig, IEmbedder, IRag, } from './rag.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/interfaces/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC1E,YAAY,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EACV,KAAK,EACL,OAAO,EACP,WAAW,EACX,UAAU,GACX,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,YAAY,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACrC,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EACV,eAAe,EACf,qBAAqB,EACrB,SAAS,EACT,IAAI,GACL,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,MAAM,EACN,aAAa,EACb,UAAU,EACV,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,eAAe,EACf,WAAW,EACX,cAAc,EACd,OAAO,EACP,WAAW,EACX,OAAO,EACP,aAAa,EACb,WAAW,EACX,SAAS,EACT,MAAM,EACN,SAAS,EACT,aAAa,EACb,WAAW,EACX,cAAc,EACd,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,cAAc,EACd,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,eAAe,GAChB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/interfaces/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC1E,YAAY,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EACV,KAAK,EACL,OAAO,EACP,WAAW,EACX,UAAU,GACX,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACrC,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EACV,eAAe,EACf,qBAAqB,EACrB,SAAS,EACT,IAAI,GACL,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,MAAM,EACN,aAAa,EACb,UAAU,EACV,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,eAAe,EACf,WAAW,EACX,cAAc,EACd,OAAO,EACP,WAAW,EACX,OAAO,EACP,aAAa,EACb,WAAW,EACX,SAAS,EACT,MAAM,EACN,SAAS,EACT,aAAa,EACb,WAAW,EACX,cAAc,EACd,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,cAAc,EACd,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,eAAe,GAChB,MAAM,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/smart-agent/interfaces/index.ts"],"names":[],"mappings":"AAoDA,OAAO,EACL,cAAc,EACd,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,eAAe,GAChB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/smart-agent/interfaces/index.ts"],"names":[],"mappings":"AAqDA,OAAO,EACL,cAAc,EACd,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,eAAe,GAChB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Contract for extracting tool definitions embedded in a client's system prompt.
3
+ *
4
+ * Some clients (e.g. Cline) describe their tools as text inside the system
5
+ * message rather than using the OpenAI `tools` parameter. An extractor
6
+ * parses those definitions so the agent can treat them as regular external
7
+ * tools, and converts native `tool_calls` back to the client's expected
8
+ * text format on output.
9
+ */
10
+ import type { LlmTool } from './types.js';
11
+ export interface IPromptToolExtractResult {
12
+ /** Whether any tool definitions were found. */
13
+ hasTools: boolean;
14
+ /** Parsed tools in the normalised LlmTool format. */
15
+ tools: LlmTool[];
16
+ /** System prompt with tool definition blocks removed. */
17
+ cleanedPrompt: string;
18
+ }
19
+ export interface IPromptToolExtractor {
20
+ /**
21
+ * Analyse the raw system prompt and extract embedded tool definitions.
22
+ * If no tools are detected, return `{ hasTools: false }` with the
23
+ * original prompt unchanged.
24
+ */
25
+ extract(systemPrompt: string): IPromptToolExtractResult;
26
+ /**
27
+ * Convert a native tool call (name + args) back to the text format the
28
+ * client expects inside the assistant `content` field.
29
+ *
30
+ * Example (Cline XML):
31
+ * ```xml
32
+ * <read_file>
33
+ * <path>src/main.ts</path>
34
+ * </read_file>
35
+ * ```
36
+ */
37
+ formatToolCall(toolName: string, args: Record<string, unknown>): string;
38
+ }
39
+ //# sourceMappingURL=prompt-tool-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-tool-extractor.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/interfaces/prompt-tool-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAM1C,MAAM,WAAW,wBAAwB;IACvC,+CAA+C;IAC/C,QAAQ,EAAE,OAAO,CAAC;IAClB,qDAAqD;IACrD,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,yDAAyD;IACzD,aAAa,EAAE,MAAM,CAAC;CACvB;AAMD,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,wBAAwB,CAAC;IAExD;;;;;;;;;;OAUG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;CACzE"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Contract for extracting tool definitions embedded in a client's system prompt.
3
+ *
4
+ * Some clients (e.g. Cline) describe their tools as text inside the system
5
+ * message rather than using the OpenAI `tools` parameter. An extractor
6
+ * parses those definitions so the agent can treat them as regular external
7
+ * tools, and converts native `tool_calls` back to the client's expected
8
+ * text format on output.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=prompt-tool-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-tool-extractor.js","sourceRoot":"","sources":["../../../src/smart-agent/interfaces/prompt-tool-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -54,6 +54,7 @@
54
54
  *
55
55
  * Only `.js`, `.mjs`, and `.ts` files are loaded. Subdirectories are ignored.
56
56
  */
57
+ import type { IClientAdapter } from '../interfaces/client-adapter.js';
57
58
  import type { IMcpClient } from '../interfaces/mcp-client.js';
58
59
  import type { EmbedderFactory } from '../interfaces/rag.js';
59
60
  import type { ISkillManager } from '../interfaces/skill.js';
@@ -80,6 +81,8 @@ export interface PluginExports {
80
81
  skillManager?: ISkillManager;
81
82
  /** Pre-built MCP clients (accumulated from all plugins). */
82
83
  mcpClients?: IMcpClient[];
84
+ /** Client adapters for auto-detecting prompt-based clients (accumulated). */
85
+ clientAdapters?: IClientAdapter[];
83
86
  }
84
87
  /**
85
88
  * Result of loading all plugins.
@@ -93,6 +96,7 @@ export interface LoadedPlugins {
93
96
  outputValidator?: IOutputValidator;
94
97
  skillManager?: ISkillManager;
95
98
  mcpClients: IMcpClient[];
99
+ clientAdapters: IClientAdapter[];
96
100
  /** Source identifiers for successfully loaded plugins. */
97
101
  loadedFiles: string[];
98
102
  /** Plugins that failed to load, with error messages. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/plugins/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAE9C,yDAAyD;IACzD,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAEpD,kDAAkD;IAClD,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB,oDAAoD;IACpD,aAAa,CAAC,EAAE,cAAc,CAAC;IAE/B,sDAAsD;IACtD,eAAe,CAAC,EAAE,gBAAgB,CAAC;IAEnC,mDAAmD;IACnD,YAAY,CAAC,EAAE,aAAa,CAAC;IAE7B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1C,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACnD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,aAAa,CAAC,EAAE,cAAc,CAAC;IAC/B,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,0DAA0D;IAC1D,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,wDAAwD;IACxD,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,aAAa,CAQlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAmDT"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/plugins/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAE9C,yDAAyD;IACzD,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAEpD,kDAAkD;IAClD,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB,oDAAoD;IACpD,aAAa,CAAC,EAAE,cAAc,CAAC;IAE/B,sDAAsD;IACtD,eAAe,CAAC,EAAE,gBAAgB,CAAC;IAEnC,mDAAmD;IACnD,YAAY,CAAC,EAAE,aAAa,CAAC;IAE7B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC;IAE1B,6EAA6E;IAC7E,cAAc,CAAC,EAAE,cAAc,EAAE,CAAC;CACnC;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1C,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACnD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,aAAa,CAAC,EAAE,cAAc,CAAC;IAC/B,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,cAAc,EAAE,cAAc,EAAE,CAAC;IACjC,0DAA0D;IAC1D,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,wDAAwD;IACxD,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,aAAa,CASlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAwDT"}
@@ -63,6 +63,7 @@ export function emptyLoadedPlugins() {
63
63
  stageHandlers: new Map(),
64
64
  embedderFactories: {},
65
65
  mcpClients: [],
66
+ clientAdapters: [],
66
67
  loadedFiles: [],
67
68
  errors: [],
68
69
  };
@@ -114,6 +115,10 @@ export function mergePluginExports(result, mod, source) {
114
115
  result.mcpClients.push(...mod.mcpClients);
115
116
  registered = true;
116
117
  }
118
+ if (mod.clientAdapters && Array.isArray(mod.clientAdapters)) {
119
+ result.clientAdapters.push(...mod.clientAdapters);
120
+ registered = true;
121
+ }
117
122
  if (registered) {
118
123
  result.loadedFiles.push(source);
119
124
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/smart-agent/plugins/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAgGH;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,aAAa,EAAE,IAAI,GAAG,EAAE;QACxB,iBAAiB,EAAE,EAAE;QACrB,UAAU,EAAE,EAAE;QACd,WAAW,EAAE,EAAE;QACf,MAAM,EAAE,EAAE;KACX,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAqB,EACrB,GAAkB,EAClB,MAAc;IAEd,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,IAAI,GAAG,CAAC,aAAa,IAAI,OAAO,GAAG,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;QAC/D,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YAChE,IAAI,OAAO,IAAI,OAAQ,OAAyB,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;gBACxE,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,OAAwB,CAAC,CAAC;gBACzD,UAAU,GAAG,IAAI,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,iBAAiB,IAAI,OAAO,GAAG,CAAC,iBAAiB,KAAK,QAAQ,EAAE,CAAC;QACvE,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACpE,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;gBAClC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;gBACzC,UAAU,GAAG,IAAI,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACrD,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC/B,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,IAAI,GAAG,CAAC,aAAa,IAAI,OAAO,GAAG,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;QAC/D,MAAM,CAAC,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;QACzC,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,IAAI,GAAG,CAAC,eAAe,IAAI,OAAO,GAAG,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC;QACnE,MAAM,CAAC,eAAe,GAAG,GAAG,CAAC,eAAe,CAAC;QAC7C,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,IAAI,GAAG,CAAC,YAAY,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;QAC7D,MAAM,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;QACvC,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,IAAI,GAAG,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QACpD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1C,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/smart-agent/plugins/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Default IPromptToolExtractor — parses Cline-style tool definitions
3
+ * embedded as markdown/XML blocks in the system prompt.
4
+ *
5
+ * Format handled:
6
+ * ```
7
+ * # Tools
8
+ *
9
+ * ## tool_name
10
+ * Description: ...
11
+ * Parameters:
12
+ * - param: (required) description
13
+ * - param2: (optional) description
14
+ * Usage:
15
+ * <tool_name>
16
+ * <param>value</param>
17
+ * </tool_name>
18
+ *
19
+ * # Tool Use Guidelines ← end sentinel
20
+ * ```
21
+ *
22
+ * Consumers can provide their own implementation of {@link IPromptToolExtractor}
23
+ * for different prompt-based formats.
24
+ */
25
+ import type { IPromptToolExtractor, IPromptToolExtractResult } from './interfaces/prompt-tool-extractor.js';
26
+ export declare class ClinePromptToolExtractor implements IPromptToolExtractor {
27
+ extract(systemPrompt: string): IPromptToolExtractResult;
28
+ formatToolCall(toolName: string, args: Record<string, unknown>): string;
29
+ }
30
+ //# sourceMappingURL=prompt-tool-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-tool-extractor.d.ts","sourceRoot":"","sources":["../../src/smart-agent/prompt-tool-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EACV,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,uCAAuC,CAAC;AAwB/C,qBAAa,wBAAyB,YAAW,oBAAoB;IACnE,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,wBAAwB;IAgEvD,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;CAUxE"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Default IPromptToolExtractor — parses Cline-style tool definitions
3
+ * embedded as markdown/XML blocks in the system prompt.
4
+ *
5
+ * Format handled:
6
+ * ```
7
+ * # Tools
8
+ *
9
+ * ## tool_name
10
+ * Description: ...
11
+ * Parameters:
12
+ * - param: (required) description
13
+ * - param2: (optional) description
14
+ * Usage:
15
+ * <tool_name>
16
+ * <param>value</param>
17
+ * </tool_name>
18
+ *
19
+ * # Tool Use Guidelines ← end sentinel
20
+ * ```
21
+ *
22
+ * Consumers can provide their own implementation of {@link IPromptToolExtractor}
23
+ * for different prompt-based formats.
24
+ */
25
+ // ---------------------------------------------------------------------------
26
+ // Regex patterns
27
+ // ---------------------------------------------------------------------------
28
+ /** Matches the entire `# Tools` … next `# ` top-level heading (or end of string). */
29
+ const TOOLS_BLOCK_RE = /^# Tools\n([\s\S]*?)(?=\n# [A-Z]|$(?![\s\S]))/m;
30
+ /** Matches individual `## tool_name` sections inside the tools block. */
31
+ const TOOL_SECTION_RE = /^## (\w+)\nDescription: ([\s\S]*?)(?=\n## \w|\n# [A-Z]|$(?![\s\S]))/gm;
32
+ /** Matches a `Parameters:` block with `- name: (required|optional) desc` lines. */
33
+ const PARAMS_BLOCK_RE = /Parameters:\n((?:- .+\n?)+)/;
34
+ /** Matches a single parameter line. */
35
+ const PARAM_LINE_RE = /^- (\w+): \((required|optional)\) (.+)/;
36
+ // ---------------------------------------------------------------------------
37
+ // Implementation
38
+ // ---------------------------------------------------------------------------
39
+ export class ClinePromptToolExtractor {
40
+ extract(systemPrompt) {
41
+ const toolsBlockMatch = systemPrompt.match(TOOLS_BLOCK_RE);
42
+ if (!toolsBlockMatch) {
43
+ return { hasTools: false, tools: [], cleanedPrompt: systemPrompt };
44
+ }
45
+ const toolsBlock = toolsBlockMatch[0];
46
+ const tools = [];
47
+ // Reset lastIndex for the global regex
48
+ TOOL_SECTION_RE.lastIndex = 0;
49
+ let match = TOOL_SECTION_RE.exec(toolsBlock);
50
+ while (match !== null) {
51
+ const name = match[1];
52
+ const body = match[2];
53
+ // Extract description (first line/paragraph before Parameters:)
54
+ const descEnd = body.indexOf('Parameters:');
55
+ const description = descEnd >= 0
56
+ ? body.slice(0, descEnd).trim()
57
+ : body.split('\n')[0].trim();
58
+ // Extract parameters
59
+ const paramsMatch = body.match(PARAMS_BLOCK_RE);
60
+ const properties = {};
61
+ const required = [];
62
+ if (paramsMatch) {
63
+ for (const line of paramsMatch[1].split('\n')) {
64
+ const paramMatch = line.match(PARAM_LINE_RE);
65
+ if (paramMatch) {
66
+ const [, paramName, req, paramDesc] = paramMatch;
67
+ properties[paramName] = { type: 'string', description: paramDesc };
68
+ if (req === 'required')
69
+ required.push(paramName);
70
+ }
71
+ }
72
+ }
73
+ tools.push({
74
+ name,
75
+ description,
76
+ inputSchema: {
77
+ type: 'object',
78
+ properties,
79
+ ...(required.length > 0 ? { required } : {}),
80
+ },
81
+ });
82
+ match = TOOL_SECTION_RE.exec(toolsBlock);
83
+ }
84
+ if (tools.length === 0) {
85
+ return { hasTools: false, tools: [], cleanedPrompt: systemPrompt };
86
+ }
87
+ // Remove the tools block from the prompt
88
+ const cleanedPrompt = systemPrompt.replace(toolsBlock, '').trim();
89
+ return { hasTools: true, tools, cleanedPrompt };
90
+ }
91
+ formatToolCall(toolName, args) {
92
+ const params = Object.entries(args)
93
+ .filter(([, v]) => v !== undefined && v !== null)
94
+ .map(([k, v]) => `<${k}>${String(v)}</${k}>`)
95
+ .join('\n');
96
+ return params
97
+ ? `<${toolName}>\n${params}\n</${toolName}>`
98
+ : `<${toolName}>\n</${toolName}>`;
99
+ }
100
+ }
101
+ //# sourceMappingURL=prompt-tool-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-tool-extractor.js","sourceRoot":"","sources":["../../src/smart-agent/prompt-tool-extractor.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * SmartServer — embeddable OpenAI-compatible HTTP server backed by SmartAgent.
3
3
  */
4
+ import type { IClientAdapter } from './interfaces/client-adapter.js';
4
5
  import type { IMcpClient } from './interfaces/mcp-client.js';
5
6
  import type { EmbedderFactory, IEmbedder } from './interfaces/rag.js';
6
7
  import type { ISkillManager } from './interfaces/skill.js';
@@ -115,6 +116,8 @@ export interface SmartServerConfig {
115
116
  skillManager?: ISkillManager;
116
117
  /** Pre-built MCP clients injected via DI. Takes precedence over `mcp` config. */
117
118
  mcpClients?: IMcpClient[];
119
+ /** Client adapters for auto-detecting prompt-based clients (e.g. Cline). */
120
+ clientAdapters?: IClientAdapter[];
118
121
  }
119
122
  export interface SmartServerHandle {
120
123
  port: number;
@@ -1 +1 @@
1
- {"version":3,"file":"smart-server.d.ts","sourceRoot":"","sources":["../../src/smart-agent/smart-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"smart-server.d.ts","sourceRoot":"","sources":["../../src/smart-agent/smart-server.ts"],"names":[],"mappings":"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"}
@@ -169,7 +169,8 @@ export class SmartServer {
169
169
  .withMainLlm(mainLlm)
170
170
  .withClassifierLlm(classifierLlm)
171
171
  .withUsageProvider(getUsage)
172
- .withLogger(fileLogger);
172
+ .withLogger(fileLogger)
173
+ .withMode(this.cfg.mode ?? 'smart');
173
174
  if (helperLlm) {
174
175
  builder = builder.withHelperLlm(helperLlm);
175
176
  }
@@ -206,6 +207,16 @@ export class SmartServer {
206
207
  if (mcpClients) {
207
208
  builder = builder.withMcpClients(mcpClients);
208
209
  }
210
+ // Client adapters (DI > plugin; ClineClientAdapter is always registered as default)
211
+ const { ClineClientAdapter } = await import('./adapters/cline-client-adapter.js');
212
+ const adapterSources = [
213
+ ...(this.cfg.clientAdapters ?? []),
214
+ ...plugins.clientAdapters,
215
+ new ClineClientAdapter(),
216
+ ];
217
+ for (const adapter of adapterSources) {
218
+ builder = builder.withClientAdapter(adapter);
219
+ }
209
220
  // Structured pipeline (when YAML contains `pipeline.stages`)
210
221
  if (pipeline?.stages && Array.isArray(pipeline.stages)) {
211
222
  builder = builder.withPipeline({