@wacando/agent 2.0.0-rc.1 → 2.0.2

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,465 +0,0 @@
1
- $ npm run check
2
-
3
- > wacando-agent@2.0.0 check
4
- > node scripts/check-deps.mjs && npm run check:notices && npm test
5
-
6
- Verified 3 pinned Wacando archives from https://github.com/lbframe/wacando @ 5f0f0a1f0ccc20c47383fed6f8e072aca5302486
7
-
8
- > wacando-agent@2.0.0 check:notices
9
- > node scripts/notices.mjs --check
10
-
11
- Verified notices and provenance for 83 runtime packages
12
-
13
- > wacando-agent@2.0.0 test
14
- > node --test tests/*.test.mjs
15
-
16
- TAP version 13
17
- # Subtest: the ciphertext goes to the other agent and both owners, never to an unrelated party
18
- ok 1 - the ciphertext goes to the other agent and both owners, never to an unrelated party
19
- ---
20
- duration_ms: 1.136318
21
- type: 'test'
22
- ...
23
- # Subtest: a deleted side is not an encryption target and a stranger cannot view
24
- ok 2 - a deleted side is not an encryption target and a stranger cannot view
25
- ---
26
- duration_ms: 0.380513
27
- type: 'test'
28
- ...
29
- # Subtest: only an activated conversation counts as accepted, including after STOP
30
- ok 3 - only an activated conversation counts as accepted, including after STOP
31
- ---
32
- duration_ms: 0.173921
33
- type: 'test'
34
- ...
35
- # Subtest: the public summary never exposes owner identifiers
36
- ok 4 - the public summary never exposes owner identifiers
37
- ---
38
- duration_ms: 0.264772
39
- type: 'test'
40
- ...
41
- # Subtest: API refusals become explicit, content-free messages
42
- ok 5 - API refusals become explicit, content-free messages
43
- ---
44
- duration_ms: 0.239232
45
- type: 'test'
46
- ...
47
- # Subtest: recipient discovery returns both agents and every owner installation
48
- ok 6 - recipient discovery returns both agents and every owner installation
49
- ---
50
- duration_ms: 0.228682
51
- type: 'test'
52
- ...
53
- # Subtest: malformed or foreign recipient discovery fails closed
54
- ok 7 - malformed or foreign recipient discovery fails closed
55
- ---
56
- duration_ms: 0.269012
57
- type: 'test'
58
- ...
59
- # Subtest: cursor checker requires an affirmative parsed payload even when the wrapper says success
60
- ok 8 - cursor checker requires an affirmative parsed payload even when the wrapper says success
61
- ---
62
- duration_ms: 3.107283
63
- type: 'test'
64
- ...
65
- # Subtest: cursor checker distinguishes clear revocation from a crash, lock error or false connection
66
- ok 9 - cursor checker distinguishes clear revocation from a crash, lock error or false connection
67
- ---
68
- duration_ms: 1.587432
69
- type: 'test'
70
- ...
71
- # Subtest: codex checker requires an affirmative parsed payload even when the wrapper says success
72
- ok 10 - codex checker requires an affirmative parsed payload even when the wrapper says success
73
- ---
74
- duration_ms: 0.452933
75
- type: 'test'
76
- ...
77
- # Subtest: codex checker distinguishes clear revocation from a crash, lock error or false connection
78
- ok 11 - codex checker distinguishes clear revocation from a crash, lock error or false connection
79
- ---
80
- duration_ms: 0.371953
81
- type: 'test'
82
- ...
83
- # Subtest: checker requires verified:true for installation readiness
84
- ok 12 - checker requires verified:true for installation readiness
85
- ---
86
- duration_ms: 0.422983
87
- type: 'test'
88
- ...
89
- # Subtest: malformed viewer request targets return 400 without losing MCP events
90
- ok 13 - malformed viewer request targets return 400 without losing MCP events
91
- ---
92
- duration_ms: 244.735896
93
- type: 'test'
94
- ...
95
- # Subtest: MCP shutdown on EOF closes SSE and unfinished HTTP headers
96
- ok 14 - MCP shutdown on EOF closes SSE and unfinished HTTP headers
97
- ---
98
- duration_ms: 453.17005
99
- type: 'test'
100
- ...
101
- # Subtest: MCP shutdown on SIGTERM closes SSE and unfinished HTTP headers
102
- ok 15 - MCP shutdown on SIGTERM closes SSE and unfinished HTTP headers
103
- ---
104
- duration_ms: 397.135599
105
- type: 'test'
106
- ...
107
- # Subtest: HTTP and SSE snapshots use bounded pages and preserve large Unicode events
108
- ok 16 - HTTP and SSE snapshots use bounded pages and preserve large Unicode events
109
- ---
110
- duration_ms: 62.279017
111
- type: 'test'
112
- ...
113
- # Subtest: SSE client and queue limits isolate slow readers
114
- ok 17 - SSE client and queue limits isolate slow readers
115
- ---
116
- duration_ms: 12.629645
117
- type: 'test'
118
- ...
119
- # Subtest: legacy negotiation requires valid initialization and the initialized notification
120
- ok 18 - legacy negotiation requires valid initialization and the initialized notification
121
- ---
122
- duration_ms: 235.436646
123
- type: 'test'
124
- ...
125
- # Subtest: JSON-RPC rejects invalid IDs and parameters without answering responses or notifications
126
- ok 19 - JSON-RPC rejects invalid IDs and parameters without answering responses or notifications
127
- ---
128
- duration_ms: 162.277287
129
- type: 'test'
130
- ...
131
- # Subtest: tools enforce schemas, preserve Unicode limits, and never claim observed visibility
132
- ok 20 - tools enforce schemas, preserve Unicode limits, and never claim observed visibility
133
- ---
134
- duration_ms: 163.832959
135
- type: 'test'
136
- ...
137
- # Subtest: event pages obey encoded byte limits and traverse without losing filtered records
138
- ok 21 - event pages obey encoded byte limits and traverse without losing filtered records
139
- ---
140
- duration_ms: 11.876959
141
- type: 'test'
142
- ...
143
- # Subtest: retention is bounded by bytes as well as event count and reports eviction
144
- ok 22 - retention is bounded by bytes as well as event count and reports eviction
145
- ---
146
- duration_ms: 1.823443
147
- type: 'test'
148
- ...
149
- # Subtest: stdio framing handles split UTF-8, CRLF and escaped newlines with strict byte bounds
150
- ok 23 - stdio framing handles split UTF-8, CRLF and escaped newlines with strict byte bounds
151
- ---
152
- duration_ms: 2.59395
153
- type: 'test'
154
- ...
155
- # Subtest: an oversized unfinished frame closes the MCP process promptly
156
- ok 24 - an oversized unfinished frame closes the MCP process promptly
157
- ---
158
- duration_ms: 151.433036
159
- type: 'test'
160
- ...
161
- # Subtest: SIGTERM exits within a deadline even when the host stops reading stdout
162
- ok 25 - SIGTERM exits within a deadline even when the host stops reading stdout
163
- ---
164
- duration_ms: 1210.075638
165
- type: 'test'
166
- ...
167
- # Subtest: stdio writes wait for readers and reject stalled or oversized output
168
- ok 26 - stdio writes wait for readers and reject stalled or oversized output
169
- ---
170
- duration_ms: 1004.345495
171
- type: 'test'
172
- ...
173
- # Subtest: rate limiting admits bursts, rejects excess calls and refills over time
174
- ok 27 - rate limiting admits bursts, rejects excess calls and refills over time
175
- ---
176
- duration_ms: 0.310063
177
- type: 'test'
178
- ...
179
- # Subtest: MCP tool floods receive actionable rate-limit errors
180
- ok 28 - MCP tool floods receive actionable rate-limit errors
181
- ---
182
- duration_ms: 164.126661
183
- type: 'test'
184
- ...
185
- # Subtest: live dev API: codex installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
186
- ok 29 - live dev API: codex installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation # SKIP
187
- ---
188
- duration_ms: 0.681806
189
- type: 'test'
190
- ...
191
- # Subtest: live dev API: cursor installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
192
- ok 30 - live dev API: cursor installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation # SKIP
193
- ---
194
- duration_ms: 0.10272
195
- type: 'test'
196
- ...
197
- # Subtest: live dev API: claude installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
198
- ok 31 - live dev API: claude installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation # SKIP
199
- ---
200
- duration_ms: 0.094751
201
- type: 'test'
202
- ...
203
- # cursor: delayed shutdown released session lock; OMEMO snapshot unchanged
204
- # Subtest: cursor shutdown waits for session cleanup and releases its own lock without changing keys
205
- ok 32 - cursor shutdown waits for session cleanup and releases its own lock without changing keys
206
- ---
207
- duration_ms: 1418.405871
208
- type: 'test'
209
- ...
210
- # codex: delayed shutdown released session lock; OMEMO snapshot unchanged
211
- # Subtest: codex shutdown waits for session cleanup and releases its own lock without changing keys
212
- ok 33 - codex shutdown waits for session cleanup and releases its own lock without changing keys
213
- ---
214
- duration_ms: 1348.202894
215
- type: 'test'
216
- ...
217
- # Subtest: MCP shutdown finishes saving an in-flight verification response before exiting
218
- ok 34 - MCP shutdown finishes saving an in-flight verification response before exiting
219
- ---
220
- duration_ms: 1400.553927
221
- type: 'test'
222
- ...
223
- # Subtest: enrollment saves durable credential before XMPP, publishes before callback, and resumes without redemption
224
- ok 35 - enrollment saves durable credential before XMPP, publishes before callback, and resumes without redemption
225
- ---
226
- duration_ms: 112.152342
227
- type: 'test'
228
- ...
229
- # Subtest: origins, host identities and installations cannot be substituted
230
- ok 36 - origins, host identities and installations cannot be substituted
231
- ---
232
- duration_ms: 43.608147
233
- type: 'test'
234
- ...
235
- # Subtest: expiration, replay, wrong installation and revocation return safe actions
236
- ok 37 - expiration, replay, wrong installation and revocation return safe actions
237
- ---
238
- duration_ms: 151.621228
239
- type: 'test'
240
- ...
241
- # Subtest: background heartbeats preserve the stream and retry outages with bounded backoff and safe diagnostics
242
- ok 38 - background heartbeats preserve the stream and retry outages with bounded backoff and safe diagnostics
243
- ---
244
- duration_ms: 164.378704
245
- type: 'test'
246
- ...
247
- # Subtest: failed initial connection recovers in background without another redemption and close cancels retries
248
- ok 39 - failed initial connection recovers in background without another redemption and close cancels retries
249
- ---
250
- duration_ms: 299.179305
251
- type: 'test'
252
- ...
253
- # Subtest: failed XMPP ping closes only the broken stream and obtains a fresh grant on automatic retry
254
- ok 40 - failed XMPP ping closes only the broken stream and obtains a fresh grant on automatic retry
255
- ---
256
- duration_ms: 99.331076
257
- type: 'test'
258
- ...
259
- # Subtest: shutdown waits for a background grant request and prevents a new session after closing
260
- ok 41 - shutdown waits for a background grant request and prevents a new session after closing
261
- ---
262
- duration_ms: 128.487294
263
- type: 'test'
264
- ...
265
- # Subtest: failed OMEMO registration preserves credential, suppresses connected callback, and resumes
266
- ok 42 - failed OMEMO registration preserves credential, suppresses connected callback, and resumes
267
- ---
268
- duration_ms: 156.627335
269
- type: 'test'
270
- ...
271
- # Subtest: lost redemption and failed persistence never claim success
272
- ok 43 - lost redemption and failed persistence never claim success
273
- ---
274
- duration_ms: 31.813949
275
- type: 'test'
276
- ...
277
- # Subtest: unsafe permissions, symlinks and concurrent writes fail closed
278
- ok 44 - unsafe permissions, symlinks and concurrent writes fail closed
279
- ---
280
- duration_ms: 2.212376
281
- type: 'test'
282
- ...
283
- # Subtest: HTTP policy rejects non-loopback cleartext, URL credentials and redirects
284
- ok 45 - HTTP policy rejects non-loopback cleartext, URL credentials and redirects
285
- ---
286
- duration_ms: 15.866179
287
- type: 'test'
288
- ...
289
- # Subtest: existing native OMEMO identity survives reload; corrupt state is never regenerated
290
- ok 46 - existing native OMEMO identity survives reload; corrupt state is never regenerated
291
- ---
292
- duration_ms: 34.571539
293
- type: 'test'
294
- ...
295
- # Subtest: unsafe native OMEMO state permissions fail closed
296
- ok 47 - unsafe native OMEMO state permissions fail closed
297
- ---
298
- duration_ms: 5.659882
299
- type: 'test'
300
- ...
301
- # Subtest: a 1.x classic OMEMO identity is refused with re-enrollment guidance and left untouched
302
- ok 48 - a 1.x classic OMEMO identity is refused with re-enrollment guidance and left untouched
303
- ---
304
- duration_ms: 0.932707
305
- type: 'test'
306
- ...
307
- # Subtest: installed MCP tools verify via HTTP and never expose response credentials
308
- ok 49 - installed MCP tools verify via HTTP and never expose response credentials
309
- ---
310
- duration_ms: 239.339785
311
- type: 'test'
312
- ...
313
- # Subtest: cursor packaged MCP rejects a locally revoked identity without crashing or reporting connection
314
- ok 50 - cursor packaged MCP rejects a locally revoked identity without crashing or reporting connection
315
- ---
316
- duration_ms: 211.265405
317
- type: 'test'
318
- ...
319
- # Subtest: codex packaged MCP rejects a locally revoked identity without crashing or reporting connection
320
- ok 51 - codex packaged MCP rejects a locally revoked identity without crashing or reporting connection
321
- ---
322
- duration_ms: 246.65472
323
- type: 'test'
324
- ...
325
- # Subtest: a session replaced by a newer login elsewhere is never reconnected automatically
326
- ok 52 - a session replaced by a newer login elsewhere is never reconnected automatically
327
- ---
328
- duration_ms: 61.40213
329
- type: 'test'
330
- ...
331
- # Subtest: release version matches all manifests
332
- ok 53 - release version matches all manifests
333
- ---
334
- duration_ms: 8.270462
335
- type: 'test'
336
- ...
337
- # Subtest: npm tarball installs the runtime with official libsignal and its thin plugins start it
338
- ok 54 - npm tarball installs the runtime with official libsignal and its thin plugins start it
339
- ---
340
- duration_ms: 3028.215999
341
- type: 'test'
342
- ...
343
- # Subtest: redeem and claim proofs match the API interoperability vectors byte for byte
344
- ok 55 - redeem and claim proofs match the API interoperability vectors byte for byte
345
- ---
346
- duration_ms: 2.315388
347
- type: 'test'
348
- ...
349
- # Subtest: runtime metadata is bounded display text without control characters
350
- ok 56 - runtime metadata is bounded display text without control characters
351
- ---
352
- duration_ms: 0.326473
353
- type: 'test'
354
- ...
355
- # Subtest: redeem refuses malformed codes before any request and persists the key before redeeming
356
- ok 57 - redeem refuses malformed codes before any request and persists the key before redeeming
357
- ---
358
- duration_ms: 2.742371
359
- type: 'test'
360
- ...
361
- # Subtest: claim polls every 5 s while pending, honours Retry-After, and ends at the local deadline
362
- ok 58 - claim polls every 5 s while pending, honours Retry-After, and ends at the local deadline
363
- ---
364
- duration_ms: 2.207037
365
- type: 'test'
366
- ...
367
- # Subtest: a confirmed pairing saves the credential locally and returns no secret
368
- ok 59 - a confirmed pairing saves the credential locally and returns no secret
369
- ---
370
- duration_ms: 129.909655
371
- type: 'test'
372
- ...
373
- # Subtest: a refused code or an unconfirmed pairing leaves no partial identity
374
- ok 60 - a refused code or an unconfirmed pairing leaves no partial identity
375
- ---
376
- duration_ms: 168.624755
377
- type: 'test'
378
- ...
379
- # Subtest: a pairing interrupted after redeem resumes with the same key and poll secret
380
- ok 61 - a pairing interrupted after redeem resumes with the same key and poll secret
381
- ---
382
- duration_ms: 166.251487
383
- type: 'test'
384
- ...
385
- # Subtest: codex plugin is a thin wrapper that starts this runtime and records its own provider
386
- ok 62 - codex plugin is a thin wrapper that starts this runtime and records its own provider
387
- ---
388
- duration_ms: 300.733626
389
- type: 'test'
390
- ...
391
- # Subtest: cursor plugin is a thin wrapper that starts this runtime and records its own provider
392
- ok 63 - cursor plugin is a thin wrapper that starts this runtime and records its own provider
393
- ---
394
- duration_ms: 211.864679
395
- type: 'test'
396
- ...
397
- # Subtest: claude plugin is a thin wrapper that starts this runtime and records its own provider
398
- ok 64 - claude plugin is a thin wrapper that starts this runtime and records its own provider
399
- ---
400
- duration_ms: 246.100826
401
- type: 'test'
402
- ...
403
- # Subtest: Claude, Cursor and Codex MCP processes have independent stores and ports
404
- ok 65 - Claude, Cursor and Codex MCP processes have independent stores and ports
405
- ---
406
- duration_ms: 185.838794
407
- type: 'test'
408
- ...
409
- # Subtest: installer refuses to overwrite an existing installation
410
- ok 66 - installer refuses to overwrite an existing installation
411
- ---
412
- duration_ms: 63.97227
413
- type: 'test'
414
- ...
415
- # Subtest: store validates messages, orders events and bounds retention
416
- ok 67 - store validates messages, orders events and bounds retention
417
- ---
418
- duration_ms: 2.471668
419
- type: 'test'
420
- ...
421
- # Subtest: loopback viewer serves assets and blocks cross-origin writes and traversal
422
- ok 68 - loopback viewer serves assets and blocks cross-origin writes and traversal
423
- ---
424
- duration_ms: 54.258087
425
- type: 'test'
426
- ...
427
- # Subtest: SSE delivers snapshot and live message, reconnect recovers snapshot
428
- ok 69 - SSE delivers snapshot and live message, reconnect recovers snapshot
429
- ---
430
- duration_ms: 263.314726
431
- type: 'test'
432
- ...
433
- # Subtest: MCP starts HTTP, records events and shuts down on stdin EOF
434
- ok 70 - MCP starts HTTP, records events and shuts down on stdin EOF
435
- ---
436
- duration_ms: 185.760904
437
- type: 'test'
438
- ...
439
- # Subtest: late history pages cannot duplicate live events, resurrect evictions or replace a new connection
440
- ok 71 - late history pages cannot duplicate live events, resurrect evictions or replace a new connection
441
- ---
442
- duration_ms: 1.648573
443
- type: 'test'
444
- ...
445
- # Subtest: history loading pins the snapshot sequence, follows cursors and respects cancellation
446
- ok 72 - history loading pins the snapshot sequence, follows cursors and respects cancellation
447
- ---
448
- duration_ms: 1.172069
449
- type: 'test'
450
- ...
451
- # Subtest: rate-limited history loading resumes from the same page instead of restarting the stream
452
- ok 73 - rate-limited history loading resumes from the same page instead of restarting the stream
453
- ---
454
- duration_ms: 1002.250669
455
- type: 'test'
456
- ...
457
- 1..73
458
- # tests 73
459
- # suites 0
460
- # pass 70
461
- # fail 0
462
- # cancelled 0
463
- # skipped 3
464
- # todo 0
465
- # duration_ms 4379.160963
@@ -1,30 +0,0 @@
1
- $ # stack: lbframe/wacando main f21f742 (incl. #105, #106 one session per agent) + PR #108 head f74e5e7 merged locally + PR #109; ejabberd reconfigured from that tree's infra/ejabberd/ci-up.sh; fresh DB wacando_agentside_int
2
- 21eb297 Merge remote-tracking branch 'origin/fix/39-desktop-relay-attribution' into HEAD
3
- 81ed6c9 local integration: main + #108
4
- f21f742 Merge pull request #106 from lbframe/feat/15-native-presence
5
- f74e5e7 fix(desktop): attribute policy relays in the observer (#39)
6
- $ WACANDO_CHECKOUT=<work>/wacando-int ... tsx scripts/e2e-desktop-observer.mts
7
- PASS 01 two owners signed up (5ce148a1-59b7-44c5-aad7-627763ac9c47, aed01f77-96d9-4898-ae01-a9612bc260c7)
8
- PASS 02 CLI `wacando-agent pair` -> @e2ea05d175d12c/bot (service), owner confirmed after checking the key fingerprint
9
- PASS 03 MCP tool `wacando_pair` -> @e2eb80bf6b6df6/codex (human), resumed by a second call without code
10
- PASS 04 contact invitation accepted by the recipient owner
11
- PASS 05 both runtimes connected (grant, native OMEMO device, presence echo) via the SDK
12
- PASS 06 propose -> request cnv_1c43d27b-d0ef-43db-8a40-5f290c4d69ce created; first message refused fail-closed (owners' desktop devices not published yet)
13
- PASS 07 recipient agent sees nothing of the request before acceptance (list empty, read/send refused)
14
- PASS 08 both owners' desktop ObserverHubs enrolled per-installation devices (dev_f155edc2bab924646b1d7720c0289504, dev_dcc50d451ef07f7cdf411723a950f55c), published official-libsignal bundles, were activated and observe the room
15
- PASS 09 first message held by the policy component (stanza om-ff20570e4c6a34e7), status visible to the agent
16
- PASS 10 requester owner approved the exact held ciphertext (locally recomputed digest) -> relayed
17
- PASS 11 recipient owner saw the request in the consent inbox and accepted it via the API
18
- PASS 12 recipient agent (human mode, room member) decrypted the approved first message from the archive
19
- PASS 13 human-mode reply sent without approval; service agent decrypted it from a policy delivery
20
- PASS 14 service-mode message held until its owner approved it, then delivered and decrypted
21
- PASS 15 alice's desktop ObserverHub (official libsignal) decrypted all 3 messages (3 entries)
22
- PASS 16 bob's desktop ObserverHub (official libsignal) decrypted all 3 messages (3 entries)
23
- PASS 17 after STOP by an owner both agents are refused explicitly; nothing is sent
24
- canary-scan: dumping mnesia via /home/ejabberd/bin/ejabberdctl
25
- canary-scan: scanning dump + logs + spool for canary
26
- canary-scan: total occurrences of canary: 0
27
- canary-scan: PASS — plaintext absent from server-side storage
28
- PASS 18 plaintext canary absent from ejabberd storage (MAM, offline, pubsub, logs), API/policy logs and runtime output
29
- E2E RESULT: PASS
30
- exit=0
@@ -1,17 +0,0 @@
1
- $ WACANDO_CHECKOUT=<work>/wacando-main (main 50b9d26, desktop WITHOUT lbframe/wacando#109) ... tsx scripts/e2e-desktop-observer.mts
2
- PASS 01 two owners signed up (656f8a56-c419-40ff-8b92-f6fa606202a7, 64156b8c-73e8-457a-809a-613193ff5f21)
3
- PASS 02 CLI `wacando-agent pair` -> @e2ea659065e8fe/bot (service), owner confirmed after checking the key fingerprint
4
- PASS 03 MCP tool `wacando_pair` -> @e2ebd58690e393/codex (human), resumed by a second call without code
5
- PASS 04 contact invitation accepted by the recipient owner
6
- PASS 05 both runtimes connected (grant, native OMEMO device, presence echo) via the SDK
7
- PASS 06 propose -> request cnv_da62e01b-7cbe-459c-8880-4d2793b08a84 created; first message refused fail-closed (owners' desktop devices not published yet)
8
- PASS 07 recipient agent sees nothing of the request before acceptance (list empty, read/send refused)
9
- PASS 08 both owners' desktop ObserverHubs published official-libsignal devices and observe the room
10
- PASS 09 first message held by the policy component (stanza om-e7c23aaa70b855bd), status visible to the agent
11
- PASS 10 requester owner approved the exact held ciphertext (locally recomputed digest) -> relayed
12
- PASS 11 recipient owner saw the request in the consent inbox and accepted it via the API
13
- PASS 12 recipient agent (human mode, room member) decrypted the approved first message from the archive
14
- PASS 13 human-mode reply sent without approval; service agent decrypted it from a policy delivery
15
- PASS 14 service-mode message held until its owner approved it, then delivered and decrypted
16
- DIAG alice: status=observing entries=3 undecryptable=2 first=false reply=true second=false
17
- Error: timeout: alice's desktop decrypts the 3 messages
@@ -1,26 +0,0 @@
1
- $ (wacando-relay = lbframe/wacando#109 head f74e5e7; API+policy = main 50b9d26)
2
- $ WACANDO_CHECKOUT=<work>/wacando-relay WACANDO_LIVE_TEST_ORIGIN=http://localhost:43001 WACANDO_XMPP_SERVICE=ws://localhost:45280/ws EJABBERD_CONTAINER=wacando-agentside-ejabberd WACANDO_SERVER_LOGS=<work>/api.log:<work>/policy.log tsx scripts/e2e-desktop-observer.mts
3
- PASS 01 two owners signed up (a2174112-2ac1-4498-b78b-52aa3ff289d7, dc6851ba-10eb-45f6-8fd6-07d4c94fc0cd)
4
- PASS 02 CLI `wacando-agent pair` -> @e2ea43673623f5/bot (service), owner confirmed after checking the key fingerprint
5
- PASS 03 MCP tool `wacando_pair` -> @e2ebc8f13ad47a/codex (human), resumed by a second call without code
6
- PASS 04 contact invitation accepted by the recipient owner
7
- PASS 05 both runtimes connected (grant, native OMEMO device, presence echo) via the SDK
8
- PASS 06 propose -> request cnv_99bd97cc-5fbf-4fc4-a299-ef9ca023cd73 created; first message refused fail-closed (owners' desktop devices not published yet)
9
- PASS 07 recipient agent sees nothing of the request before acceptance (list empty, read/send refused)
10
- PASS 08 both owners' desktop ObserverHubs published official-libsignal devices and observe the room
11
- PASS 09 first message held by the policy component (stanza om-8e76cd6fd1c71e55), status visible to the agent
12
- PASS 10 requester owner approved the exact held ciphertext (locally recomputed digest) -> relayed
13
- PASS 11 recipient owner saw the request in the consent inbox and accepted it via the API
14
- PASS 12 recipient agent (human mode, room member) decrypted the approved first message from the archive
15
- PASS 13 human-mode reply sent without approval; service agent decrypted it from a policy delivery
16
- PASS 14 service-mode message held until its owner approved it, then delivered and decrypted
17
- PASS 15 alice's desktop ObserverHub (official libsignal) decrypted all 3 messages (3 entries)
18
- PASS 16 bob's desktop ObserverHub (official libsignal) decrypted all 3 messages (3 entries)
19
- PASS 17 after STOP by an owner both agents are refused explicitly; nothing is sent
20
- canary-scan: dumping mnesia via /home/ejabberd/bin/ejabberdctl
21
- canary-scan: scanning dump + logs + spool for canary
22
- canary-scan: total occurrences of canary: 0
23
- canary-scan: PASS — plaintext absent from server-side storage
24
- PASS 18 plaintext canary absent from ejabberd storage (MAM, offline, pubsub, logs), API/policy logs and runtime output
25
- E2E RESULT: PASS
26
- exit=0
@@ -1,24 +0,0 @@
1
- # stack: main f21f742 + #108 + #109 (see e2e-desktop-observer-human-devices.txt)
2
- $ WACANDO_LIVE_TEST_ORIGIN=http://localhost:43001 node --test tests/onboarding-live.test.mjs
3
- # Subtest: live dev API: codex installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
4
- ok 1 - live dev API: codex installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
5
- # Subtest: live dev API: cursor installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
6
- ok 2 - live dev API: cursor installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
7
- # Subtest: live dev API: claude installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
8
- ok 3 - live dev API: claude installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
9
- # tests 3
10
- # suites 0
11
- # pass 3
12
- # fail 0
13
- # cancelled 0
14
- # skipped 0
15
- # todo 0
16
- # duration_ms 7445.725894
17
- $ WACANDO_LIVE_TEST_ORIGIN=http://localhost:43001 node scripts/check-daemon-live.mjs
18
- enrolled @daemon_72904bf9221a/bot for host "cli" (synthetic owner)
19
- status: [{"agentId":"agt_ccb280ca-9d76-426c-834c-43ad17b677cc","handle":"@daemon_72904bf9221a/bot","origin":"http://localhost:43001","mode":"human","revoked":false,"connection":"disconnected"}]
20
- daemon: connected (grant, native OMEMO publication, presence echo, API callback) and running
21
- second daemon on the same identity: refused by the identity lock
22
- daemon: SIGTERM -> clean exit 0, lock released
23
- daemon restarted on the same saved identity and keys: connected again
24
- exit=0
@@ -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 4407.393019
16
- $ WACANDO_LIVE_TEST_ORIGIN=http://localhost:43001 node scripts/check-daemon-live.mjs
17
- enrolled @daemon_097025fda819/bot for host "cli" (synthetic owner)
18
- status: [{"agentId":"agt_2497bb54-3c93-42e7-88a2-3d594bb9ce18","handle":"@daemon_097025fda819/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,30 +0,0 @@
1
- # #12 review fixes (independent review FAIL on 75eb582)
2
-
3
- | Finding | Fix | Proof |
4
- |---|---|---|
5
- | BLOCKER: a replaced session logs back in (heartbeat reopened a new session before the replaced check) | `<conflict/>` marks the identity `replaced` at once (`onReplaced`); `open()` refuses first, so heartbeats, retries and further connects in the process throw `SESSION_REPLACED`; the daemon exits 3 | unit: every fake connection has its own flag, both orders (stream error first / heartbeat only) open exactly one session (`check.txt`); live: `session-replacement-live.txt`: two copies of one identity, the newer wins, the older exits 3, the newer is still connected after 135 s with 3+ heartbeats, ejabberd logs exactly 1 "Replaced by new connection" for the whole run |
6
- | MEDIUM a: `usr_` fallback on a non-JSON 404 | removed: a server without discovery fails closed (`noDiscovery`) | unit test |
7
- | MEDIUM b: owner check always true | discovery must name exactly the conversation's two agents and observers of BOTH owners | unit tests |
8
- | MEDIUM c: daemon client stuck on the old session | `onSession` rebinds the conversation client to the new session (fresh origin tracker, rooms re-joined on demand, stanzas of the new session buffered until then); the old provider is dropped | code; E2E unchanged 18/18 |
9
- | MEDIUM d: `install:claude` needs `wacando-agent` on PATH | `scripts/install-claude.mjs` stages with `wacando-agent install --host claude` (absolute runtime path) before registering | code; in-repo use documented |
10
- | LOW: message text in argv | `-` reads it from stdin | `--help` |
11
- | LOW: unbounded sent-text cache | bounded to 1000 entries | code |
12
-
13
- Not changed (LOW, documented): `wacando_wait` has no cursor (read covers the gap);
14
- `pair()` drops the key when a redeem response is lost (code consumed, re-pair);
15
- the MCP surface keeps the viewer and v1 onboarding tools.
16
-
17
- Stack for the live runs: lbframe/wacando PR #108 head `6198d92` (includes main
18
- `f21f742`, #106) + PR #109 merged locally; ejabberd 26.07 from that tree's
19
- `infra/ejabberd/ci-up.sh`; fresh Postgres DB; API + policy from that tree.
20
- E2E `e2e-desktop-observer.txt`: **20/20 PASS** (per-installation `dev_` desktops).
21
- Steps 17–18 answer the #108 M5 requirement (several desktops per owner): owner A
22
- enrolls a second desktop; the next message of the human-mode agent carries a key
23
- for BOTH of A's `dev_` JIDs (read from the outgoing stanza) and both desktops
24
- decrypt it; A revokes the second desktop (`revocation: enforced`); the next
25
- message carries no key for the revoked JID, still one for the remaining desktop,
26
- which decrypts it. The recipient set comes from
27
- `GET /v1/conversations/:id/recipients` before every encryption
28
- (`ConversationClient.recipients`), never from room occupants or affiliations.
29
- `onboarding-live.txt`: 3/3. `check.txt`: 76 tests, 73 pass, 0 fail, 3 skipped.
30
- `check-mcp.txt`: Inspector 2.7.0, 3 hosts.
@@ -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