@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.
Files changed (77) hide show
  1. package/package.json +31 -0
  2. package/src/agent/AgentStateMachine.ts +151 -0
  3. package/src/agent/README.md +296 -0
  4. package/src/agent/__tests__/AgentStateMachine.test.ts +346 -0
  5. package/src/agent/__tests__/createAgent.test.ts +728 -0
  6. package/src/agent/__tests__/engine/internal/messageAssemblerProcessor.test.ts +567 -0
  7. package/src/agent/__tests__/engine/internal/stateEventProcessor.test.ts +315 -0
  8. package/src/agent/__tests__/engine/internal/turnTrackerProcessor.test.ts +340 -0
  9. package/src/agent/__tests__/engine/mealy/Mealy.test.ts +370 -0
  10. package/src/agent/__tests__/engine/mealy/Store.test.ts +123 -0
  11. package/src/agent/__tests__/engine/mealy/combinators.test.ts +322 -0
  12. package/src/agent/createAgent.ts +467 -0
  13. package/src/agent/engine/AgentProcessor.ts +106 -0
  14. package/src/agent/engine/MealyMachine.ts +184 -0
  15. package/src/agent/engine/internal/index.ts +35 -0
  16. package/src/agent/engine/internal/messageAssemblerProcessor.ts +550 -0
  17. package/src/agent/engine/internal/stateEventProcessor.ts +313 -0
  18. package/src/agent/engine/internal/turnTrackerProcessor.ts +239 -0
  19. package/src/agent/engine/mealy/Mealy.ts +308 -0
  20. package/src/agent/engine/mealy/Processor.ts +70 -0
  21. package/src/agent/engine/mealy/Sink.ts +56 -0
  22. package/src/agent/engine/mealy/Source.ts +51 -0
  23. package/src/agent/engine/mealy/Store.ts +98 -0
  24. package/src/agent/engine/mealy/combinators.ts +176 -0
  25. package/src/agent/engine/mealy/index.ts +45 -0
  26. package/src/agent/index.ts +106 -0
  27. package/src/agent/types/engine.ts +395 -0
  28. package/src/agent/types/event.ts +478 -0
  29. package/src/agent/types/index.ts +197 -0
  30. package/src/agent/types/message.ts +387 -0
  31. package/src/common/index.ts +8 -0
  32. package/src/common/logger/ConsoleLogger.ts +137 -0
  33. package/src/common/logger/LoggerFactoryImpl.ts +123 -0
  34. package/src/common/logger/index.ts +26 -0
  35. package/src/common/logger/types.ts +98 -0
  36. package/src/container/Container.ts +185 -0
  37. package/src/container/index.ts +44 -0
  38. package/src/container/types.ts +71 -0
  39. package/src/driver/index.ts +42 -0
  40. package/src/driver/types.ts +363 -0
  41. package/src/event/EventBus.ts +260 -0
  42. package/src/event/README.md +237 -0
  43. package/src/event/__tests__/EventBus.test.ts +251 -0
  44. package/src/event/index.ts +46 -0
  45. package/src/event/types/agent.ts +512 -0
  46. package/src/event/types/base.ts +241 -0
  47. package/src/event/types/bus.ts +429 -0
  48. package/src/event/types/command.ts +749 -0
  49. package/src/event/types/container.ts +471 -0
  50. package/src/event/types/driver.ts +452 -0
  51. package/src/event/types/index.ts +26 -0
  52. package/src/event/types/session.ts +314 -0
  53. package/src/image/Image.ts +203 -0
  54. package/src/image/index.ts +36 -0
  55. package/src/image/types.ts +77 -0
  56. package/src/index.ts +20 -0
  57. package/src/mq/OffsetGenerator.ts +48 -0
  58. package/src/mq/README.md +166 -0
  59. package/src/mq/__tests__/OffsetGenerator.test.ts +121 -0
  60. package/src/mq/index.ts +18 -0
  61. package/src/mq/types.ts +172 -0
  62. package/src/network/RpcClient.ts +455 -0
  63. package/src/network/index.ts +76 -0
  64. package/src/network/jsonrpc.ts +336 -0
  65. package/src/network/protocol.ts +90 -0
  66. package/src/network/types.ts +284 -0
  67. package/src/persistence/index.ts +27 -0
  68. package/src/persistence/types.ts +226 -0
  69. package/src/runtime/AgentXRuntime.ts +501 -0
  70. package/src/runtime/index.ts +56 -0
  71. package/src/runtime/types.ts +236 -0
  72. package/src/session/Session.ts +71 -0
  73. package/src/session/index.ts +25 -0
  74. package/src/session/types.ts +77 -0
  75. package/src/workspace/index.ts +27 -0
  76. package/src/workspace/types.ts +131 -0
  77. 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";