@joe-broadhead/messaging 0.7.0 → 0.8.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 +259 -2
- package/dist/bin/messaging-mcp.js +5484 -3858
- package/dist/bin/messaging-relay.js +4728 -1136
- package/dist/bin/messaging.js +4616 -2807
- package/dist/bin/messagingd.js +16451 -9444
- package/dist/lib/modules/core/agent/operations.js +19 -327
- package/dist/lib/modules/core/agent/present.js +15 -55
- package/dist/lib/modules/core/agent-tools.js +46 -143
- package/dist/lib/modules/core/consent.js +1 -1
- package/dist/lib/modules/core/conversation/context.js +80 -0
- package/dist/lib/modules/core/conversation/event.js +125 -0
- package/dist/lib/modules/core/conversation/guest-invitation.js +42 -0
- package/dist/lib/modules/core/conversation/ids.js +38 -0
- package/dist/lib/modules/core/conversation/link.js +35 -0
- package/dist/lib/modules/core/conversation/log.js +988 -0
- package/dist/lib/modules/core/conversation/ratchet.js +243 -0
- package/dist/lib/modules/core/conversation/request-log.js +158 -0
- package/dist/lib/modules/core/conversation/request-seal.js +41 -0
- package/dist/lib/modules/core/conversation/requests.js +87 -0
- package/dist/lib/modules/core/conversation/seal.js +251 -0
- package/dist/lib/modules/core/conversation-agent-tools.js +69 -0
- package/dist/lib/modules/core/federation/directory-proof.js +83 -0
- package/dist/lib/modules/core/federation/proof-state.js +167 -0
- package/dist/lib/modules/core/federation/roster-proof.js +74 -0
- package/dist/lib/modules/core/index.js +16 -2
- package/dist/lib/modules/core/jelly-host.js +5 -5
- package/dist/lib/modules/core/schema/common.js +85 -3
- package/dist/lib/modules/core/schema/consent.js +5 -4
- package/dist/lib/modules/core/schema/contact-request.js +22 -0
- package/dist/lib/modules/core/schema/conv-frames.js +94 -0
- package/dist/lib/modules/core/schema/conversation.js +326 -0
- package/dist/lib/modules/core/schema/envelope.js +8 -24
- package/dist/lib/modules/core/schema/errors.js +42 -2
- package/dist/lib/modules/core/schema/guest-invitation.js +13 -0
- package/dist/lib/modules/core/schema/index.js +6 -0
- package/dist/lib/modules/core/schema/ipc/consent.js +13 -9
- package/dist/lib/modules/core/schema/ipc/conversation-views.js +80 -0
- package/dist/lib/modules/core/schema/ipc/conversations.js +128 -0
- package/dist/lib/modules/core/schema/ipc/device.js +2 -0
- package/dist/lib/modules/core/schema/ipc/jelly.js +3 -38
- package/dist/lib/modules/core/schema/ipc/shapes.js +14 -72
- package/dist/lib/modules/core/schema/ipc/surfaces.js +12 -195
- package/dist/lib/modules/core/schema/ipc/tasks.js +31 -0
- package/dist/lib/modules/core/schema/ipc.js +18 -44
- package/dist/lib/modules/core/testing.js +1 -0
- package/dist/lib/modules/core/version.js +1 -1
- package/dist/lib/modules/ipc/client.js +10 -2
- package/dist/lib/modules/ipc/server.js +14 -5
- package/dist/lib/modules/ipc/testing.js +13 -23
- package/dist/spec/messaging-v1.md +835 -380
- package/dist/third-party-notices.md +1 -1
- package/dist/third-party.json +1 -1
- package/dist/types/core/agent/operations.d.ts +5 -52
- package/dist/types/core/agent/present.d.ts +6 -21
- package/dist/types/core/agent-tools.d.ts +277 -438
- package/dist/types/core/conversation/context.d.ts +56 -0
- package/dist/types/core/conversation/event.d.ts +36 -0
- package/dist/types/core/conversation/guest-invitation.d.ts +8 -0
- package/dist/types/core/conversation/ids.d.ts +18 -0
- package/dist/types/core/conversation/link.d.ts +16 -0
- package/dist/types/core/conversation/log.d.ts +157 -0
- package/dist/types/core/conversation/ratchet.d.ts +95 -0
- package/dist/types/core/conversation/request-log.d.ts +24 -0
- package/dist/types/core/conversation/request-seal.d.ts +6 -0
- package/dist/types/core/conversation/requests.d.ts +14 -0
- package/dist/types/core/conversation/seal.d.ts +70 -0
- package/dist/types/core/conversation-agent-tools.d.ts +918 -0
- package/dist/types/core/federation/directory-proof.d.ts +8 -0
- package/dist/types/core/federation/proof-state.d.ts +114 -0
- package/dist/types/core/federation/roster-proof.d.ts +7 -0
- package/dist/types/core/index.d.ts +15 -3
- package/dist/types/core/jelly-host.d.ts +1 -1
- package/dist/types/core/schema/common.d.ts +85 -4
- package/dist/types/core/schema/consent.d.ts +7 -7
- package/dist/types/core/schema/contact-request.d.ts +264 -0
- package/dist/types/core/schema/conv-frames.d.ts +1200 -0
- package/dist/types/core/schema/conversation.d.ts +2803 -0
- package/dist/types/core/schema/envelope.d.ts +89 -130
- package/dist/types/core/schema/errors.d.ts +40 -0
- package/dist/types/core/schema/guest-invitation.d.ts +51 -0
- package/dist/types/core/schema/index.d.ts +6 -0
- package/dist/types/core/schema/ipc/consent.d.ts +89 -49
- package/dist/types/core/schema/ipc/conversation-views.d.ts +1023 -0
- package/dist/types/core/schema/ipc/conversations.d.ts +3987 -0
- package/dist/types/core/schema/ipc/device.d.ts +10 -0
- package/dist/types/core/schema/ipc/jelly.d.ts +2 -105
- package/dist/types/core/schema/ipc/shapes.d.ts +16 -95
- package/dist/types/core/schema/ipc/surfaces.d.ts +28 -424
- package/dist/types/core/schema/ipc/tasks.d.ts +208 -0
- package/dist/types/core/schema/ipc.d.ts +2684 -523
- package/dist/types/core/schema/relay.d.ts +20 -4
- package/dist/types/core/testing.d.ts +1 -0
- package/dist/types/core/version.d.ts +1 -1
- package/dist/types/ipc/client.d.ts +4 -1
- package/dist/types/ipc/server.d.ts +10 -1
- package/dist/types/ipc/testing.d.ts +21 -8
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,263 @@ Versions follow [Semantic Versioning](https://semver.org); see
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.8.0] - 2026-11-10
|
|
10
|
+
|
|
11
|
+
**Conversations replace chat and mail.** A dm, a group, a channel and a mail between two agents are now all one
|
|
12
|
+
thing: a conversation, a signed, hash-chained log that the relay sequences and stores encrypted, and that each member
|
|
13
|
+
verifies (spec §6.8, §16). Each sender device encrypts to the conversation with a sender key, so each line is one
|
|
14
|
+
ciphertext, stored once (spec §16.5, §16.6). Tasks and delegation keep their envelopes and work as before.
|
|
15
|
+
|
|
16
|
+
**Upgrade the relay first, then every daemon of a realm together** (docs/distribution.md, "Upgrading from 0.7.1 to
|
|
17
|
+
the conversations release"). Stores only grow: nothing resets, and a rollback keeps the data.
|
|
18
|
+
|
|
19
|
+
### Breaking
|
|
20
|
+
|
|
21
|
+
- **0.7.1 and 0.8.0 daemons cannot exchange chat, mail or message requests** (spec §8.3, "Mixed versions"). Tasks,
|
|
22
|
+
presence and the directory still work in both directions.
|
|
23
|
+
- **0.8.0 → 0.7.1.** Before it creates a dm, group or channel with a person, adds a person, or sends a message
|
|
24
|
+
request, a 0.8.0 daemon asks the relay (the new `conv.caps` frame, spec §7). If every device of that person with
|
|
25
|
+
current presence lacks the `conversations` feature, the call fails with the new error `peer_outdated`, "<handle>
|
|
26
|
+
needs to update Messaging", and nothing is created or sent, so no contact is left half-open. A person with no
|
|
27
|
+
presence within the envelope TTL gives the relay no evidence, and the call goes ahead.
|
|
28
|
+
- **0.7.1 → 0.8.0.** A 0.8.0 daemon refuses a 0.7.1 chat line, plain mail or message request with a `rejected`
|
|
29
|
+
receipt, code `refused`. 0.7.1 shows only `refused` and its hint "do not retry; tell your person": **to a 0.7.1
|
|
30
|
+
user, `refused` from an updated colleague means "update Messaging".**
|
|
31
|
+
- **Rollout.** The relay first: it opens a 0.7.1 database in place and still serves every frame 0.7.1 uses, so 0.7.1
|
|
32
|
+
daemons keep working through it. Then every daemon of a realm, in one window.
|
|
33
|
+
- **Message requests pending at the upgrade must be sent again.** A request you sent from 0.7.1 that was not yet
|
|
34
|
+
answered is not carried over: it no longer shows in `request.waiting`, so send it again once both sides run 0.8.0.
|
|
35
|
+
A request you received and had not answered shows in `request.list` with state `resend`; it cannot be accepted,
|
|
36
|
+
because 0.7.1 requests carry no sender-signed proof, so ask its sender to send it again. Nothing is re-signed from
|
|
37
|
+
copied text.
|
|
38
|
+
- **IPC methods removed, with no aliases** (spec, "Conversation IPC cut-over"; design §14): `msg.send`, `person.send`,
|
|
39
|
+
`channel.create`, `channel.invite`, `channel.leave`, `channel.remove`, `search`, `conv.subscribe`, `agents.list` and
|
|
40
|
+
`agents.read`. `conv.list`, `conv.read` and `people.get` (now a batch of 1–100 ids) keep their names with the
|
|
41
|
+
conversation shapes. The chat `conv.markRead` is gone from the live API; its conversation form is staged (below).
|
|
42
|
+
- Plain mail is a `conv.send` line. A task is `task.create`, and an answer to a task waiting for input is
|
|
43
|
+
`task.continue`, both on the agent tier; `task.list/get/update/cancel` are unchanged.
|
|
44
|
+
- A daemon refuses plain agent-mail envelopes, including mail held before the upgrade and released after it. The
|
|
45
|
+
rows stay in the store but are not served.
|
|
46
|
+
- **New live methods** (`LIVE_CONVERSATION_METHODS`, spec §8.2):
|
|
47
|
+
- agent and human tier: `conv.list`, `conv.read`, `conv.send`, `conv.react`, `conv.edit`, `conv.delete` (an agent
|
|
48
|
+
edits or deletes only its own lines), `conv.search`, `conv.context`, `conv.access`, `conv.sync`;
|
|
49
|
+
- human tier (admin socket only): `conv.get`, `conv.members`, `conv.threads`, `conv.pin`, `conv.create`,
|
|
50
|
+
`conv.add`, `conv.remove`, `conv.role`, `conv.seat`, `conv.settings`, `conv.meta`, `conv.archive`, `conv.leave`,
|
|
51
|
+
`conv.join`, `conv.accept`, `conv.policy`, `conv.backfill`, `people.get`, `sessions.list`, `request.waiting`.
|
|
52
|
+
- **Staged, not live.** These contracts are in `@messaging/core` with no handler and no tier; a call to one is refused
|
|
53
|
+
(design, "Lane 4 live boundary"):
|
|
54
|
+
- read state and preferences: `conv.markRead`, `conv.markUnread`, `conv.prefs`, `conv.follow`, `conv.save`,
|
|
55
|
+
`conv.saved`, `conv.draft`, `conv.localRetention`;
|
|
56
|
+
- history as context: `context.get`, `context.set`, `context.set.preview`;
|
|
57
|
+
- the channel catalogue: `conv.catalogue`, `conv.publish`;
|
|
58
|
+
- files: `file.get`;
|
|
59
|
+
- typing and activity: `conv.typing`, `session.activity`, `turn.cancel`;
|
|
60
|
+
- scheduled lines: `conv.schedule`, `conv.scheduled`, `conv.unschedule`.
|
|
61
|
+
|
|
62
|
+
Until read state lands, views carry no read positions, unread counts, preferences or follow state, and the filters
|
|
63
|
+
that need them (`conv.list` `unread` and `mentions`, `conv.threads` `unread` and `following`) are refused with
|
|
64
|
+
`invalid_request`, never answered with an empty page. `conv.backfill` verifies the relay history it can fetch and
|
|
65
|
+
answers `complete: false`.
|
|
66
|
+
- **CLI.**
|
|
67
|
+
- `messaging message-status` is removed. `messaging status --help` points to `chat read` and `task`.
|
|
68
|
+
- `messaging send <participant|cid> [text…]` sends a conversation line as the person (`conv.send`). It creates the
|
|
69
|
+
dm when there is none, and prints `Pending <id> in <cid>` or `Waiting for consent.`. `--task` and `--continue`
|
|
70
|
+
send to one agent session, as before.
|
|
71
|
+
- `messaging chat list/read/post/search` take conversation ids (`cid`) and opaque `--cursor`s, not room names.
|
|
72
|
+
`chat search --room` is now `--cid`. `chat read` no longer changes read state, and `--keep-unread` is gone.
|
|
73
|
+
- `messaging listen` follows `conv.sync`. It prints conversation metadata and stream gaps, never the text.
|
|
74
|
+
- **MCP** (`messaging-mcp`, spec §11). Ten tools: `contacts`, `conversations`, `send`, `inbox`, `read`, `search`,
|
|
75
|
+
`context`, `tasks`, `task_update` and `task_cancel` (0.7.1 had eight, without `conversations` and `context`).
|
|
76
|
+
`--channel` is removed: the daemon decides which conversations an agent may read. Addresses are participants and
|
|
77
|
+
`cid`s, not `person:`, `agent:` or `channel:` names.
|
|
78
|
+
- **Package exports** (`@joe-broadhead/messaging/core`; a breaking change for the OpenCode plugin):
|
|
79
|
+
- removed: `AgentSummary`, `ChannelConv`, `ChatLine`, `ChatSeq`, `ChatText`, `ConvCursor`, `ConvEntry`,
|
|
80
|
+
`ConvPlace`, `ConvSummary`, `ConversationRef`, `RoomRef`, `conversationOf`, `conversationOfPeer`,
|
|
81
|
+
`decodeToolCursor`, `encodeToolCursor`, `presentConvEntry`, `presentLine`, `presentMail`, `presentSent` and
|
|
82
|
+
`sealKeyShares` (now `sealKeyShare`, one recipient); in `./core/testing`, `sealKeySharesWith` (now
|
|
83
|
+
`sealKeyShareWith`);
|
|
84
|
+
- changed: `AGENT_METHODS`, `HUMAN_METHODS` and `IPC_METHODS` (the method lists above), `TOOL_VERBS` (now only
|
|
85
|
+
`contacts`, `tasks`, `task_update` and `task_cancel`; all ten tools are `CONVERSATION_TOOL_VERBS`, with
|
|
86
|
+
`ConversationTools`), `AgentTool`,
|
|
87
|
+
`TOOL_DESCRIPTIONS`, `TOOL_REMEDIES`, `ErrorCode` (adds `peer_outdated`), `LIMITS`, `DOMAIN`, and the consent,
|
|
88
|
+
device, Jelly and surface method tables;
|
|
89
|
+
- `./ipc`, `./ipc/testing`, `./testing/jelly-id` and `./zod` export the same names as 0.7.1.
|
|
90
|
+
|
|
91
|
+
### Conversations
|
|
92
|
+
|
|
93
|
+
- **Dms, groups, channels and threads** (spec §6.8, §16). One log per conversation. Membership, roles and policy
|
|
94
|
+
are ops in the log, so every member computes the same participants at every position. A reply names its root.
|
|
95
|
+
Edits, deletes, reactions and pins are events that name their target. A dm starts with no shared history. Channels
|
|
96
|
+
share their history with new members, and groups and dms rekey when someone is added.
|
|
97
|
+
- **Agents are participants.** A participant is a person or one agent of a person (`person/agent`). Mail between two
|
|
98
|
+
agents is a line in their dm.
|
|
99
|
+
- **An agent can start a dm with another agent.** `conv.send {to: "person/agent"}` with no dm makes the person's
|
|
100
|
+
device sign the create, with only the two agents as participants. The daemon relies on the client's first-send
|
|
101
|
+
confirmation, as 0.7.1 mail did. The agent's lines wait on the sending device until the recipient seats its agent,
|
|
102
|
+
keep the id the send returned, and lapse after 7 days (at most 50 waiting per dm). An agent still cannot start a dm
|
|
103
|
+
with a person, or add or seat anyone.
|
|
104
|
+
- **Consent on invitations.** The recipient person's `ask` decides an agent-dm invitation: `open` seats the agent,
|
|
105
|
+
`request` holds it for the person, and `no` declines it silently. Until it is accepted, the relay serves an invitee
|
|
106
|
+
only the signed ops and digests: no ciphertext, no key shares, and only op pushes (spec §7, "Conversation frames").
|
|
107
|
+
- **Message requests on conversations** (spec §16.11). A first message to a person of another org is a signed,
|
|
108
|
+
portable request: the sender's device signs a descriptor that commits to the sealed opening text. The relay refuses
|
|
109
|
+
an external dm without request admission. Accepting signs a decision, activates the dm once, and imports the
|
|
110
|
+
opening as its first line, under its original author and id. `request.waiting` shows `held` only from an
|
|
111
|
+
authenticated hold, and `pending-delivery` while delivery is unconfirmed. Requests pending at the upgrade must be sent
|
|
112
|
+
again (Breaking, above). Crossed requests make one dm.
|
|
113
|
+
- **Guests.** A person of another org joins a conversation as a guest. A guest cannot invite, cannot change role out
|
|
114
|
+
of guest, and an agent of a guest inherits the guest's role. Keys and content reach a guest only after acceptance
|
|
115
|
+
(and, where history is not shared, after a rekey). These rules are enforced by the log and the relay. The daemon
|
|
116
|
+
does not yet create the inviter's signed preview that a guest's acceptance needs, so inviting a guest end to end
|
|
117
|
+
is not available in 0.8.0.
|
|
118
|
+
- **The inbox is a projection.** `inbox.list/get/ack` and `item.read` return task items and verified lines in accepted
|
|
119
|
+
agent dms addressed to that session. A line's id is its event id, with its `cid`. Acknowledgements belong to the
|
|
120
|
+
participant and survive an agent restart with a new session key. Plain mail stored before the upgrade is not
|
|
121
|
+
returned.
|
|
122
|
+
- **Own-person wakes on lines.** A person's line to their own agent (the other end of the dm, or a mention) wakes a
|
|
123
|
+
sleeping Jelly host, as mail did in 0.7.1 (spec §7, "Wake tickets"; §16.2). The relay takes the author's person from
|
|
124
|
+
the authenticated device, never from the event, and uses the existing ticket, gap and budget rules. Another person's
|
|
125
|
+
line never wakes your host.
|
|
126
|
+
- **`contacts.list`** returns accepted conversations only: `cid`, `kind`, optional `name` and `dmWith`. No transcript,
|
|
127
|
+
read position or unread count.
|
|
128
|
+
- **Blocks.** A blocked person's events are hidden from reads, search, previews and replay. The verified log stays
|
|
129
|
+
intact.
|
|
130
|
+
- **Maintenance.** The daemon retries the conversation outbox, schedules due epoch rekeys, answers new members'
|
|
131
|
+
channel history after a random 0–30 s delay, and expires local message text and search rows after retention, keeping
|
|
132
|
+
digests and ops so the chain stays verifiable. Ops never expire (design §4.4, D2).
|
|
133
|
+
- **Key shares go one per recipient device and are not entries of the log**; the relay serves each only to its
|
|
134
|
+
recipient (design §4.4, D1).
|
|
135
|
+
- **Relay frames** (spec §7): `conv.append`, `conv.share`, `conv.fetch`, `conv.head` and `conv.caps`, with `conv.ok`,
|
|
136
|
+
`conv.shared`, `conv.entries`, `conv.heads`, `conv.capabilities` and `conv.push`; and the request mailbox
|
|
137
|
+
`request.settle`, `request.state` and `request.settled`. The relay sequences each log and checks appends against its
|
|
138
|
+
copy (membership, the author's current device, op heads, epochs, orgs), and members verify everything it serves.
|
|
139
|
+
- **Presence** advertises the `conversations` feature.
|
|
140
|
+
|
|
141
|
+
### Security
|
|
142
|
+
|
|
143
|
+
- **New entries need the author's current device.** A conversation entry from a device that is no longer the author's
|
|
144
|
+
current binding is held: it keeps the chain but adds no state and no text, and is re-checked when the realm view
|
|
145
|
+
changes. Accepted history keeps its historical verification.
|
|
146
|
+
- **Rejected entries leave bounded evidence**: at most 128 rejected wire entries, and at most 512 junk and held
|
|
147
|
+
alarms, deduplicated across retries and restarts.
|
|
148
|
+
- **A message an author was not allowed to send is quarantined**, not shown.
|
|
149
|
+
- **HTTP response bodies are bounded while they stream** (daemon: Jelly environment, device login, directory home;
|
|
150
|
+
relay: Jelly directory). A response over the limit is cancelled, not buffered.
|
|
151
|
+
- **Relay error text stays out of the daemon's logs**: `relay.disconnected` no longer logs the relay's message.
|
|
152
|
+
- **Consent races.** A block made while a request's directory work is in flight is checked again before the request is
|
|
153
|
+
sent. Request pacing is reserved before any asynchronous work, so concurrent requests cannot pass the limit.
|
|
154
|
+
Answering a held request settles the request and the grant (`always` or `block`) in one transaction.
|
|
155
|
+
- **Agents are bound to their session.** The daemon binds every agent call to a session registered on that
|
|
156
|
+
connection, and rechecks membership and session ownership after rendering. Cursors bind to the query and session.
|
|
157
|
+
Peer text, author names and conversation names in MCP output are fenced, and long text carries a truncation marker.
|
|
158
|
+
- **Interim projection bounds**: projection refuses logs above 10,000 entries and responses above 512 KiB, pending
|
|
159
|
+
load tests.
|
|
160
|
+
|
|
161
|
+
### Fixed
|
|
162
|
+
|
|
163
|
+
- **A sync that overlaps the daemon's own append is accepted.** A page that repeats an entry the flush path just stored
|
|
164
|
+
failed with "entry does not extend head N"; repeated entries are now checked by seq and dropped, and a different
|
|
165
|
+
entry is `conv_conflict`.
|
|
166
|
+
- **`conv.add` and `conv.remove` no longer fail with "a conversation event is still pending"** while maintenance key
|
|
167
|
+
shares are queued: the control path drains them first.
|
|
168
|
+
- **Removing a person while history shares to them are queued no longer stalls the outbox.** A queued share is dropped
|
|
169
|
+
only when the conversation's own verified log removes its device (`conversation.share.dropped`, ids only). An explicit
|
|
170
|
+
device rekey goes ahead of queued events.
|
|
171
|
+
- **Reads no longer re-verify whole logs.** Verified event signatures are remembered (16,384 successes, never
|
|
172
|
+
failures), which removed the main CPU cost of reads and the timeouts it caused under load.
|
|
173
|
+
- **A line that becomes readable when its key arrives late streams as a new event.**
|
|
174
|
+
- **`messaging listen` fixes its stream position before it says it is ready**, so no event is missed at start.
|
|
175
|
+
- **`messaging daemon stop` waits for the home lock to be released**, and checks that an older daemon has exited.
|
|
176
|
+
- **Contact requests whose delivery is unconfirmed stay visible as pending.**
|
|
177
|
+
|
|
178
|
+
### Federation foundation (not live)
|
|
179
|
+
|
|
180
|
+
Groundwork for messaging between realms (docs/design/federation.md). **Nothing is wired into the daemon or the relay,
|
|
181
|
+
and nothing in 0.8.0 talks to another realm.**
|
|
182
|
+
|
|
183
|
+
- `@messaging/core` verifies another realm's identity proofs: its directory and full roster histories, including
|
|
184
|
+
complete epoch rotation chains.
|
|
185
|
+
- The daemon has a journal of foreign pins (trust on first use), proof results and human key reviews, with bounded
|
|
186
|
+
evidence that never drops an authenticated removal. Its durable storage is not built yet.
|
|
187
|
+
- The relay has a roster discovery handler (`/.well-known/messaging.json`) that is not installed in its HTTP server.
|
|
188
|
+
- An isolated two-realm e2e fixture.
|
|
189
|
+
|
|
190
|
+
### Stores
|
|
191
|
+
|
|
192
|
+
**Stores only grow** (spec §8.8). Every migration is additive; the generation stays 2 and `min_reader` stays 1, so a
|
|
193
|
+
0.7.x messagingd or relay still opens what 0.8.0 writes.
|
|
194
|
+
|
|
195
|
+
- **Daemon store, schema 4** (`packages/daemon/store-schemas/2.json`–`4.json`): schema 2 adds `conv_logs`,
|
|
196
|
+
`conv_entries`, `conv_shares`, `conv_cursors`, `conv_outbox`, `conv_keys`, `conv_alarms` and `conv_fts`; schema 3
|
|
197
|
+
`conv_held`; schema 4 `conv_evidence`. Message requests use rows in the existing `kv` table.
|
|
198
|
+
- **Relay database, schema 3** (`packages/relay/store-schemas/2.json`, `3.json`): schema 2 adds `conv_logs`,
|
|
199
|
+
`conv_entries`, `conv_members` and `conv_shares`; schema 3 `conv_request_decisions`.
|
|
200
|
+
- **The old chat and mail tables stay**, unused. No table is dropped.
|
|
201
|
+
- **Rollback keeps the data**, measured for both stores. A 0.7.1 relay database opens in 0.8.0, and 0.7.1 reopens
|
|
202
|
+
it. A 0.7.1 home opens in the 0.8.0 daemon (schema 4); 0.7.1's `messagingd` then starts on it, keeps the team and
|
|
203
|
+
its identity, logs no error and leaves the conversation tables alone, and 0.8.0 reads the same conversations
|
|
204
|
+
again afterwards. Conversations sent on 0.8.0 are not visible on 0.7.1. Spec §8.8 states both schemas.
|
|
205
|
+
|
|
206
|
+
### Documentation
|
|
207
|
+
|
|
208
|
+
- `packages/daemon/docs/messagingd.md` and `cli.md` describe conversations; docs/distribution.md has "Upgrading from
|
|
209
|
+
0.7.1 to the conversations release".
|
|
210
|
+
- The spec names the MCP server's ten tools; tests check the spec against the error codes, stream record kinds,
|
|
211
|
+
`request.waiting` states, tool names and staged methods.
|
|
212
|
+
- A test fails when any CLI help names a command that does not exist.
|
|
213
|
+
|
|
214
|
+
### Tests
|
|
215
|
+
|
|
216
|
+
- An opt-in mixed-version e2e against a real older release (`MESSAGING_E2E_OLD`, `MESSAGING_E2E_OLD_MACHINES`), in a
|
|
217
|
+
roster realm. The directory realm against a real 0.7.1 is covered by unit tests only.
|
|
218
|
+
- Red-when-removed tests for the agent's own-line edit and delete, the agent's dm creation rule, and the relay's
|
|
219
|
+
shares-only-to-readers filter.
|
|
220
|
+
|
|
221
|
+
## [0.7.1] - 2026-11-09
|
|
222
|
+
|
|
223
|
+
**No store change.** A 0.7.0 home and a 0.7.0 relay database open unchanged, and a 0.7.0 messagingd or relay still
|
|
224
|
+
opens what 0.7.1 writes. 0.7.0 was the last store reset: from 0.7.0 on, stores only grow (the owner's decision of
|
|
225
|
+
8 November, when the first people other than the owner began to use Messaging).
|
|
226
|
+
|
|
227
|
+
### Changed
|
|
228
|
+
|
|
229
|
+
- **A refused store has a code and an exit status of its own** (spec §8.8). messagingd and messaging-relay exit
|
|
230
|
+
**78** (`EX_CONFIG`; `STORE_REFUSED_EXIT` in `@messaging/core`) for a store they do not read, instead of 1. messagingd
|
|
231
|
+
prints one line, `messagingd: store_refused: …`; the relay's event is still `relay.store_refused`. A new error code,
|
|
232
|
+
`store_refused`, is what `messaging daemon start` reports, with its own next step, and what agent clients
|
|
233
|
+
report (`TOOL_REMEDIES`). Clients match the status or the code, never the wording. The relay's systemd unit does
|
|
234
|
+
not restart on 78.
|
|
235
|
+
- **A refusal says why** (spec §8.8): `pre-reset` (no store generation, or another: start over by moving the home
|
|
236
|
+
aside) or `newer` (a `min_reader` above the reader's schema: upgrade and keep the home). messagingd prints
|
|
237
|
+
`messagingd: store_refused: <reason>: …`; `StoreRefusedError.reason`, `reason` in `messaging --json` errors and in
|
|
238
|
+
agent tool errors carry it, each reason with its own next step. Moving the home aside is offered only for
|
|
239
|
+
`pre-reset`. The relay's event is `relay.store_refused {db, reason, message}`: **its `reason` field is now the
|
|
240
|
+
reason, and the text moved to `message`**.
|
|
241
|
+
- **A home moved aside is named `<home>.pre-reset-<UTC timestamp>`** (spec §8.8), with no version in the name, and
|
|
242
|
+
messagingd's start-over text says so.
|
|
243
|
+
|
|
244
|
+
### Fixed
|
|
245
|
+
|
|
246
|
+
- **A roster sync that succeeds on retry clears the error it reported.** messagingd kept the old `relay.lastError`
|
|
247
|
+
after a later sync succeeded.
|
|
248
|
+
- **The darwin executables are signed with a fixed 4 KiB page size,** so any Mac rebuilds a release byte for byte.
|
|
249
|
+
The default page size of `codesign` depends on the macOS version (docs/distribution.md).
|
|
250
|
+
- **publish.yml stages `./<tarball>`.** npm read a bare `dir/name.tgz` as a GitHub shorthand, so 0.7.0's packages
|
|
251
|
+
were staged by hand; `npm run test:pack` now refuses a stage line without `./`.
|
|
252
|
+
|
|
253
|
+
### Documentation
|
|
254
|
+
|
|
255
|
+
- The relay's operator docs give its limits and flags as built: pre-auth limits 1024 and 128, `--max-connections`,
|
|
256
|
+
`--max-buffered-bytes`, `--preauth-*`, `--metrics` and `--sth-witness`. A test fails when they drift.
|
|
257
|
+
- The README describes both identity modes: the Jelly directory and self-hosted roster teams.
|
|
258
|
+
|
|
259
|
+
### Tests
|
|
260
|
+
|
|
261
|
+
- The architecture tests enforce where SQLite, network listeners and raw sockets may be used, as AGENTS.md says.
|
|
262
|
+
- A lying relay that withholds the roster entries a signed head commits to is caught (`heads.ts`).
|
|
263
|
+
- The timing tests wait on events and bound cost in units measured on the same machine, not in wall-clock time, so
|
|
264
|
+
they pass on loaded and slow runners.
|
|
265
|
+
|
|
9
266
|
## [0.7.0] - 2026-11-08
|
|
10
267
|
|
|
11
268
|
### Store reset
|
|
@@ -22,8 +279,8 @@ Versions follow [Semantic Versioning](https://semver.org); see
|
|
|
22
279
|
create` / `team join`). Inbox, transcripts, grants, tasks and notices stay in the old home, which messagingd
|
|
23
280
|
0.6.0 still opens; a 0.6.0 snapshot does not restore. Reset the managed relay and every home that uses it on the
|
|
24
281
|
same day: the relay's directory restarts empty.
|
|
25
|
-
-
|
|
26
|
-
|
|
282
|
+
- **0.7.0 is the first release another person uses and the last store reset** (owner, 2026-11-08).
|
|
283
|
+
From this release on, stores only grow through additive migrations; the baseline and generation stay fixed.
|
|
27
284
|
- Stored inbox peers, task peers and provenance now use the API's `device` and `agent`, not the first shape's
|
|
28
285
|
`machine` and `session`.
|
|
29
286
|
|