@securecoms/agent-bridge 0.28.2 → 0.30.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 +288 -81
- package/dist/bin.d.ts +1 -1
- package/dist/bin.js +5112 -508
- package/dist/bridge-agent.d.ts +393 -3
- package/dist/config.d.ts +9 -0
- package/dist/consumer-grants.d.ts +19 -0
- package/dist/grants/binding.d.ts +58 -0
- package/dist/grants/effective.d.ts +47 -0
- package/dist/grants/manifest.d.ts +68 -0
- package/dist/grants/owner-turn.d.ts +52 -0
- package/dist/grants/persona-render.d.ts +30 -0
- package/dist/grants/pin-command.d.ts +31 -0
- package/dist/grants/pin.d.ts +35 -0
- package/dist/grants/room-search-cap.d.ts +15 -0
- package/dist/grants/voice-fence.d.ts +53 -0
- package/dist/http-server.d.ts +1 -0
- package/dist/index.js +4658 -248
- package/dist/memory/note-frames.d.ts +1 -1
- package/dist/memory/unified/chunk.d.ts +12 -0
- package/dist/memory/unified/config.d.ts +7 -0
- package/dist/memory/unified/consumer-unified.d.ts +21 -0
- package/dist/memory/unified/escape.d.ts +23 -0
- package/dist/memory/unified/index-key.d.ts +8 -0
- package/dist/memory/unified/item-book.d.ts +73 -0
- package/dist/memory/unified/item-reembed.d.ts +20 -0
- package/dist/memory/unified/migrate.d.ts +79 -0
- package/dist/memory/unified/owner-scope.d.ts +48 -0
- package/dist/memory/unified/pin-rules.d.ts +18 -0
- package/dist/memory/unified/ranking-client.d.ts +48 -0
- package/dist/memory/unified/ranking-core-constants.d.ts +8 -0
- package/dist/memory/unified/ranking-core.d.ts +117 -0
- package/dist/memory/unified/ranking-inprocess.d.ts +3 -0
- package/dist/memory/unified/ranking-worker.d.ts +1 -0
- package/dist/memory/unified/read-book.d.ts +81 -0
- package/dist/memory/unified/switch.d.ts +8 -0
- package/dist/memory/unified/text.d.ts +15 -0
- package/dist/memory/unified/worker-protocol.d.ts +106 -0
- package/dist/memory-taps.d.ts +1 -1
- package/dist/memory-worker.js +598 -0
- package/dist/service/runtime-config-dir.d.ts +15 -0
- package/dist/version.d.ts +1 -1
- package/dist/ws-server.d.ts +3 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -56,17 +56,23 @@ The bundled connectors give tools only to the agent owner's turns. Each harness
|
|
|
56
56
|
|
|
57
57
|
On an older harness the connector reports its tool veto as inactive and refuses every turn that has no tool grant, so non-owner rooms go quiet instead of running tools unchecked. `/healthz` shows `harness_tool_veto_active` (true, false, or null when no connector is attached), the authenticated `GET /v1/status` shows the harness name and version, and the daemon logs `harness.tool_veto_inactive` once when an attached harness cannot veto. After upgrading the package, re-run `agent-bridge wire --harness openclaw` (or re-copy the Hermes connector files) so the harness loads the new connector, then restart the harness gateway.
|
|
58
58
|
|
|
59
|
-
### Room tool rule (0.
|
|
59
|
+
### Room tool rule (0.30.0 and later)
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
<!-- [COPY, approved by Eric 2026-10-12] -->
|
|
62
|
+
|
|
63
|
+
In a room whose every member, including pending members and anyone who left but still holds an MLS leaf, is in the agent owner's org, the agent gets the time, plus web search if you allow it (50 a day per room). Other rooms get no tools. The owner DM uses the tools the owner signed. Without signed settings, it keeps `current_time` and `web_search`. <!-- [COPY, approved by Eric 2026-10-12] --> Replies to room turns are re-classified when they are sent.
|
|
62
64
|
|
|
63
65
|
Operator steps:
|
|
64
66
|
|
|
65
|
-
- **Deploy order:** backend (already live), then this bridge, then `@securecoms/agent-runtime` 0.
|
|
67
|
+
- **Deploy order:** backend (already live), then this bridge, then `@securecoms/agent-runtime` 0.13.0. A new runtime on an old bridge offers no tools on the owner's relayed voice turns. Room grants need both the new bridge and the new runtime.
|
|
66
68
|
- **Re-wire connectors:** re-run `agent-bridge wire --harness ...` on every Hermes and OpenClaw host after upgrading. Connectors are copied at wire time and an upgrade does not refresh them. A bridge downgrade after re-wiring makes the new connectors refuse tools on the owner's voice turns.
|
|
67
69
|
- **Kill switch:** `SECURECOMS_ROOM_DEFAULT_GRANTS` (bridge service environment, read at startup). Unset or `on` keeps the room default; any other value sends no tools on every room turn. It does not affect the owner DM. `SECURECOMS_OWNER_DM_DEFAULT_GRANTS` is unchanged.
|
|
70
|
+
- **Owner-signed grant switches:** `SECURECOMS_OWNER_DM_MANIFEST_GRANTS` and `SECURECOMS_ROOM_MANIFEST_GRANTS` (bridge service environment, read at startup). Unset or `on` keeps owner-signed tool settings in that place (the private chat, or rooms). Any other value makes that place use the fallback: today's default tools, limited to what the owner signed, plus `current_time`. These switches never add a tool. `SECURECOMS_OWNER_DM_DEFAULT_GRANTS` and `SECURECOMS_ROOM_DEFAULT_GRANTS` still override them and send no tools when off. <!-- [COPY, approved by Eric 2026-10-12] -->
|
|
71
|
+
- **Room search cap:** `SECURECOMS_ROOM_SEARCH_DAILY_CAP` lowers the daily `web_search` limit for each room. The default and the maximum are 50. Use a whole number from 0 to 50. `0` turns room search off, and the room gets no notice. Any other value is treated as 50, and the Connector logs one warning. **Set it in both the bridge service environment and the runtime service environment.** On macOS these are two launchd plists, and each has its own `EnvironmentVariables`. Each service reads it once at start, so restart both after a change. The count resets each UTC day. <!-- [COPY, approved by Eric 2026-10-12] -->
|
|
72
|
+
- **Agent search cap:** `SECURECOMS_AGENT_ROOM_SEARCH_DAILY_CAP` lowers the daily total of room `web_search` calls for one agent across all rooms. The default and the maximum are 200. Use a whole number from 0 to 200. `0` turns room search off. Any other value is treated as 200, and the Connector logs one warning. Set it in both service environments and restart both, as for the room cap. <!-- [COPY, approved by Eric 2026-10-12] -->
|
|
68
73
|
- **Owner-DM epoch freshness:** owner-DM tools now also require a roster read at the agent's current MLS group and epoch. A wedged or group-less DM shows no tools. Diagnose with the `authz.decision` log fields `epoch_fresh`, `room_class`, `per_tool_consumer` and `room_kill_switch`.
|
|
69
|
-
- **Restart residual:** after a bridge restart, a reply to a room turn granted before the restart is not re-classified.
|
|
74
|
+
- **Restart residual:** after a bridge restart, a reply to a room turn granted before the restart is not re-classified. `current_time` and `web_search` output can be affected. <!-- [COPY, approved by Eric 2026-10-12] -->
|
|
75
|
+
- **`sqlite` database path:** a `sqlite` database path must be its real path. On macOS `/tmp` is `/private/tmp`, so a path under `/tmp` is refused. <!-- [COPY, approved by Eric 2026-10-12] -->
|
|
70
76
|
- **Post-deploy probe:** count `connect.roster_mirror_unresolved` warnings and rooms reading `unknown`. A high rate means roster mirror drift is hiding room tools.
|
|
71
77
|
|
|
72
78
|
---
|
|
@@ -596,6 +602,68 @@ The loopback hop carries plaintext by design — the agent is the endpoint and t
|
|
|
596
602
|
|
|
597
603
|
---
|
|
598
604
|
|
|
605
|
+
## Owner signing key (tool settings)
|
|
606
|
+
|
|
607
|
+
<!-- [COPY, approved by Eric 2026-10-12] owner-signed tool grants spec 2026-10-12 section 10 K-19. -->
|
|
608
|
+
|
|
609
|
+
The Connector can hold the owner's signing key, so it can check that a message
|
|
610
|
+
or a tool setting really came from the agent's owner. The SecureComs server
|
|
611
|
+
never supplies this key. The Connector reads it only from two files on this
|
|
612
|
+
machine, once, when it starts.
|
|
613
|
+
|
|
614
|
+
**Format.** The key file is `owner-signing-key.json` and holds exactly three
|
|
615
|
+
fields, nothing else:
|
|
616
|
+
|
|
617
|
+
```json
|
|
618
|
+
{
|
|
619
|
+
"owner_identity_id": "0a0a0a0a-1111-4222-8333-444444444444",
|
|
620
|
+
"key_algo": "ed25519",
|
|
621
|
+
"public_key": "<base64 of the 32-byte Ed25519 public key>"
|
|
622
|
+
}
|
|
623
|
+
```
|
|
624
|
+
|
|
625
|
+
`owner_identity_id` is the owner's identity id in lowercase. The credential
|
|
626
|
+
file can carry the same object under `owner_signing_key`. If both are present
|
|
627
|
+
they must match exactly; if they differ the Connector uses neither.
|
|
628
|
+
|
|
629
|
+
**Location.** `owner-signing-key.json` sits in the same folder as the
|
|
630
|
+
credential file.
|
|
631
|
+
|
|
632
|
+
**No symbolic links.** A key file that is a symbolic link is refused, and the
|
|
633
|
+
Connector then uses no key at all, whatever the credential holds.
|
|
634
|
+
|
|
635
|
+
**Permissions.** Keep the file at mode `0600`, like the credential. A looser
|
|
636
|
+
mode is logged as a warning and the key is still used.
|
|
637
|
+
|
|
638
|
+
**Setting or changing the key.** Use the `pin` command. All three flags are
|
|
639
|
+
required:
|
|
640
|
+
|
|
641
|
+
```bash
|
|
642
|
+
agent-bridge pin --credential <credential.json> --file <owner-signing-key.json> --agent <agent_identity_id>
|
|
643
|
+
```
|
|
644
|
+
|
|
645
|
+
The key file must be in the same folder as the credential file, and
|
|
646
|
+
`--agent` must be the credential's own agent identity, so the command cannot
|
|
647
|
+
change another agent's credential. It prints the agent identity before it
|
|
648
|
+
changes anything. It rewrites the key file and the credential's
|
|
649
|
+
`owner_signing_key` together, through temporary files and renames, so an
|
|
650
|
+
interrupted run leaves either the old key, the new key, or no key, never a
|
|
651
|
+
wrong one. Restart the Connector afterwards to use the key.
|
|
652
|
+
|
|
653
|
+
**Counters.** Each owner-signed tool setting carries a counter that only goes
|
|
654
|
+
up. Pinning the same key again keeps the stored counter. Pinning a new key
|
|
655
|
+
starts a new counter, and the old key's stored settings are dropped.
|
|
656
|
+
|
|
657
|
+
### Upgrade note
|
|
658
|
+
|
|
659
|
+
<!-- [COPY, approved by Eric 2026-10-12] owner-signed tool grants spec 2026-10-12 section 10 K-27. -->
|
|
660
|
+
|
|
661
|
+
Owner messages stored before this release cannot be verified, because they
|
|
662
|
+
were stored without their signature. On a Connector that holds the owner's
|
|
663
|
+
signing key, a redelivered old message runs without tools or memory.
|
|
664
|
+
|
|
665
|
+
---
|
|
666
|
+
|
|
599
667
|
## Attachments and any-language agents
|
|
600
668
|
|
|
601
669
|
The daemon is the universal substrate: an agent in any language (Python, Go,
|
|
@@ -705,99 +773,238 @@ including its key). Each proxied call is metered server-side
|
|
|
705
773
|
|
|
706
774
|
---
|
|
707
775
|
|
|
708
|
-
##
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
776
|
+
## Unified memory (0.29.0)
|
|
777
|
+
|
|
778
|
+
<!-- [COPY, NEW] Approved by Eric 2026-10-11 (plan Task 37). -->
|
|
779
|
+
|
|
780
|
+
Bridge 0.29.0 replaces the Markdown notes of 0.27 and the semantic memory of
|
|
781
|
+
0.28 with one memory. In this release it works in the owner's private chat
|
|
782
|
+
only. Rooms and other people's private chats are not remembered.
|
|
783
|
+
|
|
784
|
+
**What the agent remembers.**
|
|
785
|
+
|
|
786
|
+
- Each message the owner types in their private chat. A message that looks
|
|
787
|
+
like a password or a key is not saved at all.
|
|
788
|
+
- What the owner says on a call in their private chat, when the bridge gets
|
|
789
|
+
the turn as transcribed speech from a relay that the server verified as the
|
|
790
|
+
owner. A spoken turn that arrives before the bridge has its runtime config
|
|
791
|
+
after a restart is not saved. Spoken words cannot be pinned, and a call
|
|
792
|
+
cannot forget.
|
|
793
|
+
- The agent's own replies in that chat, as reference material. A message the
|
|
794
|
+
agent sends that does not reply to a message is not saved.
|
|
795
|
+
- Pinned facts. The owner asks the agent to pin a fact, and the bridge posts
|
|
796
|
+
`Pinned: "<fact>" Say "forget that" to remove it.` in the chat. Each word
|
|
797
|
+
that carries meaning must be a word the owner typed. Words spoken on a call
|
|
798
|
+
do not count. At most 200 pinned facts, each at most 400 characters.
|
|
799
|
+
- "Forget that". The owner types it in their private chat. The agent removes
|
|
800
|
+
one memory shown with that message, and the bridge posts
|
|
801
|
+
`Forgot: "<text>"`. The agent makes one change (a pin or a forget) per
|
|
802
|
+
owner message.
|
|
803
|
+
|
|
804
|
+
**Where it is kept.** Each memory is sealed per row in `bridge-state.db`
|
|
805
|
+
(schema v12) on the agent's machine. The bridge delivers memories only to the
|
|
806
|
+
`/v1/ws` socket of a runtime that declares `memory_unified` in its hello. A
|
|
807
|
+
harness socket never receives them. The model provider sees the memories
|
|
808
|
+
delivered with each turn. Beside the pinned facts, a typed turn gets at most
|
|
809
|
+
10 memories and a voice turn at most 3. The bridge waits up to 600 ms for a
|
|
810
|
+
typed turn's memory search and up to 250 ms for a voice turn's.
|
|
811
|
+
|
|
812
|
+
**Limits.** The limit is 2 GB or 100,000 memories, whichever comes first.
|
|
813
|
+
When it is full, the oldest automatic memories are removed first. Pinned facts
|
|
814
|
+
are never removed. At 80%, the app shows: "{name}'s memory is 80% full
|
|
815
|
+
({used} of {limit}). The limit is 2 GB or 100,000 memories, whichever comes
|
|
816
|
+
first. When it is full, the oldest automatic memories are removed first.
|
|
817
|
+
Pinned facts are never removed." The app also says: "The more {name}
|
|
818
|
+
remembers, the harder it is to find older details; pinned facts are always in
|
|
819
|
+
front of it."
|
|
820
|
+
|
|
821
|
+
**RAM.** Plan for about 102 to 104 MiB more memory per agent at 100,000
|
|
822
|
+
memories (measured 2026-10-11 in a standalone process on an x86_64 laptop). A
|
|
823
|
+
small store uses less.
|
|
824
|
+
|
|
825
|
+
**The search model.** The bridge downloads its search model from
|
|
826
|
+
downloads.securecoms.ai the first time the owner messages the agent in their
|
|
827
|
+
private chat with memory on, if the model files are not already on the
|
|
828
|
+
machine. On a machine that must make no such connection, set
|
|
829
|
+
`memory.model_source` to `import_only` in the credential file and copy the
|
|
830
|
+
model bundle in with `agent-bridge models import <dir>`. Without the model,
|
|
831
|
+
the agent finds memories by keyword only. On Windows it finds memories by
|
|
832
|
+
keyword only in this release.
|
|
833
|
+
|
|
834
|
+
If you embed the bridge as a library (`new BridgeAgent(cfg, deps)`), pass
|
|
835
|
+
`hostMachine: true`. Without it, no model is downloaded or loaded, no call
|
|
836
|
+
heartbeat is written, and the agent finds memories by keyword only. The
|
|
837
|
+
`agent-bridge` command passes it for you.
|
|
716
838
|
|
|
717
839
|
**Compatibility.**
|
|
718
840
|
|
|
719
|
-
- Install `@securecoms/agent-runtime` 0.
|
|
720
|
-
restart both (`launchctl bootout` then `bootstrap`, never `kickstart`).
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
`memory_notes` has connected in that bridge process. A 0.9.x runtime's
|
|
724
|
-
hello does not, so a 0.27 bridge with a 0.9.x runtime keeps today's facts
|
|
725
|
-
and recall, but it is not a supported pairing.
|
|
841
|
+
- Install `@securecoms/agent-runtime` 0.12.0 together with the bridge and
|
|
842
|
+
restart both (`launchctl bootout` then `bootstrap`, never `kickstart`). A
|
|
843
|
+
runtime whose hello does not declare `memory_unified` (0.11.0 or older) gets
|
|
844
|
+
no memories. That is not a supported pairing.
|
|
726
845
|
- Harness daemons (Hermes, OpenClaw) must name `memory.provider` in their
|
|
727
|
-
credential file. A daemon whose file omits it is treated as `securecoms
|
|
728
|
-
its
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
(`jq .memory.provider <credential-file>`) before
|
|
733
|
-
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
846
|
+
credential file. A daemon whose file omits it is treated as `securecoms`:
|
|
847
|
+
its bridge saves owner private-chat memories on disk, although its harness
|
|
848
|
+
socket never receives them. A global `npm install -g --prefix ~/.local`
|
|
849
|
+
reaches every daemon whose plist points at the global `dist/bin.js`, at its
|
|
850
|
+
next restart. Check each credential file
|
|
851
|
+
(`jq .memory.provider <credential-file>`) before you install.
|
|
852
|
+
- Memory is off in a freshly started bridge until a runtime-config refetch
|
|
853
|
+
succeeds. A bridge restarted while the backend is unreachable saves and
|
|
854
|
+
recalls nothing until the backend answers.
|
|
855
|
+
|
|
856
|
+
**Old notes and semantic memory.** The bridge copies a private chat's old
|
|
857
|
+
memory into unified memory in the background, after the owner's first typed
|
|
858
|
+
message in that chat on 0.29.0:
|
|
859
|
+
|
|
860
|
+
- 0.27 notes become pinned facts. The 200-fact limit does not apply to them.
|
|
861
|
+
- 0.28 semantic memory rows become automatic memories. Their search vectors
|
|
862
|
+
are kept.
|
|
863
|
+
- The chat's stored history becomes reference memories.
|
|
864
|
+
- A message forgotten in 0.28 is not copied. Text that looks like a password
|
|
865
|
+
or a key is not copied. Old facts, and the history of rooms and of other
|
|
866
|
+
people's private chats, are not copied.
|
|
867
|
+
|
|
868
|
+
The old tables stay in this release, so a rollback works. Clear all and
|
|
869
|
+
"forget that" also delete the matching old rows.
|
|
870
|
+
|
|
871
|
+
**Off switches.** There are four. Use the narrowest that fits.
|
|
872
|
+
|
|
873
|
+
- Agent memory off in the agent settings. The agent saves nothing new and
|
|
874
|
+
recalls nothing. It still sees the recent messages of the chat. Turning
|
|
875
|
+
memory off does not delete memories. Use Clear all for that.
|
|
876
|
+
- `memory.enabled: false` in the credential file, then a daemon restart. The
|
|
877
|
+
same effect, and the backend cannot turn it back on. Any value other than
|
|
878
|
+
`true` turns memory off.
|
|
879
|
+
- `memory.provider: "none"` in the credential file, then a daemon restart.
|
|
880
|
+
This turns memory off, and it also drops the recent history.
|
|
881
|
+
- `SECURECOMS_OWNER_DM_DEFAULT_GRANTS=off` in the bridge service environment.
|
|
882
|
+
This turns memory off, and it also drops the owner private-chat tools.
|
|
883
|
+
|
|
884
|
+
`SECURECOMS_TOOL_DENY=memory_note` (runtime environment) removes only the pin
|
|
885
|
+
and forget tool. The agent still saves and recalls memories.
|
|
738
886
|
|
|
739
887
|
**Known limitations.**
|
|
740
888
|
|
|
741
|
-
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
- Short notes in CJK or Thai (fewer than 2 space-separated tokens) are
|
|
746
|
-
refused.
|
|
747
|
-
- UUIDs and long letter-and-digit tokens are refused as possible secrets.
|
|
889
|
+
- A pin can reorder the owner's words or leave one out, including a negation
|
|
890
|
+
("don't pay Bob, pay Alice" can be pinned as "pay Bob"). Read the
|
|
891
|
+
`Pinned:` line, and say "forget that" if it is wrong.
|
|
892
|
+
- Clear all deletes memories. It does not delete chat history.
|
|
748
893
|
- Forget and clear are logical deletes: sealed bytes can stay in free
|
|
749
|
-
database pages until they are overwritten, and they still open
|
|
750
|
-
device key.
|
|
751
|
-
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
`memory.
|
|
766
|
-
`memory.
|
|
767
|
-
`memory.
|
|
768
|
-
`memory.
|
|
769
|
-
|
|
770
|
-
`
|
|
771
|
-
`
|
|
772
|
-
|
|
894
|
+
database pages or the WAL until they are overwritten, and they still open
|
|
895
|
+
under the device key.
|
|
896
|
+
- The model provider sees the memories that the bridge delivers.
|
|
897
|
+
|
|
898
|
+
**Log events.** All are content-free: counts and classes only, never memory
|
|
899
|
+
text. `memory.item_written` (`source`, `chunks`), `memory.item_skipped`
|
|
900
|
+
(`reason_class`), `memory.pin_written`, `memory.item_forgotten`,
|
|
901
|
+
`memory.note_refused` (`reason_class`), `memory.migration_ran` (`notes`,
|
|
902
|
+
`recall`, `history`, `skipped`, `excluded`, `aborted`, `unreadable`),
|
|
903
|
+
`memory.owner_scope_purged` (`count`), `memory.unified_off`
|
|
904
|
+
(`reason_class`: `off`, `unrecognized`, `local` or `clear_pending`),
|
|
905
|
+
`memory.ranking_worker_exited` (`inFlight`), and these failure events with the
|
|
906
|
+
error class only: `memory.unified_clear_failed`,
|
|
907
|
+
`memory.unified_switch_failed`, `memory.unified_report_failed`,
|
|
908
|
+
`memory.unified_prepare_failed`, `memory.unified_reply_failed`,
|
|
909
|
+
`memory.unified_boot_reconcile_failed`, `memory.migration_failed`,
|
|
910
|
+
`memory.owner_scope_sweep_failed`, `memory.note_write_failed`,
|
|
911
|
+
`memory.pinned_line_failed`, `memory.forgot_line_failed`,
|
|
912
|
+
`memory.evict_failed`, `memory.reembed_failed`, `memory.model_upkeep_failed`,
|
|
913
|
+
`memory.ranking_notify_failed` and `memory.ranking_worker_spawn_failed`.
|
|
914
|
+
|
|
915
|
+
**`/healthz` and the machine report.** `/healthz` adds `memory_hot_bytes`,
|
|
916
|
+
`memory_deadline_misses`, `memory_reads`, `memory_reads_discarded` and `pid`.
|
|
917
|
+
The machine report adds `memory_unified_enabled`, `memory_size_bytes`,
|
|
918
|
+
`memory_item_count`, `memory_db_bytes` and `memory_near_full`. All are
|
|
919
|
+
numbers or booleans.
|
|
773
920
|
|
|
774
921
|
**Upgrade order.** Upgrade and restart the bridge and the runtime together.
|
|
775
922
|
First check `memory.provider` in the credential file of every daemon that a
|
|
776
923
|
global install reaches (`jq .memory.provider <credential-file>`).
|
|
777
924
|
|
|
778
|
-
**Rollback.**
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
925
|
+
**Rollback.** Roll back the bridge and the runtime together, to 0.28.2 and
|
|
926
|
+
0.11.0, and restart both. A 0.28.2 bridge opens the database, ignores the
|
|
927
|
+
unified tables, and works on the old notes, semantic memory rows and history
|
|
928
|
+
that 0.29.0 kept. It does not see what 0.29.0 saved, pinned facts included. It
|
|
929
|
+
never removes or clears the unified tables, so the size limit does not apply
|
|
930
|
+
to them until you upgrade again. When 0.29.0 starts again, before it serves
|
|
931
|
+
anything, it removes copied pins whose old note was deleted during the
|
|
932
|
+
rollback, removes copied memories whose message was forgotten, and applies a
|
|
933
|
+
Clear all done during the rollback. Old rows added during the rollback are
|
|
934
|
+
copied after the owner's next typed message.
|
|
787
935
|
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
If you change the memory provider or turn off owner-DM defaults, semantic memory rows stay on the machine until their retention ends, but they are never used.
|
|
791
|
-
|
|
792
|
-
The bridge logs `memory.model_download_enabled` (no fields) once per process
|
|
793
|
-
when semantic memory is turned on with `model_source` `download`.
|
|
794
|
-
|
|
795
|
-
<!-- [COPY, NEW] (7b Task 19 fix round 2). Gate: Eric sign-off before npm publish (release PR). -->
|
|
936
|
+
---
|
|
796
937
|
|
|
797
|
-
|
|
938
|
+
## Release notes: 0.30.0
|
|
939
|
+
|
|
940
|
+
<!-- [COPY, approved by Eric 2026-10-12] -->
|
|
941
|
+
|
|
942
|
+
0.30.0 lets the owner choose which read tools an agent has, and the Connector
|
|
943
|
+
checks that choice against the owner's own signing key. Install it together
|
|
944
|
+
with `@securecoms/agent-runtime` 0.13.0 and restart both. See "Owner signing
|
|
945
|
+
key (tool settings)" above.
|
|
946
|
+
|
|
947
|
+
- **Owner-set tools.** In the web app the owner chooses tools for the private
|
|
948
|
+
chat (`web_search`, `fetch_url`, `http_request` with GET, `sql_query`) and
|
|
949
|
+
for rooms in the owner's org (`web_search`). `current_time` is always on.
|
|
950
|
+
- **A key is required.** The choice takes effect only on a Connector that
|
|
951
|
+
holds the owner's signing key (the `pin` command). Without a key, the
|
|
952
|
+
agent keeps today's tools: `current_time` and `web_search` in the private
|
|
953
|
+
chat, `current_time` in rooms.
|
|
954
|
+
- **What the Connector checks.** It checks the owner's signature on each
|
|
955
|
+
private-chat message and on the tool settings. A message it has already
|
|
956
|
+
processed gets no tools. If the settings the server sends differ from what
|
|
957
|
+
the owner signed, the agent falls back to today's tools, limited to what the
|
|
958
|
+
owner signed.
|
|
959
|
+
- **Signed targets.** The endpoints for `http_request` and the databases for
|
|
960
|
+
`sql_query` come from the signed settings only. A `sqlite` path must be its
|
|
961
|
+
real path.
|
|
962
|
+
- **Room web search.** Rooms in the owner's org can use `web_search`. The
|
|
963
|
+
limit is 50 calls a day for each room and 200 a day for each agent (UTC
|
|
964
|
+
days). The agent posts one notice in a room when that room reaches its limit.
|
|
965
|
+
- **Agent frameworks.** An agent that runs through another agent framework
|
|
966
|
+
(Hermes or OpenClaw) gets no tools from SecureComs once it holds a key and
|
|
967
|
+
signed settings.
|
|
968
|
+
- **Older runtime.** With `@securecoms/agent-runtime` 0.12.2 or older, the
|
|
969
|
+
Connector uses the fallback in every place.
|
|
970
|
+
- **Off switches.** `SECURECOMS_OWNER_DM_MANIFEST_GRANTS` and
|
|
971
|
+
`SECURECOMS_ROOM_MANIFEST_GRANTS` are new. See "Room tool rule" above.
|
|
972
|
+
- **Upgrade note.** Owner messages stored before this release cannot be
|
|
973
|
+
verified. See "Upgrade note" above.
|
|
798
974
|
|
|
799
975
|
---
|
|
800
976
|
|
|
977
|
+
## Release notes: 0.29.0
|
|
978
|
+
|
|
979
|
+
<!-- [COPY, NEW] Approved by Eric 2026-10-11 (plan Task 37). -->
|
|
980
|
+
|
|
981
|
+
0.29.0 turns on unified memory in the owner's private chat. Install it
|
|
982
|
+
together with `@securecoms/agent-runtime` 0.12.0 and restart both. See
|
|
983
|
+
"Unified memory (0.29.0)" above.
|
|
984
|
+
|
|
985
|
+
- **One memory.** Typed messages, spoken call turns, the agent's replies and
|
|
986
|
+
pinned facts are kept in one sealed memory. Rooms and other people's private
|
|
987
|
+
chats are not remembered in this release.
|
|
988
|
+
- **Old memory moves.** 0.27 notes and 0.28 semantic memory rows are copied in
|
|
989
|
+
after the owner's next typed message. The old tables stay for one release.
|
|
990
|
+
- **Limits.** 2 GB or 100,000 memories, whichever comes first. Pinned facts are
|
|
991
|
+
never removed.
|
|
992
|
+
- **RAM.** About 102 to 104 MiB more per agent at 100,000 memories
|
|
993
|
+
(measured in a standalone process, not yet inside a running bridge).
|
|
994
|
+
- **Off switches.** A new credential key, `memory.enabled: false`, turns memory
|
|
995
|
+
off on the machine. `SECURECOMS_TOOL_DENY=memory_note` now removes only the
|
|
996
|
+
pin and forget tool; automatic memory continues.
|
|
997
|
+
<!-- [COPY, approved by Eric 2026-10-12] skills spec 2026-10-12 section 7 C-5. -->
|
|
998
|
+
- **Tools in the owner's private chat.** With runtime 0.12.0 or later, the
|
|
999
|
+
memory tool gate checks every tool call on the owner's private-chat turns.
|
|
1000
|
+
The tools this bridge grants there are `current_time`, which runs as usual,
|
|
1001
|
+
and `web_search`, which runs when its query does not repeat a number, link,
|
|
1002
|
+
address or wording from memory or the chat history that the owner did not
|
|
1003
|
+
type in that message. Custom skills are not offered on any turn, in the
|
|
1004
|
+
private chat or in rooms, and were not before this release.
|
|
1005
|
+
- **`/healthz`.** New `memory_hot_bytes`, `memory_deadline_misses`,
|
|
1006
|
+
`memory_reads`, `memory_reads_discarded` and `pid`.
|
|
1007
|
+
|
|
801
1008
|
## Release notes: 0.28.2
|
|
802
1009
|
|
|
803
1010
|
<!-- [COPY, NEW] this section. Approved by Eric 2026-10-09 ("approve 0.28.2 copy"). -->
|
|
@@ -816,7 +1023,7 @@ unchanged.
|
|
|
816
1023
|
|
|
817
1024
|
## Release notes: 0.28.1
|
|
818
1025
|
|
|
819
|
-
<!-- [COPY, NEW] this section.
|
|
1026
|
+
<!-- [COPY, NEW] this section. Approved by Eric 2026-10-09. -->
|
|
820
1027
|
|
|
821
1028
|
0.28.1 makes semantic memory recall more reliable. Install it in place of
|
|
822
1029
|
0.28.0 and restart the bridge. `@securecoms/agent-runtime` 0.11.0 is unchanged.
|
|
@@ -845,7 +1052,7 @@ with `@securecoms/agent-runtime` 0.11.0 and restart both.
|
|
|
845
1052
|
- **`import_only`.** Set `memory.model_source` to `import_only` on a machine
|
|
846
1053
|
that must make no model download.
|
|
847
1054
|
- **`models import`.** `agent-bridge models import <dir>` copies a model bundle
|
|
848
|
-
in for `import_only` machines. <!-- [COPY, NEW] the one-line CLI confirmation "imported <names>" printed by `models import` (src/bin.ts).
|
|
1055
|
+
in for `import_only` machines. <!-- [COPY, NEW] the one-line CLI confirmation "imported <names>" printed by `models import` (src/bin.ts). Approved by Eric 2026-10-09. -->
|
|
849
1056
|
|
|
850
1057
|
## Test commands
|
|
851
1058
|
|
package/dist/bin.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export declare function nodeMajorOk(version: string): boolean;
|
|
|
11
11
|
* diagnostics do not call this helper or expose even the hint.
|
|
12
12
|
*/
|
|
13
13
|
export declare function tokenFingerprint(token: string): string;
|
|
14
|
-
export declare function parseVerb(argv: string[]): "install" | "uninstall" | "status" | "wire" | "unwire" | "models" | null;
|
|
14
|
+
export declare function parseVerb(argv: string[]): "install" | "uninstall" | "status" | "wire" | "unwire" | "models" | "pin" | null;
|
|
15
15
|
export declare function slugFromCredentialPath(credentialPath: string): string;
|
|
16
16
|
export declare function chooseInstallExecPath(runningExecPath: string, override: string | undefined, deps: ResolveNodeDeps): string;
|
|
17
17
|
export declare function realCopyConnector(srcDir: string, dstDir: string, harness: Harness): void;
|