@wacando/agent 2.0.0-rc.1 → 2.0.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.
Files changed (67) hide show
  1. package/THIRD-PARTY-NOTICES.txt +3 -3
  2. package/docs/AGENT_TOOLS.md +18 -0
  3. package/docs/RELEASE.md +33 -6
  4. package/package.json +5 -5
  5. package/packages/onboarding/version.mjs +1 -1
  6. package/packages/runtime/conversations.mjs +53 -4
  7. package/packages/runtime/recovery.mjs +49 -0
  8. package/plugins/wacando/.codex-plugin/plugin.json +1 -1
  9. package/plugins/wacando-claude/.claude-plugin/plugin.json +1 -1
  10. package/plugins/wacando-cursor/.cursor-plugin/plugin.json +1 -1
  11. package/provenance.json +6 -6
  12. package/docs/evidence/issue-2/DOCUMENTARY_FOLLOWUP.md +0 -107
  13. package/docs/evidence/issue-2/QUALIFICATION_LINK_FOLLOWUP.md +0 -105
  14. package/docs/evidence/issue-2/REVIEW_FOLLOWUP.md +0 -93
  15. package/docs/evidence/issue-2/baseline.txt +0 -76
  16. package/docs/evidence/issue-2/check-mcp.txt +0 -14
  17. package/docs/evidence/issue-2/check.txt +0 -376
  18. package/docs/evidence/issue-2/codex-exec-help.json +0 -11
  19. package/docs/evidence/issue-2/codex-help.json +0 -10
  20. package/docs/evidence/issue-2/cursor-help.json +0 -10
  21. package/docs/evidence/issue-2/documentary-check.txt +0 -376
  22. package/docs/evidence/issue-2/documentary-validation.txt +0 -7
  23. package/docs/evidence/issue-2/local-build-api.txt +0 -203
  24. package/docs/evidence/issue-2/local-build-first.txt +0 -87
  25. package/docs/evidence/issue-2/local-build-policy-first.txt +0 -34
  26. package/docs/evidence/issue-2/local-build-policy.txt +0 -153
  27. package/docs/evidence/issue-2/local-build-web.txt +0 -219
  28. package/docs/evidence/issue-2/local-check-mcp.txt +0 -14
  29. package/docs/evidence/issue-2/local-check.txt +0 -376
  30. package/docs/evidence/issue-2/local-codex-probe.txt +0 -3
  31. package/docs/evidence/issue-2/local-codex-probe2.txt +0 -3
  32. package/docs/evidence/issue-2/local-codex.txt +0 -2
  33. package/docs/evidence/issue-2/local-cursor-probe.txt +0 -1
  34. package/docs/evidence/issue-2/local-cursor.txt +0 -2
  35. package/docs/evidence/issue-2/local-down.txt +0 -32
  36. package/docs/evidence/issue-2/local-health.txt +0 -1
  37. package/docs/evidence/issue-2/local-live.txt +0 -28
  38. package/docs/evidence/issue-2/local-seed.txt +0 -26
  39. package/docs/evidence/issue-2/local-status.txt +0 -6
  40. package/docs/evidence/issue-2/local-up.txt +0 -18
  41. package/docs/evidence/issue-2/prepare-local-stack.py +0 -67
  42. package/docs/evidence/issue-2/qualification-body-validation.txt +0 -9
  43. package/docs/evidence/issue-2/qualification-link-check.txt +0 -376
  44. package/docs/evidence/issue-2/qualification-link-validation.txt +0 -20
  45. package/docs/evidence/issue-2/review-check.txt +0 -376
  46. package/docs/evidence/issue-2/review-validation.txt +0 -218
  47. package/docs/evidence/issue-7/README.md +0 -21
  48. package/docs/evidence/issue-7/check-mcp.txt +0 -9
  49. package/docs/evidence/issue-7/check.txt +0 -381
  50. package/docs/evidence/issue-7/live.txt +0 -23
  51. package/docs/evidence/issue-8/README.md +0 -56
  52. package/docs/evidence/issue-8/check-mcp.txt +0 -9
  53. package/docs/evidence/issue-8/check.txt +0 -465
  54. package/docs/evidence/issue-8/e2e-desktop-observer-human-devices.txt +0 -30
  55. package/docs/evidence/issue-8/e2e-desktop-observer-main-without-109.txt +0 -17
  56. package/docs/evidence/issue-8/e2e-desktop-observer.txt +0 -26
  57. package/docs/evidence/issue-8/live-regression-human-devices.txt +0 -24
  58. package/docs/evidence/issue-8/live-regression.txt +0 -23
  59. package/docs/evidence/issue-8/review-fixes/README.md +0 -30
  60. package/docs/evidence/issue-8/review-fixes/check-mcp.txt +0 -9
  61. package/docs/evidence/issue-8/review-fixes/check.txt +0 -484
  62. package/docs/evidence/issue-8/review-fixes/e2e-desktop-observer.txt +0 -28
  63. package/docs/evidence/issue-8/review-fixes/onboarding-live.txt +0 -15
  64. package/docs/evidence/issue-8/review-fixes/session-replacement-live.txt +0 -13
  65. package/docs/evidence/npm-release/check-mcp.txt +0 -9
  66. package/docs/evidence/npm-release/check.txt +0 -484
  67. package/docs/evidence/npm-release/e2e-desktop-observer.txt +0 -28
