@wacando/agent 0.0.0-stage → 2.0.0-rc.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.
- package/.agents/plugins/marketplace.json +10 -0
- package/.claude-plugin/marketplace.json +12 -0
- package/.cursor-plugin/marketplace.json +12 -0
- package/README.md +166 -2
- package/STATUS.md +121 -0
- package/THIRD-PARTY-NOTICES.txt +1928 -0
- package/adapters/README.md +12 -0
- package/adapters/claude/mcp.mjs +7 -0
- package/adapters/codex/mcp.mjs +7 -0
- package/adapters/cursor/mcp.mjs +7 -0
- package/bin/wacando-agent.mjs +243 -0
- package/docs/AGENT_TOOLS.md +129 -0
- package/docs/CURSOR_IDENTITY_RESUME.md +579 -0
- package/docs/MCP-AUDIT.md +355 -0
- package/docs/MCP-CONTRACT.md +138 -0
- package/docs/MIGRATION-2.0.md +36 -0
- package/docs/OMEMO_PREKEY_INTEGRATION.md +125 -0
- package/docs/ONBOARDING-VALIDATION.md +88 -0
- package/docs/ONBOARDING.md +212 -0
- package/docs/ONBOARDING_PLUGIN_CONTRACT.md +156 -0
- package/docs/PLUGIN_HANDOFF_FOLLOWUP.md +178 -0
- package/docs/PUBLIC_ONBOARDING_READINESS.md +156 -0
- package/docs/RELEASE.md +25 -0
- package/docs/WACANDO_PACKAGES.md +26 -0
- package/docs/evidence/issue-2/DOCUMENTARY_FOLLOWUP.md +107 -0
- package/docs/evidence/issue-2/QUALIFICATION_LINK_FOLLOWUP.md +105 -0
- package/docs/evidence/issue-2/REVIEW_FOLLOWUP.md +93 -0
- package/docs/evidence/issue-2/baseline.txt +76 -0
- package/docs/evidence/issue-2/check-mcp.txt +14 -0
- package/docs/evidence/issue-2/check.txt +376 -0
- package/docs/evidence/issue-2/codex-exec-help.json +11 -0
- package/docs/evidence/issue-2/codex-help.json +10 -0
- package/docs/evidence/issue-2/cursor-help.json +10 -0
- package/docs/evidence/issue-2/documentary-check.txt +376 -0
- package/docs/evidence/issue-2/documentary-validation.txt +7 -0
- package/docs/evidence/issue-2/local-build-api.txt +203 -0
- package/docs/evidence/issue-2/local-build-first.txt +87 -0
- package/docs/evidence/issue-2/local-build-policy-first.txt +34 -0
- package/docs/evidence/issue-2/local-build-policy.txt +153 -0
- package/docs/evidence/issue-2/local-build-web.txt +219 -0
- package/docs/evidence/issue-2/local-check-mcp.txt +14 -0
- package/docs/evidence/issue-2/local-check.txt +376 -0
- package/docs/evidence/issue-2/local-codex-probe.txt +3 -0
- package/docs/evidence/issue-2/local-codex-probe2.txt +3 -0
- package/docs/evidence/issue-2/local-codex.txt +2 -0
- package/docs/evidence/issue-2/local-cursor-probe.txt +1 -0
- package/docs/evidence/issue-2/local-cursor.txt +2 -0
- package/docs/evidence/issue-2/local-down.txt +32 -0
- package/docs/evidence/issue-2/local-health.txt +1 -0
- package/docs/evidence/issue-2/local-live.txt +28 -0
- package/docs/evidence/issue-2/local-seed.txt +26 -0
- package/docs/evidence/issue-2/local-status.txt +6 -0
- package/docs/evidence/issue-2/local-up.txt +18 -0
- package/docs/evidence/issue-2/prepare-local-stack.py +67 -0
- package/docs/evidence/issue-2/qualification-body-validation.txt +9 -0
- package/docs/evidence/issue-2/qualification-link-check.txt +376 -0
- package/docs/evidence/issue-2/qualification-link-validation.txt +20 -0
- package/docs/evidence/issue-2/review-check.txt +376 -0
- package/docs/evidence/issue-2/review-validation.txt +218 -0
- package/docs/evidence/issue-7/README.md +21 -0
- package/docs/evidence/issue-7/check-mcp.txt +9 -0
- package/docs/evidence/issue-7/check.txt +381 -0
- package/docs/evidence/issue-7/live.txt +23 -0
- package/docs/evidence/issue-8/README.md +56 -0
- package/docs/evidence/issue-8/check-mcp.txt +9 -0
- package/docs/evidence/issue-8/check.txt +465 -0
- package/docs/evidence/issue-8/e2e-desktop-observer-human-devices.txt +30 -0
- package/docs/evidence/issue-8/e2e-desktop-observer-main-without-109.txt +17 -0
- package/docs/evidence/issue-8/e2e-desktop-observer.txt +26 -0
- package/docs/evidence/issue-8/live-regression-human-devices.txt +24 -0
- package/docs/evidence/issue-8/live-regression.txt +23 -0
- package/docs/evidence/issue-8/review-fixes/README.md +30 -0
- package/docs/evidence/issue-8/review-fixes/check-mcp.txt +9 -0
- package/docs/evidence/issue-8/review-fixes/check.txt +484 -0
- package/docs/evidence/issue-8/review-fixes/e2e-desktop-observer.txt +28 -0
- package/docs/evidence/issue-8/review-fixes/onboarding-live.txt +15 -0
- package/docs/evidence/issue-8/review-fixes/session-replacement-live.txt +13 -0
- package/docs/evidence/npm-release/check-mcp.txt +9 -0
- package/docs/evidence/npm-release/check.txt +484 -0
- package/docs/evidence/npm-release/e2e-desktop-observer.txt +28 -0
- package/package.json +66 -4
- package/packages/core/limits.mjs +24 -0
- package/packages/core/store.mjs +92 -0
- package/packages/core/validation.mjs +25 -0
- package/packages/mcp/agent-tools.mjs +82 -0
- package/packages/mcp/server.mjs +161 -0
- package/packages/mcp/stdio.mjs +42 -0
- package/packages/onboarding/network.mjs +60 -0
- package/packages/onboarding/service.mjs +235 -0
- package/packages/onboarding/storage.mjs +99 -0
- package/packages/onboarding/version.mjs +2 -0
- package/packages/runtime/conversations.mjs +384 -0
- package/packages/runtime/device.mjs +34 -0
- package/packages/runtime/index.mjs +8 -0
- package/packages/runtime/pairing.mjs +110 -0
- package/packages/runtime/runtime.mjs +213 -0
- package/packages/runtime/session.mjs +52 -0
- package/packages/server/cli.mjs +18 -0
- package/packages/server/server.mjs +110 -0
- package/packages/server/stream.mjs +42 -0
- package/packages/web/app.js +85 -0
- package/packages/web/history.js +48 -0
- package/packages/web/index.html +17 -0
- package/packages/web/style.css +1 -0
- package/plugins/wacando/.codex-plugin/plugin.json +18 -0
- package/plugins/wacando/.mcp.json +8 -0
- package/plugins/wacando/skills/wacando/SKILL.md +33 -0
- package/plugins/wacando-claude/.claude-plugin/plugin.json +10 -0
- package/plugins/wacando-claude/.mcp.json +8 -0
- package/plugins/wacando-claude/README.md +88 -0
- package/plugins/wacando-claude/skills/open/SKILL.md +66 -0
- package/plugins/wacando-cursor/.cursor-plugin/plugin.json +11 -0
- package/plugins/wacando-cursor/README.md +48 -0
- package/plugins/wacando-cursor/commands/wacando-open.md +10 -0
- package/plugins/wacando-cursor/mcp.json +8 -0
- package/plugins/wacando-cursor/skills/wacando/SKILL.md +50 -0
- package/provenance.json +503 -0
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
$ npm ci && npm run check
|
|
2
|
+
added 83 packages in 1s
|
|
3
|
+
|
|
4
|
+
> wacando-agent@2.0.0 check
|
|
5
|
+
> node scripts/check-deps.mjs && npm run check:notices && npm test
|
|
6
|
+
|
|
7
|
+
Verified 3 pinned Wacando archives from https://github.com/lbframe/wacando @ 5f0f0a1f0ccc20c47383fed6f8e072aca5302486
|
|
8
|
+
|
|
9
|
+
> wacando-agent@2.0.0 check:notices
|
|
10
|
+
> node scripts/notices.mjs --check
|
|
11
|
+
|
|
12
|
+
Verified notices and provenance for 83 runtime packages
|
|
13
|
+
|
|
14
|
+
> wacando-agent@2.0.0 test
|
|
15
|
+
> node --test tests/*.test.mjs
|
|
16
|
+
|
|
17
|
+
TAP version 13
|
|
18
|
+
# Subtest: the ciphertext goes to the other agent and both owners, never to an unrelated party
|
|
19
|
+
ok 1 - the ciphertext goes to the other agent and both owners, never to an unrelated party
|
|
20
|
+
---
|
|
21
|
+
duration_ms: 1.913064
|
|
22
|
+
type: 'test'
|
|
23
|
+
...
|
|
24
|
+
# Subtest: a deleted side is not an encryption target and a stranger cannot view
|
|
25
|
+
ok 2 - a deleted side is not an encryption target and a stranger cannot view
|
|
26
|
+
---
|
|
27
|
+
duration_ms: 0.553594
|
|
28
|
+
type: 'test'
|
|
29
|
+
...
|
|
30
|
+
# Subtest: only an activated conversation counts as accepted, including after STOP
|
|
31
|
+
ok 3 - only an activated conversation counts as accepted, including after STOP
|
|
32
|
+
---
|
|
33
|
+
duration_ms: 0.204582
|
|
34
|
+
type: 'test'
|
|
35
|
+
...
|
|
36
|
+
# Subtest: the public summary never exposes owner identifiers
|
|
37
|
+
ok 4 - the public summary never exposes owner identifiers
|
|
38
|
+
---
|
|
39
|
+
duration_ms: 0.452813
|
|
40
|
+
type: 'test'
|
|
41
|
+
...
|
|
42
|
+
# Subtest: API refusals become explicit, content-free messages
|
|
43
|
+
ok 5 - API refusals become explicit, content-free messages
|
|
44
|
+
---
|
|
45
|
+
duration_ms: 0.362502
|
|
46
|
+
type: 'test'
|
|
47
|
+
...
|
|
48
|
+
# Subtest: recipient discovery returns both agents and every owner installation
|
|
49
|
+
ok 6 - recipient discovery returns both agents and every owner installation
|
|
50
|
+
---
|
|
51
|
+
duration_ms: 1.32376
|
|
52
|
+
type: 'test'
|
|
53
|
+
...
|
|
54
|
+
# Subtest: malformed or foreign recipient discovery fails closed
|
|
55
|
+
ok 7 - malformed or foreign recipient discovery fails closed
|
|
56
|
+
---
|
|
57
|
+
duration_ms: 0.363403
|
|
58
|
+
type: 'test'
|
|
59
|
+
...
|
|
60
|
+
# Subtest: discovery missing an owner or naming another agent fails closed
|
|
61
|
+
ok 8 - discovery missing an owner or naming another agent fails closed
|
|
62
|
+
---
|
|
63
|
+
duration_ms: 0.239362
|
|
64
|
+
type: 'test'
|
|
65
|
+
...
|
|
66
|
+
# Subtest: a server without recipient discovery is refused: never a usr_ fallback
|
|
67
|
+
ok 9 - a server without recipient discovery is refused: never a usr_ fallback
|
|
68
|
+
---
|
|
69
|
+
duration_ms: 0.931067
|
|
70
|
+
type: 'test'
|
|
71
|
+
...
|
|
72
|
+
# Subtest: cursor checker requires an affirmative parsed payload even when the wrapper says success
|
|
73
|
+
ok 10 - cursor checker requires an affirmative parsed payload even when the wrapper says success
|
|
74
|
+
---
|
|
75
|
+
duration_ms: 2.700059
|
|
76
|
+
type: 'test'
|
|
77
|
+
...
|
|
78
|
+
# Subtest: cursor checker distinguishes clear revocation from a crash, lock error or false connection
|
|
79
|
+
ok 11 - cursor checker distinguishes clear revocation from a crash, lock error or false connection
|
|
80
|
+
---
|
|
81
|
+
duration_ms: 1.671892
|
|
82
|
+
type: 'test'
|
|
83
|
+
...
|
|
84
|
+
# Subtest: codex checker requires an affirmative parsed payload even when the wrapper says success
|
|
85
|
+
ok 12 - codex checker requires an affirmative parsed payload even when the wrapper says success
|
|
86
|
+
---
|
|
87
|
+
duration_ms: 0.462614
|
|
88
|
+
type: 'test'
|
|
89
|
+
...
|
|
90
|
+
# Subtest: codex checker distinguishes clear revocation from a crash, lock error or false connection
|
|
91
|
+
ok 13 - codex checker distinguishes clear revocation from a crash, lock error or false connection
|
|
92
|
+
---
|
|
93
|
+
duration_ms: 0.376373
|
|
94
|
+
type: 'test'
|
|
95
|
+
...
|
|
96
|
+
# Subtest: checker requires verified:true for installation readiness
|
|
97
|
+
ok 14 - checker requires verified:true for installation readiness
|
|
98
|
+
---
|
|
99
|
+
duration_ms: 0.413213
|
|
100
|
+
type: 'test'
|
|
101
|
+
...
|
|
102
|
+
# Subtest: malformed viewer request targets return 400 without losing MCP events
|
|
103
|
+
ok 15 - malformed viewer request targets return 400 without losing MCP events
|
|
104
|
+
---
|
|
105
|
+
duration_ms: 218.267741
|
|
106
|
+
type: 'test'
|
|
107
|
+
...
|
|
108
|
+
# Subtest: MCP shutdown on EOF closes SSE and unfinished HTTP headers
|
|
109
|
+
ok 16 - MCP shutdown on EOF closes SSE and unfinished HTTP headers
|
|
110
|
+
---
|
|
111
|
+
duration_ms: 431.85532
|
|
112
|
+
type: 'test'
|
|
113
|
+
...
|
|
114
|
+
# Subtest: MCP shutdown on SIGTERM closes SSE and unfinished HTTP headers
|
|
115
|
+
ok 17 - MCP shutdown on SIGTERM closes SSE and unfinished HTTP headers
|
|
116
|
+
---
|
|
117
|
+
duration_ms: 427.484819
|
|
118
|
+
type: 'test'
|
|
119
|
+
...
|
|
120
|
+
# Subtest: HTTP and SSE snapshots use bounded pages and preserve large Unicode events
|
|
121
|
+
ok 18 - HTTP and SSE snapshots use bounded pages and preserve large Unicode events
|
|
122
|
+
---
|
|
123
|
+
duration_ms: 64.884598
|
|
124
|
+
type: 'test'
|
|
125
|
+
...
|
|
126
|
+
# Subtest: SSE client and queue limits isolate slow readers
|
|
127
|
+
ok 19 - SSE client and queue limits isolate slow readers
|
|
128
|
+
---
|
|
129
|
+
duration_ms: 13.218613
|
|
130
|
+
type: 'test'
|
|
131
|
+
...
|
|
132
|
+
# Subtest: legacy negotiation requires valid initialization and the initialized notification
|
|
133
|
+
ok 20 - legacy negotiation requires valid initialization and the initialized notification
|
|
134
|
+
---
|
|
135
|
+
duration_ms: 223.541398
|
|
136
|
+
type: 'test'
|
|
137
|
+
...
|
|
138
|
+
# Subtest: JSON-RPC rejects invalid IDs and parameters without answering responses or notifications
|
|
139
|
+
ok 21 - JSON-RPC rejects invalid IDs and parameters without answering responses or notifications
|
|
140
|
+
---
|
|
141
|
+
duration_ms: 189.556199
|
|
142
|
+
type: 'test'
|
|
143
|
+
...
|
|
144
|
+
# Subtest: tools enforce schemas, preserve Unicode limits, and never claim observed visibility
|
|
145
|
+
ok 22 - tools enforce schemas, preserve Unicode limits, and never claim observed visibility
|
|
146
|
+
---
|
|
147
|
+
duration_ms: 165.101046
|
|
148
|
+
type: 'test'
|
|
149
|
+
...
|
|
150
|
+
# Subtest: event pages obey encoded byte limits and traverse without losing filtered records
|
|
151
|
+
ok 23 - event pages obey encoded byte limits and traverse without losing filtered records
|
|
152
|
+
---
|
|
153
|
+
duration_ms: 13.076422
|
|
154
|
+
type: 'test'
|
|
155
|
+
...
|
|
156
|
+
# Subtest: retention is bounded by bytes as well as event count and reports eviction
|
|
157
|
+
ok 24 - retention is bounded by bytes as well as event count and reports eviction
|
|
158
|
+
---
|
|
159
|
+
duration_ms: 1.853303
|
|
160
|
+
type: 'test'
|
|
161
|
+
...
|
|
162
|
+
# Subtest: stdio framing handles split UTF-8, CRLF and escaped newlines with strict byte bounds
|
|
163
|
+
ok 25 - stdio framing handles split UTF-8, CRLF and escaped newlines with strict byte bounds
|
|
164
|
+
---
|
|
165
|
+
duration_ms: 2.783049
|
|
166
|
+
type: 'test'
|
|
167
|
+
...
|
|
168
|
+
# Subtest: an oversized unfinished frame closes the MCP process promptly
|
|
169
|
+
ok 26 - an oversized unfinished frame closes the MCP process promptly
|
|
170
|
+
---
|
|
171
|
+
duration_ms: 167.18603
|
|
172
|
+
type: 'test'
|
|
173
|
+
...
|
|
174
|
+
# Subtest: SIGTERM exits within a deadline even when the host stops reading stdout
|
|
175
|
+
ok 27 - SIGTERM exits within a deadline even when the host stops reading stdout
|
|
176
|
+
---
|
|
177
|
+
duration_ms: 1204.702647
|
|
178
|
+
type: 'test'
|
|
179
|
+
...
|
|
180
|
+
# Subtest: stdio writes wait for readers and reject stalled or oversized output
|
|
181
|
+
ok 28 - stdio writes wait for readers and reject stalled or oversized output
|
|
182
|
+
---
|
|
183
|
+
duration_ms: 1004.177181
|
|
184
|
+
type: 'test'
|
|
185
|
+
...
|
|
186
|
+
# Subtest: rate limiting admits bursts, rejects excess calls and refills over time
|
|
187
|
+
ok 29 - rate limiting admits bursts, rejects excess calls and refills over time
|
|
188
|
+
---
|
|
189
|
+
duration_ms: 0.408453
|
|
190
|
+
type: 'test'
|
|
191
|
+
...
|
|
192
|
+
# Subtest: MCP tool floods receive actionable rate-limit errors
|
|
193
|
+
ok 30 - MCP tool floods receive actionable rate-limit errors
|
|
194
|
+
---
|
|
195
|
+
duration_ms: 150.118501
|
|
196
|
+
type: 'test'
|
|
197
|
+
...
|
|
198
|
+
# Subtest: live dev API: codex installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
|
|
199
|
+
ok 31 - live dev API: codex installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation # SKIP
|
|
200
|
+
---
|
|
201
|
+
duration_ms: 0.929686
|
|
202
|
+
type: 'test'
|
|
203
|
+
...
|
|
204
|
+
# Subtest: live dev API: cursor installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
|
|
205
|
+
ok 32 - live dev API: cursor installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation # SKIP
|
|
206
|
+
---
|
|
207
|
+
duration_ms: 0.151361
|
|
208
|
+
type: 'test'
|
|
209
|
+
...
|
|
210
|
+
# Subtest: live dev API: claude installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
|
|
211
|
+
ok 33 - live dev API: claude installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation # SKIP
|
|
212
|
+
---
|
|
213
|
+
duration_ms: 0.139571
|
|
214
|
+
type: 'test'
|
|
215
|
+
...
|
|
216
|
+
# cursor: delayed shutdown released session lock; OMEMO snapshot unchanged
|
|
217
|
+
# Subtest: cursor shutdown waits for session cleanup and releases its own lock without changing keys
|
|
218
|
+
ok 34 - cursor shutdown waits for session cleanup and releases its own lock without changing keys
|
|
219
|
+
---
|
|
220
|
+
duration_ms: 1383.51414
|
|
221
|
+
type: 'test'
|
|
222
|
+
...
|
|
223
|
+
# codex: delayed shutdown released session lock; OMEMO snapshot unchanged
|
|
224
|
+
# Subtest: codex shutdown waits for session cleanup and releases its own lock without changing keys
|
|
225
|
+
ok 35 - codex shutdown waits for session cleanup and releases its own lock without changing keys
|
|
226
|
+
---
|
|
227
|
+
duration_ms: 1352.924604
|
|
228
|
+
type: 'test'
|
|
229
|
+
...
|
|
230
|
+
# Subtest: MCP shutdown finishes saving an in-flight verification response before exiting
|
|
231
|
+
ok 36 - MCP shutdown finishes saving an in-flight verification response before exiting
|
|
232
|
+
---
|
|
233
|
+
duration_ms: 1380.794222
|
|
234
|
+
type: 'test'
|
|
235
|
+
...
|
|
236
|
+
# Subtest: enrollment saves durable credential before XMPP, publishes before callback, and resumes without redemption
|
|
237
|
+
ok 37 - enrollment saves durable credential before XMPP, publishes before callback, and resumes without redemption
|
|
238
|
+
---
|
|
239
|
+
duration_ms: 255.456354
|
|
240
|
+
type: 'test'
|
|
241
|
+
...
|
|
242
|
+
# Subtest: origins, host identities and installations cannot be substituted
|
|
243
|
+
ok 38 - origins, host identities and installations cannot be substituted
|
|
244
|
+
---
|
|
245
|
+
duration_ms: 60.710659
|
|
246
|
+
type: 'test'
|
|
247
|
+
...
|
|
248
|
+
# Subtest: expiration, replay, wrong installation and revocation return safe actions
|
|
249
|
+
ok 39 - expiration, replay, wrong installation and revocation return safe actions
|
|
250
|
+
---
|
|
251
|
+
duration_ms: 96.764984
|
|
252
|
+
type: 'test'
|
|
253
|
+
...
|
|
254
|
+
# Subtest: background heartbeats preserve the stream and retry outages with bounded backoff and safe diagnostics
|
|
255
|
+
ok 40 - background heartbeats preserve the stream and retry outages with bounded backoff and safe diagnostics
|
|
256
|
+
---
|
|
257
|
+
duration_ms: 193.656108
|
|
258
|
+
type: 'test'
|
|
259
|
+
...
|
|
260
|
+
# Subtest: failed initial connection recovers in background without another redemption and close cancels retries
|
|
261
|
+
ok 41 - failed initial connection recovers in background without another redemption and close cancels retries
|
|
262
|
+
---
|
|
263
|
+
duration_ms: 53.733709
|
|
264
|
+
type: 'test'
|
|
265
|
+
...
|
|
266
|
+
# Subtest: failed XMPP ping closes only the broken stream and obtains a fresh grant on automatic retry
|
|
267
|
+
ok 42 - failed XMPP ping closes only the broken stream and obtains a fresh grant on automatic retry
|
|
268
|
+
---
|
|
269
|
+
duration_ms: 106.25227
|
|
270
|
+
type: 'test'
|
|
271
|
+
...
|
|
272
|
+
# Subtest: shutdown waits for a background grant request and prevents a new session after closing
|
|
273
|
+
ok 43 - shutdown waits for a background grant request and prevents a new session after closing
|
|
274
|
+
---
|
|
275
|
+
duration_ms: 30.368505
|
|
276
|
+
type: 'test'
|
|
277
|
+
...
|
|
278
|
+
# Subtest: failed OMEMO registration preserves credential, suppresses connected callback, and resumes
|
|
279
|
+
ok 44 - failed OMEMO registration preserves credential, suppresses connected callback, and resumes
|
|
280
|
+
---
|
|
281
|
+
duration_ms: 29.373307
|
|
282
|
+
type: 'test'
|
|
283
|
+
...
|
|
284
|
+
# Subtest: lost redemption and failed persistence never claim success
|
|
285
|
+
ok 45 - lost redemption and failed persistence never claim success
|
|
286
|
+
---
|
|
287
|
+
duration_ms: 21.24677
|
|
288
|
+
type: 'test'
|
|
289
|
+
...
|
|
290
|
+
# Subtest: unsafe permissions, symlinks and concurrent writes fail closed
|
|
291
|
+
ok 46 - unsafe permissions, symlinks and concurrent writes fail closed
|
|
292
|
+
---
|
|
293
|
+
duration_ms: 2.165316
|
|
294
|
+
type: 'test'
|
|
295
|
+
...
|
|
296
|
+
# Subtest: HTTP policy rejects non-loopback cleartext, URL credentials and redirects
|
|
297
|
+
ok 47 - HTTP policy rejects non-loopback cleartext, URL credentials and redirects
|
|
298
|
+
---
|
|
299
|
+
duration_ms: 15.754561
|
|
300
|
+
type: 'test'
|
|
301
|
+
...
|
|
302
|
+
# Subtest: existing native OMEMO identity survives reload; corrupt state is never regenerated
|
|
303
|
+
ok 48 - existing native OMEMO identity survives reload; corrupt state is never regenerated
|
|
304
|
+
---
|
|
305
|
+
duration_ms: 11.34871
|
|
306
|
+
type: 'test'
|
|
307
|
+
...
|
|
308
|
+
# Subtest: unsafe native OMEMO state permissions fail closed
|
|
309
|
+
ok 49 - unsafe native OMEMO state permissions fail closed
|
|
310
|
+
---
|
|
311
|
+
duration_ms: 7.999176
|
|
312
|
+
type: 'test'
|
|
313
|
+
...
|
|
314
|
+
# Subtest: a 1.x classic OMEMO identity is refused with re-enrollment guidance and left untouched
|
|
315
|
+
ok 50 - a 1.x classic OMEMO identity is refused with re-enrollment guidance and left untouched
|
|
316
|
+
---
|
|
317
|
+
duration_ms: 0.907586
|
|
318
|
+
type: 'test'
|
|
319
|
+
...
|
|
320
|
+
# Subtest: installed MCP tools verify via HTTP and never expose response credentials
|
|
321
|
+
ok 51 - installed MCP tools verify via HTTP and never expose response credentials
|
|
322
|
+
---
|
|
323
|
+
duration_ms: 191.07641
|
|
324
|
+
type: 'test'
|
|
325
|
+
...
|
|
326
|
+
# Subtest: cursor packaged MCP rejects a locally revoked identity without crashing or reporting connection
|
|
327
|
+
ok 52 - cursor packaged MCP rejects a locally revoked identity without crashing or reporting connection
|
|
328
|
+
---
|
|
329
|
+
duration_ms: 255.942927
|
|
330
|
+
type: 'test'
|
|
331
|
+
...
|
|
332
|
+
# Subtest: codex packaged MCP rejects a locally revoked identity without crashing or reporting connection
|
|
333
|
+
ok 53 - codex packaged MCP rejects a locally revoked identity without crashing or reporting connection
|
|
334
|
+
---
|
|
335
|
+
duration_ms: 301.052536
|
|
336
|
+
type: 'test'
|
|
337
|
+
...
|
|
338
|
+
# Subtest: a replaced session is terminal and never logs back in (the stream error arrives first)
|
|
339
|
+
ok 54 - a replaced session is terminal and never logs back in (the stream error arrives first)
|
|
340
|
+
---
|
|
341
|
+
duration_ms: 25.51241
|
|
342
|
+
type: 'test'
|
|
343
|
+
...
|
|
344
|
+
# Subtest: a replaced session is terminal and never logs back in (only the heartbeat notices it)
|
|
345
|
+
ok 55 - a replaced session is terminal and never logs back in (only the heartbeat notices it)
|
|
346
|
+
---
|
|
347
|
+
duration_ms: 105.090322
|
|
348
|
+
type: 'test'
|
|
349
|
+
...
|
|
350
|
+
# Subtest: release version matches all manifests
|
|
351
|
+
ok 56 - release version matches all manifests
|
|
352
|
+
---
|
|
353
|
+
duration_ms: 5.69621
|
|
354
|
+
type: 'test'
|
|
355
|
+
...
|
|
356
|
+
# Subtest: npm tarball installs the runtime with official libsignal and its thin plugins start it
|
|
357
|
+
ok 57 - npm tarball installs the runtime with official libsignal and its thin plugins start it
|
|
358
|
+
---
|
|
359
|
+
duration_ms: 2989.604911
|
|
360
|
+
type: 'test'
|
|
361
|
+
...
|
|
362
|
+
# Subtest: redeem and claim proofs match the API interoperability vectors byte for byte
|
|
363
|
+
ok 58 - redeem and claim proofs match the API interoperability vectors byte for byte
|
|
364
|
+
---
|
|
365
|
+
duration_ms: 2.053354
|
|
366
|
+
type: 'test'
|
|
367
|
+
...
|
|
368
|
+
# Subtest: runtime metadata is bounded display text without control characters
|
|
369
|
+
ok 59 - runtime metadata is bounded display text without control characters
|
|
370
|
+
---
|
|
371
|
+
duration_ms: 0.315332
|
|
372
|
+
type: 'test'
|
|
373
|
+
...
|
|
374
|
+
# Subtest: redeem refuses malformed codes before any request and persists the key before redeeming
|
|
375
|
+
ok 60 - redeem refuses malformed codes before any request and persists the key before redeeming
|
|
376
|
+
---
|
|
377
|
+
duration_ms: 2.84714
|
|
378
|
+
type: 'test'
|
|
379
|
+
...
|
|
380
|
+
# Subtest: claim polls every 5 s while pending, honours Retry-After, and ends at the local deadline
|
|
381
|
+
ok 61 - claim polls every 5 s while pending, honours Retry-After, and ends at the local deadline
|
|
382
|
+
---
|
|
383
|
+
duration_ms: 2.290126
|
|
384
|
+
type: 'test'
|
|
385
|
+
...
|
|
386
|
+
# Subtest: a confirmed pairing saves the credential locally and returns no secret
|
|
387
|
+
ok 62 - a confirmed pairing saves the credential locally and returns no secret
|
|
388
|
+
---
|
|
389
|
+
duration_ms: 243.773772
|
|
390
|
+
type: 'test'
|
|
391
|
+
...
|
|
392
|
+
# Subtest: a refused code or an unconfirmed pairing leaves no partial identity
|
|
393
|
+
ok 63 - a refused code or an unconfirmed pairing leaves no partial identity
|
|
394
|
+
---
|
|
395
|
+
duration_ms: 154.663842
|
|
396
|
+
type: 'test'
|
|
397
|
+
...
|
|
398
|
+
# Subtest: a pairing interrupted after redeem resumes with the same key and poll secret
|
|
399
|
+
ok 64 - a pairing interrupted after redeem resumes with the same key and poll secret
|
|
400
|
+
---
|
|
401
|
+
duration_ms: 215.28805
|
|
402
|
+
type: 'test'
|
|
403
|
+
...
|
|
404
|
+
# Subtest: codex plugin is a thin wrapper that starts this runtime and records its own provider
|
|
405
|
+
ok 65 - codex plugin is a thin wrapper that starts this runtime and records its own provider
|
|
406
|
+
---
|
|
407
|
+
duration_ms: 249.823664
|
|
408
|
+
type: 'test'
|
|
409
|
+
...
|
|
410
|
+
# Subtest: cursor plugin is a thin wrapper that starts this runtime and records its own provider
|
|
411
|
+
ok 66 - cursor plugin is a thin wrapper that starts this runtime and records its own provider
|
|
412
|
+
---
|
|
413
|
+
duration_ms: 212.058787
|
|
414
|
+
type: 'test'
|
|
415
|
+
...
|
|
416
|
+
# Subtest: claude plugin is a thin wrapper that starts this runtime and records its own provider
|
|
417
|
+
ok 67 - claude plugin is a thin wrapper that starts this runtime and records its own provider
|
|
418
|
+
---
|
|
419
|
+
duration_ms: 194.07821
|
|
420
|
+
type: 'test'
|
|
421
|
+
...
|
|
422
|
+
# Subtest: Claude, Cursor and Codex MCP processes have independent stores and ports
|
|
423
|
+
ok 68 - Claude, Cursor and Codex MCP processes have independent stores and ports
|
|
424
|
+
---
|
|
425
|
+
duration_ms: 202.056896
|
|
426
|
+
type: 'test'
|
|
427
|
+
...
|
|
428
|
+
# Subtest: installer refuses to overwrite an existing installation
|
|
429
|
+
ok 69 - installer refuses to overwrite an existing installation
|
|
430
|
+
---
|
|
431
|
+
duration_ms: 66.157557
|
|
432
|
+
type: 'test'
|
|
433
|
+
...
|
|
434
|
+
# Subtest: store validates messages, orders events and bounds retention
|
|
435
|
+
ok 70 - store validates messages, orders events and bounds retention
|
|
436
|
+
---
|
|
437
|
+
duration_ms: 1.839893
|
|
438
|
+
type: 'test'
|
|
439
|
+
...
|
|
440
|
+
# Subtest: loopback viewer serves assets and blocks cross-origin writes and traversal
|
|
441
|
+
ok 71 - loopback viewer serves assets and blocks cross-origin writes and traversal
|
|
442
|
+
---
|
|
443
|
+
duration_ms: 46.851681
|
|
444
|
+
type: 'test'
|
|
445
|
+
...
|
|
446
|
+
# Subtest: SSE delivers snapshot and live message, reconnect recovers snapshot
|
|
447
|
+
ok 72 - SSE delivers snapshot and live message, reconnect recovers snapshot
|
|
448
|
+
---
|
|
449
|
+
duration_ms: 263.45985
|
|
450
|
+
type: 'test'
|
|
451
|
+
...
|
|
452
|
+
# Subtest: MCP starts HTTP, records events and shuts down on stdin EOF
|
|
453
|
+
ok 73 - MCP starts HTTP, records events and shuts down on stdin EOF
|
|
454
|
+
---
|
|
455
|
+
duration_ms: 167.710714
|
|
456
|
+
type: 'test'
|
|
457
|
+
...
|
|
458
|
+
# Subtest: late history pages cannot duplicate live events, resurrect evictions or replace a new connection
|
|
459
|
+
ok 74 - late history pages cannot duplicate live events, resurrect evictions or replace a new connection
|
|
460
|
+
---
|
|
461
|
+
duration_ms: 1.275379
|
|
462
|
+
type: 'test'
|
|
463
|
+
...
|
|
464
|
+
# Subtest: history loading pins the snapshot sequence, follows cursors and respects cancellation
|
|
465
|
+
ok 75 - history loading pins the snapshot sequence, follows cursors and respects cancellation
|
|
466
|
+
---
|
|
467
|
+
duration_ms: 0.826555
|
|
468
|
+
type: 'test'
|
|
469
|
+
...
|
|
470
|
+
# Subtest: rate-limited history loading resumes from the same page instead of restarting the stream
|
|
471
|
+
ok 76 - rate-limited history loading resumes from the same page instead of restarting the stream
|
|
472
|
+
---
|
|
473
|
+
duration_ms: 1001.869705
|
|
474
|
+
type: 'test'
|
|
475
|
+
...
|
|
476
|
+
1..76
|
|
477
|
+
# tests 76
|
|
478
|
+
# suites 0
|
|
479
|
+
# pass 73
|
|
480
|
+
# fail 0
|
|
481
|
+
# cancelled 0
|
|
482
|
+
# skipped 3
|
|
483
|
+
# todo 0
|
|
484
|
+
# duration_ms 4318.525607
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# stack: lbframe/wacando #108 head 6198d92 + #109 merged locally (278968b); WACANDO_CHECKOUT=<work>/wacando-int
|
|
2
|
+
$ tsx scripts/e2e-desktop-observer.mts
|
|
3
|
+
PASS 01 two owners signed up (5b5ec631-3a26-4e33-a693-62fb5166da22, 87aa3afa-73c1-436a-95ba-1f69d8913d8b)
|
|
4
|
+
PASS 02 CLI `wacando-agent pair` -> @e2eafeaac3e01a/bot (service), owner confirmed after checking the key fingerprint
|
|
5
|
+
PASS 03 MCP tool `wacando_pair` -> @e2eb8e80c8642d/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_c4f58a0f-5a35-4900-b6c9-ef4bfb5f694f 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 enrolled per-installation devices (dev_c4321fb940caa9f458861bf441f2993f, dev_f12570ea75a33bffaf84a355fb36f715), published official-libsignal bundles, were activated and observe the room
|
|
11
|
+
PASS 09 first message held by the policy component (stanza om-a000ba718bbb80a6), 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 owner A added a second desktop (dev_6835473dc8eaa8c90d5e841f2be2c9b1): the runtime discovered it before sending and both desktops decrypted the message
|
|
20
|
+
PASS 18 owner A revoked that desktop: the next message carries no key for dev_6835473dc8eaa8c90d5e841f2be2c9b1, the remaining desktop still decrypts it
|
|
21
|
+
PASS 19 after STOP by an owner both agents are refused explicitly; nothing is sent
|
|
22
|
+
canary-scan: dumping mnesia via /home/ejabberd/bin/ejabberdctl
|
|
23
|
+
canary-scan: scanning dump + logs + spool for canary
|
|
24
|
+
canary-scan: total occurrences of canary: 0
|
|
25
|
+
canary-scan: PASS — plaintext absent from server-side storage
|
|
26
|
+
PASS 20 plaintext canary absent from ejabberd storage (MAM, offline, pubsub, logs), API/policy logs and runtime output
|
|
27
|
+
E2E RESULT: PASS
|
|
28
|
+
exit=0
|
|
@@ -0,0 +1,15 @@
|
|
|
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 7122.277049
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# stack: lbframe/wacando PR #108 head 6198d92 (already merges main f21f742 incl. #106) + PR #109 merged locally -> 278968b; ejabberd 26.07 from that tree's ci-up.sh; fresh DB
|
|
2
|
+
$ WACANDO_LIVE_TEST_ORIGIN=http://localhost:43001 node scripts/check-daemon-live.mjs
|
|
3
|
+
enrolled @daemon_ed9a6fd46c77/bot for host "cli" (synthetic owner)
|
|
4
|
+
status: [{"agentId":"agt_e3c98714-530d-4b99-9f2c-a9094b3d658e","handle":"@daemon_ed9a6fd46c77/bot","origin":"http://localhost:43001","mode":"human","revoked":false,"connection":"disconnected"}]
|
|
5
|
+
daemon: connected (grant, native OMEMO publication, presence echo, API callback) and running
|
|
6
|
+
second daemon on the same identity: refused by the identity lock
|
|
7
|
+
daemon: SIGTERM -> clean exit 0, lock released
|
|
8
|
+
daemon restarted on the same saved identity and keys: connected again
|
|
9
|
+
second copy connected; the first daemon got <conflict/>, reported SESSION_REPLACED and exited 3
|
|
10
|
+
after 135 s (two heartbeats) the newer daemon is still connected and was never replaced back; no ping-pong
|
|
11
|
+
exit=0
|
|
12
|
+
$ docker logs wacando-agentside-ejabberd | grep -c "Replaced by new connection" # whole run incl. the 135 s observation
|
|
13
|
+
1
|