@primo-ai/core 0.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/README.md +114 -0
- package/dist/agent.d.ts +66 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +260 -0
- package/dist/agent.js.map +1 -0
- package/dist/checkpoint-store.d.ts +19 -0
- package/dist/checkpoint-store.d.ts.map +1 -0
- package/dist/checkpoint-store.js +79 -0
- package/dist/checkpoint-store.js.map +1 -0
- package/dist/concurrency-controller.d.ts +9 -0
- package/dist/concurrency-controller.d.ts.map +1 -0
- package/dist/concurrency-controller.js +71 -0
- package/dist/concurrency-controller.js.map +1 -0
- package/dist/config-merge.d.ts +12 -0
- package/dist/config-merge.d.ts.map +1 -0
- package/dist/config-merge.js +47 -0
- package/dist/config-merge.js.map +1 -0
- package/dist/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +144 -0
- package/dist/config.js.map +1 -0
- package/dist/context-builder.d.ts +29 -0
- package/dist/context-builder.d.ts.map +1 -0
- package/dist/context-builder.js +178 -0
- package/dist/context-builder.js.map +1 -0
- package/dist/dynamic-resolver.d.ts +7 -0
- package/dist/dynamic-resolver.d.ts.map +1 -0
- package/dist/dynamic-resolver.js +11 -0
- package/dist/dynamic-resolver.js.map +1 -0
- package/dist/errors.d.ts +30 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +40 -0
- package/dist/errors.js.map +1 -0
- package/dist/event-bus.d.ts +8 -0
- package/dist/event-bus.d.ts.map +1 -0
- package/dist/event-bus.js +36 -0
- package/dist/event-bus.js.map +1 -0
- package/dist/event-system.d.ts +19 -0
- package/dist/event-system.d.ts.map +1 -0
- package/dist/event-system.js +58 -0
- package/dist/event-system.js.map +1 -0
- package/dist/fallback-runner.d.ts +30 -0
- package/dist/fallback-runner.d.ts.map +1 -0
- package/dist/fallback-runner.js +40 -0
- package/dist/fallback-runner.js.map +1 -0
- package/dist/gateways/builtin-gateway.d.ts +17 -0
- package/dist/gateways/builtin-gateway.d.ts.map +1 -0
- package/dist/gateways/builtin-gateway.js +58 -0
- package/dist/gateways/builtin-gateway.js.map +1 -0
- package/dist/gateways/gateway-chain.d.ts +9 -0
- package/dist/gateways/gateway-chain.d.ts.map +1 -0
- package/dist/gateways/gateway-chain.js +18 -0
- package/dist/gateways/gateway-chain.js.map +1 -0
- package/dist/gateways/openai-compatible-gateway.d.ts +10 -0
- package/dist/gateways/openai-compatible-gateway.d.ts.map +1 -0
- package/dist/gateways/openai-compatible-gateway.js +26 -0
- package/dist/gateways/openai-compatible-gateway.js.map +1 -0
- package/dist/harness.d.ts +44 -0
- package/dist/harness.d.ts.map +1 -0
- package/dist/harness.js +70 -0
- package/dist/harness.js.map +1 -0
- package/dist/hook-manager.d.ts +22 -0
- package/dist/hook-manager.d.ts.map +1 -0
- package/dist/hook-manager.js +92 -0
- package/dist/hook-manager.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/llm-invoker.d.ts +34 -0
- package/dist/llm-invoker.d.ts.map +1 -0
- package/dist/llm-invoker.js +124 -0
- package/dist/llm-invoker.js.map +1 -0
- package/dist/loop-orchestrator.d.ts +48 -0
- package/dist/loop-orchestrator.d.ts.map +1 -0
- package/dist/loop-orchestrator.js +247 -0
- package/dist/loop-orchestrator.js.map +1 -0
- package/dist/model-factory.d.ts +13 -0
- package/dist/model-factory.d.ts.map +1 -0
- package/dist/model-factory.js +40 -0
- package/dist/model-factory.js.map +1 -0
- package/dist/model-profile.d.ts +17 -0
- package/dist/model-profile.d.ts.map +1 -0
- package/dist/model-profile.js +57 -0
- package/dist/model-profile.js.map +1 -0
- package/dist/model-resolver.d.ts +16 -0
- package/dist/model-resolver.d.ts.map +1 -0
- package/dist/model-resolver.js +28 -0
- package/dist/model-resolver.js.map +1 -0
- package/dist/parse-model.d.ts +6 -0
- package/dist/parse-model.d.ts.map +1 -0
- package/dist/parse-model.js +11 -0
- package/dist/parse-model.js.map +1 -0
- package/dist/pipeline.d.ts +28 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +286 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/plugin-manager.d.ts +42 -0
- package/dist/plugin-manager.d.ts.map +1 -0
- package/dist/plugin-manager.js +148 -0
- package/dist/plugin-manager.js.map +1 -0
- package/dist/processors/build-context.d.ts +3 -0
- package/dist/processors/build-context.d.ts.map +1 -0
- package/dist/processors/build-context.js +5 -0
- package/dist/processors/build-context.js.map +1 -0
- package/dist/processors/evaluate-iteration.d.ts +13 -0
- package/dist/processors/evaluate-iteration.d.ts.map +1 -0
- package/dist/processors/evaluate-iteration.js +196 -0
- package/dist/processors/evaluate-iteration.js.map +1 -0
- package/dist/processors/execute-tools.d.ts +4 -0
- package/dist/processors/execute-tools.d.ts.map +1 -0
- package/dist/processors/execute-tools.js +69 -0
- package/dist/processors/execute-tools.js.map +1 -0
- package/dist/processors/gate-tool.d.ts +3 -0
- package/dist/processors/gate-tool.d.ts.map +1 -0
- package/dist/processors/gate-tool.js +6 -0
- package/dist/processors/gate-tool.js.map +1 -0
- package/dist/processors/index.d.ts +10 -0
- package/dist/processors/index.d.ts.map +1 -0
- package/dist/processors/index.js +10 -0
- package/dist/processors/index.js.map +1 -0
- package/dist/processors/invoke-llm.d.ts +13 -0
- package/dist/processors/invoke-llm.d.ts.map +1 -0
- package/dist/processors/invoke-llm.js +138 -0
- package/dist/processors/invoke-llm.js.map +1 -0
- package/dist/processors/prepare-step.d.ts +3 -0
- package/dist/processors/prepare-step.d.ts.map +1 -0
- package/dist/processors/prepare-step.js +5 -0
- package/dist/processors/prepare-step.js.map +1 -0
- package/dist/processors/process-input.d.ts +3 -0
- package/dist/processors/process-input.d.ts.map +1 -0
- package/dist/processors/process-input.js +20 -0
- package/dist/processors/process-input.js.map +1 -0
- package/dist/processors/process-output.d.ts +3 -0
- package/dist/processors/process-output.d.ts.map +1 -0
- package/dist/processors/process-output.js +5 -0
- package/dist/processors/process-output.js.map +1 -0
- package/dist/processors/process-step-output.d.ts +3 -0
- package/dist/processors/process-step-output.d.ts.map +1 -0
- package/dist/processors/process-step-output.js +23 -0
- package/dist/processors/process-step-output.js.map +1 -0
- package/dist/processors/provider-history-compat.d.ts +7 -0
- package/dist/processors/provider-history-compat.d.ts.map +1 -0
- package/dist/processors/provider-history-compat.js +166 -0
- package/dist/processors/provider-history-compat.js.map +1 -0
- package/dist/provider-capabilities.d.ts +4 -0
- package/dist/provider-capabilities.d.ts.map +1 -0
- package/dist/provider-capabilities.js +47 -0
- package/dist/provider-capabilities.js.map +1 -0
- package/dist/retry.d.ts +6 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +26 -0
- package/dist/retry.js.map +1 -0
- package/dist/serialize.d.ts +12 -0
- package/dist/serialize.d.ts.map +1 -0
- package/dist/serialize.js +22 -0
- package/dist/serialize.js.map +1 -0
- package/dist/session-manager.d.ts +17 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +143 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/session-persistence.d.ts +13 -0
- package/dist/session-persistence.d.ts.map +1 -0
- package/dist/session-persistence.js +63 -0
- package/dist/session-persistence.js.map +1 -0
- package/dist/session-storage.d.ts +19 -0
- package/dist/session-storage.d.ts.map +1 -0
- package/dist/session-storage.js +103 -0
- package/dist/session-storage.js.map +1 -0
- package/dist/state-machine.d.ts +13 -0
- package/dist/state-machine.d.ts.map +1 -0
- package/dist/state-machine.js +49 -0
- package/dist/state-machine.js.map +1 -0
- package/dist/storage-replay-backend.d.ts +7 -0
- package/dist/storage-replay-backend.d.ts.map +1 -0
- package/dist/storage-replay-backend.js +14 -0
- package/dist/storage-replay-backend.js.map +1 -0
- package/dist/sub-agent.d.ts +13 -0
- package/dist/sub-agent.d.ts.map +1 -0
- package/dist/sub-agent.js +87 -0
- package/dist/sub-agent.js.map +1 -0
- package/dist/task-manager.d.ts +22 -0
- package/dist/task-manager.d.ts.map +1 -0
- package/dist/task-manager.js +151 -0
- package/dist/task-manager.js.map +1 -0
- package/dist/token-counter.d.ts +9 -0
- package/dist/token-counter.d.ts.map +1 -0
- package/dist/token-counter.js +74 -0
- package/dist/token-counter.js.map +1 -0
- package/dist/tool-registry.d.ts +31 -0
- package/dist/tool-registry.d.ts.map +1 -0
- package/dist/tool-registry.js +147 -0
- package/dist/tool-registry.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
class InternalAsyncTaskHandle {
|
|
2
|
+
state;
|
|
3
|
+
constructor(state) {
|
|
4
|
+
this.state = state;
|
|
5
|
+
}
|
|
6
|
+
get taskId() {
|
|
7
|
+
return this.state.taskId;
|
|
8
|
+
}
|
|
9
|
+
get status() {
|
|
10
|
+
return this.state.status;
|
|
11
|
+
}
|
|
12
|
+
get result() {
|
|
13
|
+
return this.state.result;
|
|
14
|
+
}
|
|
15
|
+
get error() {
|
|
16
|
+
return this.state.error;
|
|
17
|
+
}
|
|
18
|
+
cancel() {
|
|
19
|
+
if (this.state.status === 'pending' ||
|
|
20
|
+
this.state.status === 'running') {
|
|
21
|
+
this.state.status = 'cancelled';
|
|
22
|
+
this.state.abortController.abort();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
on_complete(handler) {
|
|
26
|
+
// If already completed, call immediately
|
|
27
|
+
if (this.state.status === 'completed' && this.state.result) {
|
|
28
|
+
handler(this.state.result);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
this.state.completionHandlers.push(handler);
|
|
32
|
+
}
|
|
33
|
+
/** Internal: parentSessionId for filtering */
|
|
34
|
+
get _parentSessionId() {
|
|
35
|
+
return this.state.parentSessionId;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const defaultRunAgent = async (config, input, signal) => {
|
|
39
|
+
const { Agent } = await import('./agent.js');
|
|
40
|
+
const agent = new Agent(config);
|
|
41
|
+
const result = await agent.run(input, signal);
|
|
42
|
+
return {
|
|
43
|
+
response: result.response,
|
|
44
|
+
tokenUsage: result.tokenUsage,
|
|
45
|
+
sessionId: result.sessionId,
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
export class TaskManagerImpl {
|
|
49
|
+
handles = new Map();
|
|
50
|
+
eventBus;
|
|
51
|
+
concurrencyController;
|
|
52
|
+
runAgentFn;
|
|
53
|
+
constructor(options) {
|
|
54
|
+
this.eventBus = options?.eventBus;
|
|
55
|
+
this.concurrencyController = options?.concurrencyController;
|
|
56
|
+
this.runAgentFn = options?.runAgentFn ?? defaultRunAgent;
|
|
57
|
+
}
|
|
58
|
+
async launch(config, prompt) {
|
|
59
|
+
const taskId = crypto.randomUUID();
|
|
60
|
+
const abortController = new AbortController();
|
|
61
|
+
const state = {
|
|
62
|
+
taskId,
|
|
63
|
+
status: 'pending',
|
|
64
|
+
config,
|
|
65
|
+
abortController,
|
|
66
|
+
completionHandlers: [],
|
|
67
|
+
parentSessionId: config.parentSessionId,
|
|
68
|
+
};
|
|
69
|
+
const handle = new InternalAsyncTaskHandle(state);
|
|
70
|
+
this.handles.set(taskId, handle);
|
|
71
|
+
// Fire-and-forget the async work
|
|
72
|
+
this.executeTask(state, config, prompt).catch(() => {
|
|
73
|
+
// Errors are handled inside executeTask
|
|
74
|
+
});
|
|
75
|
+
return handle;
|
|
76
|
+
}
|
|
77
|
+
get(taskId) {
|
|
78
|
+
return this.handles.get(taskId);
|
|
79
|
+
}
|
|
80
|
+
cancel(taskId) {
|
|
81
|
+
const handle = this.handles.get(taskId);
|
|
82
|
+
if (handle) {
|
|
83
|
+
handle.cancel();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
list(filter) {
|
|
87
|
+
let handles = Array.from(this.handles.values());
|
|
88
|
+
if (filter?.parentSessionId) {
|
|
89
|
+
handles = handles.filter((h) => h._parentSessionId === filter.parentSessionId);
|
|
90
|
+
}
|
|
91
|
+
return handles;
|
|
92
|
+
}
|
|
93
|
+
async executeTask(state, config, prompt) {
|
|
94
|
+
const { signal } = state.abortController;
|
|
95
|
+
// Check for cancellation before starting
|
|
96
|
+
if (signal.aborted)
|
|
97
|
+
return;
|
|
98
|
+
// Acquire concurrency slot if configured
|
|
99
|
+
let releaseSlot;
|
|
100
|
+
if (config.concurrencySlot && this.concurrencyController) {
|
|
101
|
+
releaseSlot = await this.concurrencyController.acquire(config.concurrencySlot.key);
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
// Update status to running
|
|
105
|
+
state.status = 'running';
|
|
106
|
+
this.eventBus?.emit('task:start', { taskId: state.taskId, config });
|
|
107
|
+
// Check cancellation again after acquiring slot
|
|
108
|
+
if (signal.aborted)
|
|
109
|
+
return;
|
|
110
|
+
const agentConfig = {
|
|
111
|
+
model: config.model ?? 'default',
|
|
112
|
+
systemPrompt: config.systemPrompt,
|
|
113
|
+
tools: config.tools,
|
|
114
|
+
maxIterations: config.maxIterations,
|
|
115
|
+
};
|
|
116
|
+
const result = await this.runAgentFn(agentConfig, prompt, signal);
|
|
117
|
+
// Check if cancelled while running
|
|
118
|
+
if (signal.aborted)
|
|
119
|
+
return;
|
|
120
|
+
state.status = 'completed';
|
|
121
|
+
state.result = result;
|
|
122
|
+
this.eventBus?.emit('task:end', {
|
|
123
|
+
taskId: state.taskId,
|
|
124
|
+
result,
|
|
125
|
+
});
|
|
126
|
+
// Fire completion handlers
|
|
127
|
+
for (const handler of state.completionHandlers) {
|
|
128
|
+
handler(result);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
if (signal.aborted)
|
|
133
|
+
return;
|
|
134
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
135
|
+
state.status = 'failed';
|
|
136
|
+
state.error = error;
|
|
137
|
+
this.eventBus?.emit('task:error', {
|
|
138
|
+
taskId: state.taskId,
|
|
139
|
+
error,
|
|
140
|
+
});
|
|
141
|
+
this.eventBus?.emit('task:end', {
|
|
142
|
+
taskId: state.taskId,
|
|
143
|
+
error,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
finally {
|
|
147
|
+
releaseSlot?.();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=task-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-manager.js","sourceRoot":"","sources":["../src/task-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TokenCounter, Message } from '@primo-ai/sdk';
|
|
2
|
+
export declare class TiktokenCounter implements TokenCounter {
|
|
3
|
+
private cache;
|
|
4
|
+
private getEncoder;
|
|
5
|
+
count(text: string, model?: string): number;
|
|
6
|
+
countMessages(messages: Message[], model?: string): number;
|
|
7
|
+
dispose(): void;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=token-counter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-counter.d.ts","sourceRoot":"","sources":["../src/token-counter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAwC3D,qBAAa,eAAgB,YAAW,YAAY;IAClD,OAAO,CAAC,KAAK,CAA+B;IAE5C,OAAO,CAAC,UAAU;IASlB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAM3C,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAyB1D,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { getEncoding } from 'js-tiktoken';
|
|
2
|
+
const MODEL_ENCODING_MAP = {
|
|
3
|
+
'gpt-4o': 'o200k_base',
|
|
4
|
+
'gpt-4o-mini': 'o200k_base',
|
|
5
|
+
'o1': 'o200k_base',
|
|
6
|
+
'o1-mini': 'o200k_base',
|
|
7
|
+
'o3': 'o200k_base',
|
|
8
|
+
'o3-mini': 'o200k_base',
|
|
9
|
+
'gpt-4-turbo': 'cl100k_base',
|
|
10
|
+
'gpt-4': 'cl100k_base',
|
|
11
|
+
'gpt-4-32k': 'cl100k_base',
|
|
12
|
+
'gpt-3.5-turbo': 'cl100k_base',
|
|
13
|
+
'text-embedding-ada-002': 'cl100k_base',
|
|
14
|
+
'text-embedding-3-small': 'cl100k_base',
|
|
15
|
+
'text-embedding-3-large': 'cl100k_base',
|
|
16
|
+
'claude': 'cl100k_base',
|
|
17
|
+
'deepseek': 'cl100k_base',
|
|
18
|
+
'gemini': 'cl100k_base',
|
|
19
|
+
};
|
|
20
|
+
const PER_MSG_OVERHEAD = 4;
|
|
21
|
+
const NAME_OVERHEAD = 1;
|
|
22
|
+
function resolveEncodingName(model) {
|
|
23
|
+
if (!model)
|
|
24
|
+
return 'cl100k_base';
|
|
25
|
+
for (const [prefix, enc] of Object.entries(MODEL_ENCODING_MAP)) {
|
|
26
|
+
if (model.toLowerCase().startsWith(prefix))
|
|
27
|
+
return enc;
|
|
28
|
+
}
|
|
29
|
+
return 'cl100k_base';
|
|
30
|
+
}
|
|
31
|
+
export class TiktokenCounter {
|
|
32
|
+
cache = new Map();
|
|
33
|
+
getEncoder(encoding) {
|
|
34
|
+
let enc = this.cache.get(encoding);
|
|
35
|
+
if (!enc) {
|
|
36
|
+
enc = getEncoding(encoding);
|
|
37
|
+
this.cache.set(encoding, enc);
|
|
38
|
+
}
|
|
39
|
+
return enc;
|
|
40
|
+
}
|
|
41
|
+
count(text, model) {
|
|
42
|
+
const encoding = resolveEncodingName(model);
|
|
43
|
+
const enc = this.getEncoder(encoding);
|
|
44
|
+
return enc.encode(text).length;
|
|
45
|
+
}
|
|
46
|
+
countMessages(messages, model) {
|
|
47
|
+
const encoding = resolveEncodingName(model);
|
|
48
|
+
const enc = this.getEncoder(encoding);
|
|
49
|
+
let total = 0;
|
|
50
|
+
for (const msg of messages) {
|
|
51
|
+
total += PER_MSG_OVERHEAD;
|
|
52
|
+
total += msg.name ? NAME_OVERHEAD : 0;
|
|
53
|
+
total += enc.encode(msg.content).length;
|
|
54
|
+
if (msg.role === 'assistant' && 'toolCalls' in msg && msg.toolCalls) {
|
|
55
|
+
for (const tc of msg.toolCalls) {
|
|
56
|
+
total += enc.encode(tc.name).length;
|
|
57
|
+
total += enc.encode(JSON.stringify(tc.args)).length;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (msg.role === 'assistant' && 'reasoningContent' in msg && msg.reasoningContent) {
|
|
61
|
+
total += enc.encode(msg.reasoningContent).length;
|
|
62
|
+
}
|
|
63
|
+
if (msg.role === 'tool' && 'result' in msg && msg.result !== undefined) {
|
|
64
|
+
total += enc.encode(JSON.stringify(msg.result)).length;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
total += 2;
|
|
68
|
+
return total;
|
|
69
|
+
}
|
|
70
|
+
dispose() {
|
|
71
|
+
this.cache.clear();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=token-counter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-counter.js","sourceRoot":"","sources":["../src/token-counter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Tool, ToolExecutionContext, ToolResult } from '@primo-ai/sdk';
|
|
2
|
+
import type { HookManager } from './hook-manager.js';
|
|
3
|
+
import type { EventBus } from './event-bus.js';
|
|
4
|
+
export interface AiSdkToolSchema {
|
|
5
|
+
description: string;
|
|
6
|
+
inputSchema: unknown;
|
|
7
|
+
}
|
|
8
|
+
export interface ToolRegistryOptions {
|
|
9
|
+
maxOutputLength?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare class ToolRegistry {
|
|
12
|
+
private tools;
|
|
13
|
+
private maxOutputLength;
|
|
14
|
+
private executionContext;
|
|
15
|
+
private hookManager?;
|
|
16
|
+
private eventBus?;
|
|
17
|
+
constructor(options?: ToolRegistryOptions);
|
|
18
|
+
register(tool: Tool): void;
|
|
19
|
+
unregister(name: string): boolean;
|
|
20
|
+
get(name: string): Tool | undefined;
|
|
21
|
+
getAll(): Tool[];
|
|
22
|
+
setHookManager(hookManager: HookManager): void;
|
|
23
|
+
setEventBus(eventBus: EventBus): void;
|
|
24
|
+
setToolExecutionContext(context: ToolExecutionContext): void;
|
|
25
|
+
toAiSdkToolSchemas(): Record<string, AiSdkToolSchema>;
|
|
26
|
+
executeTool(name: string, args: Record<string, unknown>, context?: ToolExecutionContext & {
|
|
27
|
+
toolCallId?: string;
|
|
28
|
+
}): Promise<ToolResult>;
|
|
29
|
+
private truncateOutput;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=tool-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../src/tool-registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAgBD,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,QAAQ,CAAC,CAAW;gBAEhB,OAAO,GAAE,mBAAwB;IAI7C,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAO1B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAInC,MAAM,IAAI,IAAI,EAAE;IAIhB,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAI9C,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAIrC,uBAAuB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAI5D,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IAc/C,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAqE7I,OAAO,CAAC,cAAc;CA4BvB"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { jsonSchema } from 'ai';
|
|
2
|
+
function isZodSchema(value) {
|
|
3
|
+
return (value !== null &&
|
|
4
|
+
typeof value === 'object' &&
|
|
5
|
+
'safeParse' in value &&
|
|
6
|
+
typeof value.safeParse === 'function');
|
|
7
|
+
}
|
|
8
|
+
export class ToolRegistry {
|
|
9
|
+
tools = new Map();
|
|
10
|
+
maxOutputLength;
|
|
11
|
+
executionContext = {};
|
|
12
|
+
hookManager;
|
|
13
|
+
eventBus;
|
|
14
|
+
constructor(options = {}) {
|
|
15
|
+
this.maxOutputLength = options.maxOutputLength ?? Infinity;
|
|
16
|
+
}
|
|
17
|
+
register(tool) {
|
|
18
|
+
if (this.tools.has(tool.name)) {
|
|
19
|
+
throw new Error(`Tool "${tool.name}" is already registered`);
|
|
20
|
+
}
|
|
21
|
+
this.tools.set(tool.name, tool);
|
|
22
|
+
}
|
|
23
|
+
unregister(name) {
|
|
24
|
+
return this.tools.delete(name);
|
|
25
|
+
}
|
|
26
|
+
get(name) {
|
|
27
|
+
return this.tools.get(name);
|
|
28
|
+
}
|
|
29
|
+
getAll() {
|
|
30
|
+
return [...this.tools.values()];
|
|
31
|
+
}
|
|
32
|
+
setHookManager(hookManager) {
|
|
33
|
+
this.hookManager = hookManager;
|
|
34
|
+
}
|
|
35
|
+
setEventBus(eventBus) {
|
|
36
|
+
this.eventBus = eventBus;
|
|
37
|
+
}
|
|
38
|
+
setToolExecutionContext(context) {
|
|
39
|
+
this.executionContext = context;
|
|
40
|
+
}
|
|
41
|
+
toAiSdkToolSchemas() {
|
|
42
|
+
const result = {};
|
|
43
|
+
for (const tool of this.tools.values()) {
|
|
44
|
+
const schema = isZodSchema(tool.inputSchema)
|
|
45
|
+
? tool.inputSchema
|
|
46
|
+
: jsonSchema(tool.inputSchema);
|
|
47
|
+
result[tool.name] = {
|
|
48
|
+
description: tool.description,
|
|
49
|
+
inputSchema: schema,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
async executeTool(name, args, context) {
|
|
55
|
+
const tool = this.tools.get(name);
|
|
56
|
+
const toolCallId = context?.toolCallId ?? '';
|
|
57
|
+
if (!tool) {
|
|
58
|
+
return { toolCallId, name, output: undefined, error: `Tool "${name}" not found` };
|
|
59
|
+
}
|
|
60
|
+
const execCtx = context ?? this.executionContext;
|
|
61
|
+
if (isZodSchema(tool.inputSchema)) {
|
|
62
|
+
const parsed = tool.inputSchema.safeParse(args);
|
|
63
|
+
if (!parsed.success) {
|
|
64
|
+
const issues = parsed.error?.issues?.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ') ?? parsed.error?.message ?? 'Unknown validation error';
|
|
65
|
+
return { toolCallId, name: tool.name, output: undefined, error: `Input validation failed: ${issues}` };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const hookInput = { toolName: tool.name, args, sessionId: execCtx.sessionId ?? '' };
|
|
69
|
+
if (this.hookManager) {
|
|
70
|
+
await this.hookManager.invoke('tool.before', hookInput, {});
|
|
71
|
+
}
|
|
72
|
+
let toolOutput;
|
|
73
|
+
let toolError;
|
|
74
|
+
let validationError;
|
|
75
|
+
try {
|
|
76
|
+
toolOutput = await tool.execute(args, execCtx);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
toolError = err instanceof Error ? err.message : String(err);
|
|
80
|
+
if (this.hookManager) {
|
|
81
|
+
await this.hookManager.invoke('tool.after', hookInput, { error: toolError });
|
|
82
|
+
}
|
|
83
|
+
return { toolCallId, name: tool.name, output: undefined, error: toolError };
|
|
84
|
+
}
|
|
85
|
+
let mutated = false;
|
|
86
|
+
if (this.hookManager) {
|
|
87
|
+
const hookOutput = { result: toolOutput };
|
|
88
|
+
await this.hookManager.invoke('tool.after', hookInput, hookOutput);
|
|
89
|
+
if (hookOutput.result !== undefined && hookOutput.result !== toolOutput) {
|
|
90
|
+
if (tool.allowOutputMutation) {
|
|
91
|
+
this.eventBus?.emit('tool:output_mutated', { toolName: tool.name, original: toolOutput, mutated: hookOutput.result });
|
|
92
|
+
toolOutput = hookOutput.result;
|
|
93
|
+
mutated = true;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
this.eventBus?.emit('tool:output_blocked', { toolName: tool.name, original: toolOutput, attempted: hookOutput.result });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Validate AFTER hook mutation so mutations are also checked
|
|
101
|
+
if (tool.outputSchema && isZodSchema(tool.outputSchema)) {
|
|
102
|
+
const parsed = tool.outputSchema.safeParse(toolOutput);
|
|
103
|
+
if (!parsed.success) {
|
|
104
|
+
const issues = parsed.error?.issues?.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ') ?? parsed.error?.message ?? 'Unknown validation error';
|
|
105
|
+
validationError = `Output validation failed: ${issues}`;
|
|
106
|
+
this.eventBus?.emit('tool:output_invalid', { toolName: tool.name, error: validationError });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const { value: output, truncated } = this.truncateOutput(toolOutput, tool.name);
|
|
110
|
+
const result = { toolCallId, name: tool.name, output };
|
|
111
|
+
if (mutated)
|
|
112
|
+
result.mutated = true;
|
|
113
|
+
if (truncated)
|
|
114
|
+
result.truncated = true;
|
|
115
|
+
if (validationError)
|
|
116
|
+
result.validationError = validationError;
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
truncateOutput(output, toolName) {
|
|
120
|
+
if (output && typeof output === 'object' && 'evicted' in output) {
|
|
121
|
+
return { value: output, truncated: false };
|
|
122
|
+
}
|
|
123
|
+
if (typeof output === 'string' && output.length > this.maxOutputLength) {
|
|
124
|
+
const originalSize = output.length;
|
|
125
|
+
const value = output.slice(0, this.maxOutputLength) + '... [truncated]';
|
|
126
|
+
this.eventBus?.emit('tool:output_truncated', { toolName, originalSize, truncatedSize: value.length });
|
|
127
|
+
return { value, truncated: true };
|
|
128
|
+
}
|
|
129
|
+
if (typeof output !== 'string' &&
|
|
130
|
+
output !== null &&
|
|
131
|
+
output !== undefined) {
|
|
132
|
+
try {
|
|
133
|
+
const serialized = JSON.stringify(output);
|
|
134
|
+
if (serialized.length > this.maxOutputLength) {
|
|
135
|
+
this.eventBus?.emit('tool:output_truncated', { toolName, originalSize: serialized.length, truncatedSize: this.maxOutputLength });
|
|
136
|
+
return { value: { truncated: true, preview: serialized.slice(0, this.maxOutputLength) }, truncated: true };
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
this.eventBus?.emit('tool:output_truncated', { toolName, originalSize: String(output).length, truncatedSize: this.maxOutputLength });
|
|
141
|
+
return { value: { truncated: true, preview: String(output).slice(0, this.maxOutputLength) }, truncated: true };
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return { value: output, truncated: false };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=tool-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../src/tool-registry.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@primo-ai/core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"files": ["dist"],
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc -p tsconfig.build.json",
|
|
16
|
+
"test": "tsc --noEmit && vitest run",
|
|
17
|
+
"check-types": "tsc --noEmit",
|
|
18
|
+
"lint": "eslint src __tests__"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@primo-ai/observability": "workspace:*",
|
|
22
|
+
"@primo-ai/tools": "workspace:*",
|
|
23
|
+
"@ai-sdk/anthropic": "^3.0.76",
|
|
24
|
+
"@ai-sdk/deepseek": "2.0.34",
|
|
25
|
+
"@ai-sdk/google": "^3.0.71",
|
|
26
|
+
"@ai-sdk/openai": "^3.0.63",
|
|
27
|
+
"ai": "^6.0.177",
|
|
28
|
+
"js-tiktoken": "^1.0.21",
|
|
29
|
+
"zod": "^4.4.3"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@primo-ai/sdk": "workspace:*",
|
|
33
|
+
"@types/node": "^22.15.0",
|
|
34
|
+
"typescript": "^5.7.3",
|
|
35
|
+
"vitest": "^3.0.5"
|
|
36
|
+
}
|
|
37
|
+
}
|