@@ -1,381 +0,0 @@
1
- $ node --version && npm --version
2
- v22.22.0
3
- 11.11.1
4
- $ npm ci
5
-
6
- added 83 packages in 2s
7
- $ npm run check
8
-
9
- > wacando-agent@2.0.0 check
10
- > node scripts/check-deps.mjs && npm run check:notices && npm test
11
-
12
- Verified 3 pinned Wacando archives from https://github.com/lbframe/wacando @ 5f0f0a1f0ccc20c47383fed6f8e072aca5302486
13
-
14
- > wacando-agent@2.0.0 check:notices
15
- > node scripts/notices.mjs --check
16
-
17
- Verified notices and provenance for 83 runtime packages
18
-
19
- > wacando-agent@2.0.0 test
20
- > node --test tests/*.test.mjs
21
-
22
- TAP version 13
23
- # Subtest: cursor checker requires an affirmative parsed payload even when the wrapper says success
24
- ok 1 - cursor checker requires an affirmative parsed payload even when the wrapper says success
25
- ---
26
- duration_ms: 2.65577
27
- type: 'test'
28
- ...
29
- # Subtest: cursor checker distinguishes clear revocation from a crash, lock error or false connection
30
- ok 2 - cursor checker distinguishes clear revocation from a crash, lock error or false connection
31
- ---
32
- duration_ms: 1.34947
33
- type: 'test'
34
- ...
35
- # Subtest: codex checker requires an affirmative parsed payload even when the wrapper says success
36
- ok 3 - codex checker requires an affirmative parsed payload even when the wrapper says success
37
- ---
38
- duration_ms: 0.494954
39
- type: 'test'
40
- ...
41
- # Subtest: codex checker distinguishes clear revocation from a crash, lock error or false connection
42
- ok 4 - codex checker distinguishes clear revocation from a crash, lock error or false connection
43
- ---
44
- duration_ms: 0.416783
45
- type: 'test'
46
- ...
47
- # Subtest: checker requires verified:true for installation readiness
48
- ok 5 - checker requires verified:true for installation readiness
49
- ---
50
- duration_ms: 0.401913
51
- type: 'test'
52
- ...
53
- # Subtest: malformed viewer request targets return 400 without losing MCP events
54
- ok 6 - malformed viewer request targets return 400 without losing MCP events
55
- ---
56
- duration_ms: 87.176164
57
- type: 'test'
58
- ...
59
- # Subtest: MCP shutdown on EOF closes SSE and unfinished HTTP headers
60
- ok 7 - MCP shutdown on EOF closes SSE and unfinished HTTP headers
61
- ---
62
- duration_ms: 2048.494643
63
- type: 'test'
64
- ...
65
- # Subtest: MCP shutdown on SIGTERM closes SSE and unfinished HTTP headers
66
- ok 8 - MCP shutdown on SIGTERM closes SSE and unfinished HTTP headers
67
- ---
68
- duration_ms: 348.349795
69
- type: 'test'
70
- ...
71
- # Subtest: HTTP and SSE snapshots use bounded pages and preserve large Unicode events
72
- ok 9 - HTTP and SSE snapshots use bounded pages and preserve large Unicode events
73
- ---
74
- duration_ms: 292.115179
75
- type: 'test'
76
- ...
77
- # Subtest: SSE client and queue limits isolate slow readers
78
- ok 10 - SSE client and queue limits isolate slow readers
79
- ---
80
- duration_ms: 69.699795
81
- type: 'test'
82
- ...
83
- # Subtest: legacy negotiation requires valid initialization and the initialized notification
84
- ok 11 - legacy negotiation requires valid initialization and the initialized notification
85
- ---
86
- duration_ms: 65.860727
87
- type: 'test'
88
- ...
89
- # Subtest: JSON-RPC rejects invalid IDs and parameters without answering responses or notifications
90
- ok 12 - JSON-RPC rejects invalid IDs and parameters without answering responses or notifications
91
- ---
92
- duration_ms: 79.676029
93
- type: 'test'
94
- ...
95
- # Subtest: tools enforce schemas, preserve Unicode limits, and never claim observed visibility
96
- ok 13 - tools enforce schemas, preserve Unicode limits, and never claim observed visibility
97
- ---
98
- duration_ms: 65.199482
99
- type: 'test'
100
- ...
101
- # Subtest: event pages obey encoded byte limits and traverse without losing filtered records
102
- ok 14 - event pages obey encoded byte limits and traverse without losing filtered records
103
- ---
104
- duration_ms: 12.039959
105
- type: 'test'
106
- ...
107
- # Subtest: retention is bounded by bytes as well as event count and reports eviction
108
- ok 15 - retention is bounded by bytes as well as event count and reports eviction
109
- ---
110
- duration_ms: 1.856943
111
- type: 'test'
112
- ...
113
- # Subtest: stdio framing handles split UTF-8, CRLF and escaped newlines with strict byte bounds
114
- ok 16 - stdio framing handles split UTF-8, CRLF and escaped newlines with strict byte bounds
115
- ---
116
- duration_ms: 2.605379
117
- type: 'test'
118
- ...
119
- # Subtest: an oversized unfinished frame closes the MCP process promptly
120
- ok 17 - an oversized unfinished frame closes the MCP process promptly
121
- ---
122
- duration_ms: 1679.419605
123
- type: 'test'
124
- ...
125
- # Subtest: SIGTERM exits within a deadline even when the host stops reading stdout
126
- ok 18 - SIGTERM exits within a deadline even when the host stops reading stdout
127
- ---
128
- duration_ms: 1134.679158
129
- type: 'test'
130
- ...
131
- # Subtest: stdio writes wait for readers and reject stalled or oversized output
132
- ok 19 - stdio writes wait for readers and reject stalled or oversized output
133
- ---
134
- duration_ms: 1008.765007
135
- type: 'test'
136
- ...
137
- # Subtest: rate limiting admits bursts, rejects excess calls and refills over time
138
- ok 20 - rate limiting admits bursts, rejects excess calls and refills over time
139
- ---
140
- duration_ms: 0.406953
141
- type: 'test'
142
- ...
143
- # Subtest: MCP tool floods receive actionable rate-limit errors
144
- ok 21 - MCP tool floods receive actionable rate-limit errors
145
- ---
146
- duration_ms: 126.460675
147
- type: 'test'
148
- ...
149
- # Subtest: live dev API: codex installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
150
- ok 22 - live dev API: codex installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation # SKIP
151
- ---
152
- duration_ms: 0.681815
153
- type: 'test'
154
- ...
155
- # Subtest: live dev API: cursor installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
156
- ok 23 - live dev API: cursor installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation # SKIP
157
- ---
158
- duration_ms: 0.101911
159
- type: 'test'
160
- ...
161
- # Subtest: live dev API: claude installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
162
- ok 24 - live dev API: claude installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation # SKIP
163
- ---
164
- duration_ms: 0.09195
165
- type: 'test'
166
- ...
167
- # cursor: delayed shutdown released session lock; OMEMO snapshot unchanged
168
- # Subtest: cursor shutdown waits for session cleanup and releases its own lock without changing keys
169
- ok 25 - cursor shutdown waits for session cleanup and releases its own lock without changing keys
170
- ---
171
- duration_ms: 1275.467369
172
- type: 'test'
173
- ...
174
- # codex: delayed shutdown released session lock; OMEMO snapshot unchanged
175
- # Subtest: codex shutdown waits for session cleanup and releases its own lock without changing keys
176
- ok 26 - codex shutdown waits for session cleanup and releases its own lock without changing keys
177
- ---
178
- duration_ms: 1351.612221
179
- type: 'test'
180
- ...
181
- # Subtest: MCP shutdown finishes saving an in-flight verification response before exiting
182
- ok 27 - MCP shutdown finishes saving an in-flight verification response before exiting
183
- ---
184
- duration_ms: 1953.411831
185
- type: 'test'
186
- ...
187
- # Subtest: enrollment saves durable credential before XMPP, publishes before callback, and resumes without redemption
188
- ok 28 - enrollment saves durable credential before XMPP, publishes before callback, and resumes without redemption
189
- ---
190
- duration_ms: 1403.838277
191
- type: 'test'
192
- ...
193
- # Subtest: origins, host identities and installations cannot be substituted
194
- ok 29 - origins, host identities and installations cannot be substituted
195
- ---
196
- duration_ms: 169.675815
197
- type: 'test'
198
- ...
199
- # Subtest: expiration, replay, wrong installation and revocation return safe actions
200
- ok 30 - expiration, replay, wrong installation and revocation return safe actions
201
- ---
202
- duration_ms: 154.704354
203
- type: 'test'
204
- ...
205
- # Subtest: background heartbeats preserve the stream and retry outages with bounded backoff and safe diagnostics
206
- ok 31 - background heartbeats preserve the stream and retry outages with bounded backoff and safe diagnostics
207
- ---
208
- duration_ms: 206.266035
209
- type: 'test'
210
- ...
211
- # Subtest: failed initial connection recovers in background without another redemption and close cancels retries
212
- ok 32 - failed initial connection recovers in background without another redemption and close cancels retries
213
- ---
214
- duration_ms: 61.715907
215
- type: 'test'
216
- ...
217
- # Subtest: failed XMPP ping closes only the broken stream and obtains a fresh grant on automatic retry
218
- ok 33 - failed XMPP ping closes only the broken stream and obtains a fresh grant on automatic retry
219
- ---
220
- duration_ms: 120.923834
221
- type: 'test'
222
- ...
223
- # Subtest: shutdown waits for a background grant request and prevents a new session after closing
224
- ok 34 - shutdown waits for a background grant request and prevents a new session after closing
225
- ---
226
- duration_ms: 253.289892
227
- type: 'test'
228
- ...
229
- # Subtest: failed OMEMO registration preserves credential, suppresses connected callback, and resumes
230
- ok 35 - failed OMEMO registration preserves credential, suppresses connected callback, and resumes
231
- ---
232
- duration_ms: 1119.517586
233
- type: 'test'
234
- ...
235
- # Subtest: lost redemption and failed persistence never claim success
236
- ok 36 - lost redemption and failed persistence never claim success
237
- ---
238
- duration_ms: 77.407802
239
- type: 'test'
240
- ...
241
- # Subtest: unsafe permissions, symlinks and concurrent writes fail closed
242
- ok 37 - unsafe permissions, symlinks and concurrent writes fail closed
243
- ---
244
- duration_ms: 3.062512
245
- type: 'test'
246
- ...
247
- # Subtest: HTTP policy rejects non-loopback cleartext, URL credentials and redirects
248
- ok 38 - HTTP policy rejects non-loopback cleartext, URL credentials and redirects
249
- ---
250
- duration_ms: 20.389721
251
- type: 'test'
252
- ...
253
- # Subtest: existing native OMEMO identity survives reload; corrupt state is never regenerated
254
- ok 39 - existing native OMEMO identity survives reload; corrupt state is never regenerated
255
- ---
256
- duration_ms: 41.758989
257
- type: 'test'
258
- ...
259
- # Subtest: unsafe native OMEMO state permissions fail closed
260
- ok 40 - unsafe native OMEMO state permissions fail closed
261
- ---
262
- duration_ms: 4.823516
263
- type: 'test'
264
- ...
265
- # Subtest: a 1.x classic OMEMO identity is refused with re-enrollment guidance and left untouched
266
- ok 41 - a 1.x classic OMEMO identity is refused with re-enrollment guidance and left untouched
267
- ---
268
- duration_ms: 0.975417
269
- type: 'test'
270
- ...
271
- # Subtest: installed MCP tools verify via HTTP and never expose response credentials
272
- ok 42 - installed MCP tools verify via HTTP and never expose response credentials
273
- ---
274
- duration_ms: 216.128158
275
- type: 'test'
276
- ...
277
- # Subtest: cursor packaged MCP rejects a locally revoked identity without crashing or reporting connection
278
- ok 43 - cursor packaged MCP rejects a locally revoked identity without crashing or reporting connection
279
- ---
280
- duration_ms: 785.252075
281
- type: 'test'
282
- ...
283
- # Subtest: codex packaged MCP rejects a locally revoked identity without crashing or reporting connection
284
- ok 44 - codex packaged MCP rejects a locally revoked identity without crashing or reporting connection
285
- ---
286
- duration_ms: 140.427218
287
- type: 'test'
288
- ...
289
- # Subtest: release version matches all manifests
290
- ok 45 - release version matches all manifests
291
- ---
292
- duration_ms: 5.264819
293
- type: 'test'
294
- ...
295
- # Subtest: npm tarball installs the runtime with official libsignal and its thin plugins start it
296
- ok 46 - npm tarball installs the runtime with official libsignal and its thin plugins start it
297
- ---
298
- duration_ms: 7229.1955
299
- type: 'test'
300
- ...
301
- # Subtest: codex plugin is a thin wrapper that starts this runtime and records its own provider
302
- ok 47 - codex plugin is a thin wrapper that starts this runtime and records its own provider
303
- ---
304
- duration_ms: 1548.057324
305
- type: 'test'
306
- ...
307
- # Subtest: cursor plugin is a thin wrapper that starts this runtime and records its own provider
308
- ok 48 - cursor plugin is a thin wrapper that starts this runtime and records its own provider
309
- ---
310
- duration_ms: 267.536468
311
- type: 'test'
312
- ...
313
- # Subtest: claude plugin is a thin wrapper that starts this runtime and records its own provider
314
- ok 49 - claude plugin is a thin wrapper that starts this runtime and records its own provider
315
- ---
316
- duration_ms: 189.33055
317
- type: 'test'
318
- ...
319
- # Subtest: Claude, Cursor and Codex MCP processes have independent stores and ports
320
- ok 50 - Claude, Cursor and Codex MCP processes have independent stores and ports
321
- ---
322
- duration_ms: 69.973938
323
- type: 'test'
324
- ...
325
- # Subtest: installer refuses to overwrite an existing installation
326
- ok 51 - installer refuses to overwrite an existing installation
327
- ---
328
- duration_ms: 85.632553
329
- type: 'test'
330
- ...
331
- # Subtest: store validates messages, orders events and bounds retention
332
- ok 52 - store validates messages, orders events and bounds retention
333
- ---
334
- duration_ms: 2.68943
335
- type: 'test'
336
- ...
337
- # Subtest: loopback viewer serves assets and blocks cross-origin writes and traversal
338
- ok 53 - loopback viewer serves assets and blocks cross-origin writes and traversal
339
- ---
340
- duration_ms: 46.340583
341
- type: 'test'
342
- ...
343
- # Subtest: SSE delivers snapshot and live message, reconnect recovers snapshot
344
- ok 54 - SSE delivers snapshot and live message, reconnect recovers snapshot
345
- ---
346
- duration_ms: 261.199481
347
- type: 'test'
348
- ...
349
- # Subtest: MCP starts HTTP, records events and shuts down on stdin EOF
350
- ok 55 - MCP starts HTTP, records events and shuts down on stdin EOF
351
- ---
352
- duration_ms: 62.176779
353
- type: 'test'
354
- ...
355
- # Subtest: late history pages cannot duplicate live events, resurrect evictions or replace a new connection
356
- ok 56 - late history pages cannot duplicate live events, resurrect evictions or replace a new connection
357
- ---
358
- duration_ms: 1.774133
359
- type: 'test'
360
- ...
361
- # Subtest: history loading pins the snapshot sequence, follows cursors and respects cancellation
362
- ok 57 - history loading pins the snapshot sequence, follows cursors and respects cancellation
363
- ---
364
- duration_ms: 1.020178
365
- type: 'test'
366
- ...
367
- # Subtest: rate-limited history loading resumes from the same page instead of restarting the stream
368
- ok 58 - rate-limited history loading resumes from the same page instead of restarting the stream
369
- ---
370
- duration_ms: 1001.920706
371
- type: 'test'
372
- ...
373
- 1..58
374
- # tests 58
375
- # suites 0
376
- # pass 55
377
- # fail 0
378
- # cancelled 0
379
- # skipped 3
380
- # todo 0
381
- # duration_ms 7297.569426
@@ -1,23 +0,0 @@
1
- $ WACANDO_LIVE_TEST_ORIGIN=http://localhost:43001 node --test tests/onboarding-live.test.mjs
2
- # Subtest: live dev API: codex installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
3
- ok 1 - live dev API: codex installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
4
- # Subtest: live dev API: cursor installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
5
- ok 2 - live dev API: cursor installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
6
- # Subtest: live dev API: claude installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
7
- ok 3 - live dev API: claude installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
8
- # tests 3
9
- # suites 0
10
- # pass 3
11
- # fail 0
12
- # cancelled 0
13
- # skipped 0
14
- # todo 0
15
- # duration_ms 4115.907774
16
- $ WACANDO_LIVE_TEST_ORIGIN=http://localhost:43001 node scripts/check-daemon-live.mjs
17
- enrolled @daemon_962d3aa864c8/bot for host "cli" (synthetic owner)
18
- status: [{"agentId":"agt_354244b5-6fee-449d-9243-5f946f3c89a1","handle":"@daemon_962d3aa864c8/bot","origin":"http://localhost:43001","mode":"human","revoked":false,"connection":"disconnected"}]
19
- daemon: connected (grant, native OMEMO publication, presence echo, API callback) and running
20
- second daemon on the same identity: refused by the identity lock
21
- daemon: SIGTERM -> clean exit 0, lock released
22
- daemon restarted on the same saved identity and keys: connected again
23
- exit=0
@@ -1,56 +0,0 @@
1
- # lbframe/wacando-agent#8, #3, #4 — pairing and consent-aware conversations
2
-
3
- Branch `feat/8-pairing-consent` (on top of `feat/7-generic-runtime`, PR #11).
4
- Linux x64, Node.js 22.22.0, npm 10.9.4.
5
-
6
- ## Real local stack (nothing mocked)
7
-
8
- - Postgres container `wacando-issue10-postgres` (127.0.0.1:15432), own database
9
- `wacando_agentside`, migrations from lbframe/wacando main (`drizzle-kit migrate`).
10
- - ejabberd `ejabberd/ecs:26.07`, own container `wacando-agentside-ejabberd`
11
- (127.0.0.1:45222/45280/45347), configured with lbframe/wacando
12
- `infra/ejabberd/ci-up.sh`: CI config + compiled `mod_wacando_guard` (#102).
13
- - API (:43001) and policy component (:43002) from lbframe/wacando main
14
- `50b9d26` (includes #60 pairing, #98 consent, #102 guard), `tsx src/index.ts`;
15
- then a second stack: main `f21f742` + #108 + #109 (fresh DB `wacando_agentside_int`).
16
- - Desktop observer: `apps/desktop/src/main/observer-hub.ts` (main-process,
17
- official `@signalapp/libsignal-client`), one hub per owner.
18
-
19
- ## Results
20
-
21
- | File | What | Result |
22
- |---|---|---|
23
- | `check.txt` | `npm run check` | deps + notices verified; 73 tests: 70 pass, 0 fail, 3 opt-in live skipped. Also: recipient discovery validation (fail closed), a replaced session never reconnects. New: pairing proofs equal the API's RFC 8032 interoperability vectors byte for byte; key saved before redeem; refusal/expiry leave no file; resume after interruption; 5 s polling + Retry-After; recipient set, accepted-only views, content-free refusals |
24
- | `check-mcp.txt` | `npm run check:mcp` | official MCP Inspector 2.7.0: 13 tools, 3 hosts |
25
- | `e2e-desktop-observer.txt` | `scripts/e2e-desktop-observer.mts` with the desktop fix lbframe/wacando#109 | **18/18 PASS** (below) |
26
- | `e2e-desktop-observer-main-without-109.txt` | same run with main's desktop hub | steps 1–14 pass, then the owners' desktop shows the 2 relayed messages as undecryptable: the gap fixed by lbframe/wacando#109 |
27
- | `live-regression.txt` | live onboarding (3 hosts) + CLI daemon qualification | 3/3 pass; daemon connected, lock refusal, SIGTERM exit 0, restart |
28
- | `e2e-desktop-observer-human-devices.txt` | same E2E on lbframe/wacando main `f21f742` (+#105, #106 one session per agent) with PR #108 (per-installation human devices) and #109 merged locally; ejabberd reconfigured from that tree | **18/18 PASS**: each owner's desktop enrolls a `dev_…` installation (password re-auth, device-bound grant, activation after bundle publication); the runtime discovers recipients before every send and both `dev_` observers decrypt all 3 messages |
29
- | `live-regression-human-devices.txt` | live onboarding + daemon on that stack | 3/3 pass; daemon pass |
30
-
31
- E2E steps (`e2e-desktop-observer.txt`):
32
- 1. two owners; 2. CLI `wacando-agent pair` (service bot), owner confirms after
33
- seeing the key fingerprint; 3. MCP `wacando_pair` (human, Codex host), resumed by
34
- a second call; 4. contact accepted; 5. both runtimes connected through the SDK
35
- (native OMEMO device, presence echo); 6. `propose` creates the request and
36
- refuses the first message fail-closed while the owners have no device;
37
- 7. recipient agent sees nothing before acceptance; 8. both owners' desktop hubs
38
- publish devices and observe; 9. first message **held**, status visible to the
39
- agent; 10. owner A recomputes the digest locally from the held ciphertext and
40
- approves; 11. owner B sees it in the consent inbox and accepts; 12. recipient
41
- (human, member) decrypts the first message from MAM; 13. human reply sent
42
- freely, service agent decrypts it from a policy delivery; 14. service message
43
- held, nothing reaches the recipient before approval, then delivered;
44
- 15–16. **both owners' desktop ObserverHubs decrypt all 3 messages**; 17. STOP:
45
- both agents refused; 18. canary absent from ejabberd storage (MAM, offline,
46
- pubsub, logs), API/policy logs and runtime CLI/MCP output.
47
-
48
- ## Not tested
49
-
50
- - Real Codex/Cursor/Claude hosts driving the MCP tools (the MCP process is
51
- driven over stdio by the test); macOS/Windows.
52
- - A `service`-mode recipient (it cannot receive the first message by design of
53
- the server, documented in `docs/AGENT_TOOLS.md`).
54
- - Direct 1:1 refusal by the guard (covered in lbframe/wacando #102); the runtime
55
- never sends `chat` stanzas and ignores incoming ones.
56
- - Pairing refusal/expiry against the real API (unit-tested; the real window is 10 minutes).
@@ -1,9 +0,0 @@
1
- $ npm run check:mcp
2
-
3
- > wacando-agent@2.0.0 check:mcp
4
- > node scripts/check-mcp.mjs
5
-
6
- Official Inspector 2.7.0 passed: wacando
7
- Official Inspector 2.7.0 passed: wacando-cursor
8
- Official Inspector 2.7.0 passed: wacando-claude
9
- exit=0