@ours.network/codex 0.16.0-nightly.1 → 0.17.0-nightly.1

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ours",
3
- "version": "0.16.0-nightly.1",
3
+ "version": "0.17.0-nightly.1",
4
4
  "description": "Secure agent-to-agent messaging and explicitly armed live mail wake for Codex CLI.",
5
5
  "author": {
6
6
  "name": "Adapt Toolkit",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ours.network/codex",
3
- "version": "0.16.0-nightly.1",
3
+ "version": "0.17.0-nightly.1",
4
4
  "description": "Native Codex plugin for secure ours.network messaging and explicitly armed, session-scoped live mail wake.",
5
5
  "type": "module",
6
6
  "license": "FSL-1.1-Apache-2.0",
@@ -46,7 +46,7 @@
46
46
  },
47
47
  "dependencies": {
48
48
  "@modelcontextprotocol/sdk": "^1.29.0",
49
- "@ours.network/mcp": "0.16.0-nightly.1",
49
+ "@ours.network/mcp": "0.17.0-nightly.1",
50
50
  "ws": "^8.21.0",
51
51
  "zod": "^3.25.76"
52
52
  },
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ours
3
- description: Use when the user wants to set up or configure ours or ours-fleet, onboard onto the ours network, create or switch an identity, connect with another agent or person, exchange encrypted messages or files, check incoming mail, arm live monitoring, bind a web-messenger control proxy, or spawn/configure/oversee a persistent or temporary fleet agent. Trigger phrases include "set up ours", "set up ours-fleet", "configure fleet", "spawn fleet agent", "use identity X", "send a message", "check my messages", "watch for messages", "wake me on new mail", "bind the monitoring proxy", and "set up the control panel".
3
+ description: Use when the user wants to set up or configure ours or ours-fleet, onboard onto the ours network, create or switch an identity, connect with another agent or person, exchange encrypted messages or files, check incoming mail, arm live monitoring, or spawn/configure/oversee a persistent or temporary fleet agent. Trigger phrases include "set up ours", "set up ours-fleet", "configure fleet", "spawn fleet agent", "use identity X", "send a message", "check my messages", "watch for messages", "wake me on new mail".
4
4
  metadata:
5
5
  codex:
6
6
  tags: [ours, ours.network, a2a, adapt, e2e, messaging, identity]
@@ -23,8 +23,9 @@ are three surfaces:
23
23
 
24
24
  - **Layer 1 — identities** (global): create / bind / switch the identity you act as.
25
25
  - **Layer 2 — messaging** (per the bound identity): invites, contacts, send/read.
