@animalabs/agent-framework 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/LICENSE +21 -0
- package/README.md +233 -0
- package/dist/src/agent.d.ts +130 -0
- package/dist/src/agent.d.ts.map +1 -0
- package/dist/src/agent.js +406 -0
- package/dist/src/agent.js.map +1 -0
- package/dist/src/api/mcp-server.d.ts +37 -0
- package/dist/src/api/mcp-server.d.ts.map +1 -0
- package/dist/src/api/mcp-server.js +598 -0
- package/dist/src/api/mcp-server.js.map +1 -0
- package/dist/src/api/server.d.ts +83 -0
- package/dist/src/api/server.d.ts.map +1 -0
- package/dist/src/api/server.js +785 -0
- package/dist/src/api/server.js.map +1 -0
- package/dist/src/api/types.d.ts +395 -0
- package/dist/src/api/types.d.ts.map +1 -0
- package/dist/src/api/types.js +5 -0
- package/dist/src/api/types.js.map +1 -0
- package/dist/src/framework.d.ts +309 -0
- package/dist/src/framework.d.ts.map +1 -0
- package/dist/src/framework.js +2309 -0
- package/dist/src/framework.js.map +1 -0
- package/dist/src/gate/event-gate.d.ts +75 -0
- package/dist/src/gate/event-gate.d.ts.map +1 -0
- package/dist/src/gate/event-gate.js +503 -0
- package/dist/src/gate/event-gate.js.map +1 -0
- package/dist/src/gate/index.d.ts +3 -0
- package/dist/src/gate/index.d.ts.map +1 -0
- package/dist/src/gate/index.js +2 -0
- package/dist/src/gate/index.js.map +1 -0
- package/dist/src/gate/types.d.ts +82 -0
- package/dist/src/gate/types.d.ts.map +1 -0
- package/dist/src/gate/types.js +9 -0
- package/dist/src/gate/types.js.map +1 -0
- package/dist/src/index.d.ts +17 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +18 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/mcpl/channel-registry.d.ts +141 -0
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -0
- package/dist/src/mcpl/channel-registry.js +647 -0
- package/dist/src/mcpl/channel-registry.js.map +1 -0
- package/dist/src/mcpl/checkpoint-manager.d.ts +79 -0
- package/dist/src/mcpl/checkpoint-manager.d.ts.map +1 -0
- package/dist/src/mcpl/checkpoint-manager.js +430 -0
- package/dist/src/mcpl/checkpoint-manager.js.map +1 -0
- package/dist/src/mcpl/errors.d.ts +52 -0
- package/dist/src/mcpl/errors.d.ts.map +1 -0
- package/dist/src/mcpl/errors.js +93 -0
- package/dist/src/mcpl/errors.js.map +1 -0
- package/dist/src/mcpl/feature-set-manager.d.ts +91 -0
- package/dist/src/mcpl/feature-set-manager.d.ts.map +1 -0
- package/dist/src/mcpl/feature-set-manager.js +250 -0
- package/dist/src/mcpl/feature-set-manager.js.map +1 -0
- package/dist/src/mcpl/hook-orchestrator.d.ts +51 -0
- package/dist/src/mcpl/hook-orchestrator.d.ts.map +1 -0
- package/dist/src/mcpl/hook-orchestrator.js +217 -0
- package/dist/src/mcpl/hook-orchestrator.js.map +1 -0
- package/dist/src/mcpl/index.d.ts +14 -0
- package/dist/src/mcpl/index.d.ts.map +1 -0
- package/dist/src/mcpl/index.js +21 -0
- package/dist/src/mcpl/index.js.map +1 -0
- package/dist/src/mcpl/inference-router.d.ts +67 -0
- package/dist/src/mcpl/inference-router.d.ts.map +1 -0
- package/dist/src/mcpl/inference-router.js +249 -0
- package/dist/src/mcpl/inference-router.js.map +1 -0
- package/dist/src/mcpl/push-handler.d.ts +60 -0
- package/dist/src/mcpl/push-handler.d.ts.map +1 -0
- package/dist/src/mcpl/push-handler.js +162 -0
- package/dist/src/mcpl/push-handler.js.map +1 -0
- package/dist/src/mcpl/scope-manager.d.ts +76 -0
- package/dist/src/mcpl/scope-manager.d.ts.map +1 -0
- package/dist/src/mcpl/scope-manager.js +213 -0
- package/dist/src/mcpl/scope-manager.js.map +1 -0
- package/dist/src/mcpl/server-connection.d.ts +174 -0
- package/dist/src/mcpl/server-connection.d.ts.map +1 -0
- package/dist/src/mcpl/server-connection.js +559 -0
- package/dist/src/mcpl/server-connection.js.map +1 -0
- package/dist/src/mcpl/server-registry.d.ts +63 -0
- package/dist/src/mcpl/server-registry.d.ts.map +1 -0
- package/dist/src/mcpl/server-registry.js +119 -0
- package/dist/src/mcpl/server-registry.js.map +1 -0
- package/dist/src/mcpl/types.d.ts +755 -0
- package/dist/src/mcpl/types.d.ts.map +1 -0
- package/dist/src/mcpl/types.js +48 -0
- package/dist/src/mcpl/types.js.map +1 -0
- package/dist/src/module-registry.d.ts +93 -0
- package/dist/src/module-registry.d.ts.map +1 -0
- package/dist/src/module-registry.js +386 -0
- package/dist/src/module-registry.js.map +1 -0
- package/dist/src/modules/api/index.d.ts +22 -0
- package/dist/src/modules/api/index.d.ts.map +1 -0
- package/dist/src/modules/api/index.js +63 -0
- package/dist/src/modules/api/index.js.map +1 -0
- package/dist/src/modules/discord/discord-js-client.d.ts +58 -0
- package/dist/src/modules/discord/discord-js-client.d.ts.map +1 -0
- package/dist/src/modules/discord/discord-js-client.js +273 -0
- package/dist/src/modules/discord/discord-js-client.js.map +1 -0
- package/dist/src/modules/discord/index.d.ts +82 -0
- package/dist/src/modules/discord/index.d.ts.map +1 -0
- package/dist/src/modules/discord/index.js +959 -0
- package/dist/src/modules/discord/index.js.map +1 -0
- package/dist/src/modules/discord/types.d.ts +327 -0
- package/dist/src/modules/discord/types.d.ts.map +1 -0
- package/dist/src/modules/discord/types.js +5 -0
- package/dist/src/modules/discord/types.js.map +1 -0
- package/dist/src/modules/index.d.ts +11 -0
- package/dist/src/modules/index.d.ts.map +1 -0
- package/dist/src/modules/index.js +7 -0
- package/dist/src/modules/index.js.map +1 -0
- package/dist/src/modules/workspace/index.d.ts +59 -0
- package/dist/src/modules/workspace/index.d.ts.map +1 -0
- package/dist/src/modules/workspace/index.js +831 -0
- package/dist/src/modules/workspace/index.js.map +1 -0
- package/dist/src/modules/workspace/sync.d.ts +48 -0
- package/dist/src/modules/workspace/sync.d.ts.map +1 -0
- package/dist/src/modules/workspace/sync.js +253 -0
- package/dist/src/modules/workspace/sync.js.map +1 -0
- package/dist/src/modules/workspace/types.d.ts +166 -0
- package/dist/src/modules/workspace/types.d.ts.map +1 -0
- package/dist/src/modules/workspace/types.js +5 -0
- package/dist/src/modules/workspace/types.js.map +1 -0
- package/dist/src/modules/workspace/watcher.d.ts +43 -0
- package/dist/src/modules/workspace/watcher.d.ts.map +1 -0
- package/dist/src/modules/workspace/watcher.js +120 -0
- package/dist/src/modules/workspace/watcher.js.map +1 -0
- package/dist/src/queue.d.ts +50 -0
- package/dist/src/queue.d.ts.map +1 -0
- package/dist/src/queue.js +95 -0
- package/dist/src/queue.js.map +1 -0
- package/dist/src/safe-slice.d.ts +8 -0
- package/dist/src/safe-slice.d.ts.map +1 -0
- package/dist/src/safe-slice.js +18 -0
- package/dist/src/safe-slice.js.map +1 -0
- package/dist/src/types/agent.d.ts +118 -0
- package/dist/src/types/agent.d.ts.map +1 -0
- package/dist/src/types/agent.js +2 -0
- package/dist/src/types/agent.js.map +1 -0
- package/dist/src/types/events.d.ts +220 -0
- package/dist/src/types/events.d.ts.map +1 -0
- package/dist/src/types/events.js +2 -0
- package/dist/src/types/events.js.map +1 -0
- package/dist/src/types/framework.d.ts +184 -0
- package/dist/src/types/framework.d.ts.map +1 -0
- package/dist/src/types/framework.js +2 -0
- package/dist/src/types/framework.js.map +1 -0
- package/dist/src/types/index.d.ts +7 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +7 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/inference-log.d.ts +64 -0
- package/dist/src/types/inference-log.d.ts.map +1 -0
- package/dist/src/types/inference-log.js +5 -0
- package/dist/src/types/inference-log.js.map +1 -0
- package/dist/src/types/module.d.ts +302 -0
- package/dist/src/types/module.d.ts.map +1 -0
- package/dist/src/types/module.js +2 -0
- package/dist/src/types/module.js.map +1 -0
- package/dist/src/types/trace.d.ts +173 -0
- package/dist/src/types/trace.d.ts.map +1 -0
- package/dist/src/types/trace.js +2 -0
- package/dist/src/types/trace.js.map +1 -0
- package/dist/test/event-gate.test.d.ts +2 -0
- package/dist/test/event-gate.test.d.ts.map +1 -0
- package/dist/test/event-gate.test.js +535 -0
- package/dist/test/event-gate.test.js.map +1 -0
- package/dist/test/framework.test.d.ts +5 -0
- package/dist/test/framework.test.d.ts.map +1 -0
- package/dist/test/framework.test.js +738 -0
- package/dist/test/framework.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +58 -0
- package/src/agent.ts +512 -0
- package/src/api/mcp-server.ts +687 -0
- package/src/api/server.ts +1023 -0
- package/src/api/types.ts +542 -0
- package/src/framework.ts +2784 -0
- package/src/gate/event-gate.ts +623 -0
- package/src/gate/index.ts +12 -0
- package/src/gate/types.ts +112 -0
- package/src/index.ts +63 -0
- package/src/mcpl/channel-registry.ts +824 -0
- package/src/mcpl/checkpoint-manager.ts +545 -0
- package/src/mcpl/errors.ts +114 -0
- package/src/mcpl/feature-set-manager.ts +333 -0
- package/src/mcpl/hook-orchestrator.ts +281 -0
- package/src/mcpl/index.ts +134 -0
- package/src/mcpl/inference-router.ts +335 -0
- package/src/mcpl/push-handler.ts +232 -0
- package/src/mcpl/scope-manager.ts +262 -0
- package/src/mcpl/server-connection.ts +694 -0
- package/src/mcpl/server-registry.ts +144 -0
- package/src/mcpl/types.ts +991 -0
- package/src/module-registry.ts +547 -0
- package/src/modules/api/index.ts +94 -0
- package/src/modules/discord/discord-js-client.ts +353 -0
- package/src/modules/discord/index.ts +1146 -0
- package/src/modules/discord/types.ts +465 -0
- package/src/modules/index.ts +43 -0
- package/src/modules/workspace/index.ts +969 -0
- package/src/modules/workspace/sync.ts +314 -0
- package/src/modules/workspace/types.ts +202 -0
- package/src/modules/workspace/watcher.ts +142 -0
- package/src/queue.ts +106 -0
- package/src/safe-slice.ts +18 -0
- package/src/types/agent.ts +119 -0
- package/src/types/events.ts +252 -0
- package/src/types/framework.ts +211 -0
- package/src/types/index.ts +6 -0
- package/src/types/inference-log.ts +64 -0
- package/src/types/module.ts +367 -0
- package/src/types/trace.ts +196 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for inference logging - captures raw LLM requests and responses
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// Re-export InferenceLogEntry from framework.ts for convenience
|
|
6
|
+
export type { InferenceLogEntry } from './framework.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Query options for inference logs
|
|
10
|
+
*/
|
|
11
|
+
export interface InferenceLogQuery {
|
|
12
|
+
/** Filter by agent name */
|
|
13
|
+
agentName?: string;
|
|
14
|
+
/** Max number of logs to return */
|
|
15
|
+
limit?: number;
|
|
16
|
+
/** Skip first N logs (for pagination) */
|
|
17
|
+
offset?: number;
|
|
18
|
+
/** Search pattern for content (regex) */
|
|
19
|
+
pattern?: string;
|
|
20
|
+
/** Only show failures */
|
|
21
|
+
errorsOnly?: boolean;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Result from querying inference logs
|
|
26
|
+
*/
|
|
27
|
+
export interface InferenceLogQueryResult {
|
|
28
|
+
/** Matching entries */
|
|
29
|
+
entries: InferenceLogEntryWithId[];
|
|
30
|
+
/** Total count matching query (before pagination) */
|
|
31
|
+
total: number;
|
|
32
|
+
/** Whether more entries exist beyond limit */
|
|
33
|
+
hasMore: boolean;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Inference log entry with Chronicle sequence ID
|
|
38
|
+
*/
|
|
39
|
+
export interface InferenceLogEntryWithId {
|
|
40
|
+
/** Chronicle sequence number (acts as ID) */
|
|
41
|
+
sequence: number;
|
|
42
|
+
/** The log entry data (may contain blob references) */
|
|
43
|
+
entry: import('./framework.js').InferenceLogEntry;
|
|
44
|
+
/** Summary info for display without resolving blobs */
|
|
45
|
+
summary?: InferenceLogSummary;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Summary view of an inference log (without full request/response)
|
|
50
|
+
*/
|
|
51
|
+
export interface InferenceLogSummary {
|
|
52
|
+
timestamp: number;
|
|
53
|
+
agentName: string;
|
|
54
|
+
requestId: string;
|
|
55
|
+
success: boolean;
|
|
56
|
+
error?: string;
|
|
57
|
+
durationMs: number;
|
|
58
|
+
tokenUsage?: { input: number; output: number; cacheCreation?: number; cacheRead?: number };
|
|
59
|
+
stopReason?: string;
|
|
60
|
+
/** Whether request is stored as blob */
|
|
61
|
+
requestIsBlob: boolean;
|
|
62
|
+
/** Whether response is stored as blob */
|
|
63
|
+
responseIsBlob: boolean;
|
|
64
|
+
}
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
import type { ContentBlock } from '@animalabs/membrane';
|
|
2
|
+
import type {
|
|
3
|
+
MessageId,
|
|
4
|
+
MessageMetadata,
|
|
5
|
+
StoredMessage,
|
|
6
|
+
ContextInjection,
|
|
7
|
+
} from '@animalabs/context-manager';
|
|
8
|
+
import type { ProcessEvent, ToolDefinition, ToolCall, ToolResult } from './events.js';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Filter criteria for querying messages.
|
|
12
|
+
* All fields are optional; messages must match all specified criteria.
|
|
13
|
+
*/
|
|
14
|
+
export interface MessageQuery {
|
|
15
|
+
/** Filter by external source (e.g., 'discord') */
|
|
16
|
+
source?: string;
|
|
17
|
+
/** Filter by participant name */
|
|
18
|
+
participant?: string;
|
|
19
|
+
/** Filter by metadata fields (shallow match) */
|
|
20
|
+
metadata?: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Result of a message query.
|
|
25
|
+
*/
|
|
26
|
+
export interface MessageQueryResult {
|
|
27
|
+
messages: StoredMessage[];
|
|
28
|
+
totalCount: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* A pluggable module that provides capabilities to the framework.
|
|
33
|
+
*/
|
|
34
|
+
export interface Module {
|
|
35
|
+
/** Unique name, used for tool namespacing and state storage */
|
|
36
|
+
readonly name: string;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Start the module.
|
|
40
|
+
* Called when the framework starts or when the module is added.
|
|
41
|
+
*/
|
|
42
|
+
start(ctx: ModuleContext): Promise<void>;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Stop the module.
|
|
46
|
+
* Called when the framework stops or when the module is removed.
|
|
47
|
+
*/
|
|
48
|
+
stop(): Promise<void>;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Get currently available tools.
|
|
52
|
+
* Can change over time (e.g., based on connection state).
|
|
53
|
+
*/
|
|
54
|
+
getTools(): ToolDefinition[];
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Handle a tool call.
|
|
58
|
+
* Tool name is without module prefix.
|
|
59
|
+
*/
|
|
60
|
+
handleToolCall(call: ToolCall): Promise<ToolResult>;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Handle a process event from the queue.
|
|
64
|
+
* Return response indicating what actions to take.
|
|
65
|
+
*
|
|
66
|
+
* @param event - The event to process
|
|
67
|
+
* @param state - Read-only state snapshot for accessing module state and lookups
|
|
68
|
+
*/
|
|
69
|
+
onProcess(event: ProcessEvent, state: ProcessState): Promise<EventResponse>;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Handle agent speech (if registered as speech handler).
|
|
73
|
+
* Called when an agent produces text output.
|
|
74
|
+
*/
|
|
75
|
+
onAgentSpeech?(
|
|
76
|
+
agentName: string,
|
|
77
|
+
content: ContentBlock[],
|
|
78
|
+
context: SpeechContext
|
|
79
|
+
): Promise<void>;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Gather context injections before agent inference.
|
|
83
|
+
* Called before each inference to collect data (e.g., HUD overlays, game state)
|
|
84
|
+
* that should be injected into the compiled context.
|
|
85
|
+
* Complementary to MCPL push-based hooks — modules pull via gatherContext.
|
|
86
|
+
* Adapted from Anarchid/agent-framework@mcpl-module-proto.
|
|
87
|
+
*/
|
|
88
|
+
gatherContext?(agentName: string): Promise<ContextInjection[]>;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Context provided to modules for interacting with the framework.
|
|
93
|
+
*/
|
|
94
|
+
export interface ModuleContext {
|
|
95
|
+
/**
|
|
96
|
+
* Get persistent state for this module.
|
|
97
|
+
* State is namespaced to the module.
|
|
98
|
+
*/
|
|
99
|
+
getState<T>(): T | null;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Set persistent state for this module.
|
|
103
|
+
*/
|
|
104
|
+
setState<T>(state: T): void;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Process queue for pushing events from external listeners.
|
|
108
|
+
* @deprecated Use pushEvent() instead — it also emits process:received traces.
|
|
109
|
+
*/
|
|
110
|
+
readonly queue: ProcessQueue;
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Push a process event to the queue and emit a process:received trace.
|
|
114
|
+
* Preferred over direct queue.push() for proper observability.
|
|
115
|
+
*/
|
|
116
|
+
pushEvent(event: ProcessEvent): void;
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Get another module by name.
|
|
120
|
+
*/
|
|
121
|
+
getModule<T extends Module>(name: string): T | null;
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Add a message to the conversation.
|
|
125
|
+
*/
|
|
126
|
+
addMessage(
|
|
127
|
+
participant: string,
|
|
128
|
+
content: ContentBlock[],
|
|
129
|
+
metadata?: MessageMetadata & { external?: ExternalIdRef }
|
|
130
|
+
): MessageId;
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Edit a message.
|
|
134
|
+
*/
|
|
135
|
+
editMessage(id: MessageId, content: ContentBlock[]): void;
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Remove a message.
|
|
139
|
+
*/
|
|
140
|
+
removeMessage(id: MessageId): void;
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Find a message by external ID.
|
|
144
|
+
*/
|
|
145
|
+
findMessageByExternalId(source: string, externalId: string): MessageId | null;
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Get a message by ID.
|
|
149
|
+
*/
|
|
150
|
+
getMessage(id: MessageId): StoredMessage | null;
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Query messages by filter criteria.
|
|
154
|
+
* Useful for finding messages from external sources, by participant, etc.
|
|
155
|
+
*/
|
|
156
|
+
queryMessages(filter: MessageQuery): MessageQueryResult;
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Get info about all agents.
|
|
160
|
+
*/
|
|
161
|
+
getAgents(): AgentInfo[];
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Get all currently available tools.
|
|
165
|
+
*/
|
|
166
|
+
getActiveTools(): ToolDefinition[];
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Whether this is a restart (state existed) vs fresh start.
|
|
170
|
+
*/
|
|
171
|
+
readonly isRestart: boolean;
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Register this module as a speech handler for agents.
|
|
175
|
+
* @param agents - '*' for all agents, or array of agent names
|
|
176
|
+
* @param options - Speech handler options
|
|
177
|
+
*/
|
|
178
|
+
registerSpeechHandler(
|
|
179
|
+
agents: '*' | string[],
|
|
180
|
+
options?: SpeechHandlerOptions
|
|
181
|
+
): void;
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Unregister this module as a speech handler.
|
|
185
|
+
*/
|
|
186
|
+
unregisterSpeechHandler(): void;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Read-only state snapshot provided to modules during event processing.
|
|
191
|
+
* State writes happen via EventResponse, not through this interface.
|
|
192
|
+
*/
|
|
193
|
+
export interface ProcessState {
|
|
194
|
+
/**
|
|
195
|
+
* Get this module's state.
|
|
196
|
+
*/
|
|
197
|
+
getState<T>(): T | null;
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Get another module's state by name.
|
|
201
|
+
*/
|
|
202
|
+
getModuleState<T>(name: string): T | null;
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Find a message by external ID.
|
|
206
|
+
*/
|
|
207
|
+
findMessageByExternalId(source: string, externalId: string): MessageId | null;
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Get info about all agents.
|
|
211
|
+
*/
|
|
212
|
+
getAgents(): AgentInfo[];
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Get all currently available tools.
|
|
216
|
+
*/
|
|
217
|
+
getActiveTools(): ToolDefinition[];
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Queue for emitting follow-up events.
|
|
221
|
+
* @deprecated Use pushEvent() instead — it also emits process:received traces.
|
|
222
|
+
*/
|
|
223
|
+
readonly queue: ProcessQueue;
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Push a process event to the queue and emit a process:received trace.
|
|
227
|
+
* Preferred over direct queue.push() for proper observability.
|
|
228
|
+
*/
|
|
229
|
+
pushEvent(event: ProcessEvent): void;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Reference to an external system's ID.
|
|
234
|
+
*/
|
|
235
|
+
export interface ExternalIdRef {
|
|
236
|
+
source: string;
|
|
237
|
+
id: string;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Process queue interface for modules.
|
|
242
|
+
*/
|
|
243
|
+
export interface ProcessQueue {
|
|
244
|
+
/**
|
|
245
|
+
* Push a process event to the queue.
|
|
246
|
+
*/
|
|
247
|
+
push(event: ProcessEvent): void;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Basic info about an agent.
|
|
252
|
+
*/
|
|
253
|
+
export interface AgentInfo {
|
|
254
|
+
name: string;
|
|
255
|
+
model: string;
|
|
256
|
+
status: AgentStatus;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Agent execution status.
|
|
261
|
+
*/
|
|
262
|
+
export type AgentStatus = 'idle' | 'inferring' | 'streaming' | 'waiting_for_tools' | 'ready';
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Response from a module's event handler.
|
|
266
|
+
*/
|
|
267
|
+
export interface EventResponse {
|
|
268
|
+
/**
|
|
269
|
+
* Messages to add to the conversation.
|
|
270
|
+
*/
|
|
271
|
+
addMessages?: NewMessage[];
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Messages to edit.
|
|
275
|
+
*/
|
|
276
|
+
editMessages?: MessageEdit[];
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Messages to remove.
|
|
280
|
+
*/
|
|
281
|
+
removeMessages?: MessageId[];
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Request inference.
|
|
285
|
+
* - true: request for all agents
|
|
286
|
+
* - string[]: request for specific agents
|
|
287
|
+
* - false/undefined: no request
|
|
288
|
+
*/
|
|
289
|
+
requestInference?: boolean | string[];
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Signal that this module's tools have changed.
|
|
293
|
+
*/
|
|
294
|
+
toolsChanged?: boolean;
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Module state update. Applied atomically with message operations.
|
|
298
|
+
* The framework will call setState() with this value after applying
|
|
299
|
+
* message changes, ensuring consistent state.
|
|
300
|
+
*/
|
|
301
|
+
stateUpdate?: unknown;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* A new message to add.
|
|
306
|
+
*/
|
|
307
|
+
export interface NewMessage {
|
|
308
|
+
participant: string;
|
|
309
|
+
content: ContentBlock[];
|
|
310
|
+
metadata?: MessageMetadata & { external?: ExternalIdRef };
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* An edit to an existing message.
|
|
315
|
+
*/
|
|
316
|
+
export interface MessageEdit {
|
|
317
|
+
messageId: MessageId;
|
|
318
|
+
content: ContentBlock[];
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// ============================================================================
|
|
322
|
+
// Speech Handler Types
|
|
323
|
+
// ============================================================================
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Context provided to speech handlers.
|
|
327
|
+
*/
|
|
328
|
+
export interface SpeechContext {
|
|
329
|
+
/**
|
|
330
|
+
* Whether this is a complete turn or tool calls are pending.
|
|
331
|
+
* If false, more output may follow after tool results.
|
|
332
|
+
*/
|
|
333
|
+
turnComplete: boolean;
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* The inference request that triggered this speech.
|
|
337
|
+
*/
|
|
338
|
+
trigger: {
|
|
339
|
+
reason: string;
|
|
340
|
+
source: string;
|
|
341
|
+
timestamp: number;
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Pre-tool preamble text blocks that preceded tool calls.
|
|
346
|
+
* Modules can display these as "thoughts" (e.g. Discord spoiler tags).
|
|
347
|
+
* Empty when no tool calls were made.
|
|
348
|
+
*/
|
|
349
|
+
thoughts?: ContentBlock[];
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Options for speech handler registration.
|
|
354
|
+
*/
|
|
355
|
+
export interface SpeechHandlerOptions {
|
|
356
|
+
/**
|
|
357
|
+
* If true, add to existing handlers rather than replacing.
|
|
358
|
+
* Multiple handlers will all receive speech.
|
|
359
|
+
*/
|
|
360
|
+
additive?: boolean;
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* Priority for handler ordering (higher = called first).
|
|
364
|
+
* Default: 0
|
|
365
|
+
*/
|
|
366
|
+
priority?: number;
|
|
367
|
+
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import type { ProcessEvent } from './events.js';
|
|
2
|
+
import type { ModuleProcessResponse } from './framework.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Base for all trace events.
|
|
6
|
+
* TraceEvents are observability-only — they NEVER drive logic.
|
|
7
|
+
*/
|
|
8
|
+
export interface TraceEventBase {
|
|
9
|
+
/** When this trace was emitted */
|
|
10
|
+
timestamp: number;
|
|
11
|
+
/** Optional correlation ID for distributed tracing */
|
|
12
|
+
traceId?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Observability events emitted by the framework.
|
|
17
|
+
* Subscribe via framework.onTrace() to monitor system behavior.
|
|
18
|
+
*
|
|
19
|
+
* These are purely informational — use them for:
|
|
20
|
+
* - UI updates (showing inference progress, tool execution)
|
|
21
|
+
* - Logging and debugging
|
|
22
|
+
* - Metrics and monitoring
|
|
23
|
+
* - Broadcasting to WebSocket clients
|
|
24
|
+
*
|
|
25
|
+
* They should NEVER be used to drive application logic.
|
|
26
|
+
* For that, use ProcessEvent via the event queue.
|
|
27
|
+
*/
|
|
28
|
+
export type TraceEvent =
|
|
29
|
+
// Process lifecycle
|
|
30
|
+
| (TraceEventBase & { type: 'process:received'; processEvent: ProcessEvent })
|
|
31
|
+
| (TraceEventBase & {
|
|
32
|
+
type: 'process:completed';
|
|
33
|
+
processEvent: ProcessEvent;
|
|
34
|
+
responses: ModuleProcessResponse[];
|
|
35
|
+
durationMs: number;
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
// Inference lifecycle
|
|
39
|
+
| (TraceEventBase & { type: 'inference:started'; agentName: string })
|
|
40
|
+
| (TraceEventBase & {
|
|
41
|
+
type: 'inference:completed';
|
|
42
|
+
agentName: string;
|
|
43
|
+
durationMs: number;
|
|
44
|
+
tokenUsage?: { input: number; output: number; cacheCreation?: number; cacheRead?: number };
|
|
45
|
+
})
|
|
46
|
+
| (TraceEventBase & {
|
|
47
|
+
type: 'inference:aborted';
|
|
48
|
+
agentName: string;
|
|
49
|
+
durationMs: number;
|
|
50
|
+
reason?: string;
|
|
51
|
+
})
|
|
52
|
+
| (TraceEventBase & {
|
|
53
|
+
type: 'inference:failed';
|
|
54
|
+
agentName: string;
|
|
55
|
+
error: string;
|
|
56
|
+
stack?: string;
|
|
57
|
+
})
|
|
58
|
+
| (TraceEventBase & {
|
|
59
|
+
type: 'inference:exhausted';
|
|
60
|
+
agentName: string;
|
|
61
|
+
error: string;
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
// Streaming inference lifecycle
|
|
65
|
+
| (TraceEventBase & {
|
|
66
|
+
type: 'inference:tokens';
|
|
67
|
+
agentName: string;
|
|
68
|
+
content: string;
|
|
69
|
+
})
|
|
70
|
+
| (TraceEventBase & {
|
|
71
|
+
type: 'inference:tool_calls_yielded';
|
|
72
|
+
agentName: string;
|
|
73
|
+
calls: Array<{ id: string; name: string; input?: unknown }>;
|
|
74
|
+
})
|
|
75
|
+
| (TraceEventBase & {
|
|
76
|
+
type: 'inference:usage';
|
|
77
|
+
agentName: string;
|
|
78
|
+
tokenUsage: { input: number; output: number };
|
|
79
|
+
})
|
|
80
|
+
| (TraceEventBase & {
|
|
81
|
+
type: 'inference:stream_resumed';
|
|
82
|
+
agentName: string;
|
|
83
|
+
})
|
|
84
|
+
| (TraceEventBase & {
|
|
85
|
+
type: 'inference:stream_restarted';
|
|
86
|
+
agentName: string;
|
|
87
|
+
reason: string;
|
|
88
|
+
inputTokens: number;
|
|
89
|
+
budget: number;
|
|
90
|
+
})
|
|
91
|
+
| (TraceEventBase & {
|
|
92
|
+
type: 'inference:turn_ended';
|
|
93
|
+
agentName: string;
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
// Tool lifecycle
|
|
97
|
+
| (TraceEventBase & {
|
|
98
|
+
type: 'tool:started';
|
|
99
|
+
module: string;
|
|
100
|
+
tool: string;
|
|
101
|
+
callId: string;
|
|
102
|
+
input?: unknown;
|
|
103
|
+
})
|
|
104
|
+
| (TraceEventBase & {
|
|
105
|
+
type: 'tool:completed';
|
|
106
|
+
module: string;
|
|
107
|
+
tool: string;
|
|
108
|
+
callId: string;
|
|
109
|
+
durationMs: number;
|
|
110
|
+
})
|
|
111
|
+
| (TraceEventBase & {
|
|
112
|
+
type: 'tool:failed';
|
|
113
|
+
module: string;
|
|
114
|
+
tool: string;
|
|
115
|
+
callId: string;
|
|
116
|
+
error: string;
|
|
117
|
+
stack?: string;
|
|
118
|
+
})
|
|
119
|
+
| (TraceEventBase & {
|
|
120
|
+
type: 'tool:result_dropped';
|
|
121
|
+
agentName: string;
|
|
122
|
+
callId: string;
|
|
123
|
+
agentStatus: string;
|
|
124
|
+
result: unknown;
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
// Module lifecycle
|
|
128
|
+
| (TraceEventBase & { type: 'module:added'; moduleName: string })
|
|
129
|
+
| (TraceEventBase & { type: 'module:removed'; moduleName: string })
|
|
130
|
+
|
|
131
|
+
// Inference request health
|
|
132
|
+
| (TraceEventBase & {
|
|
133
|
+
type: 'inference:request_dropped';
|
|
134
|
+
agentName: string;
|
|
135
|
+
reason: string;
|
|
136
|
+
requestCount: number;
|
|
137
|
+
oldestRequestAge: number;
|
|
138
|
+
})
|
|
139
|
+
| (TraceEventBase & {
|
|
140
|
+
type: 'inference:request_stale';
|
|
141
|
+
agentName: string;
|
|
142
|
+
agentStatus: string;
|
|
143
|
+
requestCount: number;
|
|
144
|
+
oldestRequestAge: number;
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
// Message lifecycle
|
|
148
|
+
| (TraceEventBase & {
|
|
149
|
+
type: 'message:added';
|
|
150
|
+
messageId: string;
|
|
151
|
+
source: string;
|
|
152
|
+
})
|
|
153
|
+
|
|
154
|
+
// EventGate lifecycle
|
|
155
|
+
| (TraceEventBase & {
|
|
156
|
+
type: 'gate:policy-matched';
|
|
157
|
+
policyName: string;
|
|
158
|
+
behavior: string;
|
|
159
|
+
eventType: string;
|
|
160
|
+
source?: string;
|
|
161
|
+
})
|
|
162
|
+
| (TraceEventBase & {
|
|
163
|
+
type: 'gate:config-error';
|
|
164
|
+
error: string;
|
|
165
|
+
configPath: string;
|
|
166
|
+
})
|
|
167
|
+
| (TraceEventBase & {
|
|
168
|
+
type: 'gate:debounce-delivered';
|
|
169
|
+
policyName: string;
|
|
170
|
+
eventCount: number;
|
|
171
|
+
})
|
|
172
|
+
| (TraceEventBase & {
|
|
173
|
+
type: 'gate:config-reloaded';
|
|
174
|
+
configPath: string;
|
|
175
|
+
policyCount: number;
|
|
176
|
+
})
|
|
177
|
+
|
|
178
|
+
// Undo/redo lifecycle
|
|
179
|
+
| (TraceEventBase & {
|
|
180
|
+
type: 'undo:completed';
|
|
181
|
+
agentName: string;
|
|
182
|
+
turnIndex: number;
|
|
183
|
+
fromBranch: string;
|
|
184
|
+
toBranch: string;
|
|
185
|
+
})
|
|
186
|
+
| (TraceEventBase & {
|
|
187
|
+
type: 'redo:completed';
|
|
188
|
+
agentName: string;
|
|
189
|
+
fromBranch: string;
|
|
190
|
+
toBranch: string;
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Listener for trace events.
|
|
195
|
+
*/
|
|
196
|
+
export type TraceEventListener = (event: TraceEvent) => void;
|