@adhd/agent-engine-orchestrator 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/package.json +64 -0
- package/src/clients/http-client.d.ts +24 -0
- package/src/clients/http-client.d.ts.map +1 -0
- package/src/clients/http-client.js +96 -0
- package/src/clients/http-client.js.map +1 -0
- package/src/clients/in-process.d.ts +19 -0
- package/src/clients/in-process.d.ts.map +1 -0
- package/src/clients/in-process.js +25 -0
- package/src/clients/in-process.js.map +1 -0
- package/src/clients/index.d.ts +9 -0
- package/src/clients/index.d.ts.map +1 -0
- package/src/clients/index.js +6 -0
- package/src/clients/index.js.map +1 -0
- package/src/clients/registry.d.ts +30 -0
- package/src/clients/registry.d.ts.map +1 -0
- package/src/clients/registry.js +173 -0
- package/src/clients/registry.js.map +1 -0
- package/src/clients/stdio-client.d.ts +19 -0
- package/src/clients/stdio-client.d.ts.map +1 -0
- package/src/clients/stdio-client.js +91 -0
- package/src/clients/stdio-client.js.map +1 -0
- package/src/clients/tool-naming.d.ts +8 -0
- package/src/clients/tool-naming.d.ts.map +1 -0
- package/src/clients/tool-naming.js +26 -0
- package/src/clients/tool-naming.js.map +1 -0
- package/src/clients/types.d.ts +7 -0
- package/src/clients/types.d.ts.map +1 -0
- package/src/clients/types.js +2 -0
- package/src/clients/types.js.map +1 -0
- package/src/engine/context-window.d.ts +74 -0
- package/src/engine/context-window.d.ts.map +1 -0
- package/src/engine/context-window.js +156 -0
- package/src/engine/context-window.js.map +1 -0
- package/src/engine/dag-engine.d.ts +69 -0
- package/src/engine/dag-engine.d.ts.map +1 -0
- package/src/engine/dag-engine.js +103 -0
- package/src/engine/dag-engine.js.map +1 -0
- package/src/engine/hooks.d.ts +10 -0
- package/src/engine/hooks.d.ts.map +1 -0
- package/src/engine/hooks.js +39 -0
- package/src/engine/hooks.js.map +1 -0
- package/src/engine/orchestrator.d.ts +59 -0
- package/src/engine/orchestrator.d.ts.map +1 -0
- package/src/engine/orchestrator.js +665 -0
- package/src/engine/orchestrator.js.map +1 -0
- package/src/engine/policy.d.ts +22 -0
- package/src/engine/policy.d.ts.map +1 -0
- package/src/engine/policy.js +73 -0
- package/src/engine/policy.js.map +1 -0
- package/src/engine/prompt-resolver.d.ts +24 -0
- package/src/engine/prompt-resolver.d.ts.map +1 -0
- package/src/engine/prompt-resolver.js +55 -0
- package/src/engine/prompt-resolver.js.map +1 -0
- package/src/engine/queue.d.ts +12 -0
- package/src/engine/queue.d.ts.map +1 -0
- package/src/engine/queue.js +31 -0
- package/src/engine/queue.js.map +1 -0
- package/src/engine/tool-advertisement.d.ts +5 -0
- package/src/engine/tool-advertisement.d.ts.map +1 -0
- package/src/engine/tool-advertisement.js +70 -0
- package/src/engine/tool-advertisement.js.map +1 -0
- package/src/index.d.ts +50 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +39 -0
- package/src/index.js.map +1 -0
- package/src/interfaces.d.ts +70 -0
- package/src/interfaces.d.ts.map +1 -0
- package/src/interfaces.js +9 -0
- package/src/interfaces.js.map +1 -0
- package/src/plugins/index.d.ts +4 -0
- package/src/plugins/index.d.ts.map +1 -0
- package/src/plugins/index.js +3 -0
- package/src/plugins/index.js.map +1 -0
- package/src/plugins/loader.d.ts +47 -0
- package/src/plugins/loader.d.ts.map +1 -0
- package/src/plugins/loader.js +174 -0
- package/src/plugins/loader.js.map +1 -0
- package/src/plugins/usage-plugin.d.ts +15 -0
- package/src/plugins/usage-plugin.d.ts.map +1 -0
- package/src/plugins/usage-plugin.js +140 -0
- package/src/plugins/usage-plugin.js.map +1 -0
- package/src/providers/anthropic.d.ts +35 -0
- package/src/providers/anthropic.d.ts.map +1 -0
- package/src/providers/anthropic.js +244 -0
- package/src/providers/anthropic.js.map +1 -0
- package/src/providers/claudecli.d.ts +36 -0
- package/src/providers/claudecli.d.ts.map +1 -0
- package/src/providers/claudecli.js +324 -0
- package/src/providers/claudecli.js.map +1 -0
- package/src/providers/factory.d.ts +5 -0
- package/src/providers/factory.d.ts.map +1 -0
- package/src/providers/factory.js +18 -0
- package/src/providers/factory.js.map +1 -0
- package/src/providers/index.d.ts +6 -0
- package/src/providers/index.d.ts.map +1 -0
- package/src/providers/index.js +5 -0
- package/src/providers/index.js.map +1 -0
- package/src/providers/openai.d.ts +30 -0
- package/src/providers/openai.d.ts.map +1 -0
- package/src/providers/openai.js +177 -0
- package/src/providers/openai.js.map +1 -0
- package/src/providers/types.d.ts +22 -0
- package/src/providers/types.d.ts.map +1 -0
- package/src/providers/types.js +2 -0
- package/src/providers/types.js.map +1 -0
- package/src/tools/agent-crud.d.ts +29 -0
- package/src/tools/agent-crud.d.ts.map +1 -0
- package/src/tools/agent-crud.js +28 -0
- package/src/tools/agent-crud.js.map +1 -0
- package/src/tools/session.d.ts +35 -0
- package/src/tools/session.d.ts.map +1 -0
- package/src/tools/session.js +52 -0
- package/src/tools/session.js.map +1 -0
- package/src/tools/task.d.ts +94 -0
- package/src/tools/task.d.ts.map +1 -0
- package/src/tools/task.js +336 -0
- package/src/tools/task.js.map +1 -0
- package/src/tools/usage.d.ts +19 -0
- package/src/tools/usage.d.ts.map +1 -0
- package/src/tools/usage.js +152 -0
- package/src/tools/usage.js.map +1 -0
- package/src/utils/ids.d.ts +2 -0
- package/src/utils/ids.d.ts.map +1 -0
- package/src/utils/ids.js +5 -0
- package/src/utils/ids.js.map +1 -0
- package/src/utils/timestamps.d.ts +2 -0
- package/src/utils/timestamps.d.ts.map +1 -0
- package/src/utils/timestamps.js +4 -0
- package/src/utils/timestamps.js.map +1 -0
- package/src/validation/agent.d.ts +556 -0
- package/src/validation/agent.d.ts.map +1 -0
- package/src/validation/agent.js +175 -0
- package/src/validation/agent.js.map +1 -0
- package/src/validation/agents.d.ts +2 -0
- package/src/validation/agents.d.ts.map +1 -0
- package/src/validation/agents.js +3 -0
- package/src/validation/agents.js.map +1 -0
- package/src/validation/errors.d.ts +32 -0
- package/src/validation/errors.d.ts.map +1 -0
- package/src/validation/errors.js +34 -0
- package/src/validation/errors.js.map +1 -0
- package/src/validation/execution.d.ts +101 -0
- package/src/validation/execution.d.ts.map +1 -0
- package/src/validation/execution.js +14 -0
- package/src/validation/execution.js.map +1 -0
- package/src/validation/index.d.ts +9 -0
- package/src/validation/index.d.ts.map +1 -0
- package/src/validation/index.js +9 -0
- package/src/validation/index.js.map +1 -0
- package/src/validation/mcp.d.ts +54 -0
- package/src/validation/mcp.d.ts.map +1 -0
- package/src/validation/mcp.js +33 -0
- package/src/validation/mcp.js.map +1 -0
- package/src/validation/message.d.ts +43 -0
- package/src/validation/message.d.ts.map +1 -0
- package/src/validation/message.js +28 -0
- package/src/validation/message.js.map +1 -0
- package/src/validation/session.d.ts +49 -0
- package/src/validation/session.d.ts.map +1 -0
- package/src/validation/session.js +32 -0
- package/src/validation/session.js.map +1 -0
- package/src/validation/task.d.ts +156 -0
- package/src/validation/task.d.ts.map +1 -0
- package/src/validation/task.js +84 -0
- package/src/validation/task.js.map +1 -0
- package/src/validation/tasks.d.ts +2 -0
- package/src/validation/tasks.d.ts.map +1 -0
- package/src/validation/tasks.js +3 -0
- package/src/validation/tasks.js.map +1 -0
- package/src/validation/usage.d.ts +75 -0
- package/src/validation/usage.d.ts.map +1 -0
- package/src/validation/usage.js +51 -0
- package/src/validation/usage.js.map +1 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { EngineLogger } from '../interfaces.js';
|
|
3
|
+
import type { IHookRegistry } from '@adhd/agent-base-types';
|
|
4
|
+
declare const pluginEntrySchema: z.ZodObject<{
|
|
5
|
+
module: z.ZodString;
|
|
6
|
+
config: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
7
|
+
}, z.core.$strip>;
|
|
8
|
+
export declare const agentMcpConfigFileSchema: z.ZodObject<{
|
|
9
|
+
plugins: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
10
|
+
module: z.ZodString;
|
|
11
|
+
config: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
12
|
+
}, z.core.$strip>>>>;
|
|
13
|
+
}, z.core.$strip>;
|
|
14
|
+
export type AgentMcpConfigFile = z.infer<typeof agentMcpConfigFileSchema>;
|
|
15
|
+
export type PluginEntry = z.infer<typeof pluginEntrySchema>;
|
|
16
|
+
/**
|
|
17
|
+
* Find the active agent-mcp config file.
|
|
18
|
+
* @param configPathOverride — explicit path; pass null/undefined to skip.
|
|
19
|
+
* @param configPathFromEnv — config.plugins.configPath value (injected instead of importing config).
|
|
20
|
+
* @param logger — injected logger.
|
|
21
|
+
*/
|
|
22
|
+
export declare function findConfigFile(configPathOverride: string | null | undefined, configPathFromEnv: string | undefined, logger?: EngineLogger): string | null;
|
|
23
|
+
/**
|
|
24
|
+
* Read, parse, and validate the agent-mcp config file.
|
|
25
|
+
* @param configPathOverride — forwarded to findConfigFile
|
|
26
|
+
* @param configPathFromEnv — config.plugins.configPath injection
|
|
27
|
+
* @param logger — injected logger
|
|
28
|
+
*/
|
|
29
|
+
export declare function loadConfigFile(configPathOverride: string | null | undefined, configPathFromEnv: string | undefined, logger?: EngineLogger): AgentMcpConfigFile;
|
|
30
|
+
export declare function resolveSpecifier(specifier: string): Promise<string>;
|
|
31
|
+
/**
|
|
32
|
+
* Discovers and installs all external plugins. Never throws.
|
|
33
|
+
*
|
|
34
|
+
* @param hooks — hook registry
|
|
35
|
+
* @param db — database handle
|
|
36
|
+
* @param overrides — explicit values for testability
|
|
37
|
+
* `configPath` — forwarded to findConfigFile
|
|
38
|
+
* `pluginEntries` — explicit module list (replaces config.plugins.entries)
|
|
39
|
+
* @param configPathFromEnv — config.plugins.configPath injection
|
|
40
|
+
* @param logger — injected logger
|
|
41
|
+
*/
|
|
42
|
+
export declare function loadExternalPlugins(hooks: IHookRegistry, db: unknown, overrides?: {
|
|
43
|
+
configPath?: string | null;
|
|
44
|
+
pluginEntries?: string[];
|
|
45
|
+
}, configPathFromEnv?: string, pluginEntriesFromEnv?: string[], logger?: EngineLogger): Promise<void>;
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../../../packages/agent/agent-engine-orchestrator/src/plugins/loader.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EACV,aAAa,EAId,MAAM,wBAAwB,CAAC;AAIhC,QAAA,MAAM,iBAAiB;;;iBAGrB,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;iBAEnC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAuB5D;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,kBAAkB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC7C,iBAAiB,EAAE,MAAM,GAAG,SAAS,EACrC,MAAM,CAAC,EAAE,YAAY,GACpB,MAAM,GAAG,IAAI,CAkCf;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,kBAAkB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC7C,iBAAiB,EAAE,MAAM,GAAG,SAAS,EACrC,MAAM,CAAC,EAAE,YAAY,GACpB,kBAAkB,CA8BpB;AAID,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBzE;AAqFD;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,aAAa,EACpB,EAAE,EAAE,OAAO,EACX,SAAS,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,EACpE,iBAAiB,CAAC,EAAE,MAAM,EAC1B,oBAAoB,CAAC,EAAE,MAAM,EAAE,EAC/B,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC,CAcf"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { resolve } from 'node:path';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
import { pathToFileURL } from 'node:url';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
// ── Config file schema ────────────────────────────────────────────────────────
|
|
8
|
+
const pluginEntrySchema = z.object({
|
|
9
|
+
module: z.string().min(1, 'module must be a non-empty string'),
|
|
10
|
+
config: z.record(z.string(), z.unknown()).optional().default({}),
|
|
11
|
+
});
|
|
12
|
+
export const agentMcpConfigFileSchema = z.object({
|
|
13
|
+
plugins: z.array(pluginEntrySchema).optional().default([]),
|
|
14
|
+
});
|
|
15
|
+
// ── Config file discovery ─────────────────────────────────────────────────────
|
|
16
|
+
/**
|
|
17
|
+
* Find the active agent-mcp config file.
|
|
18
|
+
* @param configPathOverride — explicit path; pass null/undefined to skip.
|
|
19
|
+
* @param configPathFromEnv — config.plugins.configPath value (injected instead of importing config).
|
|
20
|
+
* @param logger — injected logger.
|
|
21
|
+
*/
|
|
22
|
+
export function findConfigFile(configPathOverride, configPathFromEnv, logger) {
|
|
23
|
+
const log = logger ?? { info: () => { }, warn: () => { }, error: () => { }, debug: () => { } };
|
|
24
|
+
const explicit = configPathOverride !== undefined
|
|
25
|
+
? configPathOverride
|
|
26
|
+
: configPathFromEnv;
|
|
27
|
+
if (explicit) {
|
|
28
|
+
if (!existsSync(explicit)) {
|
|
29
|
+
log.warn({ path: explicit }, 'AGENT_MCP_CONFIG points to a file that does not exist — ignoring');
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
return explicit;
|
|
33
|
+
}
|
|
34
|
+
const local = resolve(process.cwd(), 'agent-mcp.config.json');
|
|
35
|
+
if (existsSync(local))
|
|
36
|
+
return local;
|
|
37
|
+
const nested = resolve(process.cwd(), '.adhd', 'agent-mcp', 'config.json');
|
|
38
|
+
if (existsSync(nested))
|
|
39
|
+
return nested;
|
|
40
|
+
const globalAdhd = resolve(homedir(), '.adhd', 'agent-mcp', 'config.json');
|
|
41
|
+
if (existsSync(globalAdhd))
|
|
42
|
+
return globalAdhd;
|
|
43
|
+
// Back-compat: the published 2.0.1 loader used ~/.agent-mcp/config.json. The engine
|
|
44
|
+
// refactor moved the global path under ~/.adhd/ and stopped checking the old one, so a
|
|
45
|
+
// user's existing global plugin config would silently stop loading. Keep honouring it.
|
|
46
|
+
// See BUG-ORCH-014.
|
|
47
|
+
const globalLegacy = resolve(homedir(), '.agent-mcp', 'config.json');
|
|
48
|
+
if (existsSync(globalLegacy))
|
|
49
|
+
return globalLegacy;
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Read, parse, and validate the agent-mcp config file.
|
|
54
|
+
* @param configPathOverride — forwarded to findConfigFile
|
|
55
|
+
* @param configPathFromEnv — config.plugins.configPath injection
|
|
56
|
+
* @param logger — injected logger
|
|
57
|
+
*/
|
|
58
|
+
export function loadConfigFile(configPathOverride, configPathFromEnv, logger) {
|
|
59
|
+
const log = logger ?? { info: () => { }, warn: () => { }, error: () => { }, debug: () => { } };
|
|
60
|
+
const configPath = findConfigFile(configPathOverride, configPathFromEnv, logger);
|
|
61
|
+
if (!configPath)
|
|
62
|
+
return { plugins: [] };
|
|
63
|
+
let raw;
|
|
64
|
+
try {
|
|
65
|
+
raw = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
log.error({ configPath, err }, 'Failed to read/parse agent-mcp config file — no config-file plugins will load');
|
|
69
|
+
return { plugins: [] };
|
|
70
|
+
}
|
|
71
|
+
const result = agentMcpConfigFileSchema.safeParse(raw);
|
|
72
|
+
if (!result.success) {
|
|
73
|
+
log.error({ configPath, issues: result.error.flatten().fieldErrors }, 'agent-mcp config file failed schema validation — no config-file plugins will load');
|
|
74
|
+
return { plugins: [] };
|
|
75
|
+
}
|
|
76
|
+
log.info({ configPath, pluginCount: result.data.plugins.length }, 'Loaded agent-mcp config file');
|
|
77
|
+
return result.data;
|
|
78
|
+
}
|
|
79
|
+
// ── Module resolution ─────────────────────────────────────────────────────────
|
|
80
|
+
export async function resolveSpecifier(specifier) {
|
|
81
|
+
if (specifier.startsWith('/') ||
|
|
82
|
+
specifier.startsWith('./') ||
|
|
83
|
+
specifier.startsWith('../')) {
|
|
84
|
+
return pathToFileURL(resolve(specifier)).href;
|
|
85
|
+
}
|
|
86
|
+
const bases = [process.cwd(), new URL('.', import.meta.url).pathname];
|
|
87
|
+
for (const base of bases) {
|
|
88
|
+
try {
|
|
89
|
+
const req = createRequire(base + '/');
|
|
90
|
+
return pathToFileURL(req.resolve(specifier)).href;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// try next base
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
throw new Error(`Cannot resolve plugin "${specifier}" from cwd (${process.cwd()}) or server directory. ` +
|
|
97
|
+
`Install it in your project: npm install ${specifier}`);
|
|
98
|
+
}
|
|
99
|
+
// ── Single plugin load ────────────────────────────────────────────────────────
|
|
100
|
+
async function loadOnePlugin(hooks, db, entry, logger) {
|
|
101
|
+
const { module: specifier, config: rawConfig } = entry;
|
|
102
|
+
let resolved;
|
|
103
|
+
try {
|
|
104
|
+
resolved = await resolveSpecifier(specifier);
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
logger.error({ specifier, err }, 'Plugin resolution failed — skipping');
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
let mod;
|
|
111
|
+
try {
|
|
112
|
+
mod = (await import(resolved));
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
logger.error({ specifier, resolved, err }, 'Plugin import failed — skipping');
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
let validatedConfig = rawConfig ?? {};
|
|
119
|
+
if (mod.configSchema && typeof mod.configSchema.safeParse === 'function') {
|
|
120
|
+
const result = mod.configSchema.safeParse(rawConfig ?? {});
|
|
121
|
+
if (!result.success) {
|
|
122
|
+
const issues = result.error?.flatten?.() ?? result.error;
|
|
123
|
+
logger.error({ specifier, issues }, 'Plugin config failed schema validation — skipping. ' +
|
|
124
|
+
"Fix the 'config' block for this plugin in your agent-mcp config file.");
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
validatedConfig = result.data;
|
|
128
|
+
}
|
|
129
|
+
const factory = (mod.createPlugin ?? mod.default);
|
|
130
|
+
if (typeof factory !== 'function') {
|
|
131
|
+
logger.error({ specifier }, 'Plugin does not export a createPlugin factory (as default or named export) — skipping. ' +
|
|
132
|
+
'Expected: export default function createPlugin(ctx): Plugin { ... }');
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
let plugin;
|
|
136
|
+
try {
|
|
137
|
+
const ctx = { db, config: validatedConfig };
|
|
138
|
+
plugin = await factory(ctx);
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
logger.error({ specifier, err }, 'Plugin factory threw during instantiation — skipping');
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
await plugin.install(hooks);
|
|
146
|
+
logger.info({ plugin: plugin.name, specifier }, 'External plugin installed');
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
logger.error({ specifier, plugin: plugin.name, err }, 'Plugin install() threw — skipping');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Discovers and installs all external plugins. Never throws.
|
|
154
|
+
*
|
|
155
|
+
* @param hooks — hook registry
|
|
156
|
+
* @param db — database handle
|
|
157
|
+
* @param overrides — explicit values for testability
|
|
158
|
+
* `configPath` — forwarded to findConfigFile
|
|
159
|
+
* `pluginEntries` — explicit module list (replaces config.plugins.entries)
|
|
160
|
+
* @param configPathFromEnv — config.plugins.configPath injection
|
|
161
|
+
* @param logger — injected logger
|
|
162
|
+
*/
|
|
163
|
+
export async function loadExternalPlugins(hooks, db, overrides, configPathFromEnv, pluginEntriesFromEnv, logger) {
|
|
164
|
+
const log = logger ?? { info: () => { }, warn: () => { }, error: () => { }, debug: () => { } };
|
|
165
|
+
const configFile = loadConfigFile(overrides?.configPath, configPathFromEnv, logger);
|
|
166
|
+
const legacyEntries = (overrides?.pluginEntries ?? pluginEntriesFromEnv ?? []).map((module) => ({ module, config: {} }));
|
|
167
|
+
const allEntries = [...configFile.plugins, ...legacyEntries];
|
|
168
|
+
if (allEntries.length === 0)
|
|
169
|
+
return;
|
|
170
|
+
for (const entry of allEntries) {
|
|
171
|
+
await loadOnePlugin(hooks, db, entry, log);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../../../../packages/agent/agent-engine-orchestrator/src/plugins/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { BetterSQLite3Database } from 'drizzle-orm/better-sqlite3';
|
|
2
|
+
import type { EngineLogger } from '../interfaces.js';
|
|
3
|
+
import type { IHookRegistry, Plugin } from '@adhd/agent-base-types';
|
|
4
|
+
export declare class UsagePlugin implements Plugin {
|
|
5
|
+
private readonly db;
|
|
6
|
+
readonly name = "usage";
|
|
7
|
+
private readonly accumulators;
|
|
8
|
+
private readonly logger;
|
|
9
|
+
constructor(db: BetterSQLite3Database<any>, logger?: EngineLogger);
|
|
10
|
+
install(hooks: IHookRegistry): void;
|
|
11
|
+
private onTaskStart;
|
|
12
|
+
private onModelResponse;
|
|
13
|
+
private onTerminal;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=usage-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-plugin.d.ts","sourceRoot":"","sources":["../../../../../../packages/agent/agent-engine-orchestrator/src/plugins/usage-plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAIxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EACV,aAAa,EACb,MAAM,EAMP,MAAM,wBAAwB,CAAC;AA2BhC,qBAAa,WAAY,YAAW,MAAM;IAQtC,OAAO,CAAC,QAAQ,CAAC,EAAE;IAPrB,QAAQ,CAAC,IAAI,WAAW;IAExB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAC/D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAInB,EAAE,EAAE,qBAAqB,CAAC,GAAG,CAAC,EAC/C,MAAM,CAAC,EAAE,YAAY;IAKvB,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAUnC,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,eAAe;IAqFvB,OAAO,CAAC,UAAU;CA0BnB"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { eq, sql } from 'drizzle-orm';
|
|
2
|
+
import { taskUsageTable } from "@adhd/agent-store-runtime";
|
|
3
|
+
import { nowIso } from '../utils/timestamps.js';
|
|
4
|
+
const SEVERITY = {
|
|
5
|
+
length: 3,
|
|
6
|
+
tool_calls: 2,
|
|
7
|
+
stop: 1,
|
|
8
|
+
unknown: 0,
|
|
9
|
+
};
|
|
10
|
+
function mostSevere(a, b) {
|
|
11
|
+
const sa = SEVERITY[a ?? ''] ?? 0;
|
|
12
|
+
const sb = SEVERITY[b ?? ''] ?? 0;
|
|
13
|
+
return sa >= sb ? a ?? 'unknown' : b ?? 'unknown';
|
|
14
|
+
}
|
|
15
|
+
export class UsagePlugin {
|
|
16
|
+
db;
|
|
17
|
+
name = 'usage';
|
|
18
|
+
accumulators = new Map();
|
|
19
|
+
logger;
|
|
20
|
+
constructor(
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
22
|
+
db, logger) {
|
|
23
|
+
this.db = db;
|
|
24
|
+
this.logger = logger ?? { info: () => { }, warn: () => { }, error: () => { }, debug: () => { } };
|
|
25
|
+
}
|
|
26
|
+
install(hooks) {
|
|
27
|
+
hooks.register('task:start', (payload) => this.onTaskStart(payload));
|
|
28
|
+
hooks.register('post:model_response', (payload) => this.onModelResponse(payload));
|
|
29
|
+
hooks.register('task:completed', (payload) => this.onTerminal(payload));
|
|
30
|
+
hooks.register('task:failed', (payload) => this.onTerminal(payload));
|
|
31
|
+
hooks.register('task:cancelled', (payload) => this.onTerminal(payload));
|
|
32
|
+
}
|
|
33
|
+
onTaskStart(payload) {
|
|
34
|
+
try {
|
|
35
|
+
const { executionContext } = payload;
|
|
36
|
+
const provider = executionContext.agentDefinition.provider;
|
|
37
|
+
this.accumulators.set(executionContext.taskId, {
|
|
38
|
+
startedAt: Date.now(),
|
|
39
|
+
rootTaskId: payload.rootTaskId ?? null,
|
|
40
|
+
agentName: executionContext.agentName,
|
|
41
|
+
providerType: provider.type,
|
|
42
|
+
model: ('model' in provider && provider.model) || 'default',
|
|
43
|
+
mostSevereStopReason: 'unknown',
|
|
44
|
+
maxTokens: 'maxTokens' in provider && typeof provider.maxTokens === 'number'
|
|
45
|
+
? provider.maxTokens
|
|
46
|
+
: null,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
this.logger.error({ err }, 'UsagePlugin: task:start handler failed');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
onModelResponse(payload) {
|
|
54
|
+
try {
|
|
55
|
+
const { executionContext, tokenUsage, toolCallCount } = payload;
|
|
56
|
+
const taskId = executionContext.taskId;
|
|
57
|
+
const acc = this.accumulators.get(taskId);
|
|
58
|
+
const inputTokens = tokenUsage?.inputTokens ?? 0;
|
|
59
|
+
const outputTokens = tokenUsage?.outputTokens ?? 0;
|
|
60
|
+
const toolCalls = toolCallCount ?? 0;
|
|
61
|
+
const incoming = tokenUsage?.stopReason ?? 'unknown';
|
|
62
|
+
if (acc) {
|
|
63
|
+
acc.mostSevereStopReason = mostSevere(acc.mostSevereStopReason, incoming);
|
|
64
|
+
}
|
|
65
|
+
const provider = executionContext.agentDefinition.provider;
|
|
66
|
+
this.db
|
|
67
|
+
.insert(taskUsageTable)
|
|
68
|
+
.values({
|
|
69
|
+
taskId,
|
|
70
|
+
rootTaskId: acc?.rootTaskId ?? null,
|
|
71
|
+
agentName: acc?.agentName ?? executionContext.agentName,
|
|
72
|
+
providerType: acc?.providerType ?? provider.type,
|
|
73
|
+
model: acc?.model ??
|
|
74
|
+
(('model' in provider && provider.model) || 'default'),
|
|
75
|
+
inputTokens,
|
|
76
|
+
outputTokens,
|
|
77
|
+
toolCallCount: toolCalls,
|
|
78
|
+
modelCalls: 1,
|
|
79
|
+
latencyMs: 0,
|
|
80
|
+
isComplete: 0,
|
|
81
|
+
stopReason: acc?.mostSevereStopReason ?? incoming,
|
|
82
|
+
maxTokens: acc?.maxTokens ?? null,
|
|
83
|
+
cacheReadTokens: tokenUsage?.cacheReadTokens ?? null,
|
|
84
|
+
cacheCreationTokens: tokenUsage?.cacheCreationTokens ?? null,
|
|
85
|
+
uncachedInputTokens: tokenUsage?.uncachedInputTokens ?? null,
|
|
86
|
+
reasoningTokens: tokenUsage?.reasoningTokens ?? null,
|
|
87
|
+
// First call for this task: its input IS the peak so far.
|
|
88
|
+
peakContextTokens: inputTokens,
|
|
89
|
+
peakContextAt: 1,
|
|
90
|
+
createdAt: nowIso(),
|
|
91
|
+
})
|
|
92
|
+
.onConflictDoUpdate({
|
|
93
|
+
target: taskUsageTable.taskId,
|
|
94
|
+
set: {
|
|
95
|
+
inputTokens: sql `${taskUsageTable.inputTokens} + ${inputTokens}`,
|
|
96
|
+
outputTokens: sql `${taskUsageTable.outputTokens} + ${outputTokens}`,
|
|
97
|
+
toolCallCount: sql `${taskUsageTable.toolCallCount} + ${toolCalls}`,
|
|
98
|
+
modelCalls: sql `${taskUsageTable.modelCalls} + 1`,
|
|
99
|
+
stopReason: acc?.mostSevereStopReason ?? incoming,
|
|
100
|
+
cacheReadTokens: sql `COALESCE(${taskUsageTable.cacheReadTokens}, 0) + ${tokenUsage?.cacheReadTokens ?? 0}`,
|
|
101
|
+
cacheCreationTokens: sql `COALESCE(${taskUsageTable.cacheCreationTokens}, 0) + ${tokenUsage?.cacheCreationTokens ?? 0}`,
|
|
102
|
+
uncachedInputTokens: sql `COALESCE(${taskUsageTable.uncachedInputTokens}, 0) + ${tokenUsage?.uncachedInputTokens ?? 0}`,
|
|
103
|
+
reasoningTokens: sql `COALESCE(${taskUsageTable.reasoningTokens}, 0) + ${tokenUsage?.reasoningTokens ?? 0}`,
|
|
104
|
+
// PEAK, not sum. Every other column here accumulates; this one must not —
|
|
105
|
+
// conflating cumulative-billed with peak-context is what made a 715K run look
|
|
106
|
+
// like a 715K context when the real high-water mark was 43K (FINDING-ORCH-007).
|
|
107
|
+
peakContextTokens: sql `MAX(COALESCE(${taskUsageTable.peakContextTokens}, 0), ${inputTokens})`,
|
|
108
|
+
// Record WHICH call peaked, but only when this call is the new peak.
|
|
109
|
+
peakContextAt: sql `CASE WHEN ${inputTokens} > COALESCE(${taskUsageTable.peakContextTokens}, 0) THEN ${taskUsageTable.modelCalls} + 1 ELSE ${taskUsageTable.peakContextAt} END`,
|
|
110
|
+
},
|
|
111
|
+
})
|
|
112
|
+
.run();
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
this.logger.error({ err }, 'UsagePlugin: post:model_response handler failed');
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
onTerminal(payload) {
|
|
119
|
+
try {
|
|
120
|
+
const taskId = payload.executionContext.taskId;
|
|
121
|
+
const acc = this.accumulators.get(taskId);
|
|
122
|
+
const latencyMs = acc ? Date.now() - acc.startedAt : 0;
|
|
123
|
+
const rootTaskId = acc?.rootTaskId ?? payload.executionContext.rootTaskId ?? null;
|
|
124
|
+
this.db
|
|
125
|
+
.update(taskUsageTable)
|
|
126
|
+
.set({
|
|
127
|
+
latencyMs,
|
|
128
|
+
rootTaskId,
|
|
129
|
+
isComplete: 1,
|
|
130
|
+
})
|
|
131
|
+
.where(eq(taskUsageTable.taskId, taskId))
|
|
132
|
+
.run();
|
|
133
|
+
this.accumulators.delete(taskId);
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
this.logger.error({ err }, 'UsagePlugin: terminal handler failed');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=usage-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-plugin.js","sourceRoot":"","sources":["../../../../../../packages/agent/agent-engine-orchestrator/src/plugins/usage-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGtC,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAYhD,MAAM,QAAQ,GAA2B;IACvC,MAAM,EAAE,CAAC;IACT,UAAU,EAAE,CAAC;IACb,IAAI,EAAE,CAAC;IACP,OAAO,EAAE,CAAC;CACX,CAAC;AACF,SAAS,UAAU,CACjB,CAA4B,EAC5B,CAA4B;IAE5B,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;AACpD,CAAC;AAYD,MAAM,OAAO,WAAW;IAQH;IAPV,IAAI,GAAG,OAAO,CAAC;IAEP,YAAY,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC9C,MAAM,CAAe;IAEtC;IACE,8DAA8D;IAC7C,EAA8B,EAC/C,MAAqB;QADJ,OAAE,GAAF,EAAE,CAA4B;QAG/C,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,EAAkB,CAAC;IAC/G,CAAC;IAED,OAAO,CAAC,KAAoB;QAC1B,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;QACrE,KAAK,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC,OAAO,EAAE,EAAE,CAChD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAC9B,CAAC;QACF,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QACxE,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QACrE,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1E,CAAC;IAEO,WAAW,CAAC,OAAyB;QAC3C,IAAI,CAAC;YACH,MAAM,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC;YACrC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,eAAe,CAAC,QAAQ,CAAC;YAC3D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,EAAE;gBAC7C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;gBACtC,SAAS,EAAE,gBAAgB,CAAC,SAAS;gBACrC,YAAY,EAAE,QAAQ,CAAC,IAAI;gBAC3B,KAAK,EAAE,CAAC,OAAO,IAAI,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,SAAS;gBAC3D,oBAAoB,EAAE,SAAS;gBAC/B,SAAS,EACP,WAAW,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,SAAS,KAAK,QAAQ;oBAC/D,CAAC,CAAC,QAAQ,CAAC,SAAS;oBACpB,CAAC,CAAC,IAAI;aACX,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,wCAAwC,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,OAAiC;QACvD,IAAI,CAAC;YACH,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;YAChE,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC;YACvC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,WAAW,GAAG,UAAU,EAAE,WAAW,IAAI,CAAC,CAAC;YACjD,MAAM,YAAY,GAAG,UAAU,EAAE,YAAY,IAAI,CAAC,CAAC;YACnD,MAAM,SAAS,GAAG,aAAa,IAAI,CAAC,CAAC;YAErC,MAAM,QAAQ,GAAG,UAAU,EAAE,UAAU,IAAI,SAAS,CAAC;YACrD,IAAI,GAAG,EAAE,CAAC;gBACR,GAAG,CAAC,oBAAoB,GAAG,UAAU,CACnC,GAAG,CAAC,oBAAoB,EACxB,QAAQ,CACT,CAAC;YACJ,CAAC;YAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,eAAe,CAAC,QAAQ,CAAC;YAE3D,IAAI,CAAC,EAAE;iBACJ,MAAM,CAAC,cAAc,CAAC;iBACtB,MAAM,CAAC;gBACN,MAAM;gBACN,UAAU,EAAE,GAAG,EAAE,UAAU,IAAI,IAAI;gBACnC,SAAS,EAAE,GAAG,EAAE,SAAS,IAAI,gBAAgB,CAAC,SAAS;gBACvD,YAAY,EAAE,GAAG,EAAE,YAAY,IAAI,QAAQ,CAAC,IAAI;gBAChD,KAAK,EACH,GAAG,EAAE,KAAK;oBACV,CAAC,CAAC,OAAO,IAAI,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC;gBACxD,WAAW;gBACX,YAAY;gBACZ,aAAa,EAAE,SAAS;gBACxB,UAAU,EAAE,CAAC;gBACb,SAAS,EAAE,CAAC;gBACZ,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,GAAG,EAAE,oBAAoB,IAAI,QAAQ;gBACjD,SAAS,EAAE,GAAG,EAAE,SAAS,IAAI,IAAI;gBACjC,eAAe,EAAE,UAAU,EAAE,eAAe,IAAI,IAAI;gBACpD,mBAAmB,EAAE,UAAU,EAAE,mBAAmB,IAAI,IAAI;gBAC5D,mBAAmB,EAAE,UAAU,EAAE,mBAAmB,IAAI,IAAI;gBAC5D,eAAe,EAAE,UAAU,EAAE,eAAe,IAAI,IAAI;gBACpD,0DAA0D;gBAC1D,iBAAiB,EAAE,WAAW;gBAC9B,aAAa,EAAE,CAAC;gBAChB,SAAS,EAAE,MAAM,EAAE;aACpB,CAAC;iBACD,kBAAkB,CAAC;gBAClB,MAAM,EAAE,cAAc,CAAC,MAAM;gBAC7B,GAAG,EAAE;oBACH,WAAW,EAAE,GAAG,CAAA,GAAG,cAAc,CAAC,WAAW,MAAM,WAAW,EAAE;oBAChE,YAAY,EAAE,GAAG,CAAA,GAAG,cAAc,CAAC,YAAY,MAAM,YAAY,EAAE;oBACnE,aAAa,EAAE,GAAG,CAAA,GAAG,cAAc,CAAC,aAAa,MAAM,SAAS,EAAE;oBAClE,UAAU,EAAE,GAAG,CAAA,GAAG,cAAc,CAAC,UAAU,MAAM;oBACjD,UAAU,EAAE,GAAG,EAAE,oBAAoB,IAAI,QAAQ;oBACjD,eAAe,EAAE,GAAG,CAAA,YAClB,cAAc,CAAC,eACjB,UAAU,UAAU,EAAE,eAAe,IAAI,CAAC,EAAE;oBAC5C,mBAAmB,EAAE,GAAG,CAAA,YACtB,cAAc,CAAC,mBACjB,UAAU,UAAU,EAAE,mBAAmB,IAAI,CAAC,EAAE;oBAChD,mBAAmB,EAAE,GAAG,CAAA,YACtB,cAAc,CAAC,mBACjB,UAAU,UAAU,EAAE,mBAAmB,IAAI,CAAC,EAAE;oBAChD,eAAe,EAAE,GAAG,CAAA,YAClB,cAAc,CAAC,eACjB,UAAU,UAAU,EAAE,eAAe,IAAI,CAAC,EAAE;oBAC5C,0EAA0E;oBAC1E,8EAA8E;oBAC9E,gFAAgF;oBAChF,iBAAiB,EAAE,GAAG,CAAA,gBACpB,cAAc,CAAC,iBACjB,SAAS,WAAW,GAAG;oBACvB,qEAAqE;oBACrE,aAAa,EAAE,GAAG,CAAA,aAAa,WAAW,eACxC,cAAc,CAAC,iBACjB,aAAa,cAAc,CAAC,UAAU,aAAa,cAAc,CAAC,aAAa,MAAM;iBACtF;aACF,CAAC;iBACD,GAAG,EAAE,CAAC;QACX,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,iDAAiD,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAEO,UAAU,CAChB,OAAwE;QAExE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,MAAM,UAAU,GACd,GAAG,EAAE,UAAU,IAAI,OAAO,CAAC,gBAAgB,CAAC,UAAU,IAAI,IAAI,CAAC;YAEjE,IAAI,CAAC,EAAE;iBACJ,MAAM,CAAC,cAAc,CAAC;iBACtB,GAAG,CAAC;gBACH,SAAS;gBACT,UAAU;gBACV,UAAU,EAAE,CAAC;aACd,CAAC;iBACD,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;iBACxC,GAAG,EAAE,CAAC;YAET,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,sCAAsC,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ProviderConfig } from "../validation/index.js";
|
|
2
|
+
import type { TokenUsage } from "@adhd/agent-base-types";
|
|
3
|
+
import type { EngineLogger, EngineConfig } from "../interfaces.js";
|
|
4
|
+
import type { LLMProvider, ProviderChatRequest, ProviderChatResponse } from "./types.js";
|
|
5
|
+
/**
|
|
6
|
+
* Anthropic is the ONE provider whose headline `input_tokens` EXCLUDES cached tokens —
|
|
7
|
+
* it reports only the uncached tail after the last cache breakpoint. OpenAI, DeepSeek and
|
|
8
|
+
* Gemini all report an INCLUSIVE headline.
|
|
9
|
+
*
|
|
10
|
+
* So the true total input Anthropic processed is:
|
|
11
|
+
* input_tokens + cache_read_input_tokens + cache_creation_input_tokens
|
|
12
|
+
*
|
|
13
|
+
* Storing the raw `input_tokens` in the same column as the other providers' inclusive
|
|
14
|
+
* headline systematically UNDER-COUNTS Anthropic spend (on a cache-warm run most input
|
|
15
|
+
* lives in cache_read) and makes budget caps bite openai-provider agents far sooner than
|
|
16
|
+
* anthropic ones for identical real usage. See BUG-ORCH-010.
|
|
17
|
+
*/
|
|
18
|
+
export declare function normaliseAnthropicUsage(sdkUsage: {
|
|
19
|
+
input_tokens: number;
|
|
20
|
+
output_tokens: number;
|
|
21
|
+
cache_read_input_tokens?: number | null;
|
|
22
|
+
cache_creation_input_tokens?: number | null;
|
|
23
|
+
}, stopReason: string, maxTokens: number): TokenUsage;
|
|
24
|
+
export declare class AnthropicProvider implements LLMProvider {
|
|
25
|
+
private readonly client;
|
|
26
|
+
private readonly providerConfig;
|
|
27
|
+
private readonly useOauthIdentity;
|
|
28
|
+
private readonly logger;
|
|
29
|
+
private readonly config;
|
|
30
|
+
constructor(providerConfig: Extract<ProviderConfig, {
|
|
31
|
+
type: "anthropic";
|
|
32
|
+
}>, config: EngineConfig, logger: EngineLogger);
|
|
33
|
+
chat(request: ProviderChatRequest): Promise<ProviderChatResponse>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../../../../packages/agent/agent-engine-orchestrator/src/providers/anthropic.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAqB,MAAM,wBAAwB,CAAC;AAChF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEnE,OAAO,KAAK,EACR,WAAW,EACX,mBAAmB,EACnB,oBAAoB,EAEvB,MAAM,YAAY,CAAC;AAsBpB;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACnC,QAAQ,EAAE;IACN,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,2BAA2B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/C,EACD,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAClB,UAAU,CAeZ;AAsGD,qBAAa,iBAAkB,YAAW,WAAW;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiD;IAChF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAGlC,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE;QAAE,IAAI,EAAE,WAAW,CAAA;KAAE,CAAC,EAC9D,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY;IAgClB,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;CA2G1E"}
|