@pidgeon-ai/sdk 1.11.0 → 1.12.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/CHANGELOG.md CHANGED
@@ -9,6 +9,16 @@ call shapes, the result shape — not to the API behind it.
9
9
 
10
10
  ## Unreleased
11
11
 
12
+ ## 1.12.0 — Pidgeon Firewall
13
+
14
+ Every inbound `Message` carries `firewall`: a `verdict` (`clean` or
15
+ `suspicious`) and the `signals` that produced it — hidden text, instructions
16
+ addressed to an AI, impersonated chat turns, directives buried in quoted
17
+ history, look-alike senders, display-name spoofing, and requests to send
18
+ secrets out — each with where it fired and a sentence quoting it.
19
+ `message.received` carries the verdict and the signal kinds. Observe-only:
20
+ nothing is held or changed. Read it before acting on what a message asks.
21
+
12
22
  ## 1.11.0 — a key for one pod
13
23
 
14
24
  `apiKeysCreate` takes `pod_id` in place of `identity_ids`: the key reaches
package/dist/index.d.cts CHANGED
@@ -528,6 +528,30 @@ type Message = {
528
528
  * The event the calendar made of that invitation, or null. A different fact from `invitation`: that is what the mail said, this is what the calendar now holds — a meeting later moved still reports the time this message invited you to.
529
529
  */
530
530
  calendar_event_id: string | null;
531
+ /**
532
+ * Pidgeon Firewall: does this message try to steer the agent reading it — hidden text, instructions addressed to an AI, impersonated chat turns, look-alike senders, requests to send secrets out. Null on outbound mail. Read it before acting on what the message asks.
533
+ */
534
+ firewall: {
535
+ /**
536
+ * `suspicious` when any signal fired. Observe-only: nothing is held or changed.
537
+ */
538
+ verdict: 'clean' | 'suspicious';
539
+ /**
540
+ * The rules that fired, most specific first. Empty when the verdict is `clean`.
541
+ */
542
+ signals: Array<{
543
+ kind: 'hidden_text' | 'invisible_characters' | 'assistant_directive' | 'role_spoof' | 'quoted_directive' | 'lookalike_sender' | 'display_name_spoof' | 'unauthenticated_with_directive' | 'exfiltration_request';
544
+ /**
545
+ * What was found, with a short quote of it.
546
+ */
547
+ detail: string;
548
+ where: 'subject' | 'text' | 'html' | 'from' | 'quoted';
549
+ }>;
550
+ /**
551
+ * Bumped when the rules change in a way that could change a verdict.
552
+ */
553
+ version: number;
554
+ } | null;
531
555
  /**
532
556
  * Verification codes and links found in the message, most likely first — read from the new text, never the quoted history. Empty lists when nothing was found.
533
557
  */
@@ -681,6 +705,30 @@ type AwaitedMessage = {
681
705
  * The event the calendar made of that invitation, or null. A different fact from `invitation`: that is what the mail said, this is what the calendar now holds — a meeting later moved still reports the time this message invited you to.
682
706
  */
683
707
  calendar_event_id: string | null;
708
+ /**
709
+ * Pidgeon Firewall: does this message try to steer the agent reading it — hidden text, instructions addressed to an AI, impersonated chat turns, look-alike senders, requests to send secrets out. Null on outbound mail. Read it before acting on what the message asks.
710
+ */
711
+ firewall: {
712
+ /**
713
+ * `suspicious` when any signal fired. Observe-only: nothing is held or changed.
714
+ */
715
+ verdict: 'clean' | 'suspicious';
716
+ /**
717
+ * The rules that fired, most specific first. Empty when the verdict is `clean`.
718
+ */
719
+ signals: Array<{
720
+ kind: 'hidden_text' | 'invisible_characters' | 'assistant_directive' | 'role_spoof' | 'quoted_directive' | 'lookalike_sender' | 'display_name_spoof' | 'unauthenticated_with_directive' | 'exfiltration_request';
721
+ /**
722
+ * What was found, with a short quote of it.
723
+ */
724
+ detail: string;
725
+ where: 'subject' | 'text' | 'html' | 'from' | 'quoted';
726
+ }>;
727
+ /**
728
+ * Bumped when the rules change in a way that could change a verdict.
729
+ */
730
+ version: number;
731
+ } | null;
684
732
  /**
685
733
  * Verification codes and links found in the message, most likely first — read from the new text, never the quoted history. Empty lists when nothing was found.
686
734
  */
package/dist/index.d.ts CHANGED
@@ -528,6 +528,30 @@ type Message = {
528
528
  * The event the calendar made of that invitation, or null. A different fact from `invitation`: that is what the mail said, this is what the calendar now holds — a meeting later moved still reports the time this message invited you to.
529
529
  */
530
530
  calendar_event_id: string | null;
531
+ /**
532
+ * Pidgeon Firewall: does this message try to steer the agent reading it — hidden text, instructions addressed to an AI, impersonated chat turns, look-alike senders, requests to send secrets out. Null on outbound mail. Read it before acting on what the message asks.
533
+ */
534
+ firewall: {
535
+ /**
536
+ * `suspicious` when any signal fired. Observe-only: nothing is held or changed.
537
+ */
538
+ verdict: 'clean' | 'suspicious';
539
+ /**
540
+ * The rules that fired, most specific first. Empty when the verdict is `clean`.
541
+ */
542
+ signals: Array<{
543
+ kind: 'hidden_text' | 'invisible_characters' | 'assistant_directive' | 'role_spoof' | 'quoted_directive' | 'lookalike_sender' | 'display_name_spoof' | 'unauthenticated_with_directive' | 'exfiltration_request';
544
+ /**
545
+ * What was found, with a short quote of it.
546
+ */
547
+ detail: string;
548
+ where: 'subject' | 'text' | 'html' | 'from' | 'quoted';
549
+ }>;
550
+ /**
551
+ * Bumped when the rules change in a way that could change a verdict.
552
+ */
553
+ version: number;
554
+ } | null;
531
555
  /**
532
556
  * Verification codes and links found in the message, most likely first — read from the new text, never the quoted history. Empty lists when nothing was found.
533
557
  */
@@ -681,6 +705,30 @@ type AwaitedMessage = {
681
705
  * The event the calendar made of that invitation, or null. A different fact from `invitation`: that is what the mail said, this is what the calendar now holds — a meeting later moved still reports the time this message invited you to.
682
706
  */
683
707
  calendar_event_id: string | null;
708
+ /**
709
+ * Pidgeon Firewall: does this message try to steer the agent reading it — hidden text, instructions addressed to an AI, impersonated chat turns, look-alike senders, requests to send secrets out. Null on outbound mail. Read it before acting on what the message asks.
710
+ */
711
+ firewall: {
712
+ /**
713
+ * `suspicious` when any signal fired. Observe-only: nothing is held or changed.
714
+ */
715
+ verdict: 'clean' | 'suspicious';
716
+ /**
717
+ * The rules that fired, most specific first. Empty when the verdict is `clean`.
718
+ */
719
+ signals: Array<{
720
+ kind: 'hidden_text' | 'invisible_characters' | 'assistant_directive' | 'role_spoof' | 'quoted_directive' | 'lookalike_sender' | 'display_name_spoof' | 'unauthenticated_with_directive' | 'exfiltration_request';
721
+ /**
722
+ * What was found, with a short quote of it.
723
+ */
724
+ detail: string;
725
+ where: 'subject' | 'text' | 'html' | 'from' | 'quoted';
726
+ }>;
727
+ /**
728
+ * Bumped when the rules change in a way that could change a verdict.
729
+ */
730
+ version: number;
731
+ } | null;
684
732
  /**
685
733
  * Verification codes and links found in the message, most likely first — read from the new text, never the quoted history. Empty lists when nothing was found.
686
734
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pidgeon-ai/sdk",
3
- "version": "1.11.0",
3
+ "version": "1.12.0",
4
4
  "description": "Thin TypeScript client for the Pidgeon email API.",
5
5
  "keywords": [
6
6
  "pidgeon",