@animalabs/agent-framework 0.6.0 → 0.6.3
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/dist/src/agent.d.ts +4 -0
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +15 -0
- package/dist/src/agent.js.map +1 -1
- package/dist/src/framework.d.ts +235 -2
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +1141 -92
- package/dist/src/framework.js.map +1 -1
- package/dist/src/gate/event-gate.d.ts +20 -1
- package/dist/src/gate/event-gate.d.ts.map +1 -1
- package/dist/src/gate/event-gate.js +60 -4
- package/dist/src/gate/event-gate.js.map +1 -1
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcpl/channel-registry.d.ts +17 -1
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.js +34 -3
- package/dist/src/mcpl/channel-registry.js.map +1 -1
- package/dist/src/mcpl/push-handler.d.ts.map +1 -1
- package/dist/src/mcpl/push-handler.js +4 -0
- package/dist/src/mcpl/push-handler.js.map +1 -1
- package/dist/src/mcpl/server-connection.d.ts +29 -0
- package/dist/src/mcpl/server-connection.d.ts.map +1 -1
- package/dist/src/mcpl/server-connection.js +102 -4
- package/dist/src/mcpl/server-connection.js.map +1 -1
- package/dist/src/mcpl/types.d.ts +17 -1
- package/dist/src/mcpl/types.d.ts.map +1 -1
- package/dist/src/mcpl/types.js.map +1 -1
- package/dist/src/module-registry.d.ts +15 -1
- package/dist/src/module-registry.d.ts.map +1 -1
- package/dist/src/module-registry.js +92 -4
- package/dist/src/module-registry.js.map +1 -1
- package/dist/src/types/agent.d.ts +37 -0
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/framework.d.ts +40 -0
- package/dist/src/types/framework.d.ts.map +1 -1
- package/dist/src/types/module.d.ts +46 -0
- package/dist/src/types/module.d.ts.map +1 -1
- package/dist/src/types/trace.d.ts +51 -0
- package/dist/src/types/trace.d.ts.map +1 -1
- package/dist/test/agent-cache-ttl.test.d.ts +2 -0
- package/dist/test/agent-cache-ttl.test.d.ts.map +1 -0
- package/dist/test/agent-cache-ttl.test.js +25 -0
- package/dist/test/agent-cache-ttl.test.js.map +1 -0
- package/dist/test/conversation-fork-injection-scoping.test.d.ts +2 -0
- package/dist/test/conversation-fork-injection-scoping.test.d.ts.map +1 -0
- package/dist/test/conversation-fork-injection-scoping.test.js +184 -0
- package/dist/test/conversation-fork-injection-scoping.test.js.map +1 -0
- package/dist/test/gather-context-timeout.test.d.ts +2 -0
- package/dist/test/gather-context-timeout.test.d.ts.map +1 -0
- package/dist/test/gather-context-timeout.test.js +120 -0
- package/dist/test/gather-context-timeout.test.js.map +1 -0
- package/dist/test/inference-exhaustion-rewind.test.d.ts +2 -0
- package/dist/test/inference-exhaustion-rewind.test.d.ts.map +1 -0
- package/dist/test/inference-exhaustion-rewind.test.js +181 -0
- package/dist/test/inference-exhaustion-rewind.test.js.map +1 -0
- package/dist/test/inference-failure-observability.test.js +9 -0
- package/dist/test/inference-failure-observability.test.js.map +1 -1
- package/dist/test/maintenance-timer.test.d.ts +2 -0
- package/dist/test/maintenance-timer.test.d.ts.map +1 -0
- package/dist/test/maintenance-timer.test.js +114 -0
- package/dist/test/maintenance-timer.test.js.map +1 -0
- package/dist/test/mcpl-reconnect-events.test.d.ts +2 -0
- package/dist/test/mcpl-reconnect-events.test.d.ts.map +1 -0
- package/dist/test/mcpl-reconnect-events.test.js +119 -0
- package/dist/test/mcpl-reconnect-events.test.js.map +1 -0
- package/dist/test/mcpl-reconnect-reregistration.test.d.ts +2 -0
- package/dist/test/mcpl-reconnect-reregistration.test.d.ts.map +1 -0
- package/dist/test/mcpl-reconnect-reregistration.test.js +181 -0
- package/dist/test/mcpl-reconnect-reregistration.test.js.map +1 -0
- package/dist/test/mcpl-request-timeout.test.d.ts +2 -0
- package/dist/test/mcpl-request-timeout.test.d.ts.map +1 -0
- package/dist/test/mcpl-request-timeout.test.js +123 -0
- package/dist/test/mcpl-request-timeout.test.js.map +1 -0
- package/dist/test/mcpl-runtime-lifecycle.test.d.ts +7 -0
- package/dist/test/mcpl-runtime-lifecycle.test.d.ts.map +1 -0
- package/dist/test/mcpl-runtime-lifecycle.test.js +142 -0
- package/dist/test/mcpl-runtime-lifecycle.test.js.map +1 -0
- package/dist/test/ops-alert.test.d.ts +2 -0
- package/dist/test/ops-alert.test.d.ts.map +1 -0
- package/dist/test/ops-alert.test.js +152 -0
- package/dist/test/ops-alert.test.js.map +1 -0
- package/dist/test/refusal-rewind.test.d.ts +2 -0
- package/dist/test/refusal-rewind.test.d.ts.map +1 -0
- package/dist/test/refusal-rewind.test.js +108 -0
- package/dist/test/refusal-rewind.test.js.map +1 -0
- package/dist/test/state-scaling-e2e.test.d.ts +22 -0
- package/dist/test/state-scaling-e2e.test.d.ts.map +1 -0
- package/dist/test/state-scaling-e2e.test.js +200 -0
- package/dist/test/state-scaling-e2e.test.js.map +1 -0
- package/dist/test/state-scaling.test.d.ts +12 -0
- package/dist/test/state-scaling.test.d.ts.map +1 -0
- package/dist/test/state-scaling.test.js +243 -0
- package/dist/test/state-scaling.test.js.map +1 -0
- package/dist/test/tool-result-content.test.d.ts +2 -0
- package/dist/test/tool-result-content.test.d.ts.map +1 -0
- package/dist/test/tool-result-content.test.js +37 -0
- package/dist/test/tool-result-content.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -2
- package/src/agent.ts +16 -0
- package/src/framework.ts +1339 -99
- package/src/gate/event-gate.ts +56 -4
- package/src/index.ts +10 -0
- package/src/mcpl/channel-registry.ts +34 -3
- package/src/mcpl/push-handler.ts +4 -0
- package/src/mcpl/server-connection.ts +110 -4
- package/src/mcpl/types.ts +19 -1
- package/src/module-registry.ts +113 -4
- package/src/types/agent.ts +38 -0
- package/src/types/framework.ts +44 -0
- package/src/types/module.ts +52 -0
- package/src/types/trace.ts +67 -0
package/src/types/framework.ts
CHANGED
|
@@ -56,6 +56,13 @@ export interface FrameworkConfig {
|
|
|
56
56
|
/** Interval for periodic store sync in milliseconds (default: 1000ms, 0 to disable) */
|
|
57
57
|
syncIntervalMs?: number;
|
|
58
58
|
|
|
59
|
+
/**
|
|
60
|
+
* Interval for queued context-maintenance polling in milliseconds
|
|
61
|
+
* (default: 5000ms, 0 to disable). Each pass refreshes the agent's live tool
|
|
62
|
+
* definitions, then advances pending compression/indexing work.
|
|
63
|
+
*/
|
|
64
|
+
maintenanceIntervalMs?: number;
|
|
65
|
+
|
|
59
66
|
/** Process logging configuration (default: disabled) */
|
|
60
67
|
processLogging?: ProcessLoggingConfig;
|
|
61
68
|
|
|
@@ -92,6 +99,43 @@ export interface FrameworkConfig {
|
|
|
92
99
|
conversations?: ConversationRouterConfig;
|
|
93
100
|
}
|
|
94
101
|
|
|
102
|
+
/** One agent's outcome within a periodic context-maintenance pass. */
|
|
103
|
+
export interface ContextMaintenanceAgentRun {
|
|
104
|
+
agentName: string;
|
|
105
|
+
startedAt: number;
|
|
106
|
+
finishedAt?: number;
|
|
107
|
+
ticks: number;
|
|
108
|
+
readyBefore: boolean;
|
|
109
|
+
readyAfter?: boolean;
|
|
110
|
+
pendingBefore?: string;
|
|
111
|
+
pendingAfter?: string;
|
|
112
|
+
progressBefore?: Record<string, unknown>;
|
|
113
|
+
progressAfter?: Record<string, unknown>;
|
|
114
|
+
error?: string;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** A bounded periodic context-maintenance pass. */
|
|
118
|
+
export interface ContextMaintenanceRun {
|
|
119
|
+
id: number;
|
|
120
|
+
startedAt: number;
|
|
121
|
+
finishedAt?: number;
|
|
122
|
+
agents: ContextMaintenanceAgentRun[];
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** Debug-safe maintenance state. Contains counts and errors, never messages. */
|
|
126
|
+
export interface ContextMaintenanceSnapshot {
|
|
127
|
+
intervalMs: number;
|
|
128
|
+
ticksPerPass: number;
|
|
129
|
+
current: ContextMaintenanceRun | null;
|
|
130
|
+
history: ContextMaintenanceRun[];
|
|
131
|
+
agents: Array<{
|
|
132
|
+
agentName: string;
|
|
133
|
+
ready: boolean;
|
|
134
|
+
pending?: string;
|
|
135
|
+
progress?: Record<string, unknown>;
|
|
136
|
+
}>;
|
|
137
|
+
}
|
|
138
|
+
|
|
95
139
|
/**
|
|
96
140
|
* Policy for deciding when to run inference.
|
|
97
141
|
*/
|
package/src/types/module.ts
CHANGED
|
@@ -36,6 +36,15 @@ export interface Module {
|
|
|
36
36
|
/** Unique name, used for tool namespacing and state storage */
|
|
37
37
|
readonly name: string;
|
|
38
38
|
|
|
39
|
+
/**
|
|
40
|
+
* Per-module budget (ms) for gatherContext() before the framework skips this
|
|
41
|
+
* module's injection for the turn (fail-open). Defaults to the registry-wide
|
|
42
|
+
* default (15s) when omitted. Declare a larger budget when gatherContext
|
|
43
|
+
* does real work — e.g. sequential LLM calls with provider backoff — so the
|
|
44
|
+
* injection isn't silently dropped every turn.
|
|
45
|
+
*/
|
|
46
|
+
readonly contextTimeoutMs?: number;
|
|
47
|
+
|
|
39
48
|
/**
|
|
40
49
|
* Start the module.
|
|
41
50
|
* Called when the framework starts or when the module is added.
|
|
@@ -101,9 +110,52 @@ export interface ModuleContext {
|
|
|
101
110
|
|
|
102
111
|
/**
|
|
103
112
|
* Set persistent state for this module.
|
|
113
|
+
*
|
|
114
|
+
* This rewrites the module's full state object every call — appropriate for
|
|
115
|
+
* small, bounded state only. For accumulating collections (registries,
|
|
116
|
+
* corpora, histories) use a log state (`registerLogState`/`appendToLog`)
|
|
117
|
+
* instead: a setState of an ever-growing object makes every persisted record
|
|
118
|
+
* proportional to accumulated content, i.e. O(n²) aggregate disk.
|
|
104
119
|
*/
|
|
105
120
|
setState<T>(state: T): void;
|
|
106
121
|
|
|
122
|
+
/**
|
|
123
|
+
* Register an auxiliary append-log state for this module, stored as
|
|
124
|
+
* `modules/<module>/<name>`. Idempotent — safe to call on every start().
|
|
125
|
+
* Items are appended with `appendToLog` (one O(item) record per append) and
|
|
126
|
+
* point-edited with `editLogItem`; Chronicle's append_log snapshot cadence
|
|
127
|
+
* handles consolidation. `name` must not be 'state' (reserved for the main
|
|
128
|
+
* snapshot state) and must not contain '/'.
|
|
129
|
+
*/
|
|
130
|
+
registerLogState(
|
|
131
|
+
name: string,
|
|
132
|
+
opts?: { deltaSnapshotEvery?: number; fullSnapshotEvery?: number }
|
|
133
|
+
): void;
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Append one item to a log state registered via registerLogState.
|
|
137
|
+
* Record size is O(item), independent of accumulated log length.
|
|
138
|
+
*/
|
|
139
|
+
appendToLog<T>(name: string, item: T): void;
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Overwrite the item at `index` in a log state. Indices are stable —
|
|
143
|
+
* appends assign the next index and nothing is ever removed.
|
|
144
|
+
*/
|
|
145
|
+
editLogItem<T>(name: string, index: number, item: T): void;
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Read the full contents of a log state (empty array if never written).
|
|
149
|
+
* Intended for one-shot reconstruction at start(); keep hot-path reads
|
|
150
|
+
* against the in-memory copy.
|
|
151
|
+
*/
|
|
152
|
+
getLog<T>(name: string): T[];
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Number of items in a log state (0 if never written).
|
|
156
|
+
*/
|
|
157
|
+
getLogLength(name: string): number;
|
|
158
|
+
|
|
107
159
|
/**
|
|
108
160
|
* Process queue for pushing events from external listeners.
|
|
109
161
|
* @deprecated Use pushEvent() instead — it also emits process:received traces.
|
package/src/types/trace.ts
CHANGED
|
@@ -60,6 +60,13 @@ export type TraceEvent =
|
|
|
60
60
|
type: 'inference:exhausted';
|
|
61
61
|
agentName: string;
|
|
62
62
|
error: string;
|
|
63
|
+
/** Whether membrane classified the failure as retryable (observability). */
|
|
64
|
+
retryable?: boolean;
|
|
65
|
+
/**
|
|
66
|
+
* The membrane error type (e.g. 'invalid_request', 'auth', 'context_length').
|
|
67
|
+
* The poison-history breaker fires only on 'invalid_request'.
|
|
68
|
+
*/
|
|
69
|
+
errorType?: string;
|
|
63
70
|
})
|
|
64
71
|
|
|
65
72
|
// Streaming inference lifecycle
|
|
@@ -270,6 +277,66 @@ export type TraceEvent =
|
|
|
270
277
|
type: 'mcpl:conversation-disposed';
|
|
271
278
|
agentName: string;
|
|
272
279
|
channelId?: string;
|
|
280
|
+
})
|
|
281
|
+
|
|
282
|
+
// MCPL server connection lifecycle (spawn / handshake / reconnect health).
|
|
283
|
+
// Previously these outcomes were visible only on the host process's own
|
|
284
|
+
// stderr, so a server that lost the boot handshake race just went missing.
|
|
285
|
+
| (TraceEventBase & {
|
|
286
|
+
type: 'mcpl:server-connect-failed';
|
|
287
|
+
serverId: string;
|
|
288
|
+
error: string;
|
|
289
|
+
/** Ordinal of the failed attempt: 0 is the initial connect, N is the Nth background retry. */
|
|
290
|
+
attempt: number;
|
|
291
|
+
/** True when a background reconnect loop will keep retrying. */
|
|
292
|
+
willRetry: boolean;
|
|
293
|
+
})
|
|
294
|
+
| (TraceEventBase & {
|
|
295
|
+
type: 'mcpl:server-reconnected';
|
|
296
|
+
serverId: string;
|
|
297
|
+
/** How many attempts the reconnect loop needed (1 = first retry succeeded). */
|
|
298
|
+
attempts: number;
|
|
299
|
+
})
|
|
300
|
+
| (TraceEventBase & {
|
|
301
|
+
type: 'mcpl:server-closed';
|
|
302
|
+
serverId: string;
|
|
303
|
+
/** Child process exit code, or null when killed by signal / closed explicitly. */
|
|
304
|
+
code: number | null;
|
|
305
|
+
/** Signal that terminated the child, if any. */
|
|
306
|
+
signal: string | null;
|
|
307
|
+
/** True when a background reconnect loop will revive the connection. */
|
|
308
|
+
willReconnect: boolean;
|
|
309
|
+
})
|
|
310
|
+
| (TraceEventBase & {
|
|
311
|
+
type: 'mcpl:server-error';
|
|
312
|
+
serverId: string;
|
|
313
|
+
error: string;
|
|
314
|
+
})
|
|
315
|
+
| (TraceEventBase & {
|
|
316
|
+
type: 'mcpl:orphaned-response';
|
|
317
|
+
serverId: string;
|
|
318
|
+
/** The JSON-RPC id of the late response whose pending request already timed out. */
|
|
319
|
+
responseId: string | number;
|
|
320
|
+
/** True when the dropped response carried host-managed `state`. */
|
|
321
|
+
hadState: boolean;
|
|
322
|
+
/** True when the dropped response carried a server-managed `checkpoint`. */
|
|
323
|
+
hadCheckpoint: boolean;
|
|
324
|
+
})
|
|
325
|
+
|
|
326
|
+
// Ops / fleet observability. Everything the framework's opsAlert() escalates
|
|
327
|
+
// (refusals, hard-down, MCPL unreachable, …) mirrored onto the trace bus so
|
|
328
|
+
// authorized observers see alerts on the same wire as the rest of the
|
|
329
|
+
// agent's internal life. Discord (CONNECTOME_OPS_WEBHOOK) is one sink of
|
|
330
|
+
// this stream, not a separate system. See connectome docs/observability.md.
|
|
331
|
+
| (TraceEventBase & {
|
|
332
|
+
type: 'ops:alert';
|
|
333
|
+
/** Alert kind — open set: 'refusal' | 'hard-down' | 'mcpl-down' | … */
|
|
334
|
+
kind: string;
|
|
335
|
+
/** Agent name, or a server/component id for non-agent alerts (e.g. mcpl-down). */
|
|
336
|
+
agentName: string;
|
|
337
|
+
message: string;
|
|
338
|
+
/** Kind-specific structured payload (mirrors the failures.log record). */
|
|
339
|
+
data?: Record<string, unknown>;
|
|
273
340
|
});
|
|
274
341
|
|
|
275
342
|
/**
|