@animalabs/agent-framework 0.15.0 → 0.16.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.
Files changed (96) hide show
  1. package/README.md +22 -1
  2. package/dist/src/agent.d.ts +32 -0
  3. package/dist/src/agent.d.ts.map +1 -1
  4. package/dist/src/agent.js +55 -0
  5. package/dist/src/agent.js.map +1 -1
  6. package/dist/src/api/server.d.ts +9 -0
  7. package/dist/src/api/server.d.ts.map +1 -1
  8. package/dist/src/api/server.js +156 -0
  9. package/dist/src/api/server.js.map +1 -1
  10. package/dist/src/api/types.d.ts +15 -0
  11. package/dist/src/api/types.d.ts.map +1 -1
  12. package/dist/src/framework.d.ts +418 -3
  13. package/dist/src/framework.d.ts.map +1 -1
  14. package/dist/src/framework.js +1782 -68
  15. package/dist/src/framework.js.map +1 -1
  16. package/dist/src/gate/event-gate.d.ts +16 -0
  17. package/dist/src/gate/event-gate.d.ts.map +1 -1
  18. package/dist/src/gate/event-gate.js +41 -3
  19. package/dist/src/gate/event-gate.js.map +1 -1
  20. package/dist/src/index.d.ts +4 -1
  21. package/dist/src/index.d.ts.map +1 -1
  22. package/dist/src/index.js +3 -1
  23. package/dist/src/index.js.map +1 -1
  24. package/dist/src/mcpl/channel-registry.d.ts +172 -0
  25. package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
  26. package/dist/src/mcpl/channel-registry.js +444 -2
  27. package/dist/src/mcpl/channel-registry.js.map +1 -1
  28. package/dist/src/mcpl/server-connection.d.ts +9 -0
  29. package/dist/src/mcpl/server-connection.d.ts.map +1 -1
  30. package/dist/src/mcpl/server-connection.js +71 -13
  31. package/dist/src/mcpl/server-connection.js.map +1 -1
  32. package/dist/src/modules/history/index.d.ts +89 -13
  33. package/dist/src/modules/history/index.d.ts.map +1 -1
  34. package/dist/src/modules/history/index.js +655 -24
  35. package/dist/src/modules/history/index.js.map +1 -1
  36. package/dist/src/operator-log.d.ts +78 -0
  37. package/dist/src/operator-log.d.ts.map +1 -0
  38. package/dist/src/operator-log.js +102 -0
  39. package/dist/src/operator-log.js.map +1 -0
  40. package/dist/src/recovery/discord-awareness-outbox.d.ts +10 -0
  41. package/dist/src/recovery/discord-awareness-outbox.d.ts.map +1 -1
  42. package/dist/src/recovery/discord-awareness-outbox.js +20 -0
  43. package/dist/src/recovery/discord-awareness-outbox.js.map +1 -1
  44. package/dist/src/types/framework.d.ts +24 -0
  45. package/dist/src/types/framework.d.ts.map +1 -1
  46. package/dist/src/types/trace.d.ts +36 -0
  47. package/dist/src/types/trace.d.ts.map +1 -1
  48. package/dist/test/agent-runtime-settings.test.js +199 -1
  49. package/dist/test/agent-runtime-settings.test.js.map +1 -1
  50. package/dist/test/api-admin-gate.test.d.ts +2 -0
  51. package/dist/test/api-admin-gate.test.d.ts.map +1 -0
  52. package/dist/test/api-admin-gate.test.js +116 -0
  53. package/dist/test/api-admin-gate.test.js.map +1 -0
  54. package/dist/test/channel-label-history.test.d.ts +2 -0
  55. package/dist/test/channel-label-history.test.d.ts.map +1 -0
  56. package/dist/test/channel-label-history.test.js +424 -0
  57. package/dist/test/channel-label-history.test.js.map +1 -0
  58. package/dist/test/discord-awareness-outbox.test.js +16 -0
  59. package/dist/test/discord-awareness-outbox.test.js.map +1 -1
  60. package/dist/test/event-gate.test.js +44 -0
  61. package/dist/test/event-gate.test.js.map +1 -1
  62. package/dist/test/helpers/quiesce-crash-child.d.ts +2 -0
  63. package/dist/test/helpers/quiesce-crash-child.d.ts.map +1 -0
  64. package/dist/test/helpers/quiesce-crash-child.js +156 -0
  65. package/dist/test/helpers/quiesce-crash-child.js.map +1 -0
  66. package/dist/test/history-module-overview.test.d.ts +2 -0
  67. package/dist/test/history-module-overview.test.d.ts.map +1 -0
  68. package/dist/test/history-module-overview.test.js +711 -0
  69. package/dist/test/history-module-overview.test.js.map +1 -0
  70. package/dist/test/history-module.test.js +146 -0
  71. package/dist/test/history-module.test.js.map +1 -1
  72. package/dist/test/host-quiesce.test.d.ts +2 -0
  73. package/dist/test/host-quiesce.test.d.ts.map +1 -0
  74. package/dist/test/host-quiesce.test.js +863 -0
  75. package/dist/test/host-quiesce.test.js.map +1 -0
  76. package/dist/test/operator-surgery.test.d.ts +2 -0
  77. package/dist/test/operator-surgery.test.d.ts.map +1 -0
  78. package/dist/test/operator-surgery.test.js +398 -0
  79. package/dist/test/operator-surgery.test.js.map +1 -0
  80. package/dist/test/puppet-tool-call.test.js +5 -0
  81. package/dist/test/puppet-tool-call.test.js.map +1 -1
  82. package/dist/tsconfig.tsbuildinfo +1 -1
  83. package/package.json +2 -2
  84. package/src/agent.ts +69 -0
  85. package/src/api/server.ts +159 -2
  86. package/src/api/types.ts +15 -0
  87. package/src/framework.ts +2081 -89
  88. package/src/gate/event-gate.ts +47 -4
  89. package/src/index.ts +5 -1
  90. package/src/mcpl/channel-registry.ts +495 -2
  91. package/src/mcpl/server-connection.ts +73 -13
  92. package/src/modules/history/index.ts +689 -25
  93. package/src/operator-log.ts +132 -0
  94. package/src/recovery/discord-awareness-outbox.ts +19 -0
  95. package/src/types/framework.ts +27 -0
  96. package/src/types/trace.ts +42 -0
