@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
package/README.md
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# @primo-ai/core
|
|
2
|
+
|
|
3
|
+
Core agent loop, processor pipeline, and orchestration layer.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
This package provides the main building blocks of the AgentForge framework:
|
|
8
|
+
|
|
9
|
+
- **Agent** -- Top-level facade for creating, configuring, and running agents
|
|
10
|
+
- **PipelineRunner** -- Executes the linear pipeline of processors stage by stage
|
|
11
|
+
- **LoopOrchestrator** -- Manages the agentic loop (repeating stages until stop)
|
|
12
|
+
- **LLMInvoker** -- Wraps Vercel AI SDK `streamText()` for single-step LLM calls
|
|
13
|
+
- **ToolRegistry** -- Registers tools and converts them to AI SDK schemas
|
|
14
|
+
- **EventBus / EventSystem** -- Pub/sub event dispatch with replay support
|
|
15
|
+
- **HookManager** -- Fixed-point interception (before/after hooks)
|
|
16
|
+
- **StateMachine** -- Agent lifecycle states (pending/running/completed/paused/cancelled/error)
|
|
17
|
+
- **ModelFactory** -- Canonical model resolution with pluggable gateways
|
|
18
|
+
- **ContextBuilder** -- Assembles PipelineContext from config, tools, and prompt fragments
|
|
19
|
+
|
|
20
|
+
## Quick Example
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { Agent, registerProvider } from '@primo-ai/core';
|
|
24
|
+
import { createOpenAICompatible } from '@ai-sdk/openai-compatible';
|
|
25
|
+
|
|
26
|
+
registerProvider('deepseek', (modelId) => {
|
|
27
|
+
const sdk = createOpenAICompatible({
|
|
28
|
+
baseURL: 'https://api.deepseek.com',
|
|
29
|
+
apiKey: process.env.DEEPSEEK_API_KEY!,
|
|
30
|
+
});
|
|
31
|
+
return sdk.languageModel(modelId);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const agent = new Agent({
|
|
35
|
+
model: 'deepseek/deepseek-v4-flash',
|
|
36
|
+
systemPrompt: 'You are a helpful assistant.',
|
|
37
|
+
maxIterations: 5,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// Run (returns full result)
|
|
41
|
+
const result = await agent.run('Hello');
|
|
42
|
+
console.log(result.response, result.tokenUsage, result.sessionId);
|
|
43
|
+
|
|
44
|
+
// Stream (yields text chunks)
|
|
45
|
+
for await (const chunk of agent.stream('Hello')) {
|
|
46
|
+
process.stdout.write(chunk);
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Agent API
|
|
51
|
+
|
|
52
|
+
### `new Agent(config, deps?)`
|
|
53
|
+
|
|
54
|
+
| Parameter | Type | Description |
|
|
55
|
+
|-----------|------|-------------|
|
|
56
|
+
| `config.model` | `string` | Model string in `provider/modelId` format |
|
|
57
|
+
| `config.systemPrompt` | `Dynamic<string>` | System prompt (static or per-request function) |
|
|
58
|
+
| `config.maxIterations` | `Dynamic<number>` | Max agentic loop iterations (default: 10) |
|
|
59
|
+
| `config.tools` | `Tool[]` | Tools available to the agent |
|
|
60
|
+
| `config.providerOptions` | `Record<string, Record<string, unknown>>` | Per-provider options passed to streamText() |
|
|
61
|
+
|
|
62
|
+
### `agent.run(input, signal?)` -> `Promise<AgentRunResult>`
|
|
63
|
+
|
|
64
|
+
Runs the agent pipeline to completion. Returns `{ response, tokenUsage, sessionId, compatRetries }`.
|
|
65
|
+
|
|
66
|
+
### `agent.stream(input, signal?)` -> `AsyncGenerator<string>`
|
|
67
|
+
|
|
68
|
+
Streams text chunks as the agent generates them.
|
|
69
|
+
|
|
70
|
+
### `agent.streamEvents(input, signal?)` -> `AsyncGenerator<StreamEvent>`
|
|
71
|
+
|
|
72
|
+
Streams structured events (text_delta, tool_call, tool_result, stage_start, etc.).
|
|
73
|
+
|
|
74
|
+
### `agent.resume(sessionId, signal?)` -> `Promise<AgentRunResult>`
|
|
75
|
+
|
|
76
|
+
Resumes a suspended agent from a checkpoint.
|
|
77
|
+
|
|
78
|
+
### `agent.use(factory)`
|
|
79
|
+
|
|
80
|
+
Registers a plugin or processor. Accepts a `PluginFactory` function or a `Processor` instance.
|
|
81
|
+
|
|
82
|
+
## Key Exports
|
|
83
|
+
|
|
84
|
+
| Export | Description |
|
|
85
|
+
|--------|-------------|
|
|
86
|
+
| `PipelineRunner` | Executes pipeline stages sequentially |
|
|
87
|
+
| `LoopOrchestrator` | Manages agentic loop with abort/retry/suspend |
|
|
88
|
+
| `LLMInvoker` | Single-step LLM invocation via AI SDK |
|
|
89
|
+
| `ToolRegistry` | Tool registration and schema conversion |
|
|
90
|
+
| `EventBus` | Lightweight pub/sub event bus |
|
|
91
|
+
| `EventSystem` | Event dispatch with replay backend |
|
|
92
|
+
| `HookManager` | Before/after hook invocation |
|
|
93
|
+
| `StateMachine` | Agent lifecycle state transitions |
|
|
94
|
+
| `ModelFactory` | Pluggable model resolution chain |
|
|
95
|
+
| `ContextBuilder` | PipelineContext assembly |
|
|
96
|
+
| `PluginManager` | Plugin lifecycle (initialize, shutdown) |
|
|
97
|
+
| `SessionManagerImpl` | Session CRUD with suspend/resume |
|
|
98
|
+
| `FilesystemSessionStorage` | JSONL file-based session storage |
|
|
99
|
+
| `createSubAgentTool` | Creates a tool that delegates to a sub-agent |
|
|
100
|
+
| `ConcurrencyController` | Limits parallel task execution |
|
|
101
|
+
| `TaskManagerImpl` | Async sub-agent task management |
|
|
102
|
+
| `ConfigLoader` | Multi-layer JSONC config loading |
|
|
103
|
+
| `InMemoryCheckpointStore` | In-memory checkpoint storage |
|
|
104
|
+
| `JsonlCheckpointStore` | JSONL file-based checkpoint storage |
|
|
105
|
+
| `serialize` / `deserialize` | PipelineContext serialization for checkpoints |
|
|
106
|
+
| `registerProvider` | Register a model provider factory |
|
|
107
|
+
| `AgentForgeError` | Base error class with domain hierarchy |
|
|
108
|
+
|
|
109
|
+
## Dependencies
|
|
110
|
+
|
|
111
|
+
- `@primo-ai/sdk` -- type definitions
|
|
112
|
+
- `@primo-ai/observability` -- tracing and metrics
|
|
113
|
+
- `@primo-ai/tools` -- built-in tools
|
|
114
|
+
- `ai` + provider SDKs -- Vercel AI SDK core
|
package/dist/agent.d.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { AgentConfig, CheckpointStore, PipelineStageConfig, Processor, SessionManager, Tracer } from '@primo-ai/sdk';
|
|
2
|
+
import { PipelineRunner } from './pipeline.js';
|
|
3
|
+
import { serialize } from './serialize.js';
|
|
4
|
+
import { ToolRegistry } from './tool-registry.js';
|
|
5
|
+
import { PluginManager, type PluginFactory } from './plugin-manager.js';
|
|
6
|
+
import { ModelFactory } from './model-factory.js';
|
|
7
|
+
import { ContextBuilder } from './context-builder.js';
|
|
8
|
+
export interface AgentDependencies {
|
|
9
|
+
runner?: PipelineRunner;
|
|
10
|
+
registry?: ToolRegistry;
|
|
11
|
+
pluginManager?: PluginManager;
|
|
12
|
+
tracer?: Tracer;
|
|
13
|
+
modelFactory?: ModelFactory;
|
|
14
|
+
sessionManager?: SessionManager;
|
|
15
|
+
checkpointStore?: CheckpointStore<ReturnType<typeof serialize>>;
|
|
16
|
+
/** When provided, creates a JsonlCheckpointStore for crash-safe checkpoint persistence */
|
|
17
|
+
checkpointDir?: string;
|
|
18
|
+
/** When true, saves a checkpoint after each completed iteration */
|
|
19
|
+
autoCheckpoint?: boolean;
|
|
20
|
+
contextBuilder?: ContextBuilder;
|
|
21
|
+
/** Override default pipeline stage order. */
|
|
22
|
+
stageConfig?: PipelineStageConfig;
|
|
23
|
+
}
|
|
24
|
+
export interface AgentRunResult {
|
|
25
|
+
response: string;
|
|
26
|
+
tokenUsage: import('@primo-ai/sdk').TokenUsage;
|
|
27
|
+
sessionId: string;
|
|
28
|
+
/** Number of compat retries that occurred during the agentic loop. */
|
|
29
|
+
compatRetries: number;
|
|
30
|
+
}
|
|
31
|
+
export declare class Agent {
|
|
32
|
+
private config;
|
|
33
|
+
private runner;
|
|
34
|
+
private registry;
|
|
35
|
+
private _pluginManager;
|
|
36
|
+
private _tracer?;
|
|
37
|
+
private _autoCheckpoint;
|
|
38
|
+
private _model;
|
|
39
|
+
private modelFactory;
|
|
40
|
+
private orchestrator;
|
|
41
|
+
private sessionManager?;
|
|
42
|
+
private contextBuilder;
|
|
43
|
+
constructor(config: AgentConfig, deps?: AgentDependencies);
|
|
44
|
+
use(factory: Processor | PluginFactory): void;
|
|
45
|
+
teardown(): Promise<void>;
|
|
46
|
+
get pipelineRunner(): PipelineRunner;
|
|
47
|
+
get toolRegistry(): ToolRegistry;
|
|
48
|
+
get pluginManager(): PluginManager;
|
|
49
|
+
get eventBus(): import('./event-bus.js').EventBus;
|
|
50
|
+
get eventSystem(): import('./event-system.js').EventSystem;
|
|
51
|
+
get state(): import('./state-machine.js').AgentState;
|
|
52
|
+
get _contextBuilder(): ContextBuilder;
|
|
53
|
+
run(input: string, signal?: globalThis.AbortSignal): Promise<AgentRunResult>;
|
|
54
|
+
resume(sessionId: string, signal?: globalThis.AbortSignal): Promise<AgentRunResult>;
|
|
55
|
+
stream(input: string, signal?: globalThis.AbortSignal): AsyncGenerator<string>;
|
|
56
|
+
streamEvents(input: string, signal?: globalThis.AbortSignal): AsyncGenerator<import('@primo-ai/sdk').StreamEvent>;
|
|
57
|
+
/** Clear the cached model so the next run re-resolves from the factory. */
|
|
58
|
+
invalidateModel(): void;
|
|
59
|
+
/** Auto-invalidate cached model when the error indicates auth failure or model-not-found. */
|
|
60
|
+
private autoInvalidateModel;
|
|
61
|
+
private getLLM;
|
|
62
|
+
private createContext;
|
|
63
|
+
private registerTools;
|
|
64
|
+
private registerBuiltinProcessors;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/agent.js
ADDED
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { PipelineRunner } from './pipeline.js';
|
|
2
|
+
import { ToolRegistry } from './tool-registry.js';
|
|
3
|
+
import { PluginManager } from './plugin-manager.js';
|
|
4
|
+
import { LLMInvoker } from './llm-invoker.js';
|
|
5
|
+
import { ModelFactory } from './model-factory.js';
|
|
6
|
+
import { getDefaultBuiltInGateway } from './gateways/builtin-gateway.js';
|
|
7
|
+
import { AuthError, ModelNotFoundError } from './errors.js';
|
|
8
|
+
import { LoopOrchestrator } from './loop-orchestrator.js';
|
|
9
|
+
import { JsonlCheckpointStore } from './checkpoint-store.js';
|
|
10
|
+
import { echoTool } from '@primo-ai/tools';
|
|
11
|
+
import { processInputProcessor, prepareStepExtensionPoint, createInvokeLLMProcessor, processStepOutputProcessor, gateToolExtensionPoint, createExecuteToolsProcessor, createEvaluateIterationProcessor, processOutputProcessor, } from './processors/index.js';
|
|
12
|
+
import { ContextBuilder } from './context-builder.js';
|
|
13
|
+
export class Agent {
|
|
14
|
+
config;
|
|
15
|
+
runner;
|
|
16
|
+
registry;
|
|
17
|
+
_pluginManager;
|
|
18
|
+
_tracer;
|
|
19
|
+
_autoCheckpoint;
|
|
20
|
+
_model = null;
|
|
21
|
+
modelFactory;
|
|
22
|
+
orchestrator;
|
|
23
|
+
sessionManager;
|
|
24
|
+
contextBuilder;
|
|
25
|
+
constructor(config, deps) {
|
|
26
|
+
this.config = config;
|
|
27
|
+
this.modelFactory = deps?.modelFactory ?? new ModelFactory();
|
|
28
|
+
this.modelFactory.registerGateway(getDefaultBuiltInGateway());
|
|
29
|
+
this._tracer = deps?.tracer;
|
|
30
|
+
this.runner = deps?.runner ?? new PipelineRunner({ tracer: deps?.tracer });
|
|
31
|
+
this.registry = deps?.registry ?? new ToolRegistry();
|
|
32
|
+
this.contextBuilder = deps?.contextBuilder ?? new ContextBuilder({ registry: this.registry });
|
|
33
|
+
this._pluginManager = deps?.pluginManager ?? new PluginManager(this.runner, this.registry, this.contextBuilder);
|
|
34
|
+
this.registry.setHookManager(this._pluginManager.hookManager);
|
|
35
|
+
this.registry.setEventBus(this._pluginManager.eventBus);
|
|
36
|
+
this.runner.setHookManager(this._pluginManager.hookManager);
|
|
37
|
+
const store = deps?.checkpointStore ?? (deps?.checkpointDir ? new JsonlCheckpointStore(deps.checkpointDir) : undefined);
|
|
38
|
+
this.orchestrator = new LoopOrchestrator(this.runner, this._pluginManager.hookManager, store, this._pluginManager.eventBus, deps?.stageConfig);
|
|
39
|
+
this.sessionManager = deps?.sessionManager;
|
|
40
|
+
this._autoCheckpoint = deps?.autoCheckpoint ?? false;
|
|
41
|
+
this.registerTools();
|
|
42
|
+
this.registerBuiltinProcessors();
|
|
43
|
+
this._pluginManager.setStageMutator((m) => this.orchestrator.applyMutation(m));
|
|
44
|
+
}
|
|
45
|
+
use(factory) {
|
|
46
|
+
if (typeof factory === 'function') {
|
|
47
|
+
this._pluginManager.initializePlugin(factory);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
this.runner.register(factory);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async teardown() {
|
|
54
|
+
await this._pluginManager.shutdown();
|
|
55
|
+
}
|
|
56
|
+
get pipelineRunner() {
|
|
57
|
+
return this.runner;
|
|
58
|
+
}
|
|
59
|
+
get toolRegistry() {
|
|
60
|
+
return this.registry;
|
|
61
|
+
}
|
|
62
|
+
get pluginManager() {
|
|
63
|
+
return this._pluginManager;
|
|
64
|
+
}
|
|
65
|
+
get eventBus() {
|
|
66
|
+
return this._pluginManager.eventBus;
|
|
67
|
+
}
|
|
68
|
+
get eventSystem() {
|
|
69
|
+
return this._pluginManager.eventSystem;
|
|
70
|
+
}
|
|
71
|
+
get state() {
|
|
72
|
+
return this.orchestrator.state;
|
|
73
|
+
}
|
|
74
|
+
get _contextBuilder() {
|
|
75
|
+
return this.contextBuilder;
|
|
76
|
+
}
|
|
77
|
+
async run(input, signal) {
|
|
78
|
+
if (signal?.aborted)
|
|
79
|
+
throw new DOMException('Agent run aborted', 'AbortError');
|
|
80
|
+
this._pluginManager.freezeHarnessInstances();
|
|
81
|
+
const context = await this.createContext(input);
|
|
82
|
+
const hm = this._pluginManager.hookManager;
|
|
83
|
+
// agent.start hook
|
|
84
|
+
await hm.invoke('agent.start', { sessionId: context.request.sessionId, request: context.request, agentConfig: this.config }, {});
|
|
85
|
+
const maxIter = typeof this.config.maxIterations === 'number' ? this.config.maxIterations : 10;
|
|
86
|
+
try {
|
|
87
|
+
const { context: finalCtx, compatRetries } = await this.orchestrator.runLoop(context, {
|
|
88
|
+
maxIterations: maxIter,
|
|
89
|
+
signal,
|
|
90
|
+
modelString: this.config.model,
|
|
91
|
+
sessionId: context.request.sessionId,
|
|
92
|
+
autoCheckpoint: this._autoCheckpoint,
|
|
93
|
+
});
|
|
94
|
+
return {
|
|
95
|
+
response: finalCtx.iteration.response ?? '',
|
|
96
|
+
tokenUsage: finalCtx.session.totalTokenUsage ?? { input: 0, output: 0 },
|
|
97
|
+
sessionId: context.request.sessionId,
|
|
98
|
+
compatRetries,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
this.autoInvalidateModel(error);
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
// agent.end hook — always fires, even on error; suppress hook errors to preserve original
|
|
107
|
+
try {
|
|
108
|
+
await hm.invoke('agent.end', { sessionId: context.request.sessionId }, {});
|
|
109
|
+
}
|
|
110
|
+
catch { /* hook error must not mask original */ }
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async resume(sessionId, signal) {
|
|
114
|
+
if (signal?.aborted)
|
|
115
|
+
throw new DOMException('Agent resume aborted', 'AbortError');
|
|
116
|
+
const hm = this._pluginManager.hookManager;
|
|
117
|
+
const maxIter = typeof this.config.maxIterations === 'number' ? this.config.maxIterations : 10;
|
|
118
|
+
try {
|
|
119
|
+
const { context: finalCtx, compatRetries } = await this.orchestrator.resumeLoop(sessionId, {
|
|
120
|
+
maxIterations: maxIter,
|
|
121
|
+
signal,
|
|
122
|
+
modelString: this.config.model,
|
|
123
|
+
sessionId,
|
|
124
|
+
autoCheckpoint: this._autoCheckpoint,
|
|
125
|
+
});
|
|
126
|
+
return {
|
|
127
|
+
response: finalCtx.iteration.response ?? '',
|
|
128
|
+
tokenUsage: finalCtx.session.totalTokenUsage ?? { input: 0, output: 0 },
|
|
129
|
+
sessionId,
|
|
130
|
+
compatRetries,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
this.autoInvalidateModel(error);
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
finally {
|
|
138
|
+
try {
|
|
139
|
+
await hm.invoke('agent.end', { sessionId }, {});
|
|
140
|
+
}
|
|
141
|
+
catch { /* hook error must not mask original */ }
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async *stream(input, signal) {
|
|
145
|
+
if (signal?.aborted)
|
|
146
|
+
throw new DOMException('Agent stream aborted', 'AbortError');
|
|
147
|
+
const context = await this.createContext(input);
|
|
148
|
+
const hm = this._pluginManager.hookManager;
|
|
149
|
+
// agent.start hook
|
|
150
|
+
await hm.invoke('agent.start', { sessionId: context.request.sessionId, request: context.request, agentConfig: this.config }, {});
|
|
151
|
+
const maxIter = typeof this.config.maxIterations === 'number' ? this.config.maxIterations : 10;
|
|
152
|
+
try {
|
|
153
|
+
yield* this.orchestrator.streamLoop(context, {
|
|
154
|
+
maxIterations: maxIter,
|
|
155
|
+
signal,
|
|
156
|
+
modelString: this.config.model,
|
|
157
|
+
sessionId: context.request.sessionId,
|
|
158
|
+
autoCheckpoint: this._autoCheckpoint,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
finally {
|
|
162
|
+
try {
|
|
163
|
+
await hm.invoke('agent.end', { sessionId: context.request.sessionId }, {});
|
|
164
|
+
}
|
|
165
|
+
catch { /* hook error must not mask original */ }
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
async *streamEvents(input, signal) {
|
|
169
|
+
if (signal?.aborted)
|
|
170
|
+
throw new DOMException('Agent stream aborted', 'AbortError');
|
|
171
|
+
const context = await this.createContext(input);
|
|
172
|
+
const hm = this._pluginManager.hookManager;
|
|
173
|
+
await hm.invoke('agent.start', { sessionId: context.request.sessionId, request: context.request, agentConfig: this.config }, {});
|
|
174
|
+
const maxIter = typeof this.config.maxIterations === 'number' ? this.config.maxIterations : 10;
|
|
175
|
+
try {
|
|
176
|
+
yield* this.orchestrator.streamEvents(context, {
|
|
177
|
+
maxIterations: maxIter,
|
|
178
|
+
signal,
|
|
179
|
+
modelString: this.config.model,
|
|
180
|
+
sessionId: context.request.sessionId,
|
|
181
|
+
autoCheckpoint: this._autoCheckpoint,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
finally {
|
|
185
|
+
try {
|
|
186
|
+
await hm.invoke('agent.end', { sessionId: context.request.sessionId }, {});
|
|
187
|
+
}
|
|
188
|
+
catch { /* hook error must not mask original */ }
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/** Clear the cached model so the next run re-resolves from the factory. */
|
|
192
|
+
invalidateModel() {
|
|
193
|
+
this._model = null;
|
|
194
|
+
}
|
|
195
|
+
/** Auto-invalidate cached model when the error indicates auth failure or model-not-found. */
|
|
196
|
+
autoInvalidateModel(error) {
|
|
197
|
+
if (isAuthOrNotFoundError(error)) {
|
|
198
|
+
this._model = null;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
async getLLM(systemPrompt) {
|
|
202
|
+
if (!this._model) {
|
|
203
|
+
this._model = await this.modelFactory.resolve(this.config.model);
|
|
204
|
+
}
|
|
205
|
+
return new LLMInvoker({
|
|
206
|
+
model: this._model,
|
|
207
|
+
system: systemPrompt,
|
|
208
|
+
retryOptions: { maxRetries: 3, baseDelay: 1000 },
|
|
209
|
+
tracer: this._tracer,
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
async createContext(input) {
|
|
213
|
+
let sessionId = crypto.randomUUID();
|
|
214
|
+
if (this.sessionManager) {
|
|
215
|
+
const record = await this.sessionManager.start(input);
|
|
216
|
+
sessionId = record.sessionId;
|
|
217
|
+
}
|
|
218
|
+
return {
|
|
219
|
+
request: { input, sessionId },
|
|
220
|
+
agent: { config: { ...this.config }, promptFragments: [], toolDeclarations: [] },
|
|
221
|
+
iteration: { step: 0 },
|
|
222
|
+
session: { custom: {} },
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
registerTools() {
|
|
226
|
+
const userToolNames = new Set((this.config.tools ?? []).map(t => t.name));
|
|
227
|
+
if (!userToolNames.has(echoTool.name)) {
|
|
228
|
+
this.registry.register(echoTool);
|
|
229
|
+
}
|
|
230
|
+
for (const tool of this.config.tools ?? []) {
|
|
231
|
+
this.registry.register(tool);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
registerBuiltinProcessors() {
|
|
235
|
+
this.runner.register(processInputProcessor);
|
|
236
|
+
this.runner.register(this.contextBuilder.createProcessor());
|
|
237
|
+
this.runner.register(prepareStepExtensionPoint);
|
|
238
|
+
this.runner.register(createInvokeLLMProcessor({
|
|
239
|
+
getLLM: (systemPrompt) => this.getLLM(systemPrompt),
|
|
240
|
+
registry: this.registry,
|
|
241
|
+
hookManager: this._pluginManager.hookManager,
|
|
242
|
+
modelString: this.config.model,
|
|
243
|
+
}));
|
|
244
|
+
this.runner.register(processStepOutputProcessor);
|
|
245
|
+
this.runner.register(gateToolExtensionPoint);
|
|
246
|
+
this.runner.register(createExecuteToolsProcessor(this.registry));
|
|
247
|
+
this.runner.register(createEvaluateIterationProcessor({ eventBus: this._pluginManager.eventBus }));
|
|
248
|
+
this.runner.register(processOutputProcessor);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
function isAuthOrNotFoundError(error) {
|
|
252
|
+
if (error instanceof AuthError || error instanceof ModelNotFoundError)
|
|
253
|
+
return true;
|
|
254
|
+
if (!(error instanceof Error))
|
|
255
|
+
return false;
|
|
256
|
+
const err = error;
|
|
257
|
+
const code = err.statusCode ?? err.status;
|
|
258
|
+
return code === 401 || code === 403 || code === 404;
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { CheckpointStore } from '@primo-ai/sdk';
|
|
2
|
+
export declare class InMemoryCheckpointStore<T = unknown> implements CheckpointStore<T> {
|
|
3
|
+
private store;
|
|
4
|
+
save(sessionId: string, data: T): Promise<void>;
|
|
5
|
+
load(sessionId: string): Promise<T | undefined>;
|
|
6
|
+
delete(sessionId: string): Promise<void>;
|
|
7
|
+
list(): Promise<string[]>;
|
|
8
|
+
}
|
|
9
|
+
export declare class JsonlCheckpointStore<T = unknown> implements CheckpointStore<T> {
|
|
10
|
+
private dir;
|
|
11
|
+
constructor(dir: string);
|
|
12
|
+
private validateSessionId;
|
|
13
|
+
private path;
|
|
14
|
+
save(sessionId: string, data: T): Promise<void>;
|
|
15
|
+
load(sessionId: string): Promise<T | undefined>;
|
|
16
|
+
delete(sessionId: string): Promise<void>;
|
|
17
|
+
list(): Promise<string[]>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=checkpoint-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint-store.d.ts","sourceRoot":"","sources":["../src/checkpoint-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAQrD,qBAAa,uBAAuB,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,eAAe,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,KAAK,CAAwB;IAE/B,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAI/C,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAGhC;AAED,qBAAa,oBAAoB,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,eAAe,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG;gBAAH,GAAG,EAAE,MAAM;IAE/B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,IAAI;IAIN,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAS/C,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAa/C,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASxC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAShC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir, rm, readdir, rename } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
function hasCode(err) {
|
|
4
|
+
return typeof err === 'object' && err !== null && 'code' in err;
|
|
5
|
+
}
|
|
6
|
+
export class InMemoryCheckpointStore {
|
|
7
|
+
store = new Map();
|
|
8
|
+
async save(sessionId, data) {
|
|
9
|
+
this.store.set(sessionId, data);
|
|
10
|
+
}
|
|
11
|
+
async load(sessionId) {
|
|
12
|
+
return this.store.get(sessionId);
|
|
13
|
+
}
|
|
14
|
+
async delete(sessionId) {
|
|
15
|
+
this.store.delete(sessionId);
|
|
16
|
+
}
|
|
17
|
+
async list() {
|
|
18
|
+
return [...this.store.keys()];
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export class JsonlCheckpointStore {
|
|
22
|
+
dir;
|
|
23
|
+
constructor(dir) {
|
|
24
|
+
this.dir = dir;
|
|
25
|
+
}
|
|
26
|
+
validateSessionId(sessionId) {
|
|
27
|
+
if (sessionId.includes('/') || sessionId.includes('\\') || sessionId.includes('..')) {
|
|
28
|
+
throw new Error(`Invalid sessionId: ${sessionId}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
path(sessionId) {
|
|
32
|
+
return join(this.dir, `${sessionId}.jsonl`);
|
|
33
|
+
}
|
|
34
|
+
async save(sessionId, data) {
|
|
35
|
+
this.validateSessionId(sessionId);
|
|
36
|
+
await mkdir(this.dir, { recursive: true });
|
|
37
|
+
const target = this.path(sessionId);
|
|
38
|
+
const tmp = `${target}.tmp`;
|
|
39
|
+
await writeFile(tmp, JSON.stringify(data) + '\n', 'utf-8');
|
|
40
|
+
await rename(tmp, target);
|
|
41
|
+
}
|
|
42
|
+
async load(sessionId) {
|
|
43
|
+
this.validateSessionId(sessionId);
|
|
44
|
+
try {
|
|
45
|
+
const content = await readFile(this.path(sessionId), 'utf-8');
|
|
46
|
+
const line = content.trim();
|
|
47
|
+
if (!line)
|
|
48
|
+
return undefined;
|
|
49
|
+
return JSON.parse(line);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
if (hasCode(err) && err.code === 'ENOENT')
|
|
53
|
+
return undefined;
|
|
54
|
+
throw err;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async delete(sessionId) {
|
|
58
|
+
this.validateSessionId(sessionId);
|
|
59
|
+
try {
|
|
60
|
+
await rm(this.path(sessionId));
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
if (!hasCode(err) || err.code !== 'ENOENT')
|
|
64
|
+
throw err;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async list() {
|
|
68
|
+
try {
|
|
69
|
+
const files = await readdir(this.dir);
|
|
70
|
+
return files.filter(f => f.endsWith('.jsonl')).map(f => f.slice(0, -6));
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
if (hasCode(err) && err.code === 'ENOENT')
|
|
74
|
+
return [];
|
|
75
|
+
throw err;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=checkpoint-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint-store.js","sourceRoot":"","sources":["../src/checkpoint-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ConcurrencySlot } from '@primo-ai/sdk';
|
|
2
|
+
export declare class ConcurrencyController {
|
|
3
|
+
private slots;
|
|
4
|
+
constructor(slotDefs: ConcurrencySlot[]);
|
|
5
|
+
acquire(slotKey: string, timeoutMs?: number): Promise<() => void>;
|
|
6
|
+
getActiveCount(slotKey: string): number;
|
|
7
|
+
private releaseSlot;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=concurrency-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrency-controller.d.ts","sourceRoot":"","sources":["../src/concurrency-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAQrD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,KAAK,CAAgC;gBAEjC,QAAQ,EAAE,eAAe,EAAE;IAMvC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;IAsDjE,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAKvC,OAAO,CAAC,WAAW;CAQpB"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export class ConcurrencyController {
|
|
2
|
+
slots = new Map();
|
|
3
|
+
constructor(slotDefs) {
|
|
4
|
+
for (const { key, maxConcurrent } of slotDefs) {
|
|
5
|
+
this.slots.set(key, { current: 0, max: maxConcurrent, waiters: [] });
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
acquire(slotKey, timeoutMs) {
|
|
9
|
+
const slot = this.slots.get(slotKey);
|
|
10
|
+
if (!slot) {
|
|
11
|
+
return Promise.reject(new Error(`Unknown concurrency slot: ${slotKey}`));
|
|
12
|
+
}
|
|
13
|
+
if (slot.current < slot.max) {
|
|
14
|
+
slot.current++;
|
|
15
|
+
let released = false;
|
|
16
|
+
return Promise.resolve(() => {
|
|
17
|
+
if (released)
|
|
18
|
+
return;
|
|
19
|
+
released = true;
|
|
20
|
+
this.releaseSlot(slot);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
let waiterRef = null;
|
|
24
|
+
const acquirePromise = new Promise((resolve) => {
|
|
25
|
+
const waiter = () => {
|
|
26
|
+
let released = false;
|
|
27
|
+
resolve(() => {
|
|
28
|
+
if (released)
|
|
29
|
+
return;
|
|
30
|
+
released = true;
|
|
31
|
+
this.releaseSlot(slot);
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
waiterRef = waiter;
|
|
35
|
+
slot.waiters.push(waiter);
|
|
36
|
+
});
|
|
37
|
+
if (timeoutMs == null) {
|
|
38
|
+
return acquirePromise;
|
|
39
|
+
}
|
|
40
|
+
let timer;
|
|
41
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
42
|
+
timer = setTimeout(() => {
|
|
43
|
+
// Remove our waiter from the queue so it doesn't leak
|
|
44
|
+
if (waiterRef) {
|
|
45
|
+
const idx = slot.waiters.indexOf(waiterRef);
|
|
46
|
+
if (idx !== -1)
|
|
47
|
+
slot.waiters.splice(idx, 1);
|
|
48
|
+
}
|
|
49
|
+
reject(new Error(`Concurrency acquire timed out for slot "${slotKey}" after ${timeoutMs}ms`));
|
|
50
|
+
}, timeoutMs);
|
|
51
|
+
});
|
|
52
|
+
return Promise.race([acquirePromise, timeoutPromise]).finally(() => {
|
|
53
|
+
clearTimeout(timer);
|
|
54
|
+
// If acquire won the race, the waiter was already consumed — nothing to clean.
|
|
55
|
+
// If timeout won, we already removed it above.
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
getActiveCount(slotKey) {
|
|
59
|
+
const slot = this.slots.get(slotKey);
|
|
60
|
+
return slot ? slot.current : 0;
|
|
61
|
+
}
|
|
62
|
+
releaseSlot(slot) {
|
|
63
|
+
slot.current--;
|
|
64
|
+
if (slot.waiters.length > 0) {
|
|
65
|
+
const next = slot.waiters.shift();
|
|
66
|
+
slot.current++;
|
|
67
|
+
next();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=concurrency-controller.js.map
|