@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.
Files changed (69) hide show
  1. package/dist/src/agent.d.ts +18 -1
  2. package/dist/src/agent.d.ts.map +1 -1
  3. package/dist/src/agent.js +201 -2
  4. package/dist/src/agent.js.map +1 -1
  5. package/dist/src/framework.d.ts +15 -1
  6. package/dist/src/framework.d.ts.map +1 -1
  7. package/dist/src/framework.js +423 -86
  8. package/dist/src/framework.js.map +1 -1
  9. package/dist/src/gate/event-gate.d.ts.map +1 -1
  10. package/dist/src/gate/event-gate.js +27 -4
  11. package/dist/src/gate/event-gate.js.map +1 -1
  12. package/dist/src/mcpl/channel-registry.d.ts +34 -15
  13. package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
  14. package/dist/src/mcpl/channel-registry.js +299 -67
  15. package/dist/src/mcpl/channel-registry.js.map +1 -1
  16. package/dist/src/mcpl/push-handler.d.ts +1 -0
  17. package/dist/src/mcpl/push-handler.d.ts.map +1 -1
  18. package/dist/src/mcpl/push-handler.js +1 -0
  19. package/dist/src/mcpl/push-handler.js.map +1 -1
  20. package/dist/src/mcpl/server-connection.d.ts +3 -1
  21. package/dist/src/mcpl/server-connection.d.ts.map +1 -1
  22. package/dist/src/mcpl/server-connection.js +4 -0
  23. package/dist/src/mcpl/server-connection.js.map +1 -1
  24. package/dist/src/mcpl/types.d.ts +43 -12
  25. package/dist/src/mcpl/types.d.ts.map +1 -1
  26. package/dist/src/mcpl/types.js +1 -0
  27. package/dist/src/mcpl/types.js.map +1 -1
  28. package/dist/src/types/agent.d.ts +15 -0
  29. package/dist/src/types/agent.d.ts.map +1 -1
  30. package/dist/src/types/events.d.ts +1 -0
  31. package/dist/src/types/events.d.ts.map +1 -1
  32. package/dist/src/types/trace.d.ts +2 -0
  33. package/dist/src/types/trace.d.ts.map +1 -1
  34. package/dist/test/agent-runtime-settings.test.d.ts +2 -0
  35. package/dist/test/agent-runtime-settings.test.d.ts.map +1 -0
  36. package/dist/test/agent-runtime-settings.test.js +120 -0
  37. package/dist/test/agent-runtime-settings.test.js.map +1 -0
  38. package/dist/test/channel-registry-routing.test.js +5 -4
  39. package/dist/test/channel-registry-routing.test.js.map +1 -1
  40. package/dist/test/conversation-fork-injection-scoping.test.js +12 -1
  41. package/dist/test/conversation-fork-injection-scoping.test.js.map +1 -1
  42. package/dist/test/event-gate.test.js +21 -1
  43. package/dist/test/event-gate.test.js.map +1 -1
  44. package/dist/test/helpers/mock-membrane.d.ts +13 -1
  45. package/dist/test/helpers/mock-membrane.d.ts.map +1 -1
  46. package/dist/test/helpers/mock-membrane.js +8 -1
  47. package/dist/test/helpers/mock-membrane.js.map +1 -1
  48. package/dist/test/maintenance-timer.test.js +3 -1
  49. package/dist/test/maintenance-timer.test.js.map +1 -1
  50. package/dist/test/mcpl-gate-roundtrip.test.js +138 -6
  51. package/dist/test/mcpl-gate-roundtrip.test.js.map +1 -1
  52. package/dist/test/present-while-acting.test.d.ts +18 -0
  53. package/dist/test/present-while-acting.test.d.ts.map +1 -0
  54. package/dist/test/present-while-acting.test.js +267 -0
  55. package/dist/test/present-while-acting.test.js.map +1 -0
  56. package/dist/test/trunk-channel-routing.test.js +38 -0
  57. package/dist/test/trunk-channel-routing.test.js.map +1 -1
  58. package/dist/tsconfig.tsbuildinfo +1 -1
  59. package/package.json +3 -3
  60. package/src/agent.ts +222 -3
  61. package/src/framework.ts +468 -92
  62. package/src/gate/event-gate.ts +38 -4
  63. package/src/mcpl/channel-registry.ts +372 -76
  64. package/src/mcpl/push-handler.ts +2 -0
  65. package/src/mcpl/server-connection.ts +10 -0
  66. package/src/mcpl/types.ts +49 -12
  67. package/src/types/agent.ts +18 -0
  68. package/src/types/events.ts +1 -1
  69. package/src/types/trace.ts +2 -0
@@ -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
- const text = `[Gate: ${events.length} event${events.length > 1 ? 's' : ''} matched]\n\n${lines}`;
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',