@@ -532,6 +532,10 @@ export class EventGate {
532
532
  // Inference buffering
533
533
  private inferring = new Set<string>();
534
534
  private inferenceBuffer: PendingEvent[] = [];
535
+ /** Host quiesce suppression — see setQuiesced. */
536
+ private quiesced = false;
537
+ /** Lifetime count of buffer-cap evictions (see bufferForInference). */
538
+ private droppedBufferedEvents = 0;
535
539
 
536
540
  // Per-policy stats
537
541
  private stats = new Map<string, PolicyStats>();
@@ -1470,8 +1474,11 @@ export class EventGate {
1470
1474
  const events = state.events;
1471
1475
  this.debounceTimers.delete(policyName);
1472
1476
 
1473
- // If any agent is currently inferring, buffer for later (with cap)
1474
- if (this.inferring.size > 0) {
1477
+ // If any agent is currently inferring — or the host is quiesced — buffer
1478
+ // for later (with cap). While quiesced, delivering would write a
1479
+ // "[Gate: N events]" message into the very context being operated on
1480
+ // mid-surgery; buffering composes them and they land at resume.
1481
+ if (this.inferring.size > 0 || this.quiesced) {
1475
1482
  this.bufferForInference(events);
1476
1483
  return;
1477
1484
  }
@@ -1563,8 +1570,26 @@ export class EventGate {
1563
1570
 
1564
1571
  onInferenceEnded(agentName: string): void {
1565
1572
  this.inferring.delete(agentName);
1573
+ this.flushInferenceBufferIfClear();
1574
+ }
1566
1575
 
1567
- // Flush inference buffer if no agents are inferring
1576
+ /**
1577
+ * Host quiesce suppression (issue #122). While set, debounce firings buffer
1578
+ * instead of writing gate messages into context; clearing it flushes the
1579
+ * buffer through the same path a turn's end uses. Self-wake and sleep-expiry
1580
+ * timers deliberately do NOT route through this — their inference requests
1581
+ * are per-agent targeted pushes that the framework's quiesce wake gate parks
1582
+ * and releases at resume, whereas the buffer's deliverEvents broadcasts a
1583
+ * wake to every agent.
1584
+ */
1585
+ setQuiesced(quiesced: boolean): void {
1586
+ if (this.quiesced === quiesced) return;
1587
+ this.quiesced = quiesced;
1588
+ if (!quiesced) this.flushInferenceBufferIfClear();
1589
+ }
1590
+
1591
+ private flushInferenceBufferIfClear(): void {
1592
+ if (this.quiesced) return;
1568
1593
  if (this.inferring.size === 0 && this.inferenceBuffer.length > 0) {
1569
1594
  const events = this.inferenceBuffer.splice(0);
1570
1595
  // Defer to avoid re-entrancy inside trace callbacks
@@ -1576,10 +1601,16 @@ export class EventGate {
1576
1601
  * A non-empty `inferring` with a stale timestamp + growing `bufferedEvents`
1577
1602
  * is the signature of the wake-wedge: an agent stuck mid-"inference" so all
1578
1603
  * incoming events buffer and never trigger. */
1579
- inferenceDiagnostics(): { inferring: string[]; bufferedEvents: number; sleepUntil: number } {
1604
+ inferenceDiagnostics(): {
1605
+ inferring: string[];
1606
+ bufferedEvents: number;
1607
+ droppedBufferedEvents: number;
1608
+ sleepUntil: number;
1609
+ } {
1580
1610
  return {
1581
1611
  inferring: [...this.inferring],
1582
1612
  bufferedEvents: this.inferenceBuffer.length,
1613
+ droppedBufferedEvents: this.droppedBufferedEvents,
1583
1614
  sleepUntil: this.sleepUntil,
1584
1615
  };
1585
1616
  }
@@ -1593,6 +1624,18 @@ export class EventGate {
1593
1624
  for (const event of events) {
1594
1625
  if (this.inferenceBuffer.length >= MAX_INFERENCE_BUFFER) {
1595
1626
  this.inferenceBuffer.shift(); // Drop oldest
1627
+ // Telemetry (issue #122): quiesce stretches buffering from
1628
+ // single-inference minutes to operator-length windows, so silent
1629
+ // eviction is no longer a corner case — count and log it, or the
1630
+ // resume flush reads as complete when it isn't.
1631
+ this.droppedBufferedEvents++;
1632
+ if (this.droppedBufferedEvents % 50 === 1) {
1633
+ console.error(
1634
+ `[gate] inference buffer cap (${MAX_INFERENCE_BUFFER}) — dropped ` +
1635
+ `${this.droppedBufferedEvents} oldest buffered event(s)` +
1636
+ `${this.quiesced ? ' during quiesce' : ''}; the flush on release will be incomplete`,
1637
+ );
1638
+ }
1596
1639
  }
1597
1640
  this.inferenceBuffer.push(event);
1598
1641
  }
package/src/index.ts CHANGED
@@ -2,7 +2,8 @@
2
2
  export * from './types/index.js';
3
3
 
4
4
  // Core classes
5
- export { AgentFramework } from './framework.js';
5
+ export { AgentFramework, BudgetPreflightError, ResumeBlockedError } from './framework.js';
6
+ export type { RuntimeSettingsPreview, HostModeStatus } from './framework.js';
6
7
  export { Agent } from './agent.js';
7
8
  export type { StartStreamResult } from './agent.js';
8
9
  export { ProcessQueueImpl } from './queue.js';
@@ -124,6 +125,9 @@ export type {
124
125
  DiscordAwarenessRef,
125
126
  DiscordSuppressionInterval,
126
127
  } from './recovery/discord-awareness-outbox.js';
128
+ // Live operator surgery (rollback / suppress) and its durable action log
129
+ export { OperatorLog, OperatorActionError, defaultOperatorLogPath } from './operator-log.js';
130
+ export type { OperatorLogEntry, OperatorLogInput, OperatorRequester } from './operator-log.js';
127
131
  export { createOfflineRecoveryBranch } from './recovery/offline-branch.js';
128
132
  export type {
129
133
  OfflineRecoveryBranchOptions,