@ours.network/codex 0.15.4 → 0.16.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/.codex-plugin/plugin.json +1 -1
- package/package.json +2 -2
- package/skills/ours/SKILL.md +38 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ours.network/codex",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
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.
|
|
49
|
+
"@ours.network/mcp": "0.16.0",
|
|
50
50
|
"ws": "^8.21.0",
|
|
51
51
|
"zod": "^3.25.76"
|
|
52
52
|
},
|
package/skills/ours/SKILL.md
CHANGED
|
@@ -210,6 +210,27 @@ the bio, so a persona prompt is only needed if they want to role-play it).
|
|
|
210
210
|
- **Remove:** `remove_identity({ name })` — permanent; deletes the node and all its state.
|
|
211
211
|
A Human identity with agents refuses until the agents are removed.
|
|
212
212
|
|
|
213
|
+
### Temporary identities (session-scoped)
|
|
214
|
+
|
|
215
|
+
For scratch/one-off work ("make a temporary identity", "throwaway identity"):
|
|
216
|
+
`create_temporary_identity({ name? , bio?, expose_local? })` — name optional (omitted → a
|
|
217
|
+
random public-safe `tmp-…` name), binds it to this session, and marks it **temporary**:
|
|
218
|
+
|
|
219
|
+
- **Session-scoped local lifetime.** When this session ends — an explicit
|
|
220
|
+
`close_temporary_identity()`, releasing the connection, or the client process dying —
|
|
221
|
+
each contact is sent **one best-effort remove-me notice** and then ALL local state
|
|
222
|
+
(keys, profile, contacts, messages, files) is deleted; it disappears from
|
|
223
|
+
`list_identities`. **Remote contact deletion is NOT guaranteed** (fire-and-forget; an
|
|
224
|
+
offline or older peer keeps its entry).
|
|
225
|
+
- **Exclusive ownership.** No other session can bind, close, or remove it while the
|
|
226
|
+
owning session lives — not even with `force`. A **stale** one (owner process dead) is
|
|
227
|
+
reclaimed automatically by the daemon, or immediately via
|
|
228
|
+
`close_temporary_identity({ name })` from any session.
|
|
229
|
+
- It is flat (never delegated under the Human identity) and NOT in the local contact book
|
|
230
|
+
unless `expose_local: true`.
|
|
231
|
+
- `list_identities()` tags each temporary identity with its lease state (owned by this
|
|
232
|
+
session / another live session / stale / closing).
|
|
233
|
+
|
|
213
234
|
### Version mismatch (advisory)
|
|
214
235
|
|
|
215
236
|
If a notice says your plugin and the running daemon are different
|
|
@@ -241,6 +262,18 @@ All of these act as your currently-bound identity.
|
|
|
241
262
|
out-of-band. The blob carries only minimal key material (brotli-compressed, armored to a
|
|
242
263
|
single base64url line, newline-safe). Both ends must run a matching ours version.
|
|
243
264
|
|
|
265
|
+
**Invite kinds** (`mode`, omitted = `"one_time"`):
|
|
266
|
+
- `"one_time"` — consumed by the first redemption (the default, unchanged behavior).
|
|
267
|
+
- `"public"` — **reusable**, meant for open posting ("post an open invite"): every redeemer
|
|
268
|
+
gets an independent encrypted channel, and a public invite cannot pre-assign a contact
|
|
269
|
+
name. It has **no expiry and is never consumed**, so the ONLY way to close it is
|
|
270
|
+
`revoke_invite({ invite_id })` — record the `invite_id` from the response. It also does
|
|
271
|
+
**not survive a daemon restart** (re-generate and re-post after one). To keep a specific
|
|
272
|
+
peer out for good: `revoke_invite` **first**, then `remove_contact` (removal alone does
|
|
273
|
+
not revoke a shared invite).
|
|
274
|
+
- `list_invites()` shows the outstanding invites (id, kind, assigned name);
|
|
275
|
+
`revoke_invite` is idempotent.
|
|
276
|
+
|
|
244
277
|
### Add a contact from an invite
|
|
245
278
|
When the user pastes an invite blob:
|
|
246
279
|
1. With a name → `add_contact({ invite: "<blob>", name: "My friend" })`.
|
|
@@ -313,7 +346,11 @@ tools, a separate store. To caption a file, also `send_message`.
|
|
|
313
346
|
"require approval for local contacts" → `set_local_book_policy({ auto_accept: false })`.
|
|
314
347
|
- Approve/reject a queued local introduction → `respond_to_introduction({ contact, action:
|
|
315
348
|
"approve" | "reject" })` — approving also delivers its queued messages (read with `get_messages`).
|
|
316
|
-
- "forget Bob" → `remove_contact({ contact })`
|
|
349
|
+
- "forget Bob" → `remove_contact({ contact })` — a contacts-layer forget (not a key wipe)
|
|
350
|
+
that also sends Bob one **best-effort** authenticated "remove me from your contacts"
|
|
351
|
+
notice, so an up-to-date peer drops you too. Fire-and-forget: no retry, no ack — an
|
|
352
|
+
offline peer or dropped packet leaves the removal **local-only**, and the tool says
|
|
353
|
+
whether a notice was queued. Never report the peer's side as removed.
|
|
317
354
|
|
|
318
355
|
## Conversation rules (1:1 and fan-out)
|
|
319
356
|
|