@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.
Files changed (115) hide show
  1. package/dist/src/agent.d.ts +4 -0
  2. package/dist/src/agent.d.ts.map +1 -1
  3. package/dist/src/agent.js +15 -0
  4. package/dist/src/agent.js.map +1 -1
  5. package/dist/src/framework.d.ts +235 -2
  6. package/dist/src/framework.d.ts.map +1 -1
  7. package/dist/src/framework.js +1141 -92
  8. package/dist/src/framework.js.map +1 -1
  9. package/dist/src/gate/event-gate.d.ts +20 -1
  10. package/dist/src/gate/event-gate.d.ts.map +1 -1
  11. package/dist/src/gate/event-gate.js +60 -4
  12. package/dist/src/gate/event-gate.js.map +1 -1
  13. package/dist/src/index.d.ts +3 -0
  14. package/dist/src/index.d.ts.map +1 -1
  15. package/dist/src/index.js +4 -0
  16. package/dist/src/index.js.map +1 -1
  17. package/dist/src/mcpl/channel-registry.d.ts +17 -1
  18. package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
  19. package/dist/src/mcpl/channel-registry.js +34 -3
  20. package/dist/src/mcpl/channel-registry.js.map +1 -1
  21. package/dist/src/mcpl/push-handler.d.ts.map +1 -1
  22. package/dist/src/mcpl/push-handler.js +4 -0
  23. package/dist/src/mcpl/push-handler.js.map +1 -1
  24. package/dist/src/mcpl/server-connection.d.ts +29 -0
  25. package/dist/src/mcpl/server-connection.d.ts.map +1 -1
  26. package/dist/src/mcpl/server-connection.js +102 -4
  27. package/dist/src/mcpl/server-connection.js.map +1 -1
  28. package/dist/src/mcpl/types.d.ts +17 -1
  29. package/dist/src/mcpl/types.d.ts.map +1 -1
  30. package/dist/src/mcpl/types.js.map +1 -1
  31. package/dist/src/module-registry.d.ts +15 -1
  32. package/dist/src/module-registry.d.ts.map +1 -1
  33. package/dist/src/module-registry.js +92 -4
  34. package/dist/src/module-registry.js.map +1 -1
  35. package/dist/src/types/agent.d.ts +37 -0
  36. package/dist/src/types/agent.d.ts.map +1 -1
  37. package/dist/src/types/framework.d.ts +40 -0
  38. package/dist/src/types/framework.d.ts.map +1 -1
  39. package/dist/src/types/module.d.ts +46 -0
  40. package/dist/src/types/module.d.ts.map +1 -1
  41. package/dist/src/types/trace.d.ts +51 -0
  42. package/dist/src/types/trace.d.ts.map +1 -1
  43. package/dist/test/agent-cache-ttl.test.d.ts +2 -0
  44. package/dist/test/agent-cache-ttl.test.d.ts.map +1 -0
  45. package/dist/test/agent-cache-ttl.test.js +25 -0
  46. package/dist/test/agent-cache-ttl.test.js.map +1 -0
  47. package/dist/test/conversation-fork-injection-scoping.test.d.ts +2 -0
  48. package/dist/test/conversation-fork-injection-scoping.test.d.ts.map +1 -0
  49. package/dist/test/conversation-fork-injection-scoping.test.js +184 -0
  50. package/dist/test/conversation-fork-injection-scoping.test.js.map +1 -0
  51. package/dist/test/gather-context-timeout.test.d.ts +2 -0
  52. package/dist/test/gather-context-timeout.test.d.ts.map +1 -0
  53. package/dist/test/gather-context-timeout.test.js +120 -0
  54. package/dist/test/gather-context-timeout.test.js.map +1 -0
  55. package/dist/test/inference-exhaustion-rewind.test.d.ts +2 -0
  56. package/dist/test/inference-exhaustion-rewind.test.d.ts.map +1 -0
  57. package/dist/test/inference-exhaustion-rewind.test.js +181 -0
  58. package/dist/test/inference-exhaustion-rewind.test.js.map +1 -0
  59. package/dist/test/inference-failure-observability.test.js +9 -0
  60. package/dist/test/inference-failure-observability.test.js.map +1 -1
  61. package/dist/test/maintenance-timer.test.d.ts +2 -0
  62. package/dist/test/maintenance-timer.test.d.ts.map +1 -0
  63. package/dist/test/maintenance-timer.test.js +114 -0
  64. package/dist/test/maintenance-timer.test.js.map +1 -0
  65. package/dist/test/mcpl-reconnect-events.test.d.ts +2 -0
  66. package/dist/test/mcpl-reconnect-events.test.d.ts.map +1 -0
  67. package/dist/test/mcpl-reconnect-events.test.js +119 -0
  68. package/dist/test/mcpl-reconnect-events.test.js.map +1 -0
  69. package/dist/test/mcpl-reconnect-reregistration.test.d.ts +2 -0
  70. package/dist/test/mcpl-reconnect-reregistration.test.d.ts.map +1 -0
  71. package/dist/test/mcpl-reconnect-reregistration.test.js +181 -0
  72. package/dist/test/mcpl-reconnect-reregistration.test.js.map +1 -0
  73. package/dist/test/mcpl-request-timeout.test.d.ts +2 -0
  74. package/dist/test/mcpl-request-timeout.test.d.ts.map +1 -0
  75. package/dist/test/mcpl-request-timeout.test.js +123 -0
  76. package/dist/test/mcpl-request-timeout.test.js.map +1 -0
  77. package/dist/test/mcpl-runtime-lifecycle.test.d.ts +7 -0
  78. package/dist/test/mcpl-runtime-lifecycle.test.d.ts.map +1 -0
  79. package/dist/test/mcpl-runtime-lifecycle.test.js +142 -0
  80. package/dist/test/mcpl-runtime-lifecycle.test.js.map +1 -0
  81. package/dist/test/ops-alert.test.d.ts +2 -0
  82. package/dist/test/ops-alert.test.d.ts.map +1 -0
  83. package/dist/test/ops-alert.test.js +152 -0
  84. package/dist/test/ops-alert.test.js.map +1 -0
  85. package/dist/test/refusal-rewind.test.d.ts +2 -0
  86. package/dist/test/refusal-rewind.test.d.ts.map +1 -0
  87. package/dist/test/refusal-rewind.test.js +108 -0
  88. package/dist/test/refusal-rewind.test.js.map +1 -0
  89. package/dist/test/state-scaling-e2e.test.d.ts +22 -0
  90. package/dist/test/state-scaling-e2e.test.d.ts.map +1 -0
  91. package/dist/test/state-scaling-e2e.test.js +200 -0
  92. package/dist/test/state-scaling-e2e.test.js.map +1 -0
  93. package/dist/test/state-scaling.test.d.ts +12 -0
  94. package/dist/test/state-scaling.test.d.ts.map +1 -0
  95. package/dist/test/state-scaling.test.js +243 -0
  96. package/dist/test/state-scaling.test.js.map +1 -0
  97. package/dist/test/tool-result-content.test.d.ts +2 -0
  98. package/dist/test/tool-result-content.test.d.ts.map +1 -0
  99. package/dist/test/tool-result-content.test.js +37 -0
  100. package/dist/test/tool-result-content.test.js.map +1 -0
  101. package/dist/tsconfig.tsbuildinfo +1 -1
  102. package/package.json +3 -2
  103. package/src/agent.ts +16 -0
  104. package/src/framework.ts +1339 -99
  105. package/src/gate/event-gate.ts +56 -4
  106. package/src/index.ts +10 -0
  107. package/src/mcpl/channel-registry.ts +34 -3
  108. package/src/mcpl/push-handler.ts +4 -0
  109. package/src/mcpl/server-connection.ts +110 -4
  110. package/src/mcpl/types.ts +19 -1
  111. package/src/module-registry.ts +113 -4
  112. package/src/types/agent.ts +38 -0
  113. package/src/types/framework.ts +44 -0
  114. package/src/types/module.ts +52 -0
  115. package/src/types/trace.ts +67 -0
@@ -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
  */
@@ -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.
@@ -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
  /**