@burtson-labs/agent-core 1.6.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +88 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/activation.d.ts +60 -0
- package/dist/mcp/activation.d.ts.map +1 -0
- package/dist/mcp/activation.js +139 -0
- package/dist/mcp/activation.js.map +1 -0
- package/dist/mcp/clientPool.d.ts +202 -0
- package/dist/mcp/clientPool.d.ts.map +1 -0
- package/dist/mcp/clientPool.js +469 -0
- package/dist/mcp/clientPool.js.map +1 -0
- package/dist/mcp/index.d.ts +18 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +28 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +43 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +130 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/toolAdapter.d.ts +57 -0
- package/dist/mcp/toolAdapter.d.ts.map +1 -0
- package/dist/mcp/toolAdapter.js +223 -0
- package/dist/mcp/toolAdapter.js.map +1 -0
- package/dist/mcp/types.d.ts +122 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +15 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/providers/deterministic-provider.d.ts +21 -0
- package/dist/providers/deterministic-provider.d.ts.map +1 -0
- package/dist/providers/deterministic-provider.js +80 -0
- package/dist/providers/deterministic-provider.js.map +1 -0
- package/dist/providers/provider-client.d.ts +12 -0
- package/dist/providers/provider-client.d.ts.map +1 -0
- package/dist/providers/provider-client.js +11 -0
- package/dist/providers/provider-client.js.map +1 -0
- package/dist/runtime/AgentRuntime.d.ts +67 -0
- package/dist/runtime/AgentRuntime.d.ts.map +1 -0
- package/dist/runtime/AgentRuntime.js +382 -0
- package/dist/runtime/AgentRuntime.js.map +1 -0
- package/dist/security/secretPatterns.d.ts +76 -0
- package/dist/security/secretPatterns.d.ts.map +1 -0
- package/dist/security/secretPatterns.js +290 -0
- package/dist/security/secretPatterns.js.map +1 -0
- package/dist/tools/ask-user-tool.d.ts +19 -0
- package/dist/tools/ask-user-tool.d.ts.map +1 -0
- package/dist/tools/ask-user-tool.js +148 -0
- package/dist/tools/ask-user-tool.js.map +1 -0
- package/dist/tools/compactMessages.d.ts +52 -0
- package/dist/tools/compactMessages.d.ts.map +1 -0
- package/dist/tools/compactMessages.js +158 -0
- package/dist/tools/compactMessages.js.map +1 -0
- package/dist/tools/core-tools.d.ts +29 -0
- package/dist/tools/core-tools.d.ts.map +1 -0
- package/dist/tools/core-tools.js +2214 -0
- package/dist/tools/core-tools.js.map +1 -0
- package/dist/tools/git-tools.d.ts +32 -0
- package/dist/tools/git-tools.d.ts.map +1 -0
- package/dist/tools/git-tools.js +330 -0
- package/dist/tools/git-tools.js.map +1 -0
- package/dist/tools/index.d.ts +15 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +31 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/language-adapters.d.ts +48 -0
- package/dist/tools/language-adapters.d.ts.map +1 -0
- package/dist/tools/language-adapters.js +299 -0
- package/dist/tools/language-adapters.js.map +1 -0
- package/dist/tools/loop/compactionTrigger.d.ts +47 -0
- package/dist/tools/loop/compactionTrigger.d.ts.map +1 -0
- package/dist/tools/loop/compactionTrigger.js +32 -0
- package/dist/tools/loop/compactionTrigger.js.map +1 -0
- package/dist/tools/loop/finalAnswerNudges.d.ts +68 -0
- package/dist/tools/loop/finalAnswerNudges.d.ts.map +1 -0
- package/dist/tools/loop/finalAnswerNudges.js +87 -0
- package/dist/tools/loop/finalAnswerNudges.js.map +1 -0
- package/dist/tools/loop/goalAnchor.d.ts +72 -0
- package/dist/tools/loop/goalAnchor.d.ts.map +1 -0
- package/dist/tools/loop/goalAnchor.js +76 -0
- package/dist/tools/loop/goalAnchor.js.map +1 -0
- package/dist/tools/loop/llmStream.d.ts +70 -0
- package/dist/tools/loop/llmStream.d.ts.map +1 -0
- package/dist/tools/loop/llmStream.js +181 -0
- package/dist/tools/loop/llmStream.js.map +1 -0
- package/dist/tools/loop/parallelExecute.d.ts +57 -0
- package/dist/tools/loop/parallelExecute.d.ts.map +1 -0
- package/dist/tools/loop/parallelExecute.js +54 -0
- package/dist/tools/loop/parallelExecute.js.map +1 -0
- package/dist/tools/loop/singleToolExecute.d.ts +71 -0
- package/dist/tools/loop/singleToolExecute.d.ts.map +1 -0
- package/dist/tools/loop/singleToolExecute.js +139 -0
- package/dist/tools/loop/singleToolExecute.js.map +1 -0
- package/dist/tools/loop/toolCallNormalize.d.ts +57 -0
- package/dist/tools/loop/toolCallNormalize.d.ts.map +1 -0
- package/dist/tools/loop/toolCallNormalize.js +99 -0
- package/dist/tools/loop/toolCallNormalize.js.map +1 -0
- package/dist/tools/loop/turnSetup.d.ts +43 -0
- package/dist/tools/loop/turnSetup.d.ts.map +1 -0
- package/dist/tools/loop/turnSetup.js +48 -0
- package/dist/tools/loop/turnSetup.js.map +1 -0
- package/dist/tools/ocr.d.ts +52 -0
- package/dist/tools/ocr.d.ts.map +1 -0
- package/dist/tools/ocr.js +238 -0
- package/dist/tools/ocr.js.map +1 -0
- package/dist/tools/post-edit-checks.d.ts +46 -0
- package/dist/tools/post-edit-checks.d.ts.map +1 -0
- package/dist/tools/post-edit-checks.js +236 -0
- package/dist/tools/post-edit-checks.js.map +1 -0
- package/dist/tools/skill-loader.d.ts +94 -0
- package/dist/tools/skill-loader.d.ts.map +1 -0
- package/dist/tools/skill-loader.js +422 -0
- package/dist/tools/skill-loader.js.map +1 -0
- package/dist/tools/skill-registry.d.ts +44 -0
- package/dist/tools/skill-registry.d.ts.map +1 -0
- package/dist/tools/skill-registry.js +118 -0
- package/dist/tools/skill-registry.js.map +1 -0
- package/dist/tools/skill-types.d.ts +38 -0
- package/dist/tools/skill-types.d.ts.map +1 -0
- package/dist/tools/skill-types.js +10 -0
- package/dist/tools/skill-types.js.map +1 -0
- package/dist/tools/skills/code-review-skill.d.ts +9 -0
- package/dist/tools/skills/code-review-skill.d.ts.map +1 -0
- package/dist/tools/skills/code-review-skill.js +66 -0
- package/dist/tools/skills/code-review-skill.js.map +1 -0
- package/dist/tools/skills/core-skill.d.ts +13 -0
- package/dist/tools/skills/core-skill.d.ts.map +1 -0
- package/dist/tools/skills/core-skill.js +23 -0
- package/dist/tools/skills/core-skill.js.map +1 -0
- package/dist/tools/skills/git-skill.d.ts +10 -0
- package/dist/tools/skills/git-skill.d.ts.map +1 -0
- package/dist/tools/skills/git-skill.js +30 -0
- package/dist/tools/skills/git-skill.js.map +1 -0
- package/dist/tools/skills/index.d.ts +17 -0
- package/dist/tools/skills/index.d.ts.map +1 -0
- package/dist/tools/skills/index.js +49 -0
- package/dist/tools/skills/index.js.map +1 -0
- package/dist/tools/skills/interaction-skill.d.ts +14 -0
- package/dist/tools/skills/interaction-skill.d.ts.map +1 -0
- package/dist/tools/skills/interaction-skill.js +24 -0
- package/dist/tools/skills/interaction-skill.js.map +1 -0
- package/dist/tools/skills/mail-search-skill.d.ts +25 -0
- package/dist/tools/skills/mail-search-skill.d.ts.map +1 -0
- package/dist/tools/skills/mail-search-skill.js +343 -0
- package/dist/tools/skills/mail-search-skill.js.map +1 -0
- package/dist/tools/skills/plan-skill.d.ts +10 -0
- package/dist/tools/skills/plan-skill.d.ts.map +1 -0
- package/dist/tools/skills/plan-skill.js +126 -0
- package/dist/tools/skills/plan-skill.js.map +1 -0
- package/dist/tools/skills/semantic-search-skill.d.ts +22 -0
- package/dist/tools/skills/semantic-search-skill.d.ts.map +1 -0
- package/dist/tools/skills/semantic-search-skill.js +244 -0
- package/dist/tools/skills/semantic-search-skill.js.map +1 -0
- package/dist/tools/skills/test-gen-skill.d.ts +9 -0
- package/dist/tools/skills/test-gen-skill.d.ts.map +1 -0
- package/dist/tools/skills/test-gen-skill.js +123 -0
- package/dist/tools/skills/test-gen-skill.js.map +1 -0
- package/dist/tools/tool-registry.d.ts +60 -0
- package/dist/tools/tool-registry.d.ts.map +1 -0
- package/dist/tools/tool-registry.js +200 -0
- package/dist/tools/tool-registry.js.map +1 -0
- package/dist/tools/tool-types.d.ts +281 -0
- package/dist/tools/tool-types.d.ts.map +1 -0
- package/dist/tools/tool-types.js +10 -0
- package/dist/tools/tool-types.js.map +1 -0
- package/dist/tools/tool-use-loop.d.ts +231 -0
- package/dist/tools/tool-use-loop.d.ts.map +1 -0
- package/dist/tools/tool-use-loop.js +2057 -0
- package/dist/tools/tool-use-loop.js.map +1 -0
- package/dist/tools/tool-use-parser.d.ts +78 -0
- package/dist/tools/tool-use-parser.d.ts.map +1 -0
- package/dist/tools/tool-use-parser.js +427 -0
- package/dist/tools/tool-use-parser.js.map +1 -0
- package/dist/tools/toolAvailabilityDetector.d.ts +48 -0
- package/dist/tools/toolAvailabilityDetector.d.ts.map +1 -0
- package/dist/tools/toolAvailabilityDetector.js +156 -0
- package/dist/tools/toolAvailabilityDetector.js.map +1 -0
- package/dist/tools/unified-patch.d.ts +87 -0
- package/dist/tools/unified-patch.d.ts.map +1 -0
- package/dist/tools/unified-patch.js +217 -0
- package/dist/tools/unified-patch.js.map +1 -0
- package/dist/types/agent.d.ts +69 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +54 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/tasks.d.ts +22 -0
- package/dist/types/tasks.d.ts.map +1 -0
- package/dist/types/tasks.js +3 -0
- package/dist/types/tasks.js.map +1 -0
- package/dist/utils/event-emitter.d.ts +13 -0
- package/dist/utils/event-emitter.d.ts.map +1 -0
- package/dist/utils/event-emitter.js +54 -0
- package/dist/utils/event-emitter.js.map +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP — Model Context Protocol — types.
|
|
3
|
+
*
|
|
4
|
+
* Bandit speaks MCP as a CLIENT. Each configured server runs as a
|
|
5
|
+
* separate child process; we open a JSON-RPC channel over stdio,
|
|
6
|
+
* enumerate the server's tools, and register them in the existing
|
|
7
|
+
* AgentTool registry with namespaced names (`<server>.<tool>`).
|
|
8
|
+
*
|
|
9
|
+
* Config shape uses the standard MCP `mcpServers` schema so users can
|
|
10
|
+
* port a working config to / from other MCP-speaking clients without
|
|
11
|
+
* rewriting it.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Auth strategy for remote (URL-based) MCP servers. Stdio servers don't
|
|
15
|
+
* use this — they're trusted via fingerprint + the trust gate.
|
|
16
|
+
*
|
|
17
|
+
* - `'bandit'` (string shorthand) → equivalent to `{ type: 'bandit-api-key' }`,
|
|
18
|
+
* resolves to the host's configured Bandit Cloud API key at request time.
|
|
19
|
+
* Sent as `X-API-Key: <key>`.
|
|
20
|
+
* - `{ type: 'bandit-api-key' }` → explicit form of the above.
|
|
21
|
+
* - `{ type: 'bearer'; token: '...' }` → static bearer token. Sent as
|
|
22
|
+
* `Authorization: Bearer <token>`.
|
|
23
|
+
* - `{ type: 'header'; name: 'X-Foo'; value: '...' }` → arbitrary custom
|
|
24
|
+
* header. Use for connectors with bespoke auth headers.
|
|
25
|
+
*
|
|
26
|
+
* The pool resolves a string token from the host via
|
|
27
|
+
* McpClientPoolOptions.resolveAuthToken when the type is bandit-api-key.
|
|
28
|
+
*/
|
|
29
|
+
export type McpAuthConfig = 'bandit' | {
|
|
30
|
+
type: 'bandit-api-key';
|
|
31
|
+
} | {
|
|
32
|
+
type: 'bearer';
|
|
33
|
+
token: string;
|
|
34
|
+
} | {
|
|
35
|
+
type: 'header';
|
|
36
|
+
name: string;
|
|
37
|
+
value: string;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* One server entry in the user's mcp-servers.json. Matches the standard
|
|
41
|
+
* MCP config schema for stdio servers AND the emerging Streamable HTTP
|
|
42
|
+
* remote-server shape for URL-based servers. An entry is one OR the
|
|
43
|
+
* other — `command` and `url` are mutually exclusive. `url` wins when
|
|
44
|
+
* both are set.
|
|
45
|
+
*/
|
|
46
|
+
export interface McpServerConfig {
|
|
47
|
+
/** Stdio mode: executable name or absolute path. e.g. "npx", "node",
|
|
48
|
+
* "/usr/local/bin/mcp-server". Mutually exclusive with `url`. */
|
|
49
|
+
command?: string;
|
|
50
|
+
/** Stdio mode arguments. */
|
|
51
|
+
args?: string[];
|
|
52
|
+
/** Stdio mode environment variables merged into the child process. NOT logged. */
|
|
53
|
+
env?: Record<string, string>;
|
|
54
|
+
/** Remote mode: full URL of the MCP endpoint (Streamable HTTP), e.g.
|
|
55
|
+
* `https://mcp.burtson.ai/mcp`. When set, this entry uses the remote
|
|
56
|
+
* transport — command/args/env are ignored. The Bandit MCP client
|
|
57
|
+
* speaks Streamable HTTP via @modelcontextprotocol/sdk's
|
|
58
|
+
* StreamableHTTPClientTransport. */
|
|
59
|
+
url?: string;
|
|
60
|
+
/** Auth for the remote URL — see McpAuthConfig. Omit for public URLs.
|
|
61
|
+
* Most user-facing entries will be `auth: 'bandit'` (Bandit Cloud key)
|
|
62
|
+
* since that's how `mcp.burtson.ai` and similar hosted servers
|
|
63
|
+
* authenticate. */
|
|
64
|
+
auth?: McpAuthConfig;
|
|
65
|
+
/**
|
|
66
|
+
* Optional disable flag — set to true to keep the server in the
|
|
67
|
+
* config (so the user doesn't lose their tokens) without spawning
|
|
68
|
+
* it. Mirrors the standard MCP `disabled` field.
|
|
69
|
+
*/
|
|
70
|
+
disabled?: boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Activation mode. Defaults to "always" (current behavior — every
|
|
73
|
+
* configured server's tools are registered every turn). When set
|
|
74
|
+
* to "on-mention", the server's tools are only registered when
|
|
75
|
+
* the user's prompt mentions one of the server's triggers (the
|
|
76
|
+
* server name itself + any explicit `triggers` + auto-derived
|
|
77
|
+
* triggers for well-known providers like slack/github/gmail/etc).
|
|
78
|
+
*
|
|
79
|
+
* Use "on-mention" to keep the system prompt small when you have
|
|
80
|
+
* many servers configured. A user with 10 servers using "always"
|
|
81
|
+
* pays for 60+ tool definitions in every prompt; "on-mention"
|
|
82
|
+
* lets you summon Slack tools by typing "slack" without bloating
|
|
83
|
+
* your code-review prompts.
|
|
84
|
+
*/
|
|
85
|
+
activation?: 'always' | 'on-mention';
|
|
86
|
+
/**
|
|
87
|
+
* Extra keywords that activate this server when activation is
|
|
88
|
+
* "on-mention". The server name is always a trigger; explicit
|
|
89
|
+
* triggers stack on top. For well-known servers (slack, github,
|
|
90
|
+
* gmail, drive, calendar, outlook, teams) Bandit auto-supplies
|
|
91
|
+
* sensible defaults so users don't need to think about it.
|
|
92
|
+
*/
|
|
93
|
+
triggers?: string[];
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* The full mcp-servers.json file. Loaded from `~/.bandit/mcp-servers.json`
|
|
97
|
+
* (global) and `.bandit/mcp-servers.json` (workspace, takes precedence).
|
|
98
|
+
*/
|
|
99
|
+
export interface McpServersFile {
|
|
100
|
+
mcpServers: Record<string, McpServerConfig>;
|
|
101
|
+
}
|
|
102
|
+
/** Per-server runtime status. Surfaced in the CLI `/mcp` listing and the IDE Connections tab. */
|
|
103
|
+
export type McpServerStatus = {
|
|
104
|
+
state: 'idle';
|
|
105
|
+
} | {
|
|
106
|
+
state: 'connecting';
|
|
107
|
+
} | {
|
|
108
|
+
state: 'connected';
|
|
109
|
+
toolCount: number;
|
|
110
|
+
} | {
|
|
111
|
+
state: 'error';
|
|
112
|
+
message: string;
|
|
113
|
+
} | {
|
|
114
|
+
state: 'disabled';
|
|
115
|
+
};
|
|
116
|
+
/** Snapshot of one server for status views (CLI and IDE). */
|
|
117
|
+
export interface McpServerSnapshot {
|
|
118
|
+
name: string;
|
|
119
|
+
config: McpServerConfig;
|
|
120
|
+
status: McpServerStatus;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,aAAa,GACrB,QAAQ,GACR;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B;sEACkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,kFAAkF;IAClF,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE7B;;;;yCAIqC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;wBAGoB;IACpB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;;;;;;;;OAaG;IACH,UAAU,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAC;IACrC;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC7C;AAED,iGAAiG;AACjG,MAAM,MAAM,eAAe,GACvB;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB;IAAE,KAAK,EAAE,YAAY,CAAA;CAAE,GACvB;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC;AAE1B,6DAA6D;AAC7D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,eAAe,CAAC;CACzB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP — Model Context Protocol — types.
|
|
4
|
+
*
|
|
5
|
+
* Bandit speaks MCP as a CLIENT. Each configured server runs as a
|
|
6
|
+
* separate child process; we open a JSON-RPC channel over stdio,
|
|
7
|
+
* enumerate the server's tools, and register them in the existing
|
|
8
|
+
* AgentTool registry with namespaced names (`<server>.<tool>`).
|
|
9
|
+
*
|
|
10
|
+
* Config shape uses the standard MCP `mcpServers` schema so users can
|
|
11
|
+
* port a working config to / from other MCP-speaking clients without
|
|
12
|
+
* rewriting it.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ProviderChatOptions, ProviderClient } from "./provider-client";
|
|
2
|
+
export interface DeterministicProviderConfig {
|
|
3
|
+
/**
|
|
4
|
+
* Optional seed to influence deterministic outputs.
|
|
5
|
+
*/
|
|
6
|
+
seed?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* A lightweight provider implementation that produces deterministic,
|
|
10
|
+
* heuristic outputs for planning and execution without invoking a model.
|
|
11
|
+
*/
|
|
12
|
+
export declare class DeterministicProviderClient implements ProviderClient {
|
|
13
|
+
private readonly config;
|
|
14
|
+
readonly name = "deterministic-provider";
|
|
15
|
+
constructor(config?: DeterministicProviderConfig);
|
|
16
|
+
chat(prompt: string, options?: ProviderChatOptions): AsyncIterable<string>;
|
|
17
|
+
private generatePlan;
|
|
18
|
+
private generateReport;
|
|
19
|
+
private generateEcho;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=deterministic-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deterministic-provider.d.ts","sourceRoot":"","sources":["../../src/providers/deterministic-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExE,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,qBAAa,2BAA4B,YAAW,cAAc;IAGpD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,QAAQ,CAAC,IAAI,4BAA4B;gBAEZ,MAAM,GAAE,2BAAgC;IAE9D,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,aAAa,CAAC,MAAM,CAAC;IAgBjF,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,YAAY;CAUrB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeterministicProviderClient = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* A lightweight provider implementation that produces deterministic,
|
|
6
|
+
* heuristic outputs for planning and execution without invoking a model.
|
|
7
|
+
*/
|
|
8
|
+
class DeterministicProviderClient {
|
|
9
|
+
constructor(config = {}) {
|
|
10
|
+
this.config = config;
|
|
11
|
+
this.name = "deterministic-provider";
|
|
12
|
+
}
|
|
13
|
+
async *chat(prompt, options) {
|
|
14
|
+
const mode = options?.mode ?? "plan";
|
|
15
|
+
if (mode === "plan") {
|
|
16
|
+
yield this.generatePlan(prompt);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (mode === "report") {
|
|
20
|
+
yield this.generateReport(prompt, options);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
yield this.generateEcho(prompt, options);
|
|
24
|
+
}
|
|
25
|
+
generatePlan(prompt) {
|
|
26
|
+
const goal = extractGoal(prompt);
|
|
27
|
+
const steps = heuristicallyBreakGoal(goal);
|
|
28
|
+
return JSON.stringify({
|
|
29
|
+
goal,
|
|
30
|
+
summary: `Plan generated from goal: ${goal}`,
|
|
31
|
+
steps: steps.map((text, index) => ({
|
|
32
|
+
id: `step-${index + 1}`,
|
|
33
|
+
title: titleCase(text),
|
|
34
|
+
description: text
|
|
35
|
+
}))
|
|
36
|
+
}, null, 2);
|
|
37
|
+
}
|
|
38
|
+
generateReport(prompt, options) {
|
|
39
|
+
return JSON.stringify({
|
|
40
|
+
summary: "Execution completed using deterministic provider.",
|
|
41
|
+
prompt,
|
|
42
|
+
metadata: options?.metadata ?? {}
|
|
43
|
+
}, null, 2);
|
|
44
|
+
}
|
|
45
|
+
generateEcho(prompt, options) {
|
|
46
|
+
return JSON.stringify({
|
|
47
|
+
prompt,
|
|
48
|
+
options: options ?? {}
|
|
49
|
+
}, null, 2);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.DeterministicProviderClient = DeterministicProviderClient;
|
|
53
|
+
function extractGoal(prompt) {
|
|
54
|
+
const cleaned = prompt.trim();
|
|
55
|
+
const match = cleaned.match(/goal:(.*)/i);
|
|
56
|
+
if (match) {
|
|
57
|
+
return match[1].trim();
|
|
58
|
+
}
|
|
59
|
+
return cleaned;
|
|
60
|
+
}
|
|
61
|
+
function heuristicallyBreakGoal(goal) {
|
|
62
|
+
const delimiters = [/ and /i, / then /i, /, /];
|
|
63
|
+
for (const delimiter of delimiters) {
|
|
64
|
+
if (delimiter.test(goal)) {
|
|
65
|
+
return goal.split(delimiter).map((part) => part.trim()).filter(Boolean);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (goal.length < 80) {
|
|
69
|
+
return [goal];
|
|
70
|
+
}
|
|
71
|
+
const midpoint = Math.floor(goal.length / 2);
|
|
72
|
+
return [goal.slice(0, midpoint).trim(), goal.slice(midpoint).trim()];
|
|
73
|
+
}
|
|
74
|
+
function titleCase(input) {
|
|
75
|
+
return input
|
|
76
|
+
.split(" ")
|
|
77
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
78
|
+
.join(" ");
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=deterministic-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deterministic-provider.js","sourceRoot":"","sources":["../../src/providers/deterministic-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface ProviderChatOptions {
|
|
2
|
+
mode?: "plan" | "execute" | "report" | string;
|
|
3
|
+
metadata?: Record<string, unknown>;
|
|
4
|
+
context?: unknown;
|
|
5
|
+
[key: string]: unknown;
|
|
6
|
+
}
|
|
7
|
+
export interface ProviderClient {
|
|
8
|
+
readonly name: string;
|
|
9
|
+
chat(prompt: string, options?: ProviderChatOptions): AsyncIterable<string>;
|
|
10
|
+
}
|
|
11
|
+
export declare function collectFromStream(stream: AsyncIterable<string>): Promise<string>;
|
|
12
|
+
//# sourceMappingURL=provider-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-client.d.ts","sourceRoot":"","sources":["../../src/providers/provider-client.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;CAC5E;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAQtF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.collectFromStream = collectFromStream;
|
|
4
|
+
async function collectFromStream(stream) {
|
|
5
|
+
let result = "";
|
|
6
|
+
for await (const chunk of stream) {
|
|
7
|
+
result += chunk;
|
|
8
|
+
}
|
|
9
|
+
return result;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=provider-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-client.js","sourceRoot":"","sources":["../../src/providers/provider-client.ts"],"names":[],"mappings":";;AAYA,8CAQC;AARM,KAAK,UAAU,iBAAiB,CAAC,MAA6B;IACnE,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC;IAClB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { AgentContext, AgentEvent, AgentExecutionResult, AgentPlan, AgentStep, AgentStepStatus, AgentReport, AgentDiff } from "../types/agent";
|
|
2
|
+
import { ProviderClient } from "../providers/provider-client";
|
|
3
|
+
import { AgentEventEmitter } from "../utils/event-emitter";
|
|
4
|
+
export interface AgentTelemetry {
|
|
5
|
+
track(event: AgentEvent): void | Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export interface AgentLogger {
|
|
8
|
+
debug(...args: unknown[]): void;
|
|
9
|
+
info(...args: unknown[]): void;
|
|
10
|
+
warn(...args: unknown[]): void;
|
|
11
|
+
error(...args: unknown[]): void;
|
|
12
|
+
}
|
|
13
|
+
export interface AgentRuntimeOptions {
|
|
14
|
+
provider: ProviderClient;
|
|
15
|
+
context?: AgentContext;
|
|
16
|
+
logger?: AgentLogger;
|
|
17
|
+
telemetry?: AgentTelemetry;
|
|
18
|
+
clock?: () => number;
|
|
19
|
+
stepExecutor?: StepExecutor;
|
|
20
|
+
}
|
|
21
|
+
export interface PlanOptions {
|
|
22
|
+
context?: Partial<AgentContext>;
|
|
23
|
+
metadata?: Record<string, unknown>;
|
|
24
|
+
}
|
|
25
|
+
export interface ExecuteOptions {
|
|
26
|
+
stepExecutor?: StepExecutor;
|
|
27
|
+
metadata?: Record<string, unknown>;
|
|
28
|
+
}
|
|
29
|
+
export interface StepExecutorContext {
|
|
30
|
+
step: AgentStep;
|
|
31
|
+
plan: AgentPlan;
|
|
32
|
+
context: AgentContext;
|
|
33
|
+
metadata?: Record<string, unknown>;
|
|
34
|
+
emitEvent: (type: string, payload?: unknown) => void;
|
|
35
|
+
logger: AgentLogger;
|
|
36
|
+
}
|
|
37
|
+
export interface StepExecutorOutput {
|
|
38
|
+
status?: AgentStepStatus;
|
|
39
|
+
diff?: AgentDiff[];
|
|
40
|
+
logs?: string[];
|
|
41
|
+
metadata?: Record<string, unknown>;
|
|
42
|
+
}
|
|
43
|
+
export type StepExecutor = (context: StepExecutorContext) => Promise<StepExecutorOutput>;
|
|
44
|
+
export declare class AgentRuntime extends AgentEventEmitter {
|
|
45
|
+
private context;
|
|
46
|
+
private activePlan;
|
|
47
|
+
private executionResults;
|
|
48
|
+
private planStartedAt;
|
|
49
|
+
private executeStartedAt;
|
|
50
|
+
private readonly telemetry?;
|
|
51
|
+
private readonly logger;
|
|
52
|
+
private readonly clock;
|
|
53
|
+
private readonly provider;
|
|
54
|
+
private readonly configuredStepExecutor?;
|
|
55
|
+
constructor(options: AgentRuntimeOptions);
|
|
56
|
+
getContext(): AgentContext;
|
|
57
|
+
setContext(context: AgentContext): void;
|
|
58
|
+
updateContext(patch: Partial<AgentContext>): void;
|
|
59
|
+
getPlan(): AgentPlan | null;
|
|
60
|
+
getExecutionResults(): AgentExecutionResult[];
|
|
61
|
+
plan(goal: string, options?: PlanOptions): Promise<AgentPlan>;
|
|
62
|
+
execute(options?: ExecuteOptions): Promise<AgentExecutionResult[]>;
|
|
63
|
+
report(metadata?: Record<string, unknown>): Promise<AgentReport>;
|
|
64
|
+
private emitAgentEvent;
|
|
65
|
+
private trackTelemetry;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=AgentRuntime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentRuntime.d.ts","sourceRoot":"","sources":["../../src/runtime/AgentRuntime.ts"],"names":[],"mappings":"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"}
|