@animalabs/agent-framework 0.15.0 → 0.17.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/README.md +22 -1
- package/dist/src/agent.d.ts +32 -0
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +55 -0
- package/dist/src/agent.js.map +1 -1
- package/dist/src/api/server.d.ts +9 -0
- package/dist/src/api/server.d.ts.map +1 -1
- package/dist/src/api/server.js +156 -0
- package/dist/src/api/server.js.map +1 -1
- package/dist/src/api/types.d.ts +15 -0
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/framework.d.ts +423 -3
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +1857 -75
- package/dist/src/framework.js.map +1 -1
- package/dist/src/gate/event-gate.d.ts +16 -0
- package/dist/src/gate/event-gate.d.ts.map +1 -1
- package/dist/src/gate/event-gate.js +41 -3
- package/dist/src/gate/event-gate.js.map +1 -1
- package/dist/src/index.d.ts +4 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcpl/channel-registry.d.ts +172 -0
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.js +444 -2
- package/dist/src/mcpl/channel-registry.js.map +1 -1
- package/dist/src/mcpl/server-connection.d.ts +9 -0
- package/dist/src/mcpl/server-connection.d.ts.map +1 -1
- package/dist/src/mcpl/server-connection.js +71 -13
- package/dist/src/mcpl/server-connection.js.map +1 -1
- package/dist/src/modules/history/index.d.ts +89 -13
- package/dist/src/modules/history/index.d.ts.map +1 -1
- package/dist/src/modules/history/index.js +655 -24
- package/dist/src/modules/history/index.js.map +1 -1
- package/dist/src/operator-log.d.ts +78 -0
- package/dist/src/operator-log.d.ts.map +1 -0
- package/dist/src/operator-log.js +102 -0
- package/dist/src/operator-log.js.map +1 -0
- package/dist/src/recovery/discord-awareness-outbox.d.ts +10 -0
- package/dist/src/recovery/discord-awareness-outbox.d.ts.map +1 -1
- package/dist/src/recovery/discord-awareness-outbox.js +20 -0
- package/dist/src/recovery/discord-awareness-outbox.js.map +1 -1
- package/dist/src/types/framework.d.ts +56 -0
- package/dist/src/types/framework.d.ts.map +1 -1
- package/dist/src/types/trace.d.ts +36 -0
- package/dist/src/types/trace.d.ts.map +1 -1
- package/dist/test/agent-runtime-settings.test.js +199 -1
- package/dist/test/agent-runtime-settings.test.js.map +1 -1
- package/dist/test/api-admin-gate.test.d.ts +2 -0
- package/dist/test/api-admin-gate.test.d.ts.map +1 -0
- package/dist/test/api-admin-gate.test.js +116 -0
- package/dist/test/api-admin-gate.test.js.map +1 -0
- package/dist/test/channel-label-history.test.d.ts +2 -0
- package/dist/test/channel-label-history.test.d.ts.map +1 -0
- package/dist/test/channel-label-history.test.js +424 -0
- package/dist/test/channel-label-history.test.js.map +1 -0
- package/dist/test/discord-awareness-outbox.test.js +16 -0
- package/dist/test/discord-awareness-outbox.test.js.map +1 -1
- package/dist/test/event-gate.test.js +44 -0
- package/dist/test/event-gate.test.js.map +1 -1
- package/dist/test/helpers/quiesce-crash-child.d.ts +2 -0
- package/dist/test/helpers/quiesce-crash-child.d.ts.map +1 -0
- package/dist/test/helpers/quiesce-crash-child.js +156 -0
- package/dist/test/helpers/quiesce-crash-child.js.map +1 -0
- package/dist/test/history-module-overview.test.d.ts +2 -0
- package/dist/test/history-module-overview.test.d.ts.map +1 -0
- package/dist/test/history-module-overview.test.js +711 -0
- package/dist/test/history-module-overview.test.js.map +1 -0
- package/dist/test/history-module.test.js +146 -0
- package/dist/test/history-module.test.js.map +1 -1
- package/dist/test/host-quiesce.test.d.ts +2 -0
- package/dist/test/host-quiesce.test.d.ts.map +1 -0
- package/dist/test/host-quiesce.test.js +863 -0
- package/dist/test/host-quiesce.test.js.map +1 -0
- package/dist/test/liveness-watchdog.test.js +18 -2
- package/dist/test/liveness-watchdog.test.js.map +1 -1
- package/dist/test/operator-surgery.test.d.ts +2 -0
- package/dist/test/operator-surgery.test.d.ts.map +1 -0
- package/dist/test/operator-surgery.test.js +398 -0
- package/dist/test/operator-surgery.test.js.map +1 -0
- package/dist/test/provider-acceleration-cooldown.test.js +145 -0
- package/dist/test/provider-acceleration-cooldown.test.js.map +1 -1
- package/dist/test/puppet-tool-call.test.js +5 -0
- package/dist/test/puppet-tool-call.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/agent.ts +69 -0
- package/src/api/server.ts +159 -2
- package/src/api/types.ts +15 -0
- package/src/framework.ts +2155 -96
- package/src/gate/event-gate.ts +47 -4
- package/src/index.ts +5 -1
- package/src/mcpl/channel-registry.ts +495 -2
- package/src/mcpl/server-connection.ts +73 -13
- package/src/modules/history/index.ts +689 -25
- package/src/operator-log.ts +132 -0
- package/src/recovery/discord-awareness-outbox.ts +19 -0
- package/src/types/framework.ts +63 -0
- package/src/types/trace.ts +42 -0
package/src/gate/event-gate.ts
CHANGED
|
@@ -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
|
|
1474
|
-
|
|
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
|
-
|
|
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(): {
|
|
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,
|