@agentxjs/core 1.9.1-dev
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 +31 -0
- package/src/agent/AgentStateMachine.ts +151 -0
- package/src/agent/README.md +296 -0
- package/src/agent/__tests__/AgentStateMachine.test.ts +346 -0
- package/src/agent/__tests__/createAgent.test.ts +728 -0
- package/src/agent/__tests__/engine/internal/messageAssemblerProcessor.test.ts +567 -0
- package/src/agent/__tests__/engine/internal/stateEventProcessor.test.ts +315 -0
- package/src/agent/__tests__/engine/internal/turnTrackerProcessor.test.ts +340 -0
- package/src/agent/__tests__/engine/mealy/Mealy.test.ts +370 -0
- package/src/agent/__tests__/engine/mealy/Store.test.ts +123 -0
- package/src/agent/__tests__/engine/mealy/combinators.test.ts +322 -0
- package/src/agent/createAgent.ts +467 -0
- package/src/agent/engine/AgentProcessor.ts +106 -0
- package/src/agent/engine/MealyMachine.ts +184 -0
- package/src/agent/engine/internal/index.ts +35 -0
- package/src/agent/engine/internal/messageAssemblerProcessor.ts +550 -0
- package/src/agent/engine/internal/stateEventProcessor.ts +313 -0
- package/src/agent/engine/internal/turnTrackerProcessor.ts +239 -0
- package/src/agent/engine/mealy/Mealy.ts +308 -0
- package/src/agent/engine/mealy/Processor.ts +70 -0
- package/src/agent/engine/mealy/Sink.ts +56 -0
- package/src/agent/engine/mealy/Source.ts +51 -0
- package/src/agent/engine/mealy/Store.ts +98 -0
- package/src/agent/engine/mealy/combinators.ts +176 -0
- package/src/agent/engine/mealy/index.ts +45 -0
- package/src/agent/index.ts +106 -0
- package/src/agent/types/engine.ts +395 -0
- package/src/agent/types/event.ts +478 -0
- package/src/agent/types/index.ts +197 -0
- package/src/agent/types/message.ts +387 -0
- package/src/common/index.ts +8 -0
- package/src/common/logger/ConsoleLogger.ts +137 -0
- package/src/common/logger/LoggerFactoryImpl.ts +123 -0
- package/src/common/logger/index.ts +26 -0
- package/src/common/logger/types.ts +98 -0
- package/src/container/Container.ts +185 -0
- package/src/container/index.ts +44 -0
- package/src/container/types.ts +71 -0
- package/src/driver/index.ts +42 -0
- package/src/driver/types.ts +363 -0
- package/src/event/EventBus.ts +260 -0
- package/src/event/README.md +237 -0
- package/src/event/__tests__/EventBus.test.ts +251 -0
- package/src/event/index.ts +46 -0
- package/src/event/types/agent.ts +512 -0
- package/src/event/types/base.ts +241 -0
- package/src/event/types/bus.ts +429 -0
- package/src/event/types/command.ts +749 -0
- package/src/event/types/container.ts +471 -0
- package/src/event/types/driver.ts +452 -0
- package/src/event/types/index.ts +26 -0
- package/src/event/types/session.ts +314 -0
- package/src/image/Image.ts +203 -0
- package/src/image/index.ts +36 -0
- package/src/image/types.ts +77 -0
- package/src/index.ts +20 -0
- package/src/mq/OffsetGenerator.ts +48 -0
- package/src/mq/README.md +166 -0
- package/src/mq/__tests__/OffsetGenerator.test.ts +121 -0
- package/src/mq/index.ts +18 -0
- package/src/mq/types.ts +172 -0
- package/src/network/RpcClient.ts +455 -0
- package/src/network/index.ts +76 -0
- package/src/network/jsonrpc.ts +336 -0
- package/src/network/protocol.ts +90 -0
- package/src/network/types.ts +284 -0
- package/src/persistence/index.ts +27 -0
- package/src/persistence/types.ts +226 -0
- package/src/runtime/AgentXRuntime.ts +501 -0
- package/src/runtime/index.ts +56 -0
- package/src/runtime/types.ts +236 -0
- package/src/session/Session.ts +71 -0
- package/src/session/index.ts +25 -0
- package/src/session/types.ts +77 -0
- package/src/workspace/index.ts +27 -0
- package/src/workspace/types.ts +131 -0
- package/tsconfig.json +10 -0
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MealyMachine - Pure Mealy Machine Event Processor
|
|
3
|
+
*
|
|
4
|
+
* MealyMachine is a stateless event processor that transforms StreamEvents
|
|
5
|
+
* into higher-level events (state, message, turn events).
|
|
6
|
+
*
|
|
7
|
+
* Key Design:
|
|
8
|
+
* - Engine is a pure Mealy Machine: process(agentId, event) → outputs
|
|
9
|
+
* - Engine does NOT hold driver or presenters (those belong to AgentEngine layer)
|
|
10
|
+
* - Engine manages intermediate processing state per agentId
|
|
11
|
+
* - Multiple agents can share the same MealyMachine instance
|
|
12
|
+
*
|
|
13
|
+
* Type Relationship:
|
|
14
|
+
* ```
|
|
15
|
+
* StreamEvent (from Driver)
|
|
16
|
+
* │
|
|
17
|
+
* └── message_start, text_delta, tool_use_start, message_stop...
|
|
18
|
+
* ↓ MealyMachine processes
|
|
19
|
+
* AgentOutput (to AgentEngine/Presenter)
|
|
20
|
+
* │
|
|
21
|
+
* ├── StateEvent (conversation_start, conversation_end...)
|
|
22
|
+
* ├── MessageEvent (assistant_message, tool_call_message...)
|
|
23
|
+
* └── TurnEvent (turn_request, turn_response)
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* State Management:
|
|
27
|
+
* - Processing state (pendingContents, etc.) is managed internally per agentId
|
|
28
|
+
* - Business data persistence is NOT handled here - that's AgentEngine layer's job
|
|
29
|
+
*
|
|
30
|
+
* Usage:
|
|
31
|
+
* ```typescript
|
|
32
|
+
* const machine = new MealyMachine();
|
|
33
|
+
*
|
|
34
|
+
* // AgentEngine layer coordinates:
|
|
35
|
+
* // 1. Driver produces StreamEvents
|
|
36
|
+
* // 2. MealyMachine processes events
|
|
37
|
+
* // 3. Presenters handle outputs
|
|
38
|
+
*
|
|
39
|
+
* for await (const streamEvent of driver.receive(message)) {
|
|
40
|
+
* const outputs = machine.process(agentId, streamEvent);
|
|
41
|
+
* for (const output of outputs) {
|
|
42
|
+
* presenters.forEach(p => p.present(agentId, output));
|
|
43
|
+
* }
|
|
44
|
+
* }
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
import {
|
|
49
|
+
agentProcessor,
|
|
50
|
+
createInitialAgentEngineState,
|
|
51
|
+
type AgentEngineState,
|
|
52
|
+
} from "./AgentProcessor";
|
|
53
|
+
import { MemoryStore } from "./mealy";
|
|
54
|
+
import type { AgentOutput, StreamEvent } from "../types";
|
|
55
|
+
import { createLogger } from "commonxjs/logger";
|
|
56
|
+
|
|
57
|
+
const logger = createLogger("engine/MealyMachine");
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* MealyMachine - Pure Mealy Machine for event processing
|
|
61
|
+
*
|
|
62
|
+
* - Input: StreamEvent (from Driver)
|
|
63
|
+
* - Output: AgentOutput[] (state, message, turn events)
|
|
64
|
+
* - State: Managed internally per agentId
|
|
65
|
+
*/
|
|
66
|
+
export class MealyMachine {
|
|
67
|
+
private readonly store: MemoryStore<AgentEngineState>;
|
|
68
|
+
|
|
69
|
+
constructor() {
|
|
70
|
+
this.store = new MemoryStore<AgentEngineState>();
|
|
71
|
+
logger.debug("MealyMachine initialized");
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Process a single driveable event and return output events
|
|
76
|
+
*
|
|
77
|
+
* This is the core Mealy Machine operation:
|
|
78
|
+
* process(agentId, event) → outputs[]
|
|
79
|
+
*
|
|
80
|
+
* @param agentId - The agent identifier (for state isolation)
|
|
81
|
+
* @param event - StreamEvent to process
|
|
82
|
+
* @returns Array of output events (state, message, turn events)
|
|
83
|
+
*/
|
|
84
|
+
process(agentId: string, event: StreamEvent): AgentOutput[] {
|
|
85
|
+
const eventType = (event as { type?: string }).type || "unknown";
|
|
86
|
+
logger.debug("Processing event", { agentId, eventType });
|
|
87
|
+
|
|
88
|
+
// Get current state or create initial state
|
|
89
|
+
const isNewState = !this.store.has(agentId);
|
|
90
|
+
let state = this.store.get(agentId) ?? createInitialAgentEngineState();
|
|
91
|
+
|
|
92
|
+
if (isNewState) {
|
|
93
|
+
logger.debug("Created initial state for agent", { agentId });
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Collect all outputs
|
|
97
|
+
const allOutputs: AgentOutput[] = [];
|
|
98
|
+
|
|
99
|
+
// Pass-through: original stream event is also an output
|
|
100
|
+
allOutputs.push(event);
|
|
101
|
+
|
|
102
|
+
// Process through Mealy Machine
|
|
103
|
+
const [newState, outputs] = agentProcessor(state, event);
|
|
104
|
+
state = newState;
|
|
105
|
+
|
|
106
|
+
// Collect processor outputs
|
|
107
|
+
for (const output of outputs) {
|
|
108
|
+
allOutputs.push(output);
|
|
109
|
+
|
|
110
|
+
// Re-inject for event chaining (e.g., TurnTracker needs MessageEvents)
|
|
111
|
+
const [chainedState, chainedOutputs] = this.processChained(state, output);
|
|
112
|
+
state = chainedState;
|
|
113
|
+
allOutputs.push(...chainedOutputs);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Store updated state
|
|
117
|
+
this.store.set(agentId, state);
|
|
118
|
+
|
|
119
|
+
if (outputs.length > 0) {
|
|
120
|
+
logger.debug("Produced outputs", {
|
|
121
|
+
agentId,
|
|
122
|
+
inputEvent: eventType,
|
|
123
|
+
outputCount: allOutputs.length,
|
|
124
|
+
processorOutputs: outputs.length,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return allOutputs;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Process chained events recursively
|
|
133
|
+
*
|
|
134
|
+
* Some processors produce events that trigger other processors:
|
|
135
|
+
* - MessageAssembler produces MessageEvents
|
|
136
|
+
* - TurnTracker consumes MessageEvents to produce TurnEvents
|
|
137
|
+
*/
|
|
138
|
+
private processChained(
|
|
139
|
+
state: AgentEngineState,
|
|
140
|
+
event: AgentOutput
|
|
141
|
+
): [AgentEngineState, AgentOutput[]] {
|
|
142
|
+
const [newState, outputs] = agentProcessor(state, event);
|
|
143
|
+
|
|
144
|
+
if (outputs.length === 0) {
|
|
145
|
+
return [newState, []];
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Process outputs recursively
|
|
149
|
+
const allOutputs: AgentOutput[] = [...outputs];
|
|
150
|
+
let currentState = newState;
|
|
151
|
+
|
|
152
|
+
for (const output of outputs) {
|
|
153
|
+
const [chainedState, chainedOutputs] = this.processChained(currentState, output);
|
|
154
|
+
currentState = chainedState;
|
|
155
|
+
allOutputs.push(...chainedOutputs);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return [currentState, allOutputs];
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Clear state for an agent
|
|
163
|
+
*
|
|
164
|
+
* Call this when an agent is destroyed to free memory.
|
|
165
|
+
*/
|
|
166
|
+
clearState(agentId: string): void {
|
|
167
|
+
logger.debug("Clearing state", { agentId });
|
|
168
|
+
this.store.delete(agentId);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Check if state exists for an agent
|
|
173
|
+
*/
|
|
174
|
+
hasState(agentId: string): boolean {
|
|
175
|
+
return this.store.has(agentId);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Factory function to create MealyMachine
|
|
181
|
+
*/
|
|
182
|
+
export function createMealyMachine(): MealyMachine {
|
|
183
|
+
return new MealyMachine();
|
|
184
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal processors for agentx-engine
|
|
3
|
+
*
|
|
4
|
+
* These are implementation details and should not be used directly.
|
|
5
|
+
* Use the public API (AgentProcessor, Driver, Presenter) instead.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export {
|
|
9
|
+
messageAssemblerProcessor,
|
|
10
|
+
messageAssemblerProcessorDef,
|
|
11
|
+
type MessageAssemblerInput,
|
|
12
|
+
type MessageAssemblerOutput,
|
|
13
|
+
type MessageAssemblerState,
|
|
14
|
+
type PendingContent,
|
|
15
|
+
createInitialMessageAssemblerState,
|
|
16
|
+
} from "./messageAssemblerProcessor";
|
|
17
|
+
|
|
18
|
+
export {
|
|
19
|
+
stateEventProcessor,
|
|
20
|
+
stateEventProcessorDef,
|
|
21
|
+
type StateEventProcessorInput,
|
|
22
|
+
type StateEventProcessorOutput,
|
|
23
|
+
type StateEventProcessorContext,
|
|
24
|
+
createInitialStateEventProcessorContext,
|
|
25
|
+
} from "./stateEventProcessor";
|
|
26
|
+
|
|
27
|
+
export {
|
|
28
|
+
turnTrackerProcessor,
|
|
29
|
+
turnTrackerProcessorDef,
|
|
30
|
+
type TurnTrackerInput,
|
|
31
|
+
type TurnTrackerOutput,
|
|
32
|
+
type TurnTrackerState,
|
|
33
|
+
type PendingTurn,
|
|
34
|
+
createInitialTurnTrackerState,
|
|
35
|
+
} from "./turnTrackerProcessor";
|