@animalabs/agent-framework 0.6.5 → 0.6.6
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 +18 -1
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +201 -2
- package/dist/src/agent.js.map +1 -1
- package/dist/src/framework.d.ts +15 -1
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +423 -86
- package/dist/src/framework.js.map +1 -1
- package/dist/src/gate/event-gate.d.ts.map +1 -1
- package/dist/src/gate/event-gate.js +27 -4
- package/dist/src/gate/event-gate.js.map +1 -1
- package/dist/src/mcpl/channel-registry.d.ts +34 -15
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.js +299 -67
- package/dist/src/mcpl/channel-registry.js.map +1 -1
- package/dist/src/mcpl/push-handler.d.ts +1 -0
- package/dist/src/mcpl/push-handler.d.ts.map +1 -1
- package/dist/src/mcpl/push-handler.js +1 -0
- package/dist/src/mcpl/push-handler.js.map +1 -1
- package/dist/src/mcpl/server-connection.d.ts +3 -1
- package/dist/src/mcpl/server-connection.d.ts.map +1 -1
- package/dist/src/mcpl/server-connection.js +4 -0
- package/dist/src/mcpl/server-connection.js.map +1 -1
- package/dist/src/mcpl/types.d.ts +43 -12
- package/dist/src/mcpl/types.d.ts.map +1 -1
- package/dist/src/mcpl/types.js +1 -0
- package/dist/src/mcpl/types.js.map +1 -1
- package/dist/src/types/agent.d.ts +15 -0
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/events.d.ts +1 -0
- package/dist/src/types/events.d.ts.map +1 -1
- package/dist/src/types/trace.d.ts +2 -0
- package/dist/src/types/trace.d.ts.map +1 -1
- package/dist/test/agent-runtime-settings.test.d.ts +2 -0
- package/dist/test/agent-runtime-settings.test.d.ts.map +1 -0
- package/dist/test/agent-runtime-settings.test.js +120 -0
- package/dist/test/agent-runtime-settings.test.js.map +1 -0
- package/dist/test/channel-registry-routing.test.js +5 -4
- package/dist/test/channel-registry-routing.test.js.map +1 -1
- package/dist/test/conversation-fork-injection-scoping.test.js +12 -1
- package/dist/test/conversation-fork-injection-scoping.test.js.map +1 -1
- package/dist/test/event-gate.test.js +21 -1
- package/dist/test/event-gate.test.js.map +1 -1
- package/dist/test/helpers/mock-membrane.d.ts +13 -1
- package/dist/test/helpers/mock-membrane.d.ts.map +1 -1
- package/dist/test/helpers/mock-membrane.js +8 -1
- package/dist/test/helpers/mock-membrane.js.map +1 -1
- package/dist/test/maintenance-timer.test.js +3 -1
- package/dist/test/maintenance-timer.test.js.map +1 -1
- package/dist/test/mcpl-gate-roundtrip.test.js +138 -6
- package/dist/test/mcpl-gate-roundtrip.test.js.map +1 -1
- package/dist/test/present-while-acting.test.d.ts +18 -0
- package/dist/test/present-while-acting.test.d.ts.map +1 -0
- package/dist/test/present-while-acting.test.js +267 -0
- package/dist/test/present-while-acting.test.js.map +1 -0
- package/dist/test/trunk-channel-routing.test.js +38 -0
- package/dist/test/trunk-channel-routing.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/agent.ts +222 -3
- package/src/framework.ts +468 -92
- package/src/gate/event-gate.ts +38 -4
- package/src/mcpl/channel-registry.ts +372 -76
- package/src/mcpl/push-handler.ts +2 -0
- package/src/mcpl/server-connection.ts +10 -0
- package/src/mcpl/types.ts +49 -12
- package/src/types/agent.ts +18 -0
- package/src/types/events.ts +1 -1
- package/src/types/trace.ts +2 -0
package/src/gate/event-gate.ts
CHANGED
|
@@ -65,6 +65,13 @@ interface PendingEvent {
|
|
|
65
65
|
content: string;
|
|
66
66
|
eventType: string;
|
|
67
67
|
timestamp: number;
|
|
68
|
+
/** The framework stores MCPL event content in the context window AT ARRIVAL
|
|
69
|
+
* (channel-incoming and push-event both addMessage before the gate decides
|
|
70
|
+
* anything). For those, the debounced wake must NOT re-quote the content —
|
|
71
|
+
* a [Gate:] copy delivered minutes later reads as a fresh, stale duplicate
|
|
72
|
+
* of a message the agent may have long since handled. */
|
|
73
|
+
inContext: boolean;
|
|
74
|
+
channelId?: string;
|
|
68
75
|
}
|
|
69
76
|
|
|
70
77
|
interface DebounceState {
|
|
@@ -1020,6 +1027,8 @@ export class EventGate {
|
|
|
1020
1027
|
: info.content,
|
|
1021
1028
|
eventType: info.eventType,
|
|
1022
1029
|
timestamp: Date.now(),
|
|
1030
|
+
inContext: info.eventType === 'mcpl:channel-incoming' || info.eventType === 'mcpl:push-event',
|
|
1031
|
+
channelId: info.channelId || undefined,
|
|
1023
1032
|
};
|
|
1024
1033
|
|
|
1025
1034
|
const existing = this.debounceTimers.get(policy.name);
|
|
@@ -1067,11 +1076,36 @@ export class EventGate {
|
|
|
1067
1076
|
if (events.length === 0) return;
|
|
1068
1077
|
|
|
1069
1078
|
const policyNames = [...new Set(events.map(e => e.policyName))];
|
|
1070
|
-
const lines = events
|
|
1071
|
-
.map(e => `- [${e.policyName}] (${e.eventType}): ${e.content}`)
|
|
1072
|
-
.join('\n');
|
|
1073
1079
|
|
|
1074
|
-
|
|
1080
|
+
// Events whose content the framework already stored at arrival (MCPL
|
|
1081
|
+
// channel-incoming / push-event) get a compact REFERENCE — re-quoting
|
|
1082
|
+
// them here would inject a duplicate copy of the message minutes after
|
|
1083
|
+
// the fact, reading as fresh input the agent may have already handled.
|
|
1084
|
+
// Only events with no context entry of their own carry their content.
|
|
1085
|
+
const quoted = events.filter(e => !e.inContext);
|
|
1086
|
+
const referenced = events.filter(e => e.inContext);
|
|
1087
|
+
|
|
1088
|
+
const lines: string[] = quoted.map(e => `- [${e.policyName}] (${e.eventType}): ${e.content}`);
|
|
1089
|
+
if (referenced.length > 0) {
|
|
1090
|
+
const byChannel = new Map<string, { count: number; oldest: number }>();
|
|
1091
|
+
for (const e of referenced) {
|
|
1092
|
+
const key = e.channelId ?? '(unknown channel)';
|
|
1093
|
+
const entry = byChannel.get(key) ?? { count: 0, oldest: e.timestamp };
|
|
1094
|
+
entry.count += 1;
|
|
1095
|
+
entry.oldest = Math.min(entry.oldest, e.timestamp);
|
|
1096
|
+
byChannel.set(key, entry);
|
|
1097
|
+
}
|
|
1098
|
+
for (const [channel, { count, oldest }] of byChannel) {
|
|
1099
|
+
const age = Math.round((Date.now() - oldest) / 1000);
|
|
1100
|
+
lines.push(
|
|
1101
|
+
`- ${count} message${count > 1 ? 's' : ''} in ${channel} ` +
|
|
1102
|
+
`(oldest ~${age}s ago) — already shown above at arrival; this is a ` +
|
|
1103
|
+
`batched wake, not new content`,
|
|
1104
|
+
);
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
const text = `[Gate: ${events.length} event${events.length > 1 ? 's' : ''} matched]\n\n${lines.join('\n')}`;
|
|
1075
1109
|
|
|
1076
1110
|
this.addMessageFn('user', [{ type: 'text', text }], {
|
|
1077
1111
|
source: 'gate:debounce',
|