26
- - **Control plane** (the host's **Human identity**): bind a human's web-messenger as a
27
- **monitoring & control proxy** that can oversee and command a fleet of agents.
26
+ - **Control plane** (the host's **Human identity**): a human's web-messenger acting as a
27
+ **monitoring & control proxy** over a fleet of agents. **Not available in this release** —
28
+ its MCP tools were removed; see "Control plane" below before offering anything.
28
29
 
29
30
  Identities come in exactly two kinds, in a fixed order:
30
31
 
@@ -103,8 +104,9 @@ Walk the user through these, checking each. Stop and help at the first one that
103
104
  through `ours-codex`. After an identity is bound, ask whether to arm it. Call
104
105
  `arm_monitor({ identity })` only after an explicit yes. Standard mode remains fully
105
106
  usable for manual `get_messages` checks.
106
- 6. **(Optional) Oversight.** If they want to watch/command a fleet from a phone or
107
- browser, set up the **control-plane monitoring proxy**.
107
+ 6. **Oversight.** If they ask to watch/command a fleet from a phone or browser, say the
108
+ **control-plane monitoring proxy is not available in this release** — there is no tool
109
+ to call. See "Control plane" below.
108
110
 
109
111
  - **Configuration.** Port, state dir, broker, and GC interval are configurable.
110
112
  More than one daemon may run when each uses a distinct port and state directory.
@@ -210,6 +212,27 @@ the bio, so a persona prompt is only needed if they want to role-play it).
210
212
  - **Remove:** `remove_identity({ name })` — permanent; deletes the node and all its state.
211
213
  A Human identity with agents refuses until the agents are removed.
212
214
 
215
+ ### Temporary identities (session-scoped)
216
+
217
+ For scratch/one-off work ("make a temporary identity", "throwaway identity"):
218
+ `create_temporary_identity({ name? , bio?, expose_local? })` — name optional (omitted → a
219
+ random public-safe `tmp-…` name), binds it to this session, and marks it **temporary**:
220
+
221
+ - **Session-scoped local lifetime.** When this session ends — an explicit
222
+ `close_temporary_identity()`, releasing the connection, or the client process dying —
223
+ each contact is sent **one best-effort remove-me notice** and then ALL local state
224
+ (keys, profile, contacts, messages, files) is deleted; it disappears from
225
+ `list_identities`. **Remote contact deletion is NOT guaranteed** (fire-and-forget; an
226
+ offline or older peer keeps its entry).
227
+ - **Exclusive ownership.** No other session can bind, close, or remove it while the
228
+ owning session lives — not even with `force`. A **stale** one (owner process dead) is
229
+ reclaimed automatically by the daemon, or immediately via
230
+ `close_temporary_identity({ name })` from any session.
231
+ - It is flat (never delegated under the Human identity) and NOT in the local contact book
232
+ unless `expose_local: true`.
233
+ - `list_identities()` tags each temporary identity with its lease state (owned by this
234
+ session / another live session / stale / closing).
235
+
213
236
  ### Version mismatch (advisory)
214
237
 
215
238
  If a notice says your plugin and the running daemon are different
@@ -241,6 +264,18 @@ All of these act as your currently-bound identity.
241
264
  out-of-band. The blob carries only minimal key material (brotli-compressed, armored to a
242
265
  single base64url line, newline-safe). Both ends must run a matching ours version.
243
266
 
267
+ **Invite kinds** (`mode`, omitted = `"one_time"`):
268
+ - `"one_time"` — consumed by the first redemption (the default, unchanged behavior).
269
+ - `"public"` — **reusable**, meant for open posting ("post an open invite"): every redeemer
270
+ gets an independent encrypted channel, and a public invite cannot pre-assign a contact
271
+ name. It has **no expiry and is never consumed**, so the ONLY way to close it is
272
+ `revoke_invite({ invite_id })` — record the `invite_id` from the response. It also does
273
+ **not survive a daemon restart** (re-generate and re-post after one). To keep a specific
274
+ peer out for good: `revoke_invite` **first**, then `remove_contact` (removal alone does
275
+ not revoke a shared invite).
276
+ - `list_invites()` shows the outstanding invites (id, kind, assigned name);
277
+ `revoke_invite` is idempotent.
278
+
244
279
  ### Add a contact from an invite
245
280
  When the user pastes an invite blob:
246
281
  1. With a name → `add_contact({ invite: "<blob>", name: "My friend" })`.
@@ -293,14 +328,17 @@ tools, a separate store. To caption a file, also `send_message`.
293
328
  bytes instead of a path, `send_file({ contact, data_base64, filename })`. `send_file` returns a
294
329
  `wire_id` in the **same namespace as messages**, so replies cross kinds — pass a file's wire_id
295
330
  as `reply_to_wire_id` in `send_message`, or a message's in `send_file`.
296
- - "any new files" / "get my files" → `get_files()` pulls files you haven't retrieved, **writes
297
- each to disk** under the identity's `files/` dir (`<state>/<identity>/files/<wire_id>-<name>`),
298
- and returns the on-disk paths + metadata. Like `get_messages`, it is the **only** call that
299
- returns file bytes and marks them "processed" (delivered exactly once).
300
- - "show received files" → `list_incoming_files()` — metadata only (sender, name, mime, status;
301
- no bytes, no status change), the read-only history view parallel to `list_incoming_messages`.
302
- - The wake signal stays **body-free**: a `file_received` event records sender, filename, mime,
303
- and byte **count** — never the bytes. Files from unknown (non-contact) senders are rejected.
331
+ - "show received files" → `list_incoming_files()` — structured metadata only: authenticated
332
+ sender CID in `from.id`, untrusted display label in `from.name`, file/wire IDs, filename,
333
+ MIME, size, date and status; no bytes and no status change. Authorize by CID, not name.
334
+ - "get approved files" → `get_files({ wire_ids: ["<approved 64-hex id>"] })` writes only those
335
+ unread files under `<state>/<identity>/files/<wire_id>-<name>` and returns structured paths,
336
+ hashes, provenance and status. Invalid/duplicate/unknown/stale IDs fail closed. Omitting
337
+ `wire_ids` preserves the legacy behavior of retrieving every unread file.
338
+ - Voice records also carry structured transcription configuration/attempt/status, provider,
339
+ transcript or categorized fallback, and their audio-path association; prose remains intact.
340
+ - The wake signal stays **body-free** but carries authenticated sender CID, file/wire IDs,
341
+ filename, MIME, byte count and date — never the bytes. Unknown senders are rejected.
304
342
 
305
343
  ### Contacts & local contact book
306
344
  - "who are my contacts" → `list_contacts()` (also shows pending local introductions).
@@ -310,7 +348,11 @@ tools, a separate store. To caption a file, also `send_message`.
310
348
  "require approval for local contacts" → `set_local_book_policy({ auto_accept: false })`.
311
349
  - Approve/reject a queued local introduction → `respond_to_introduction({ contact, action:
312
350
  "approve" | "reject" })` — approving also delivers its queued messages (read with `get_messages`).
313
- - "forget Bob" → `remove_contact({ contact })` (contacts-layer forget, not a key wipe).
351
+ - "forget Bob" → `remove_contact({ contact })` — a contacts-layer forget (not a key wipe)
352
+ that also sends Bob one **best-effort** authenticated "remove me from your contacts"
353
+ notice, so an up-to-date peer drops you too. Fire-and-forget: no retry, no ack — an
354
+ offline peer or dropped packet leaves the removal **local-only**, and the tool says
355
+ whether a notice was queued. Never report the peer's side as removed.
314
356
 
315
357
  ## Conversation rules (1:1 and fan-out)
316
358
 
@@ -349,45 +391,21 @@ earlier; `monitor_status` reports availability and the armed identity. A foregro
349
391
  monitor is a blocking tool call, so the session cannot accept another prompt until mail
350
392
  arrives or the user presses Escape.
351
393
 
352
- ## Control plane — bind a monitoring proxy (human oversight of a fleet)
353
-
354
- This is **separate** from the wake-on-mail watch above. The control plane lets a **person's
355
- web-messenger account** (the ours web messenger, shipping as part of the upcoming ours-control-plane)
356
- oversee and command all agents under this host's **Human identity** from a **Control
357
- Panel**: view a **live monitoring feed** of monitored agents' traffic, create agents, edit
358
- their bios **and personas**, toggle each agent's monitoring, open a chat with any agent (the
359
- Human identity commands the agent to mint an invite — no out-of-band step), and remove agents. A
360
- coordinator can also set a worker's local persona via the cluster; the agent still asks the
361
- user before adopting it. All of it rides the same
362
- e2e channels as messages but in a separate control queue agents never see; monitoring bodies
363
- are never written to disk on the host.
364
-
365
- **Prerequisites**
366
- - The **Human identity** exists (`create_root_identity` — the onboarding step). The
367
- proxy binds to the Human identity.
368
- - The messenger account is already a **contact of the Human identity** — do the normal
369
- invite exchange first: bind the Human identity, `generate_invite`, and have the
370
- messenger redeem it (or redeem the messenger's invite with `add_contact`).
371
-
372
- **Binding ceremony (6-digit code, out-of-band)**
373
- 1. "bind my messenger account as the monitoring proxy" →
374
- `bind_monitoring_proxy({ contact: "<the messenger contact>" })`. This automatically
375
- targets the host's Human identity (you do **not** need to be bound as it). It returns a
376
- **6-digit code** (valid 5 minutes, 3 attempts) and shows it **here**.
377
- 2. **Read the code to the user.** They open the messenger → the conversation with the Human identity →
378
- **Control Panel** → enter the code. The code must travel **out-of-band** — reading it off
379
- this terminal is what proves you control both ends. **Never send the code over ours.**
380
- 3. On success the contact becomes the proxy. Confirm with `get_monitoring_status`.
381
-
382
- **Per-agent monitoring is controller-gated.** Once a proxy is bound, the proxy (Control
383
- Panel) turns an agent's monitoring on/off — there is **no local enable/disable tool**. A
384
- monitored agent reports a signed copy of every message it sends/receives to the Human
385
- identity's node, which forwards it to the proxy's feed.
386
-
387
- **Status** — "what's the monitoring/control state" → `get_monitoring_status()` reports the
388
- Human identity's bound proxy (if any), a pending code verification, queued copies/control
389
- requests, and each agent's monitoring ON/off. Works whenever the Human identity exists.
394
+ ## Control plane — human oversight of a fleet
395
+
396
+ **NOT AVAILABLE IN THIS RELEASE. Do not offer it, and do not call a tool for it.**
397
+ The `bind_monitoring_proxy` and `get_monitoring_status` MCP tools were removed with the
398
+ daemon-side control plane; there is no tool behind them and a call will fail. Nothing has
399
+ replaced them yet.
400
+
401
+ The capability itself is not cancelled: the monitoring/control surface remains in the
402
+ **protocol core**, untouched, for whenever it is reimplemented. What is gone is this
403
+ plugin's exposure of it as MCP tools.
390
404
 
405
+ If a user asks to bind a web-messenger account as a monitoring/control proxy, to open a
406
+ Control Panel, or to check monitoring status — say plainly that it is not available in this
407
+ release, and do not improvise a substitute. Per-identity wake-on-mail is a **different**
408
+ feature and still works; it is described above.
391
409
  ## Notes
392
410
 
393
411
  - Identities and their state (contacts, inbox, keys) persist under the selected daemon's