@sjawhar/pi-legion-envoy 5.30.2 → 5.30.4

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/envoy.js CHANGED
@@ -30475,6 +30475,23 @@ var EnvelopeSchema = exports_external.object({
30475
30475
  urgency: exports_external.enum(["low", "med", "high", "blocking"]).optional(),
30476
30476
  expects_reply: exports_external.enum(["none", "optional", "required"]).optional()
30477
30477
  });
30478
+ var MINTED_DEDUPE_KEY_PATTERN = "^(?:envoy\\.role\\.forward\\.)?(?:publish|agent\\.[^.]+)\\.(?:[0-9a-f]{32}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$";
30479
+ var mintedDedupeKey = new RegExp(MINTED_DEDUPE_KEY_PATTERN);
30480
+ function dedupeKeyNamesItsEvent(envelope) {
30481
+ const key = envelope.dedupe_key;
30482
+ if (key === undefined)
30483
+ return false;
30484
+ if (envelope.source === "dispatch" || mintedDedupeKey.test(key))
30485
+ return true;
30486
+ switch (envelope.source) {
30487
+ case "github":
30488
+ case "slack":
30489
+ case "ghostwispr":
30490
+ return envelope.source_event_id !== undefined && envelope.source_event_id !== "" && key === `${envelope.source}.${envelope.source_event_id}`;
30491
+ default:
30492
+ return false;
30493
+ }
30494
+ }
30478
30495
  // ../contracts/src/handoff-schema.ts
30479
30496
  var HANDOFF_SCHEMA_VERSION = 1;
30480
30497
  var HANDOFF_PHASES = ["architect", "plan", "implement", "test", "review"];
