zas-agent 0.8.0 → 0.10.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 +59 -1
- package/README.md +44 -7
- package/dist/cli.js +1620 -1003
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,62 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.10.0] - 2026-09-28
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Transfer telemetry. File and note sends, item downloads, and Directo sends
|
|
15
|
+
and receives (live and reliable delivery) report `transfer.started`,
|
|
16
|
+
`transfer.stage_started`, `transfer.slow` (after 30 s),
|
|
17
|
+
`transfer.phase_timing` and `transfer.finished`. Each report carries the
|
|
18
|
+
item category, the transport, byte counts, a size bucket, stage durations and
|
|
19
|
+
the outcome (success, failure or cancellation), joined by a random
|
|
20
|
+
per-attempt ID. No file name, content, path or channel name. The same
|
|
21
|
+
opt-out as `agent.tool_call` covers it. The telemetry notice names the new
|
|
22
|
+
fields.
|
|
23
|
+
|
|
24
|
+
- `plan_inactive`. A send, replace or Directo transfer in an organization
|
|
25
|
+
channel whose plan is inactive now says so, and names who can reactivate
|
|
26
|
+
it. It used to arrive as `upload_failed`, which told the agent to retry.
|
|
27
|
+
|
|
28
|
+
### Changed
|
|
29
|
+
|
|
30
|
+
- Reports never delay or fail a tool call. The `agent.tool_call` report is
|
|
31
|
+
sent after the answer, on a later tick. Transfer events are queued, at most
|
|
32
|
+
32 per batch, and sent in one request on a later tick. A report is one
|
|
33
|
+
request with a 2 s timeout and no retry. It is skipped when there is no
|
|
34
|
+
valid session, so it never starts or refreshes a sign-in.
|
|
35
|
+
|
|
36
|
+
## [0.9.0] - 2026-09-09
|
|
37
|
+
|
|
38
|
+
### Added
|
|
39
|
+
|
|
40
|
+
- `zas_edit_item`. An agent changes an item it sent, under the same id: the
|
|
41
|
+
title of a file or a note, or a note's text, language and secret cover.
|
|
42
|
+
The owner's activity log records the edit, and the channel's devices are
|
|
43
|
+
woken. An item somebody else sent is refused as `not_yours`.
|
|
44
|
+
- `zas_replace_file`. An agent swaps the bytes under a file it sent, keeping
|
|
45
|
+
the item id, its place in the channel and its pin. The old chunks are
|
|
46
|
+
released and the new ones charged in one server transaction; a chunk in
|
|
47
|
+
both versions is left alone. A note, an item with a public share, and an
|
|
48
|
+
item somebody else sent are refused. Agents only: no web or mobile client
|
|
49
|
+
gets a replace.
|
|
50
|
+
- Five codes: `not_yours`, `stale` (the item changed while the agent was
|
|
51
|
+
working on it: read it again and retry), `not_a_note`, `not_a_file`,
|
|
52
|
+
`item_shared`.
|
|
53
|
+
- Both tools drop the local send receipts for the item they changed, so
|
|
54
|
+
"send that again" after an edit makes a new item.
|
|
55
|
+
|
|
56
|
+
### Fixed
|
|
57
|
+
|
|
58
|
+
- A machine whose agent home could not be written crashed on the way into
|
|
59
|
+
serving, before the MCP initialize response, because recording that the
|
|
60
|
+
telemetry notice had been shown threw. The notice is printed and the
|
|
61
|
+
failure to record it is logged; the server starts either way. This is the
|
|
62
|
+
crash behind "connection closed: initialize response" from a Codex-style
|
|
63
|
+
host.
|
|
64
|
+
|
|
65
|
+
|
|
10
66
|
## [0.8.0] - 2026-09-06
|
|
11
67
|
|
|
12
68
|
### Added
|
|
@@ -303,7 +359,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
303
359
|
two separate identities that cannot read each other's keys.
|
|
304
360
|
- Install snippets for Claude Code and Codex, printed by `zas-agent pair`.
|
|
305
361
|
|
|
306
|
-
[Unreleased]: https://github.com/soke1556/zas-agent/compare/v0.
|
|
362
|
+
[Unreleased]: https://github.com/soke1556/zas-agent/compare/v0.10.0...HEAD
|
|
363
|
+
[0.10.0]: https://github.com/soke1556/zas-agent/compare/v0.9.0...v0.10.0
|
|
364
|
+
[0.9.0]: https://github.com/soke1556/zas-agent/compare/v0.8.0...v0.9.0
|
|
307
365
|
[0.8.0]: https://github.com/soke1556/zas-agent/compare/v0.7.0...v0.8.0
|
|
308
366
|
[0.7.0]: https://github.com/soke1556/zas-agent/compare/v0.6.3...v0.7.0
|
|
309
367
|
[0.6.3]: https://github.com/soke1556/zas-agent/compare/v0.6.2...v0.6.3
|
package/README.md
CHANGED
|
@@ -25,9 +25,10 @@ scope to the channels you choose, and that you can revoke.
|
|
|
25
25
|
|
|
26
26
|
## What it does
|
|
27
27
|
|
|
28
|
-
Your coding agent gets
|
|
28
|
+
Your coding agent gets thirteen tools. It can send a file or a note into a channel
|
|
29
29
|
you picked, send or receive a file live through Directo, list what is in that
|
|
30
|
-
channel,
|
|
30
|
+
channel, pull one item back onto disk, and change what it sent: an item's
|
|
31
|
+
title or text, or the bytes under a file, keeping the item id.
|
|
31
32
|
Everything it sends is encrypted on your machine before it leaves, lands in your
|
|
32
33
|
account, and is marked in the channel as sent by that agent. The agent has an
|
|
33
34
|
identity of its own and never holds your account key: pairing mints a key pair
|
|
@@ -158,14 +159,24 @@ The package refuses some of these on its own, before a request is made. The
|
|
|
158
159
|
ones marked *(server-side)* are enforced by the Zas server.
|
|
159
160
|
|
|
160
161
|
- **No channel you did not grant.** Not by name, not by id.
|
|
161
|
-
- **No shared channel you
|
|
162
|
-
|
|
162
|
+
- **No shared channel you joined, unless its owner allows it.** You can grant
|
|
163
|
+
a channel you joined, but the grant stays `grant_pending` until that
|
|
164
|
+
channel's owner allows this agent in Zas. The plan also caps how many of
|
|
165
|
+
these channels one agent holds: 2 on Free *(server-side)*.
|
|
166
|
+
- **No workspace channel, unless the organization allows agents.** A channel
|
|
167
|
+
an organization manages, or one you created inside its workspace, can be
|
|
168
|
+
granted only while the organization is active and an admin turned agents on
|
|
163
169
|
*(server-side)*.
|
|
164
170
|
- **No reading unless the grant says so.** `read` is a separate switch from
|
|
165
171
|
`send`; without it, `zas_list_items` and `zas_get_item` are refused.
|
|
166
172
|
- **No stored sending into a view-only channel, and none into a channel in
|
|
167
173
|
Directo mode.** Both are refused before a byte is uploaded. A channel in
|
|
168
174
|
Directo mode takes `zas_send_direct`, a live transfer that stores nothing.
|
|
175
|
+
- **No changing what it did not send.** `zas_edit_item` and `zas_replace_file`
|
|
176
|
+
act only on items carrying this agent's mark; anything else is `not_yours`,
|
|
177
|
+
and the server refuses it too *(server-side)*. A replace is for agents only:
|
|
178
|
+
no web or mobile client gets one. An item with a public share is not
|
|
179
|
+
replaced until the share is removed.
|
|
169
180
|
- **No receiving unless the grant says read.** Receiving through Directo
|
|
170
181
|
writes a file onto this machine, so `zas_receive_direct` takes the same
|
|
171
182
|
`read` switch as listing. And it only ever runs inside a tool call: the
|
|
@@ -194,6 +205,7 @@ string ever reaches a terminal.
|
|
|
194
205
|
| `agent_revoked` | The owner revoked this agent. |
|
|
195
206
|
| `agent_forbidden` | Only the account owner can do that. |
|
|
196
207
|
| `grant_missing` | This agent has no access to that channel. |
|
|
208
|
+
| `grant_pending` | That channel belongs to somebody else, and its owner has not allowed this agent yet. |
|
|
197
209
|
| `send_forbidden` | This agent cannot send to that channel. |
|
|
198
210
|
| `read_forbidden` | This agent cannot read that channel. |
|
|
199
211
|
| `direct_mode` | That channel is in Directo mode. |
|
|
@@ -209,14 +221,26 @@ string ever reaches a terminal.
|
|
|
209
221
|
| `fallback_unavailable` | Reliable delivery is not available right now. |
|
|
210
222
|
| `key_stale` | The channel key changed; the owner refreshes it by opening Zas. |
|
|
211
223
|
| `quota_exceeded` | The account reached its storage limit. |
|
|
224
|
+
| `plan_inactive` | The organization's plan is inactive, so sending to its channels is paused; the owner or a billing admin reactivates it. |
|
|
212
225
|
| `rate_limited` | Too many sends in a row. |
|
|
213
226
|
| `file_too_big` | The file is over the plan limit. |
|
|
214
227
|
| `duplicate` | That item is already in the channel. |
|
|
215
228
|
| `not_found` | That item is not in the channel. |
|
|
229
|
+
| `not_yours` | That item was not sent by this agent; it can only change its own items. |
|
|
230
|
+
| `stale` | That item changed while this agent was working on it; read it again and retry. |
|
|
231
|
+
| `not_a_note` | That item is a file, not a note; only its title can change. |
|
|
232
|
+
| `not_a_file` | That item is a note, not a file. |
|
|
233
|
+
| `item_shared` | That item has a public share; the owner removes the share first. |
|
|
216
234
|
| `invalid_cap` | That file is no longer available. |
|
|
217
235
|
| `write_failed` | The download destination could not be written. |
|
|
218
236
|
| `pairing_expired` | The pairing expired; pair again. |
|
|
219
237
|
| `pairing_cancelled` | The owner cancelled the pairing. |
|
|
238
|
+
| `claim_mismatch` | The code does not match. |
|
|
239
|
+
| `pairing_not_approved` | Nobody has approved this pairing yet. |
|
|
240
|
+
| `pairing_claimed` | This pairing was already claimed; pair again. |
|
|
241
|
+
| `agent_limit` | The account cannot take another agent; the owner deletes one from Settings → Agents. |
|
|
242
|
+
| `grant_limit` | The plan allows fewer channels per agent than this pairing grants. |
|
|
243
|
+
| `foreign_limit` | The plan allows this agent fewer channels of other people than this pairing asks for. |
|
|
220
244
|
| `feature_disabled` | Agents are not enabled for this account yet. |
|
|
221
245
|
| `upload_failed` | The upload failed. |
|
|
222
246
|
| `oprf_failed` | Zas did not answer correctly while preparing the file. |
|
|
@@ -243,11 +267,22 @@ stack trace.
|
|
|
243
267
|
| `zas_receive_direct_fallback` | After a Directo receive failed in flight, downloads the encrypted copy the sender chose to store, and decrypts it to the same destination. |
|
|
244
268
|
| `zas_list_items` | Lists the most recent items in one of the owner's channels. Needs a grant that includes reading. |
|
|
245
269
|
| `zas_get_item` | Fetches one item. A note comes back as text; a file is written to disk. It never overwrites, so the path it answers with can differ from the one you asked for. |
|
|
270
|
+
| `zas_edit_item` | Changes an item this agent sent, keeping its id: the title of a file or a note, or a note's text, language and secret cover. Needs a grant that includes reading and sending. The owner's activity log records it. |
|
|
271
|
+
| `zas_replace_file` | Replaces the bytes of a file this agent sent with a file from this machine, keeping the item id, its place in the channel and its pin. Returns the item id, or a job id after a minute. Refuses notes, shared items, and items sent by anyone else. |
|
|
246
272
|
| `zas_jobs` | Lists the sends and Directo transfers this server started, newest first, with the phase each one reached — and where a `job_id` from a long send is redeemed. |
|
|
247
273
|
|
|
248
274
|
`channel` takes a channel name or a channel id. A name has to match exactly one
|
|
249
275
|
of the channels you granted; with exactly one grant, `zas_send_file`,
|
|
250
|
-
`zas_send_note`, `zas_send_direct
|
|
276
|
+
`zas_send_note`, `zas_send_direct`, `zas_receive_direct`, `zas_edit_item` and
|
|
277
|
+
`zas_replace_file` can leave it out.
|
|
278
|
+
|
|
279
|
+
A replace runs the same pipeline as a send — hash, key derivation, encryption,
|
|
280
|
+
then upload or proof per chunk — and posts the new set with the old one to
|
|
281
|
+
release. The server moves both sets, the account's storage tally and the item
|
|
282
|
+
in one transaction, so a failure leaves everything as it was; a chunk present
|
|
283
|
+
in both versions is neither uploaded nor released. Both tools read the item
|
|
284
|
+
first and write only over the version they read: an item that changed in
|
|
285
|
+
between answers `stale`, and nothing is lost.
|
|
251
286
|
|
|
252
287
|
Directo needs a native module, [node-datachannel](https://github.com/murat-dogan/node-datachannel),
|
|
253
288
|
WebRTC for Node. npm installs a prebuilt binary for Windows, macOS and Linux;
|
|
@@ -284,14 +319,16 @@ covers every profile on the machine; pairing again does not reset it.
|
|
|
284
319
|
|
|
285
320
|
What one report carries, and nothing else: the tool that ran, whether it
|
|
286
321
|
worked, the closed error code when it did not, which of four duration buckets
|
|
287
|
-
it fell in, and the package version.
|
|
322
|
+
it fell in, and the package version. Item transfers also report item category,
|
|
323
|
+
transport, byte counts, stage durations, and success/failure/cancellation, joined
|
|
324
|
+
by a random per-attempt ID. No file name, no file contents, no path,
|
|
288
325
|
no channel name, no error message, no stack.
|
|
289
326
|
|
|
290
327
|
Where it goes: to Zas, never to an analytics service directly. This package
|
|
291
328
|
holds no analytics token and opens no connection to a third party, so no
|
|
292
329
|
address of yours reaches one. The report is attributed to the Zas account the
|
|
293
330
|
agent is paired with, which the server reads from the session — the request
|
|
294
|
-
carries no
|
|
331
|
+
carries no account or content identifier. Nothing is reported before pairing, because
|
|
295
332
|
until then there is no account it could belong to.
|
|
296
333
|
|
|
297
334
|
A report is never allowed to matter: it is sent after the answer, waited on
|