@adhd/agent-mcp 2.0.0 → 2.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.
- package/AGENTS.md +236 -0
- package/CHANGELOG.md +115 -0
- package/LICENSE +21 -0
- package/README.md +201 -0
- package/docs/architecture-and-security.md +405 -0
- package/docs/marketing/.catalog/capabilities.md +143 -0
- package/docs/marketing/.catalog/consumer.md +111 -0
- package/docs/marketing/.catalog/distribution.md +223 -0
- package/docs/marketing/.catalog/doc-conformance.md +237 -0
- package/docs/marketing/.catalog/doc-ops.md +98 -0
- package/docs/marketing/.catalog/metrics.md +119 -0
- package/docs/marketing/.catalog/required-tooling.md +224 -0
- package/docs/marketing/.catalog/review.md +164 -0
- package/docs/provider-call-audit.md +254 -0
- package/llms.txt +133 -0
- package/package.json +31 -50
- package/src/__tests__/integration/harness.d.ts +871 -39
- package/src/__tests__/integration/harness.d.ts.map +1 -1
- package/src/__tests__/integration/harness.js +93 -87
- package/src/__tests__/integration/harness.js.map +1 -1
- package/src/__tests__/integration/scripted-provider.d.ts +1 -2
- package/src/__tests__/integration/scripted-provider.d.ts.map +1 -1
- package/src/__tests__/integration/scripted-provider.js +1 -3
- package/src/__tests__/integration/scripted-provider.js.map +1 -1
- package/src/config.d.ts +6 -69
- package/src/config.d.ts.map +1 -1
- package/src/config.js +1 -50
- package/src/config.js.map +1 -1
- package/src/db/client.d.ts +1516 -2
- package/src/db/client.d.ts.map +1 -1
- package/src/db/client.js +4 -2
- package/src/db/client.js.map +1 -1
- package/src/db/migrate-runner.d.ts +0 -28
- package/src/db/migrate-runner.d.ts.map +1 -1
- package/src/db/migrate-runner.js +0 -24
- package/src/db/migrate-runner.js.map +1 -1
- package/src/db/migrate.d.ts +0 -7
- package/src/db/migrate.d.ts.map +1 -1
- package/src/db/migrate.js +0 -7
- package/src/db/migrate.js.map +1 -1
- package/src/db/schema.d.ts +0 -1260
- package/src/db/schema.d.ts.map +1 -1
- package/src/db/schema.js +2 -179
- package/src/db/schema.js.map +1 -1
- package/src/index.d.ts +4 -27
- package/src/index.d.ts.map +1 -1
- package/src/index.js +43 -114
- package/src/index.js.map +1 -1
- package/src/logger.d.ts +0 -8
- package/src/logger.d.ts.map +1 -1
- package/src/logger.js +1 -12
- package/src/logger.js.map +1 -1
- package/src/scripts/agent-mcp-tail.d.ts +3 -0
- package/src/scripts/agent-mcp-tail.d.ts.map +1 -0
- package/src/scripts/agent-mcp-tail.js +227 -0
- package/src/scripts/agent-mcp-tail.js.map +1 -0
- package/src/server.d.ts +13 -34
- package/src/server.d.ts.map +1 -1
- package/src/server.js +234 -326
- package/src/server.js.map +1 -1
- package/src/store/agent-store.d.ts +3 -16
- package/src/store/agent-store.d.ts.map +1 -1
- package/src/store/agent-store.js +38 -41
- package/src/store/agent-store.js.map +1 -1
- package/src/streaming/chat-gateway.d.ts +17 -0
- package/src/streaming/chat-gateway.d.ts.map +1 -0
- package/src/streaming/chat-gateway.js +336 -0
- package/src/streaming/chat-gateway.js.map +1 -0
- package/src/streaming/event-bus.d.ts +4 -0
- package/src/streaming/event-bus.d.ts.map +1 -1
- package/src/streaming/event-bus.js +14 -1
- package/src/streaming/event-bus.js.map +1 -1
- package/src/streaming/sse-server.d.ts +3 -14
- package/src/streaming/sse-server.d.ts.map +1 -1
- package/src/streaming/sse-server.js +37 -37
- package/src/streaming/sse-server.js.map +1 -1
- package/src/utils/load-env.d.ts +0 -14
- package/src/utils/load-env.d.ts.map +1 -1
- package/src/utils/load-env.js +0 -18
- package/src/utils/load-env.js.map +1 -1
- package/drizzle/0000_nifty_sasquatch.sql +0 -55
- package/drizzle/0001_task_usage.sql +0 -16
- package/drizzle/0002_lumpy_silver_centurion.sql +0 -2
- package/drizzle/0003_nifty_shriek.sql +0 -2
- package/drizzle/0004_brief_shocker.sql +0 -4
- package/drizzle/0005_clear_lenny_balinger.sql +0 -25
- package/drizzle/0006_composed_prompts_cache.sql +0 -24
- package/drizzle/meta/0000_snapshot.json +0 -387
- package/drizzle/meta/0001_snapshot.json +0 -495
- package/drizzle/meta/0002_snapshot.json +0 -509
- package/drizzle/meta/0003_snapshot.json +0 -523
- package/drizzle/meta/0004_snapshot.json +0 -551
- package/drizzle/meta/0005_snapshot.json +0 -545
- package/drizzle/meta/0006_snapshot.json +0 -651
- package/drizzle/meta/_journal.json +0 -55
- package/src/clients/http-client.d.ts +0 -24
- package/src/clients/http-client.d.ts.map +0 -1
- package/src/clients/http-client.js +0 -98
- package/src/clients/http-client.js.map +0 -1
- package/src/clients/in-process.d.ts +0 -27
- package/src/clients/in-process.d.ts.map +0 -1
- package/src/clients/in-process.js +0 -37
- package/src/clients/in-process.js.map +0 -1
- package/src/clients/index.d.ts +0 -7
- package/src/clients/index.d.ts.map +0 -1
- package/src/clients/index.js +0 -5
- package/src/clients/index.js.map +0 -1
- package/src/clients/registry.d.ts +0 -54
- package/src/clients/registry.d.ts.map +0 -1
- package/src/clients/registry.js +0 -164
- package/src/clients/registry.js.map +0 -1
- package/src/clients/stdio-client.d.ts +0 -16
- package/src/clients/stdio-client.d.ts.map +0 -1
- package/src/clients/stdio-client.js +0 -97
- package/src/clients/stdio-client.js.map +0 -1
- package/src/clients/tool-naming.d.ts +0 -44
- package/src/clients/tool-naming.d.ts.map +0 -1
- package/src/clients/tool-naming.js +0 -65
- package/src/clients/tool-naming.js.map +0 -1
- package/src/clients/types.d.ts +0 -18
- package/src/clients/types.d.ts.map +0 -1
- package/src/clients/types.js +0 -2
- package/src/clients/types.js.map +0 -1
- package/src/engine/dag-engine.d.ts +0 -62
- package/src/engine/dag-engine.d.ts.map +0 -1
- package/src/engine/dag-engine.js +0 -158
- package/src/engine/dag-engine.js.map +0 -1
- package/src/engine/hooks.d.ts +0 -24
- package/src/engine/hooks.d.ts.map +0 -1
- package/src/engine/hooks.js +0 -50
- package/src/engine/hooks.js.map +0 -1
- package/src/engine/orchestrator.d.ts +0 -40
- package/src/engine/orchestrator.d.ts.map +0 -1
- package/src/engine/orchestrator.js +0 -507
- package/src/engine/orchestrator.js.map +0 -1
- package/src/engine/policy.d.ts +0 -66
- package/src/engine/policy.d.ts.map +0 -1
- package/src/engine/policy.js +0 -112
- package/src/engine/policy.js.map +0 -1
- package/src/engine/prompt-resolver.d.ts +0 -89
- package/src/engine/prompt-resolver.d.ts.map +0 -1
- package/src/engine/prompt-resolver.js +0 -96
- package/src/engine/prompt-resolver.js.map +0 -1
- package/src/engine/queue.d.ts +0 -29
- package/src/engine/queue.d.ts.map +0 -1
- package/src/engine/queue.js +0 -56
- package/src/engine/queue.js.map +0 -1
- package/src/plugins/index.d.ts +0 -2
- package/src/plugins/index.d.ts.map +0 -1
- package/src/plugins/index.js +0 -2
- package/src/plugins/index.js.map +0 -1
- package/src/plugins/loader.d.ts +0 -65
- package/src/plugins/loader.d.ts.map +0 -1
- package/src/plugins/loader.js +0 -222
- package/src/plugins/loader.js.map +0 -1
- package/src/plugins/usage-plugin.d.ts +0 -27
- package/src/plugins/usage-plugin.d.ts.map +0 -1
- package/src/plugins/usage-plugin.js +0 -148
- package/src/plugins/usage-plugin.js.map +0 -1
- package/src/providers/anthropic.d.ts +0 -13
- package/src/providers/anthropic.d.ts.map +0 -1
- package/src/providers/anthropic.js +0 -260
- package/src/providers/anthropic.js.map +0 -1
- package/src/providers/claudecli.d.ts +0 -153
- package/src/providers/claudecli.d.ts.map +0 -1
- package/src/providers/claudecli.js +0 -510
- package/src/providers/claudecli.js.map +0 -1
- package/src/providers/factory.d.ts +0 -10
- package/src/providers/factory.d.ts.map +0 -1
- package/src/providers/factory.js +0 -24
- package/src/providers/factory.js.map +0 -1
- package/src/providers/index.d.ts +0 -6
- package/src/providers/index.d.ts.map +0 -1
- package/src/providers/index.js +0 -5
- package/src/providers/index.js.map +0 -1
- package/src/providers/openai.d.ts +0 -14
- package/src/providers/openai.d.ts.map +0 -1
- package/src/providers/openai.js +0 -162
- package/src/providers/openai.js.map +0 -1
- package/src/providers/types.d.ts +0 -36
- package/src/providers/types.d.ts.map +0 -1
- package/src/providers/types.js +0 -2
- package/src/providers/types.js.map +0 -1
- package/src/store/composed-prompt-store.d.ts +0 -24
- package/src/store/composed-prompt-store.d.ts.map +0 -1
- package/src/store/composed-prompt-store.js +0 -75
- package/src/store/composed-prompt-store.js.map +0 -1
- package/src/store/index.d.ts +0 -5
- package/src/store/index.d.ts.map +0 -1
- package/src/store/index.js +0 -5
- package/src/store/index.js.map +0 -1
- package/src/store/session-store.d.ts +0 -45
- package/src/store/session-store.d.ts.map +0 -1
- package/src/store/session-store.js +0 -197
- package/src/store/session-store.js.map +0 -1
- package/src/store/task-store.d.ts +0 -55
- package/src/store/task-store.d.ts.map +0 -1
- package/src/store/task-store.js +0 -186
- package/src/store/task-store.js.map +0 -1
- package/src/tools/agent-crud.d.ts +0 -15
- package/src/tools/agent-crud.d.ts.map +0 -1
- package/src/tools/agent-crud.js +0 -32
- package/src/tools/agent-crud.js.map +0 -1
- package/src/tools/session.d.ts +0 -33
- package/src/tools/session.d.ts.map +0 -1
- package/src/tools/session.js +0 -73
- package/src/tools/session.js.map +0 -1
- package/src/tools/task.d.ts +0 -86
- package/src/tools/task.d.ts.map +0 -1
- package/src/tools/task.js +0 -406
- package/src/tools/task.js.map +0 -1
- package/src/tools/usage.d.ts +0 -60
- package/src/tools/usage.d.ts.map +0 -1
- package/src/tools/usage.js +0 -174
- package/src/tools/usage.js.map +0 -1
- package/src/types/agent.d.ts +0 -2
- package/src/types/agent.d.ts.map +0 -1
- package/src/types/agent.js +0 -3
- package/src/types/agent.js.map +0 -1
- package/src/types/execution.d.ts +0 -2
- package/src/types/execution.d.ts.map +0 -1
- package/src/types/execution.js +0 -3
- package/src/types/execution.js.map +0 -1
- package/src/types/index.d.ts +0 -2
- package/src/types/index.d.ts.map +0 -1
- package/src/types/index.js +0 -2
- package/src/types/index.js.map +0 -1
- package/src/types/mcp.d.ts +0 -2
- package/src/types/mcp.d.ts.map +0 -1
- package/src/types/mcp.js +0 -3
- package/src/types/mcp.js.map +0 -1
- package/src/types/message.d.ts +0 -2
- package/src/types/message.d.ts.map +0 -1
- package/src/types/message.js +0 -3
- package/src/types/message.js.map +0 -1
- package/src/types/session.d.ts +0 -2
- package/src/types/session.d.ts.map +0 -1
- package/src/types/session.js +0 -3
- package/src/types/session.js.map +0 -1
- package/src/types/task.d.ts +0 -2
- package/src/types/task.d.ts.map +0 -1
- package/src/types/task.js +0 -3
- package/src/types/task.js.map +0 -1
- package/src/utils/ids.d.ts +0 -2
- package/src/utils/ids.d.ts.map +0 -1
- package/src/utils/ids.js +0 -5
- package/src/utils/ids.js.map +0 -1
- package/src/utils/logger.d.ts +0 -2
- package/src/utils/logger.d.ts.map +0 -1
- package/src/utils/logger.js +0 -5
- package/src/utils/logger.js.map +0 -1
- package/src/utils/timestamps.d.ts +0 -2
- package/src/utils/timestamps.d.ts.map +0 -1
- package/src/utils/timestamps.js +0 -4
- package/src/utils/timestamps.js.map +0 -1
- package/src/validation/agent.d.ts +0 -400
- package/src/validation/agent.d.ts.map +0 -1
- package/src/validation/agent.js +0 -251
- package/src/validation/agent.js.map +0 -1
- package/src/validation/agents.d.ts +0 -2
- package/src/validation/agents.d.ts.map +0 -1
- package/src/validation/agents.js +0 -3
- package/src/validation/agents.js.map +0 -1
- package/src/validation/errors.d.ts +0 -32
- package/src/validation/errors.d.ts.map +0 -1
- package/src/validation/errors.js +0 -42
- package/src/validation/errors.js.map +0 -1
- package/src/validation/execution.d.ts +0 -86
- package/src/validation/execution.d.ts.map +0 -1
- package/src/validation/execution.js +0 -28
- package/src/validation/execution.js.map +0 -1
- package/src/validation/index.d.ts +0 -9
- package/src/validation/index.d.ts.map +0 -1
- package/src/validation/index.js +0 -9
- package/src/validation/index.js.map +0 -1
- package/src/validation/mcp.d.ts +0 -42
- package/src/validation/mcp.d.ts.map +0 -1
- package/src/validation/mcp.js +0 -28
- package/src/validation/mcp.js.map +0 -1
- package/src/validation/message.d.ts +0 -43
- package/src/validation/message.d.ts.map +0 -1
- package/src/validation/message.js +0 -23
- package/src/validation/message.js.map +0 -1
- package/src/validation/session.d.ts +0 -49
- package/src/validation/session.d.ts.map +0 -1
- package/src/validation/session.js +0 -34
- package/src/validation/session.js.map +0 -1
- package/src/validation/task.d.ts +0 -146
- package/src/validation/task.d.ts.map +0 -1
- package/src/validation/task.js +0 -95
- package/src/validation/task.js.map +0 -1
- package/src/validation/tasks.d.ts +0 -2
- package/src/validation/tasks.d.ts.map +0 -1
- package/src/validation/tasks.js +0 -3
- package/src/validation/tasks.js.map +0 -1
- package/src/validation/usage.d.ts +0 -89
- package/src/validation/usage.d.ts.map +0 -1
- package/src/validation/usage.js +0 -98
- package/src/validation/usage.js.map +0 -1
package/src/plugins/loader.js
DELETED
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* External plugin loader for @adhd/agent-mcp.
|
|
3
|
-
*
|
|
4
|
-
* Discovers and loads plugins from two sources (processed in order):
|
|
5
|
-
* 1. agent-mcp config file — supports per-plugin `config` blocks with schema
|
|
6
|
-
* validation. Discovered via:
|
|
7
|
-
* a. AGENT_MCP_CONFIG env var (explicit override)
|
|
8
|
-
* b. {cwd}/agent-mcp.config.json (project-local)
|
|
9
|
-
* c. {HOME}/.agent-mcp/config.json (global user config)
|
|
10
|
-
* 2. AGENT_MCP_PLUGINS env var — comma-separated module specifiers, no options
|
|
11
|
-
* (legacy / CI shorthand).
|
|
12
|
-
*
|
|
13
|
-
* Config file format:
|
|
14
|
-
* {
|
|
15
|
-
* "plugins": [
|
|
16
|
-
* { "module": "@adhd/agent-mcp-metrics" },
|
|
17
|
-
* { "module": "@adhd/agent-mcp-budget", "config": { "maxUSD": 10 } }
|
|
18
|
-
* ]
|
|
19
|
-
* }
|
|
20
|
-
*
|
|
21
|
-
* Plugin packages must export a `createPlugin(ctx): Plugin` factory as their
|
|
22
|
-
* `default` export or as a named `createPlugin` export.
|
|
23
|
-
*
|
|
24
|
-
* Optional schema enforcement: if the plugin module exports `configSchema` with a
|
|
25
|
-
* `.safeParse()` method (Zod-compatible), the server validates the `config` block
|
|
26
|
-
* before calling the factory. The validated (coerced + defaulted) result is passed
|
|
27
|
-
* as `ctx.config`. Validation failure skips the plugin; the server continues.
|
|
28
|
-
*/
|
|
29
|
-
import { createRequire } from "node:module";
|
|
30
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
31
|
-
import { resolve } from "node:path";
|
|
32
|
-
import { homedir } from "node:os";
|
|
33
|
-
import { pathToFileURL } from "node:url";
|
|
34
|
-
import { z } from "zod";
|
|
35
|
-
import { logger } from "../logger.js";
|
|
36
|
-
import { config } from "../config.js";
|
|
37
|
-
// ── Config file schema ────────────────────────────────────────────────────────
|
|
38
|
-
const pluginEntrySchema = z.object({
|
|
39
|
-
/** npm package name or absolute file path */
|
|
40
|
-
module: z.string().min(1, "module must be a non-empty string"),
|
|
41
|
-
/** plugin-specific options validated against the plugin's own configSchema */
|
|
42
|
-
config: z.record(z.string(), z.unknown()).optional().default({}),
|
|
43
|
-
});
|
|
44
|
-
/** JSON schema for the agent-mcp.config.json file itself. */
|
|
45
|
-
export const agentMcpConfigFileSchema = z.object({
|
|
46
|
-
plugins: z.array(pluginEntrySchema).optional().default([]),
|
|
47
|
-
});
|
|
48
|
-
// ── Config file discovery ─────────────────────────────────────────────────────
|
|
49
|
-
/**
|
|
50
|
-
* Returns the path to the active agent-mcp config file, or `null` if none is
|
|
51
|
-
* found. Search order:
|
|
52
|
-
* 1. `configPathOverride` (when provided directly — used by tests)
|
|
53
|
-
* or `ADHD_AGENT_CONFIG` singleton value — absolute path to any JSON file
|
|
54
|
-
* 2. `{cwd}/agent-mcp.config.json` — project-local (next to package.json)
|
|
55
|
-
* 3. `{HOME}/.agent-mcp/config.json` — global user config
|
|
56
|
-
*
|
|
57
|
-
* @param configPathOverride — explicit path that takes priority over the
|
|
58
|
-
* singleton value; pass `null` to force "no explicit path" (skip the env
|
|
59
|
-
* lookup) without passing an actual file path.
|
|
60
|
-
*/
|
|
61
|
-
export function findConfigFile(configPathOverride) {
|
|
62
|
-
const explicit = configPathOverride !== undefined
|
|
63
|
-
? configPathOverride
|
|
64
|
-
: config.plugins.configPath;
|
|
65
|
-
if (explicit) {
|
|
66
|
-
if (!existsSync(explicit)) {
|
|
67
|
-
logger.warn({ path: explicit }, "AGENT_MCP_CONFIG points to a file that does not exist — ignoring");
|
|
68
|
-
return null;
|
|
69
|
-
}
|
|
70
|
-
return explicit;
|
|
71
|
-
}
|
|
72
|
-
const local = resolve(process.cwd(), "agent-mcp.config.json");
|
|
73
|
-
if (existsSync(local))
|
|
74
|
-
return local;
|
|
75
|
-
const global_ = resolve(homedir(), ".agent-mcp", "config.json");
|
|
76
|
-
if (existsSync(global_))
|
|
77
|
-
return global_;
|
|
78
|
-
return null;
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Reads, parses, and validates the agent-mcp config file. Returns
|
|
82
|
-
* `{ plugins: [] }` on any failure so the caller can always destructure safely.
|
|
83
|
-
*
|
|
84
|
-
* @param configPathOverride — forwarded to `findConfigFile`; used in tests.
|
|
85
|
-
*/
|
|
86
|
-
export function loadConfigFile(configPathOverride) {
|
|
87
|
-
const configPath = findConfigFile(configPathOverride);
|
|
88
|
-
if (!configPath)
|
|
89
|
-
return { plugins: [] };
|
|
90
|
-
let raw;
|
|
91
|
-
try {
|
|
92
|
-
raw = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
93
|
-
}
|
|
94
|
-
catch (err) {
|
|
95
|
-
logger.error({ configPath, err }, "Failed to read/parse agent-mcp config file — no config-file plugins will load");
|
|
96
|
-
return { plugins: [] };
|
|
97
|
-
}
|
|
98
|
-
const result = agentMcpConfigFileSchema.safeParse(raw);
|
|
99
|
-
if (!result.success) {
|
|
100
|
-
logger.error({ configPath, issues: result.error.flatten().fieldErrors }, "agent-mcp config file failed schema validation — no config-file plugins will load");
|
|
101
|
-
return { plugins: [] };
|
|
102
|
-
}
|
|
103
|
-
logger.info({ configPath, pluginCount: result.data.plugins.length }, "Loaded agent-mcp config file");
|
|
104
|
-
return result.data;
|
|
105
|
-
}
|
|
106
|
-
// ── Module resolution ─────────────────────────────────────────────────────────
|
|
107
|
-
/**
|
|
108
|
-
* Resolves a module specifier to a `file://` URL string for `import()`.
|
|
109
|
-
*
|
|
110
|
-
* - Absolute/relative paths → converted via `pathToFileURL`.
|
|
111
|
-
* - Package names → resolved via `createRequire` from `process.cwd()` first
|
|
112
|
-
* (project-local `node_modules`, works for `npx` users), then from the server
|
|
113
|
-
* binary's directory (monorepo / global installs). Throws if unresolvable.
|
|
114
|
-
*/
|
|
115
|
-
export async function resolveSpecifier(specifier) {
|
|
116
|
-
if (specifier.startsWith("/") ||
|
|
117
|
-
specifier.startsWith("./") ||
|
|
118
|
-
specifier.startsWith("../")) {
|
|
119
|
-
return pathToFileURL(resolve(specifier)).href;
|
|
120
|
-
}
|
|
121
|
-
const bases = [
|
|
122
|
-
process.cwd(),
|
|
123
|
-
new URL(".", import.meta.url).pathname,
|
|
124
|
-
];
|
|
125
|
-
for (const base of bases) {
|
|
126
|
-
try {
|
|
127
|
-
const req = createRequire(base + "/");
|
|
128
|
-
return pathToFileURL(req.resolve(specifier)).href;
|
|
129
|
-
}
|
|
130
|
-
catch {
|
|
131
|
-
// try next base
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
throw new Error(`Cannot resolve plugin "${specifier}" from cwd (${process.cwd()}) or server directory. ` +
|
|
135
|
-
`Install it in your project: npm install ${specifier}`);
|
|
136
|
-
}
|
|
137
|
-
// ── Single plugin load ────────────────────────────────────────────────────────
|
|
138
|
-
async function loadOnePlugin(hooks, db, entry) {
|
|
139
|
-
const { module: specifier, config: rawConfig } = entry;
|
|
140
|
-
// ── Resolve ───────────────────────────────────────────────────────────────
|
|
141
|
-
let resolved;
|
|
142
|
-
try {
|
|
143
|
-
resolved = await resolveSpecifier(specifier);
|
|
144
|
-
}
|
|
145
|
-
catch (err) {
|
|
146
|
-
logger.error({ specifier, err }, "Plugin resolution failed — skipping");
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
// ── Import ────────────────────────────────────────────────────────────────
|
|
150
|
-
let mod;
|
|
151
|
-
try {
|
|
152
|
-
mod = await import(resolved);
|
|
153
|
-
}
|
|
154
|
-
catch (err) {
|
|
155
|
-
logger.error({ specifier, resolved, err }, "Plugin import failed — skipping");
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
// ── Config schema validation ──────────────────────────────────────────────
|
|
159
|
-
let validatedConfig = rawConfig ?? {};
|
|
160
|
-
if (mod.configSchema && typeof mod.configSchema.safeParse === "function") {
|
|
161
|
-
const result = mod.configSchema.safeParse(rawConfig ?? {});
|
|
162
|
-
if (!result.success) {
|
|
163
|
-
const issues = result.error?.flatten?.() ?? result.error;
|
|
164
|
-
logger.error({ specifier, issues }, "Plugin config failed schema validation — skipping. " +
|
|
165
|
-
"Fix the 'config' block for this plugin in your agent-mcp config file.");
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
validatedConfig = result.data;
|
|
169
|
-
}
|
|
170
|
-
// ── Factory ───────────────────────────────────────────────────────────────
|
|
171
|
-
const factory = (mod.createPlugin ?? mod.default);
|
|
172
|
-
if (typeof factory !== "function") {
|
|
173
|
-
logger.error({ specifier }, "Plugin does not export a createPlugin factory (as default or named export) — skipping. " +
|
|
174
|
-
"Expected: export default function createPlugin(ctx): Plugin { ... }");
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
// ── Instantiate + install ─────────────────────────────────────────────────
|
|
178
|
-
let plugin;
|
|
179
|
-
try {
|
|
180
|
-
const ctx = { db, config: validatedConfig };
|
|
181
|
-
plugin = await factory(ctx);
|
|
182
|
-
}
|
|
183
|
-
catch (err) {
|
|
184
|
-
logger.error({ specifier, err }, "Plugin factory threw during instantiation — skipping");
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
try {
|
|
188
|
-
await plugin.install(hooks);
|
|
189
|
-
logger.info({ plugin: plugin.name, specifier }, "External plugin installed");
|
|
190
|
-
}
|
|
191
|
-
catch (err) {
|
|
192
|
-
logger.error({ specifier, plugin: plugin.name, err }, "Plugin install() threw — skipping");
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
// ── Public entry point ────────────────────────────────────────────────────────
|
|
196
|
-
/**
|
|
197
|
-
* Discovers and installs all external plugins. Never throws.
|
|
198
|
-
*
|
|
199
|
-
* Processing order:
|
|
200
|
-
* 1. Plugins from the agent-mcp config file (with optional validated `config` blocks).
|
|
201
|
-
* 2. Specifiers from `ADHD_AGENT_PLUGINS` (comma-separated, no per-plugin options).
|
|
202
|
-
*
|
|
203
|
-
* All failures (bad config file, unresolvable module, failed schema validation,
|
|
204
|
-
* factory errors) are logged at `error` level and skipped — a broken plugin
|
|
205
|
-
* never prevents the server from starting.
|
|
206
|
-
*
|
|
207
|
-
* @param overrides — explicit values for testability; production code omits this.
|
|
208
|
-
* `configPath` — forwarded to `findConfigFile`
|
|
209
|
-
* `pluginEntries` — explicit module list (replaces `config.plugins.entries`)
|
|
210
|
-
*/
|
|
211
|
-
export async function loadExternalPlugins(hooks, db, overrides) {
|
|
212
|
-
const configFile = loadConfigFile(overrides?.configPath);
|
|
213
|
-
const legacyEntries = (overrides?.pluginEntries ?? config.plugins.entries)
|
|
214
|
-
.map(module => ({ module, config: {} }));
|
|
215
|
-
const allEntries = [...configFile.plugins, ...legacyEntries];
|
|
216
|
-
if (allEntries.length === 0)
|
|
217
|
-
return;
|
|
218
|
-
for (const entry of allEntries) {
|
|
219
|
-
await loadOnePlugin(hooks, db, entry);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
//# sourceMappingURL=loader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/plugins/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import type { BetterSQLite3Database } from "drizzle-orm/better-sqlite3";
|
|
2
|
-
import type { IHookRegistry, Plugin } from "@adhd/agent-mcp-types";
|
|
3
|
-
/**
|
|
4
|
-
* Observational plugin that records per-task token usage into `task_usage`.
|
|
5
|
-
*
|
|
6
|
-
* Write strategy (see [inv:incremental-write]):
|
|
7
|
-
* - task:start → remember startedAt + identity in memory; no DB write.
|
|
8
|
-
* - post:model_response → UPSERT: INSERT the row on first call (is_complete=0),
|
|
9
|
-
* then accumulate input/output tokens + tool/model
|
|
10
|
-
* counts on every subsequent call. Durable across crash.
|
|
11
|
-
* - task:completed/failed/cancelled → final UPDATE: latency_ms, root_task_id,
|
|
12
|
-
* is_complete=1; drop the in-memory entry.
|
|
13
|
-
*
|
|
14
|
-
* INVARIANT [inv:plugin-no-throw]: every handler is wrapped in try/catch and logs
|
|
15
|
-
* errors silently. An observational plugin must never crash the host process.
|
|
16
|
-
*/
|
|
17
|
-
export declare class UsagePlugin implements Plugin {
|
|
18
|
-
private readonly db;
|
|
19
|
-
readonly name = "usage";
|
|
20
|
-
private readonly accumulators;
|
|
21
|
-
constructor(db: BetterSQLite3Database<any>);
|
|
22
|
-
install(hooks: IHookRegistry): void;
|
|
23
|
-
private onTaskStart;
|
|
24
|
-
private onModelResponse;
|
|
25
|
-
private onTerminal;
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=usage-plugin.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"usage-plugin.d.ts","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/plugins/usage-plugin.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAKxE,OAAO,KAAK,EACR,aAAa,EACb,MAAM,EAMT,MAAM,uBAAuB,CAAC;AAyB/B;;;;;;;;;;;;;GAaG;AACH,qBAAa,WAAY,YAAW,MAAM;IAQlC,OAAO,CAAC,QAAQ,CAAC,EAAE;IAPvB,QAAQ,CAAC,IAAI,WAAW;IAExB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;gBAK1C,EAAE,EAAE,qBAAqB,CAAC,GAAG,CAAC;IAGnD,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAQnC,OAAO,CAAC,WAAW;IAuBnB,OAAO,CAAC,eAAe;IA+DvB,OAAO,CAAC,UAAU;CA6BrB"}
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import { eq, sql } from "drizzle-orm";
|
|
2
|
-
const SEVERITY = { length: 3, tool_calls: 2, stop: 1, unknown: 0 };
|
|
3
|
-
function mostSevere(a, b) {
|
|
4
|
-
const sa = SEVERITY[a ?? ""] ?? 0;
|
|
5
|
-
const sb = SEVERITY[b ?? ""] ?? 0;
|
|
6
|
-
return sa >= sb ? (a ?? "unknown") : (b ?? "unknown");
|
|
7
|
-
}
|
|
8
|
-
import { taskUsageTable } from "../db/schema.js";
|
|
9
|
-
import { logger } from "../logger.js";
|
|
10
|
-
import { nowIso } from "../utils/timestamps.js";
|
|
11
|
-
/**
|
|
12
|
-
* Observational plugin that records per-task token usage into `task_usage`.
|
|
13
|
-
*
|
|
14
|
-
* Write strategy (see [inv:incremental-write]):
|
|
15
|
-
* - task:start → remember startedAt + identity in memory; no DB write.
|
|
16
|
-
* - post:model_response → UPSERT: INSERT the row on first call (is_complete=0),
|
|
17
|
-
* then accumulate input/output tokens + tool/model
|
|
18
|
-
* counts on every subsequent call. Durable across crash.
|
|
19
|
-
* - task:completed/failed/cancelled → final UPDATE: latency_ms, root_task_id,
|
|
20
|
-
* is_complete=1; drop the in-memory entry.
|
|
21
|
-
*
|
|
22
|
-
* INVARIANT [inv:plugin-no-throw]: every handler is wrapped in try/catch and logs
|
|
23
|
-
* errors silently. An observational plugin must never crash the host process.
|
|
24
|
-
*/
|
|
25
|
-
export class UsagePlugin {
|
|
26
|
-
db;
|
|
27
|
-
name = "usage";
|
|
28
|
-
accumulators = new Map();
|
|
29
|
-
constructor(
|
|
30
|
-
// Drizzle better-sqlite3 instance — identical to what the stores receive.
|
|
31
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
32
|
-
db) {
|
|
33
|
-
this.db = db;
|
|
34
|
-
}
|
|
35
|
-
install(hooks) {
|
|
36
|
-
hooks.register("task:start", payload => this.onTaskStart(payload));
|
|
37
|
-
hooks.register("post:model_response", payload => this.onModelResponse(payload));
|
|
38
|
-
hooks.register("task:completed", payload => this.onTerminal(payload));
|
|
39
|
-
hooks.register("task:failed", payload => this.onTerminal(payload));
|
|
40
|
-
hooks.register("task:cancelled", payload => this.onTerminal(payload));
|
|
41
|
-
}
|
|
42
|
-
onTaskStart(payload) {
|
|
43
|
-
try {
|
|
44
|
-
const { executionContext } = payload;
|
|
45
|
-
const provider = executionContext.agentDefinition.provider;
|
|
46
|
-
this.accumulators.set(executionContext.taskId, {
|
|
47
|
-
startedAt: Date.now(),
|
|
48
|
-
// rootTaskId is resolved at task-creation time and forwarded in the
|
|
49
|
-
// task:start payload — never walk the tasks DB (ephemeral tasks have
|
|
50
|
-
// no tasks row). See [inv:root-task-resolution].
|
|
51
|
-
rootTaskId: payload.rootTaskId ?? null,
|
|
52
|
-
agentName: executionContext.agentName,
|
|
53
|
-
providerType: provider.type,
|
|
54
|
-
model: ("model" in provider && provider.model) || "default",
|
|
55
|
-
mostSevereStopReason: "unknown",
|
|
56
|
-
maxTokens: ("maxTokens" in provider && typeof provider.maxTokens === "number")
|
|
57
|
-
? provider.maxTokens
|
|
58
|
-
: null,
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
catch (err) {
|
|
62
|
-
logger.error({ err }, "UsagePlugin: task:start handler failed");
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
onModelResponse(payload) {
|
|
66
|
-
try {
|
|
67
|
-
const { executionContext, tokenUsage, toolCallCount } = payload;
|
|
68
|
-
const taskId = executionContext.taskId;
|
|
69
|
-
const acc = this.accumulators.get(taskId);
|
|
70
|
-
// Tokens are undefined for claudecli — record zeros so the row still
|
|
71
|
-
// exists. See [inv:claudecli-undefined].
|
|
72
|
-
const inputTokens = tokenUsage?.inputTokens ?? 0;
|
|
73
|
-
const outputTokens = tokenUsage?.outputTokens ?? 0;
|
|
74
|
-
const toolCalls = toolCallCount ?? 0;
|
|
75
|
-
// Update most-severe stop reason in memory before writing to DB.
|
|
76
|
-
const incoming = tokenUsage?.stopReason ?? "unknown";
|
|
77
|
-
if (acc) {
|
|
78
|
-
acc.mostSevereStopReason = mostSevere(acc.mostSevereStopReason, incoming);
|
|
79
|
-
}
|
|
80
|
-
const provider = executionContext.agentDefinition.provider;
|
|
81
|
-
// UPSERT (see [inv:incremental-write]): insert on the first model
|
|
82
|
-
// response, accumulate on every subsequent one. Durable across crash.
|
|
83
|
-
this.db
|
|
84
|
-
.insert(taskUsageTable)
|
|
85
|
-
.values({
|
|
86
|
-
taskId,
|
|
87
|
-
rootTaskId: acc?.rootTaskId ?? null,
|
|
88
|
-
agentName: acc?.agentName ?? executionContext.agentName,
|
|
89
|
-
providerType: acc?.providerType ?? provider.type,
|
|
90
|
-
model: acc?.model ??
|
|
91
|
-
(("model" in provider && provider.model) || "default"),
|
|
92
|
-
inputTokens,
|
|
93
|
-
outputTokens,
|
|
94
|
-
toolCallCount: toolCalls,
|
|
95
|
-
modelCalls: 1,
|
|
96
|
-
latencyMs: 0,
|
|
97
|
-
isComplete: 0,
|
|
98
|
-
stopReason: acc?.mostSevereStopReason ?? incoming,
|
|
99
|
-
maxTokens: acc?.maxTokens ?? null,
|
|
100
|
-
cacheReadTokens: tokenUsage?.cacheReadTokens ?? null,
|
|
101
|
-
cacheCreationTokens: tokenUsage?.cacheCreationTokens ?? null,
|
|
102
|
-
createdAt: nowIso(),
|
|
103
|
-
})
|
|
104
|
-
.onConflictDoUpdate({
|
|
105
|
-
target: taskUsageTable.taskId,
|
|
106
|
-
set: {
|
|
107
|
-
inputTokens: sql `${taskUsageTable.inputTokens} + ${inputTokens}`,
|
|
108
|
-
outputTokens: sql `${taskUsageTable.outputTokens} + ${outputTokens}`,
|
|
109
|
-
toolCallCount: sql `${taskUsageTable.toolCallCount} + ${toolCalls}`,
|
|
110
|
-
modelCalls: sql `${taskUsageTable.modelCalls} + 1`,
|
|
111
|
-
stopReason: acc?.mostSevereStopReason ?? incoming,
|
|
112
|
-
cacheReadTokens: sql `COALESCE(${taskUsageTable.cacheReadTokens}, 0) + ${tokenUsage?.cacheReadTokens ?? 0}`,
|
|
113
|
-
cacheCreationTokens: sql `COALESCE(${taskUsageTable.cacheCreationTokens}, 0) + ${tokenUsage?.cacheCreationTokens ?? 0}`,
|
|
114
|
-
// maxTokens deliberately OMITTED from SET — constant per task
|
|
115
|
-
},
|
|
116
|
-
})
|
|
117
|
-
.run();
|
|
118
|
-
}
|
|
119
|
-
catch (err) {
|
|
120
|
-
logger.error({ err }, "UsagePlugin: post:model_response handler failed");
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
onTerminal(payload) {
|
|
124
|
-
try {
|
|
125
|
-
const taskId = payload.executionContext.taskId;
|
|
126
|
-
const acc = this.accumulators.get(taskId);
|
|
127
|
-
// If no post:model_response ever fired there is no row to finalise —
|
|
128
|
-
// the task consumed zero tokens (cancelled before first model call).
|
|
129
|
-
// The UPDATE simply affects zero rows, which is correct.
|
|
130
|
-
const latencyMs = acc ? Date.now() - acc.startedAt : 0;
|
|
131
|
-
const rootTaskId = acc?.rootTaskId ?? payload.executionContext.rootTaskId ?? null;
|
|
132
|
-
this.db
|
|
133
|
-
.update(taskUsageTable)
|
|
134
|
-
.set({
|
|
135
|
-
latencyMs,
|
|
136
|
-
rootTaskId,
|
|
137
|
-
isComplete: 1,
|
|
138
|
-
})
|
|
139
|
-
.where(eq(taskUsageTable.taskId, taskId))
|
|
140
|
-
.run();
|
|
141
|
-
this.accumulators.delete(taskId);
|
|
142
|
-
}
|
|
143
|
-
catch (err) {
|
|
144
|
-
logger.error({ err }, "UsagePlugin: terminal handler failed");
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
//# sourceMappingURL=usage-plugin.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"usage-plugin.js","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/plugins/usage-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { ProviderConfig } from "../validation/index.js";
|
|
2
|
-
import type { LLMProvider, ProviderChatRequest, ProviderChatResponse } from "./types.js";
|
|
3
|
-
export declare class AnthropicProvider implements LLMProvider {
|
|
4
|
-
private readonly client;
|
|
5
|
-
private readonly providerConfig;
|
|
6
|
-
/** True when the resolved secret is a sk-ant-oat… OAuth token. */
|
|
7
|
-
private readonly useOauthIdentity;
|
|
8
|
-
constructor(providerConfig: Extract<ProviderConfig, {
|
|
9
|
-
type: "anthropic";
|
|
10
|
-
}>);
|
|
11
|
-
chat(request: ProviderChatRequest): Promise<ProviderChatResponse>;
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/providers/anthropic.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAqB,MAAM,wBAAwB,CAAC;AAKhF,OAAO,KAAK,EACR,WAAW,EACX,mBAAmB,EACnB,oBAAoB,EAEvB,MAAM,YAAY,CAAC;AAsJpB,qBAAa,iBAAkB,YAAW,WAAW;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiD;IAChF,kEAAkE;IAClE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;gBAE/B,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE;QAAE,IAAI,EAAE,WAAW,CAAA;KAAE,CAAC;IA+BpE,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;CA0H1E"}
|