@@ -31612,6 +31629,7 @@ var InboundSenderSchema = exports_external.object({
31612
31629
  var InboundEnvelopeSchema = exports_external.object({
31613
31630
  event_id: exports_external.string().optional(),
31614
31631
  source: exports_external.string(),
31632
+ source_event_id: exports_external.string().optional(),
31615
31633
  source_session: exports_external.string().optional(),
31616
31634
  topic: exports_external.string().optional(),
31617
31635
  dedupe_key: exports_external.string().optional(),
@@ -31655,13 +31673,72 @@ async function postDeliveryReply(config2, sessionId, delivery, result) {
31655
31673
  function expectsLaneReceipt(frame) {
31656
31674
  return frame.reply !== undefined && frame.reply !== "" && frame.subject === frame.directSubject && frame.envelopeTopic !== undefined && frame.envelopeTopic !== frame.directSubject;
31657
31675
  }
31658
- function rememberBounded(seen, key, limit) {
31659
- seen.add(key);
31660
- if (seen.size > limit) {
31661
- const oldest = seen.values().next();
31662
- if (!oldest.done)
31663
- seen.delete(oldest.value);
31664
- }
31676
+ var DedupeIdentitySchema = exports_external.object({
31677
+ event_id: exports_external.string().min(1).optional(),
31678
+ dedupe_key: exports_external.string().min(1).optional(),
31679
+ source: exports_external.string().optional(),
31680
+ source_event_id: exports_external.string().optional()
31681
+ });
31682
+ var DELIVERY_DEDUPE_KEY_LIMIT = 250000;
31683
+ var DELIVERY_EVENT_ID_LIMIT = 1e4;
31684
+ function createDeliveryDedupe(now = Date.now) {
31685
+ const keys = new Map;
31686
+ let events = new Map;
31687
+ let olderEvents = new Map;
31688
+ let claims = 0;
31689
+ return {
31690
+ claim(frame) {
31691
+ const eventId = frame?.event_id;
31692
+ if (eventId !== undefined && (events.has(eventId) || olderEvents.has(eventId))) {
31693
+ return;
31694
+ }
31695
+ const key = frame?.dedupe_key;
31696
+ const named = frame !== undefined && key !== undefined && dedupeKeyNamesItsEvent(frame);
31697
+ const at = now();
31698
+ if (named) {
31699
+ const claimedAt = keys.get(key);
31700
+ if (claimedAt !== undefined && at - claimedAt < DELIVERY_DUPLICATE_WINDOW_MS) {
31701
+ return;
31702
+ }
31703
+ for (const [oldest, deliveredAt] of keys) {
31704
+ if (at - deliveredAt < DELIVERY_DUPLICATE_WINDOW_MS)
31705
+ break;
31706
+ keys.delete(oldest);
31707
+ }
31708
+ keys.delete(key);
31709
+ if (keys.size >= DELIVERY_DEDUPE_KEY_LIMIT) {
31710
+ const oldest = keys.keys().next();
31711
+ if (oldest.done !== true)
31712
+ keys.delete(oldest.value);
31713
+ }
31714
+ keys.set(key, at);
31715
+ }
31716
+ const claim = ++claims;
31717
+ if (eventId !== undefined) {
31718
+ if (events.size >= DELIVERY_EVENT_ID_LIMIT / 2) {
31719
+ olderEvents = events;
31720
+ events = new Map;
31721
+ }
31722
+ events.set(eventId, claim);
31723
+ }
31724
+ let released = false;
31725
+ return {
31726
+ release() {
31727
+ if (released)
31728
+ return;
31729
+ released = true;
31730
+ if (named && keys.get(key) === at)
31731
+ keys.delete(key);
31732
+ if (eventId === undefined)
31733
+ return;
31734
+ if (events.get(eventId) === claim)
31735
+ events.delete(eventId);
31736
+ if (olderEvents.get(eventId) === claim)
31737
+ olderEvents.delete(eventId);
31738
+ }
31739
+ };
31740
+ }
31741
+ };
31665
31742
  }
31666
31743
  function isCommentTargetedDelivery(delivery) {
31667
31744
  return "comment_id" in delivery;
@@ -35893,7 +35970,7 @@ function envoyExtension(pi) {
35893
35970
  };
35894
35971
  const client = createEnvoyClient({ baseUrl: defaults.envoyUrl, fetch });
35895
35972
  const subscriptions = new Map;
35896
- const dedupeKeys = new Set;
35973
+ const delivered = createDeliveryDedupe();
35897
35974
  let connection;
35898
35975
  let sessionDirectory = "";
35899
35976
  let sessionID = "";
@@ -36051,9 +36128,8 @@ function envoyExtension(pi) {
36051
36128
  }
36052
36129
  for (const topic of subscriptionRemovedTopics(raw, sessionID) ?? [])
36053
36130
  closeIntentionally(topic);
36054
- const dedupeKey = rendered.envelope?.dedupe_key;
36055
- const duplicate = dedupeKey !== undefined && dedupeKeys.has(dedupeKey);
36056
- if (!duplicate && !rendered.skip) {
36131
+ const claim2 = rendered.skip ? undefined : delivered.claim(rendered.envelope);
36132
+ if (claim2 !== undefined) {
36057
36133
  const envelope2 = rendered.envelope;
36058
36134
  if (envelope2 !== undefined) {
36059
36135
  inbox.unshift({
@@ -36065,30 +36141,28 @@ function envoyExtension(pi) {
36065
36141
  if (inbox.length > 50)
36066
36142
  inbox.pop();
36067
36143
  }
36144
+ const refuse = async (delivery, error48) => {
36145
+ claim2.release();
36146
+ await postDispatchReply(delivery, { error: error48 });
36147
+ };
36068
36148
  try {
36069
36149
  if (rendered.rejectedDelivery !== undefined) {
36070
36150
  console.warn(`[envoy] rejecting malformed Dispatch targeted delivery ${rendered.rejectedDelivery.id}`);
36071
- await postDispatchReply(rendered.rejectedDelivery, {
36072
- error: "Invalid Dispatch targeted delivery frame"
36073
- });
36151
+ await refuse(rendered.rejectedDelivery, "Invalid Dispatch targeted delivery frame");
36074
36152
  } else if (rendered.malformedDelivery === true) {
36075
36153
  console.warn("[envoy] dropping malformed Dispatch targeted delivery without a reply address");
36076
36154
  } else if (rendered.delivery?.mode === "btw") {
36077
36155
  const answer = sideTurn(pi, activeSessionContext);
36078
36156
  if (shuttingDown) {
36079
- await postDispatchReply(rendered.delivery, {
36080
- error: "This OMP session is shutting down"
36081
- });
36157
+ await refuse(rendered.delivery, "This OMP session is shutting down");
36082
36158
  } else if (answer === undefined) {
36083
- await postDispatchReply(rendered.delivery, {
36084
- error: "This OMP host does not support BTW delivery"
36085
- });
36159
+ await refuse(rendered.delivery, "This OMP host does not support BTW delivery");
36086
36160
  } else {
36087
36161
  try {
36088
36162
  const reply2 = await answer({ prompt: rendered.delivery.body });
36089
36163
  await postDispatchReply(rendered.delivery, { body: reply2.replyText });
36090
36164
  } catch (error48) {
36091
- await postDispatchReply(rendered.delivery, { error: messageFor(error48) });
36165
+ await refuse(rendered.delivery, messageFor(error48));
36092
36166
  }
36093
36167
  }
36094
36168
  } else {
@@ -36104,11 +36178,10 @@ function envoyExtension(pi) {
36104
36178
  }
36105
36179
  }
36106
36180
  } catch (error48) {
36181
+ claim2.release();
36107
36182
  console.warn(`[envoy] failed to deliver envelope ${envelope2?.event_id ?? "unknown"}`, error48);
36108
36183
  throw error48;
36109
36184
  }
36110
- if (dedupeKey !== undefined)
36111
- rememberBounded(dedupeKeys, dedupeKey, 1000);
36112
36185
  }
36113
36186
  };
36114
36187
  const RESUBSCRIBE_DELAY_MS = Number(process.env.ENVOY_RESUBSCRIBE_DELAY_MS ?? "") || 5000;
package/dist/legion.js CHANGED
@@ -30644,6 +30644,23 @@ var EnvelopeSchema = exports_external.object({
30644
30644
  urgency: exports_external.enum(["low", "med", "high", "blocking"]).optional(),
30645
30645
  expects_reply: exports_external.enum(["none", "optional", "required"]).optional()
30646
30646
  });
30647
+ var MINTED_DEDUPE_KEY_PATTERN = "^(?:envoy\\.role\\.forward\\.)?(?:publish|agent\\.[^.]+)\\.(?:[0-9a-f]{32}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$";
30648
+ var mintedDedupeKey = new RegExp(MINTED_DEDUPE_KEY_PATTERN);
30649
+ function dedupeKeyNamesItsEvent(envelope) {
30650
+ const key = envelope.dedupe_key;
30651
+ if (key === undefined)
30652
+ return false;
30653
+ if (envelope.source === "dispatch" || mintedDedupeKey.test(key))
30654
+ return true;
30655
+ switch (envelope.source) {
30656
+ case "github":
30657
+ case "slack":
30658
+ case "ghostwispr":
30659
+ return envelope.source_event_id !== undefined && envelope.source_event_id !== "" && key === `${envelope.source}.${envelope.source_event_id}`;
30660
+ default:
30661
+ return false;
30662
+ }
30663
+ }
30647
30664
  // ../contracts/src/handoff-schema.ts
30648
30665
  var HANDOFF_SCHEMA_VERSION = 1;
30649
30666
  var HANDOFF_PHASES = ["architect", "plan", "implement", "test", "review"];
@@ -33685,7 +33702,7 @@ import { logger } from "@oh-my-pi/pi-utils";
33685
33702
  // package.json
33686
33703
  var package_default = {
33687
33704
  name: "@sjawhar/pi-legion-envoy",
33688
- version: "5.30.2",
33705
+ version: "5.30.4",
33689
33706
  type: "module",
33690
33707
  omp: {
33691
33708
  extensions: [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sjawhar/pi-legion-envoy",
3
- "version": "5.30.2",
3
+ "version": "5.30.4",
4
4
  "type": "module",
5
5
  "omp": {
6
6
  "extensions": [