@cello-protocol/daemon 0.0.221 → 0.0.223

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 (42) hide show
  1. package/dist/agent-admin-handlers.js +1 -1
  2. package/dist/agent-admin-handlers.js.map +1 -1
  3. package/dist/attendance-wiring.d.ts.map +1 -1
  4. package/dist/attendance-wiring.js +9 -0
  5. package/dist/attendance-wiring.js.map +1 -1
  6. package/dist/away-detection.d.ts.map +1 -1
  7. package/dist/away-detection.js +5 -3
  8. package/dist/away-detection.js.map +1 -1
  9. package/dist/away-inbox-oneshot.d.ts +40 -0
  10. package/dist/away-inbox-oneshot.d.ts.map +1 -0
  11. package/dist/away-inbox-oneshot.js +311 -0
  12. package/dist/away-inbox-oneshot.js.map +1 -0
  13. package/dist/daemon.d.ts.map +1 -1
  14. package/dist/daemon.js +11 -5
  15. package/dist/daemon.js.map +1 -1
  16. package/dist/outbound-sessions.js +2 -2
  17. package/dist/outbound-sessions.js.map +1 -1
  18. package/dist/seal-coordinator.js +1 -1
  19. package/dist/seal-coordinator.js.map +1 -1
  20. package/dist/seal-evidence-root-check.d.ts +70 -0
  21. package/dist/seal-evidence-root-check.d.ts.map +1 -0
  22. package/dist/seal-evidence-root-check.js +199 -0
  23. package/dist/seal-evidence-root-check.js.map +1 -0
  24. package/dist/send-claims.d.ts +56 -0
  25. package/dist/send-claims.d.ts.map +1 -0
  26. package/dist/send-claims.js +50 -0
  27. package/dist/send-claims.js.map +1 -0
  28. package/dist/session-ceremony.d.ts +3 -1
  29. package/dist/session-ceremony.d.ts.map +1 -1
  30. package/dist/session-ceremony.js +3 -1
  31. package/dist/session-ceremony.js.map +1 -1
  32. package/dist/session-content-handlers.d.ts +3 -0
  33. package/dist/session-content-handlers.d.ts.map +1 -1
  34. package/dist/session-content-handlers.js +24 -23
  35. package/dist/session-content-handlers.js.map +1 -1
  36. package/dist/session-seal.d.ts +1 -1
  37. package/dist/session-seal.d.ts.map +1 -1
  38. package/dist/session-seal.js +6 -2
  39. package/dist/session-seal.js.map +1 -1
  40. package/dist/signaling-wiring.js +4 -4
  41. package/dist/signaling-wiring.js.map +1 -1
  42. package/package.json +3 -3
@@ -27,7 +27,7 @@ export function registerAgentAdminHandlers(deps) {
27
27
  persistence: getPersistence(agentName),
28
28
  agentPubkeyHex: loaded.pubkey,
29
29
  // DOD-M15-SEALWIRE-1 bullet 2 (review F1): gate the co-signature on the root check.
30
- verifyCertifiedRoot: (pub, sid, root, leaves) => sessionNodeManager.verifyCertifiedRoot(pub, sid, root, leaves),
30
+ verifyCertifiedRoot: (pub, sid, root, leaves, evidence) => sessionNodeManager.verifyCertifiedRoot(pub, sid, root, leaves, evidence),
31
31
  keyProvider: loaded.keyProvider,
32
32
  getNode: entry.getNode,
33
33
  getDirectoryEndpoint: getFailoverEndpoint,
@@ -1 +1 @@
1
- {"version":3,"file":"agent-admin-handlers.js","sourceRoot":"","sources":["../src/agent-admin-handlers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-admin-handlers.js","sourceRoot":"","sources":["../src/agent-admin-handlers.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAgCxD,MAAM,UAAU,0BAA0B,CAAC,IAAoB;IAC7D,MAAM,EACJ,QAAQ,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EACrF,cAAc,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,uBAAuB,EACrF,mBAAmB,EAAE,YAAY,GAClC,GAAG,IAAI,CAAC;IAET,6FAA6F;IAC7F,QAAQ,CAAC,GAAG,CAAC,sBAAsB,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE;QAClE,MAAM,SAAS,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,KAA2B,CAAC,CAAC,CAAC,4CAA4C;QACnI,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,uFAAuF;YACvF,6FAA6F;YAC7F,8FAA8F;YAC9F,iGAAiG;YACjG,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,+FAA+F,EAAE,CAAC;QAC9J,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,QAAQ,EAAE,mBAAmB,SAAS,gCAAgC,EAAE,CAAC;QAC1H,CAAC;QACD,iGAAiG;QACjG,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9E,MAAM,SAAS,GAAG,MAAM,yBAAyB,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC3E,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,QAAQ,EAAE,8EAA8E,EAAE,CAAC;QAClJ,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACnC,SAAS;YACT,WAAW,EAAE,cAAc,CAAC,SAAS,CAAC;YACtC,cAAc,EAAE,MAAM,CAAC,MAAM;YAC7B,oFAAoF;YACpF,mBAAmB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC;YACnI,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,oBAAoB,EAAE,mBAAmB;YACzC,sBAAsB,EAAE,uBAAuB;YAC/C,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,MAAM;YACN,+FAA+F;YAC/F,4EAA4E;YAC5E,iBAAiB,EAAE,CAAC,IAAY,EAAE,GAAW,EAAE,MAAc,EAAE,IAA8B,EAAE,EAAE,CAC/F,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC;SACzE,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,yFAAyF,EAAE,CAAC;QACnJ,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,aAAa,EAAE,uBAAuB,EAAE,MAAM,CAAC,qBAAqB,EAAE,CAAC;IAC3I,CAAC,CAAC,CAAC;IAEH,oGAAoG;IACpG,QAAQ,CAAC,GAAG,CAAC,0BAA0B,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE;QACtE,MAAM,SAAS,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,KAA2B,CAAC,CAAC,CAAC,4CAA4C;QACnI,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,yEAAyE;YACzE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,sGAAsG,EAAE,CAAC;QACrK,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,QAAQ,EAAE,mBAAmB,SAAS,IAAI,EAAE,CAAC;QAC9F,CAAC;QACD,MAAM,YAAY,GAAG,OAAO,MAAM,EAAE,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAE,MAAM,CAAC,UAAqB,CAAC,CAAC,CAAC,SAAS,CAAC;QACxG,MAAM,QAAQ,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5F,QAAQ,EAAE,CAAC,CAAC,OAAO;YACnB,UAAU,EAAE,CAAC,CAAC,YAAY;YAC1B,QAAQ,EAAE,CAAC,CAAC,OAAO;YACnB,eAAe,EAAE,CAAC,CAAC,cAAc;YACjC,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,aAAa,EAAE,CAAC,CAAC,YAAY;YAC7B,8FAA8F;YAC9F,6FAA6F;YAC7F,gBAAgB,EAAE,CAAC,CAAC,cAAc;SACnC,CAAC,CAAC,CAAC;QACJ,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"attendance-wiring.d.ts","sourceRoot":"","sources":["../src/attendance-wiring.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAOrE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,kBAAkB,CAAC;IACvC;;;OAGG;IACH,kBAAkB,EAAE,WAAW,CAAC,MAAM,EAAE;QAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IACzE,2FAA2F;IAC3F,eAAe,EAAE,qBAAqB,CAAC;CACxC;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,oBAAoB;iCAqB3B,MAAM,KAAG,MAAM;kCAwBR,MAAM,aAAa,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;;;EA8JrF"}
1
+ {"version":3,"file":"attendance-wiring.d.ts","sourceRoot":"","sources":["../src/attendance-wiring.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAOrE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,kBAAkB,CAAC;IACvC;;;OAGG;IACH,kBAAkB,EAAE,WAAW,CAAC,MAAM,EAAE;QAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IACzE,2FAA2F;IAC3F,eAAe,EAAE,qBAAqB,CAAC;CACxC;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,oBAAoB;iCAqB3B,MAAM,KAAG,MAAM;kCAgCR,MAAM,aAAa,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;;;EAiKrF"}
@@ -72,6 +72,13 @@ export function createAttendanceWiring(deps) {
72
72
  * rather than defaulted: a second value is what let this function be reached from an existing
73
73
  * session, and a default would leave that call compiling.
74
74
  */
75
+ /**
76
+ * "WE GREETED THEM" — DOD-INBOX-ONESHOT-1, NOT the same fact as `dedupKey`, which is set before the
77
+ * send and stays set on the screened-out branch where nothing reached the caller. The one-shot
78
+ * closes a visit for having told the caller the rule, so it keys off a greeting that went out; a
79
+ * queued one counts — witnessed, leafed, on its way.
80
+ */
81
+ const markGreeted = (agentName, sessionId) => void awayAckSent.add(`${agentName}:${sessionId}:greeted`);
75
82
  async function sendAwayResponse(agentName, sessionId) {
76
83
  if (isAttended(agentName))
77
84
  return;
@@ -202,6 +209,7 @@ export function createAttendanceWiring(deps) {
202
209
  committed: placedQueued.placed,
203
210
  reason: sendResult.reason, cause: sendResult.cause,
204
211
  });
212
+ markGreeted(agentName, sessionId);
205
213
  return;
206
214
  }
207
215
  // DOD-M12B-INDEX-1: the away responder fires while inbound is still arriving, so it is the
@@ -215,6 +223,7 @@ export function createAttendanceWiring(deps) {
215
223
  sequenceNumber: placedReply.placed ? placedReply.leafIndex : placedReply.heldAt,
216
224
  committed: placedReply.placed,
217
225
  });
226
+ markGreeted(agentName, sessionId);
218
227
  }
219
228
  catch (err) {
220
229
  // Same as above: the clear is correct and currently unreachable — nothing re-enters this
@@ -1 +1 @@
1
- {"version":3,"file":"attendance-wiring.js","sourceRoot":"","sources":["../src/attendance-wiring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAczD,MAAM,UAAU,sBAAsB,CAAC,IAA0B;IAC/D,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IAEjF,kFAAkF;IAClF,2FAA2F;IAC3F,+FAA+F;IAC/F,iGAAiG;IACjG,+FAA+F;IAC/F,mDAAmD;IACnD,4FAA4F;IAC5F,gFAAgF;IAChF,8FAA8F;IAC9F,SAAS,UAAU,CAAC,SAAiB;QACnC,KAAK,MAAM,CAAC,IAAI,kBAAkB,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,CAAC,YAAY,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC;QAC3F,OAAO,KAAK,CAAC;IACf,CAAC;IACD,gGAAgG;IAChG,kGAAkG;IAClG,kGAAkG;IAClG,uFAAuF;IACvF,kGAAkG;IAClG,SAAS,eAAe,CAAC,SAAiB;QACxC,OAAO,eAAe,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;IACxD,CAAC;IACD;;;;;;OAMG;IACH,MAAM,eAAe,GAAG,IAAI,GAAG,EAAoB,CAAC;IACpD,+FAA+F;IAC/F,gGAAgG;IAChG,2FAA2F;IAC3F,6FAA6F;IAC7F,oGAAoG;IACpG,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC;;;;;;OAMG;IACH,KAAK,UAAU,gBAAgB,CAAC,SAAiB,EAAE,SAAiB;QAClE,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO;QAClC;;;;;WAKG;QACH,MAAM,IAAI,GAAG,SAAkB,CAAC;QAChC,MAAM,QAAQ,GAAG,GAAG,SAAS,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QACrD,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO;QACtC,MAAM,MAAM,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO;QAClD,6FAA6F;QAC7F,yFAAyF;QACzF,6FAA6F;QAC7F,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAClF,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,wEAAwE;QACnG,IAAI,CAAC;YACH,0FAA0F;YAC1F,sFAAsF;YACtF,2FAA2F;YAC3F,8FAA8F;YAC9F,qFAAqF;YACrF,yFAAyF;YACzF,6FAA6F;YAC7F,kFAAkF;YAClF,MAAM,QAAQ,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,SAAS,EAAE,MAAM,CAAC,mBAAmB,CAAC;mBACxF,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACxC,8FAA8F;YAC9F,kGAAkG;YAClG,MAAM,MAAM,GAAG,GAAG,SAAS,IAAI,SAAS,QAAQ,QAAQ,EAAE,CAAC;YAC3D,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,iCAAiC,EAAE,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC9K,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACxB,MAAM,UAAU,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACtD,+FAA+F;YAC/F,iGAAiG;YACjG,kGAAkG;YAClG,4CAA4C;YAC5C,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,cAAc,CAAC,UAAU,EAAE;gBACnE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE;aACzE,CAAC,CAAC;YACH,IAAI,WAAW,CAAC,WAAW,KAAK,OAAO,IAAI,WAAW,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;gBAC9E,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;gBACxH,OAAO;YACT,CAAC;YACD,IAAI,WAAW,CAAC,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC9E,MAAM,CAAC,KAAK,CAAC,8CAA8C,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7F,OAAO;YACT,CAAC;YACD,0FAA0F;YAC1F,8FAA8F;YAC9F,8FAA8F;YAC9F,0FAA0F;YAC1F,6FAA6F;YAC7F,qFAAqF;YACrF,MAAM,aAAa,GAAG,WAAW,CAAC,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,OAAO,KAAK,SAAS;gBAC7F,CAAC,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC;gBACrC,CAAC,CAAC,UAAU,CAAC;YACf,MAAM,YAAY,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAC3C,eAAe,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CACzD,CAAC;YACF,kKAAkK;YAClK,kBAAkB,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAC7D,wFAAwF;YACxF,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,qBAAqB,CAAC,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;YAChG,iGAAiG;YACjG,gGAAgG;YAChG,oGAAoG;YACpG,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC3D,IAAI,kBAAkB,CAAC,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1F,MAAM,CAAC,IAAI,CAAC,4CAA4C,EAAE;oBACxD,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,wCAAwC;oBACzG,MAAM,EAAE,2FAA2F;iBACpG,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9J,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;gBAC1C,+EAA+E;gBAC/E,EAAE;gBACF,uFAAuF;gBACvF,yFAAyF;gBACzF,6FAA6F;gBAC7F,uFAAuF;gBACvF,0CAA0C;gBAC1C,EAAE;gBACF,sFAAsF;gBACtF,2FAA2F;gBAC3F,4EAA4E;gBAC5E,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACzD,wFAAwF;gBACxF,4FAA4F;gBAC5F,8DAA8D;gBAC9D,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE;oBAC3C,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK;oBAC9E,MAAM,EAAE,sFAAsF;iBAC/F,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC9D,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;gBACnB,yFAAyF;gBACzF,4FAA4F;gBAC5F,6FAA6F;gBAC7F,yFAAyF;gBACzF,iFAAiF;gBACjF,EAAE;gBACF,0FAA0F;gBAC1F,kEAAkE;gBAClE,uFAAuF;gBACvF,+BAA+B;gBAC/B,wFAAwF;gBACxF,6FAA6F;gBAC7F,sFAAsF;gBACtF,MAAM,YAAY,GAAG,kBAAkB,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,CAAC,cAAc,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;gBACrL,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;oBACxB,kBAAkB,CAAC,uBAAuB,CAAC,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC3J,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE;oBAC5C,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO;oBACnC,cAAc,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM;oBAClF,SAAS,EAAE,YAAY,CAAC,MAAM;oBAC9B,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK;iBACnD,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,2FAA2F;YAC3F,0FAA0F;YAC1F,MAAM,WAAW,GAAG,kBAAkB,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,CAAC,cAAc,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;YACpL,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;gBACvB,kBAAkB,CAAC,uBAAuB,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;YAC1J,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;gBACxC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO;gBACnC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM;gBAC/E,SAAS,EAAE,WAAW,CAAC,MAAM;aAC9B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,yFAAyF;YACzF,2FAA2F;YAC3F,8FAA8F;YAC9F,uDAAuD;YACvD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,8FAA8F;YAC9F,8FAA8F;YAC9F,0FAA0F;YAC1F,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE;gBAC1C,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC;gBAC3D,MAAM,EAAE,iFAAiF;aAC1F,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,+FAA+F;IAC/F,gGAAgG;IAChG,gDAAgD;IAChD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EAAE,CAAC;AAC7E,CAAC"}
1
+ {"version":3,"file":"attendance-wiring.js","sourceRoot":"","sources":["../src/attendance-wiring.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"away-detection.d.ts","sourceRoot":"","sources":["../src/away-detection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,mBAAmB,CAAC;AA0BvD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,sFAAsF;AACtF,eAAO,MAAM,qBAAqB;IAChC,wFAAwF;mCACpE,MAAM,KAAG,MAAM;IAInC;;;;;;;OAOG;;CAEK,CAAC;AAEX;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAG1E;AAGD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQxD"}
1
+ {"version":3,"file":"away-detection.d.ts","sourceRoot":"","sources":["../src/away-detection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,mBAAmB,CAAC;AA4BvD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,sFAAsF;AACtF,eAAO,MAAM,qBAAqB;IAChC,wFAAwF;mCACpE,MAAM,KAAG,MAAM;IAInC;;;;;;;OAOG;;CAEK,CAAC;AAEX;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAG1E;AAGD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQxD"}
@@ -79,9 +79,11 @@ export const AWAY_AUTO_REPLY_MARKER = "[[AUTO-REPLY]]";
79
79
  /**
80
80
  * The unmarked bodies. Kept separate so the legacy detector below matches an un-upgraded peer.
81
81
  *
82
- * ⚠️ `ONESHOT_BODY` IS NO LONGER SENT, AND NOTHING READS IT EITHER. DOD-M15-AWAYSCOPE-1 deleted the
83
- * branch that sent it AND the only production call site of `isOwnAwayAutoReply`, which was in the
84
- * same branch. An earlier version of this comment said the legacy recogniser "is what stops this
82
+ * ⚠️ `ONESHOT_BODY` IS NO LONGER SENT `away-inbox-oneshot.ts` sends its own line but it IS read
83
+ * again. DOD-M15-AWAYSCOPE-1 deleted the branch that sent it and the only production call site of
84
+ * `isOwnAwayAutoReply` along with it; DOD-INBOX-ONESHOT-1 gave that recogniser a caller again,
85
+ * because a file that can SEAL must recognise an un-upgraded peer's away traffic, not just a
86
+ * marker-aware one. An earlier version of this comment said the legacy recogniser "is what stops this
85
87
  * side treating that machine traffic as a person" — review caught that, and it is false: the only
86
88
  * live recogniser is `isAutoReplyMarked`, which matches the MARKER and therefore does NOT match an
87
89
  * un-upgraded peer's unmarked body.
@@ -1 +1 @@
1
- {"version":3,"file":"away-detection.js","sourceRoot":"","sources":["../src/away-detection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,gBAAgB,CAAC;AAEvD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,YAAY,GAChB,sGAAsG;IACtG,2HAA2H,CAAC;AAE9H,sFAAsF;AACtF,MAAM,YAAY,GAAG,6GAA6G,CAAC;AAEnI;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,iBAAiB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,GAAG,sBAAsB,IAAI,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC;AACjD,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,wFAAwF;IACxF,QAAQ,CAAC,SAAiB;QACxB,OAAO,GAAG,sBAAsB,IAAI,SAAS,GAAG,YAAY,EAAE,CAAC;IACjE,CAAC;IAED;;;;;;;OAOG;IACH,QAAQ,EAAE,GAAG,sBAAsB,cAAc;CACzC,CAAC;AAEX;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,OAAgB;IAChE,IAAI,CAAC,OAAO;QAAE,OAAO,qBAAqB,CAAC,QAAQ,CAAC;IACpD,OAAO,qBAAqB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACnD,CAAC;AAGD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,iBAAiB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IACvC,gGAAgG;IAChG,gFAAgF;IAChF,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAClF,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"away-detection.js","sourceRoot":"","sources":["../src/away-detection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,gBAAgB,CAAC;AAEvD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,YAAY,GAChB,sGAAsG;IACtG,2HAA2H,CAAC;AAE9H,sFAAsF;AACtF,MAAM,YAAY,GAAG,6GAA6G,CAAC;AAEnI;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,iBAAiB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,GAAG,sBAAsB,IAAI,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC;AACjD,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,wFAAwF;IACxF,QAAQ,CAAC,SAAiB;QACxB,OAAO,GAAG,sBAAsB,IAAI,SAAS,GAAG,YAAY,EAAE,CAAC;IACjE,CAAC;IAED;;;;;;;OAOG;IACH,QAAQ,EAAE,GAAG,sBAAsB,cAAc;CACzC,CAAC;AAEX;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,OAAgB;IAChE,IAAI,CAAC,OAAO;QAAE,OAAO,qBAAqB,CAAC,QAAQ,CAAC;IACpD,OAAO,qBAAqB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACnD,CAAC;AAGD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,iBAAiB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IACvC,gGAAgG;IAChG,gFAAgF;IAChF,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAClF,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { KeyProvider } from "@cello-protocol/crypto";
2
+ import type { Logger, SessionRecord } from "./types.js";
3
+ import type { SessionNodeManager } from "./session-node-manager.js";
4
+ import type { ActiveSealResult } from "./seal-flows.js";
5
+ import type { SealCompletion, UnilateralResult } from "./seal-coordinator.js";
6
+ import type { SendClaims } from "./send-claims.js";
7
+ export interface AwayInboxOneshotDeps {
8
+ logger: Logger;
9
+ sessionNodeManager: SessionNodeManager;
10
+ /**
11
+ * Sends on the wire right now — the half `weSpoke` cannot see.
12
+ *
13
+ * An outbound transcript row is written AFTER the send resolves, so for the whole round trip of
14
+ * an operator's reply there is a human speaking and no record of it. Reading `weSpoke` in that
15
+ * window answers "nobody spoke here" about a live conversation, and this path is terminal.
16
+ */
17
+ sendClaims: SendClaims;
18
+ /**
19
+ * The away wiring's own guard set, shared rather than copied: this file must fire only for a
20
+ * session that was ACTUALLY told "one message per visit", and that set is what records it. It
21
+ * also carries our own once-only key, so re-attending an agent re-arms both together (the
22
+ * `${name}:` sweep in agent-handlers.ts clears them as one).
23
+ */
24
+ awayAckSent: Set<string>;
25
+ keyProviders: Map<string, KeyProvider>;
26
+ /** The seal machinery this hands off to once the conversation is closed. */
27
+ sealKey: (agentName: string, sessionId: string) => string;
28
+ sealInterruptedInProgress: Set<string>;
29
+ pendingSealWaiters: Map<string, (completion: SealCompletion) => void>;
30
+ pendingUnilateralWaiters: Map<string, (r: UnilateralResult) => void>;
31
+ sendOver: (agentName: string, frame: Record<string, unknown>) => Promise<{
32
+ ok: boolean;
33
+ reason?: string;
34
+ }>;
35
+ handleActiveSealFlow: (sessionId: string, record: SessionRecord, correlationId: string) => Promise<ActiveSealResult>;
36
+ }
37
+ export declare function createAwayInboxOneshot(deps: AwayInboxOneshotDeps): {
38
+ closeInboxIfIgnored: (agentName: string, sessionId: string) => Promise<void>;
39
+ };
40
+ //# sourceMappingURL=away-inbox-oneshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"away-inbox-oneshot.d.ts","sourceRoot":"","sources":["../src/away-inbox-oneshot.ts"],"names":[],"mappings":"AAsDA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAK9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAKnD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,kBAAkB,CAAC;IACvC;;;;;;OAMG;IACH,UAAU,EAAE,UAAU,CAAC;IACvB;;;;;OAKG;IACH,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACvC,4EAA4E;IAC5E,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1D,yBAAyB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,cAAc,KAAK,IAAI,CAAC,CAAC;IACtE,wBAAwB,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC,CAAC;IACrE,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3G,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACtH;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,GAAG;IAClE,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9E,CAkQA"}
@@ -0,0 +1,311 @@
1
+ /**
2
+ * `DOD-INBOX-ONESHOT-1` — an away agent's inbox accepts ONE message, then closes itself.
3
+ *
4
+ * ─── What this restores, and why it was missing ────────────────────────────────────────────────
5
+ *
6
+ * The away reply tells the caller, in its own words, that this inbox "accepts one message per
7
+ * visit — please close the session now". Nothing enforced that. A caller who kept talking was
8
+ * talking into an empty room, and the session stayed open indefinitely with no operator anywhere
9
+ * near it.
10
+ *
11
+ * It was enforced once. `DOD-M15-AWAYSCOPE-1` (2026-09-12) deleted the branch that answered
12
+ * mid-conversation messages with the away GREETING — correctly: that greeting took a hash-chain
13
+ * leaf in a live exchange and made the receipt unobtainable. But the one-shot rejection and the
14
+ * seal it initiated lived in the same branch and went with it, and that half was not the defect.
15
+ * Its own commit said so: "deleting the wrong one of the two mechanisms is the whole risk here".
16
+ *
17
+ * So the termination is back, on its own, in its own file, where it cannot be confused with the
18
+ * greeting. It NEVER sends the away text. It sends one closing line and seals.
19
+ *
20
+ * ─── Why the close is a real message and a real seal ───────────────────────────────────────────
21
+ *
22
+ * Because an inbound message is an attack surface, and an away agent's record of it must obey the
23
+ * same rules as everything else: the rejection is signed, ordered by the relay, and takes its leaf.
24
+ * A "quiet" close that left no record would be the one conversation in the system with no evidence.
25
+ *
26
+ * ⚠️ IT PLACES ITS OWN LEAVES, so this file belongs in the seal call-site enforcer's CALLERS list.
27
+ *
28
+ * ─── The rule that stops two machines sealing a conversation nobody had ────────────────────────
29
+ *
30
+ * When both agents are away, each side's auto-reply lands on the other as an inbound message. Left
31
+ * alone, the one-shot fires on BOTH sides, each posts a SEAL ctrl leaf, and two distinct-sender
32
+ * ctrl leaves is exactly what notarizes a session. Measured from the relay's own log 2026-08-09: a
33
+ * session sealed THREE SECONDS after opening, its entire content two machines telling each other
34
+ * nobody was home, while both operators went on believing it was live.
35
+ *
36
+ * So a message carrying the auto-reply marker is never answered and never counted. The narrow rule
37
+ * — suppress a machine answering a machine — is the correct one. The broad rule ("never notarize a
38
+ * session where we only sent away traffic") was tried and reverted: it also disabled closing the
39
+ * inbox on a real caller who ignores the instruction, which is the behaviour this file exists for.
40
+ *
41
+ * ⚠️ `isOwnAwayAutoReply`, NOT the marker alone. The marker only catches a marker-aware peer; the
42
+ * recogniser's LEGACY branch also catches this daemon's older default wording, which is what an
43
+ * un-upgraded CELLO agent still sends. Two away agents on mixed versions sealing a conversation
44
+ * nobody had is `DOD-AWAY-MUTUAL-SEAL-1`, and it became reachable again the moment this file could
45
+ * seal. Its documented limit stands: an old peer with a CONFIGURED away message is unmatched.
46
+ *
47
+ * ⚠️ THE MARKER IS TEXT, SO IT IS ADVISORY — say it rather than imply a rule. It is a token at the
48
+ * front of the message body, not a signed frame field, so any caller who types it is never counted
49
+ * and never closed on. What that buys them is the PRE-FIX behaviour: the session stays open until
50
+ * the operator returns. It buys them no leaf, no seal, no reply and nothing this side would not
51
+ * otherwise have given them. Closing that off means carrying the flag in the frame beside the text,
52
+ * which is a wire change on both sides and is not worth it for an opt-out into waiting longer.
53
+ */
54
+ import { randomUUID } from "node:crypto";
55
+ import { markAsAutoReply, isOwnAwayAutoReply } from "./away-detection.js";
56
+ import { isLocalCredentialRefusal, LEAF_KIND_MSG } from "./session-relay-client.js";
57
+ import { sentAuthorship } from "./session-content-handlers.js";
58
+ import { escalateToUnilateralSeal as runUnilateralEscalation, UNILATERAL_SEAL_TIMEOUT_MS } from "./seal-escalation.js";
59
+ /** The one line this file ever sends. Marked as machine-generated; [[WRAP]] stays at the END. */
60
+ const ONESHOT_REJECT_TEXT = "This inbox only accepts one message per visit. Closing. [[WRAP]]";
61
+ export function createAwayInboxOneshot(deps) {
62
+ const { logger, sessionNodeManager, sendClaims, awayAckSent, keyProviders, sealKey, sealInterruptedInProgress, pendingSealWaiters, pendingUnilateralWaiters, sendOver, handleActiveSealFlow, } = deps;
63
+ /**
64
+ * Their messages, counted from the DURABLE transcript rather than an arrival buffer.
65
+ *
66
+ * The in-memory buffer this used to peek at is deliberately gone (see the note in
67
+ * session-node-manager.ts): it held the plaintext of every live conversation in daemon memory for
68
+ * nobody. The transcript is what production serves and what the operator reads, so counting there
69
+ * also means a restart mid-visit does not reset the caller's allowance.
70
+ *
71
+ * Auto-replies are excluded from the count AND cannot be the trigger — see the header.
72
+ */
73
+ function readSession(agentName, sessionId) {
74
+ const { messages } = sessionNodeManager.readTranscript(agentName, sessionId);
75
+ let theirCount = 0;
76
+ let latest = null;
77
+ let weSpoke = false;
78
+ for (const m of messages) {
79
+ if (m.direction === "sent") {
80
+ // ANYTHING of ours that is not the greeting means a human spoke here. See `weSpoke` at the
81
+ // call site: it is the line between an answering machine and a conversation.
82
+ if (!isOwnAwayAutoReply(m.text))
83
+ weSpoke = true;
84
+ continue;
85
+ }
86
+ if (m.direction !== "received")
87
+ continue;
88
+ // `latest` is the last thing they sent WHATEVER it was, because the auto-reply case is a
89
+ // decision this makes (never answer a machine), not one it can make by never seeing it.
90
+ latest = m.text;
91
+ if (isOwnAwayAutoReply(m.text))
92
+ continue;
93
+ theirCount += 1;
94
+ }
95
+ return { theirCount, latest, weSpoke };
96
+ }
97
+ async function closeInboxIfIgnored(agentName, sessionId) {
98
+ /**
99
+ * THIS IS THE AWAY CASE AND ONLY THE AWAY CASE — the session was answered by the machine at the
100
+ * door, because nobody was at the desk OR because this caller's tier says do not engage (a
101
+ * private agent, which IS attended and still away). The greeting having REACHED the caller is
102
+ * what says so, and it is why attendance is not consulted here: the tier case would fail an
103
+ * attendance test while being exactly the case this exists for.
104
+ *
105
+ * ⚠️ `:greeted`, NEVER `:request`. The latter is set before the send and stays set when the
106
+ * outbound screen blocks the greeting — so keying on it would close a visit on a caller who was
107
+ * never told the rule they are being held to.
108
+ *
109
+ * A conversation that was under way when someone dropped is a DIFFERENT case with its own
110
+ * machinery (recovery and the relay mailbox). Nothing here may reach it — see `weSpoke`.
111
+ */
112
+ if (!awayAckSent.has(`${agentName}:${sessionId}:greeted`))
113
+ return;
114
+ const rejectedKey = `${agentName}:${sessionId}:rejected`;
115
+ if (awayAckSent.has(rejectedKey))
116
+ return;
117
+ const { theirCount, latest, weSpoke } = readSession(agentName, sessionId);
118
+ if (latest === null)
119
+ return;
120
+ /**
121
+ * ⚠️ THE LINE PRINCIPLE 4 DRAWS, AND THE WHOLE REASON THIS IS SAFE TO SHIP.
122
+ *
123
+ * "A session with nobody live must not be terminal" was ruled on 2026-09-11 after a machine
124
+ * greeting took a leaf MID-CONVERSATION and cost a completed exchange its receipt. That ruling
125
+ * is about a conversation. If this side has said anything of its own, a human was here, and the
126
+ * machine does not get to end it — the party who comes back closes, per principle 8.
127
+ *
128
+ * A session whose only outbound line is the greeting is not a conversation. Nobody had it, and
129
+ * closing it destroys nothing.
130
+ */
131
+ if (weSpoke)
132
+ return;
133
+ // A send whose transcript row failed is a message this side made that the transcript cannot
134
+ // show. "Cannot tell" is not "nobody spoke", and only one of those may end a session.
135
+ if (sendClaims.rowMissing(agentName, sessionId)) {
136
+ logger.warn("session.away.inbox.oneshot.skipped_unreadable_record", {
137
+ agentName, sessionId,
138
+ impact: "this side sent something the transcript does not hold, so whether a human spoke here cannot be decided — the visit is left open",
139
+ });
140
+ return;
141
+ }
142
+ // AND the same question for a reply that is on the wire but not yet on disk. Without this, the
143
+ // window between `sendContent` resolving and its transcript row being written reads as silence.
144
+ if (sendClaims.held(agentName, sessionId)) {
145
+ logger.info("session.away.inbox.oneshot.skipped_send_in_flight", {
146
+ agentName, sessionId,
147
+ impact: "a reply from this side is on the wire, so this is a conversation — the visit is not closed",
148
+ });
149
+ return;
150
+ }
151
+ // THE ARRIVAL ITSELF IS A MACHINE'S: never answered, never counted, and checked before the
152
+ // count so two away agents cannot reach the seal below by trading greetings.
153
+ if (isOwnAwayAutoReply(latest)) {
154
+ logger.info("session.away.mutual.skipped", {
155
+ agentName, sessionId,
156
+ impact: "no one-shot close — two away agents must not notarize a conversation nobody had",
157
+ });
158
+ return;
159
+ }
160
+ // Their one message has arrived, so the visit is over. Waiting for a SECOND would be a shop that
161
+ // locks up only when someone tries the handle after closing time.
162
+ if (theirCount < 1)
163
+ return;
164
+ // They are closing of their own accord — let the ordinary seal proceed, and do not spend the
165
+ // one-shot on it. Matched at the END, because DOD-SIGNAL-TOKEN-1 appends the real token there
166
+ // and a substring match would read a mere mention of the token as a close.
167
+ if (latest.trimEnd().endsWith("[[WRAP]]")) {
168
+ logger.info("session.away.inbox.oneshot.skipped_wrap", { agentName, sessionId });
169
+ return;
170
+ }
171
+ awayAckSent.add(rejectedKey); // guard BEFORE async work — concurrent arrivals must not re-enter
172
+ const record = sessionNodeManager.getSessionRecord(agentName, sessionId);
173
+ if (!record || record.status !== "active")
174
+ return;
175
+ const rejectText = markAsAutoReply(ONESHOT_REJECT_TEXT);
176
+ const rejectBytes = new TextEncoder().encode(rejectText);
177
+ // One decision point for the hash AND its algorithm — see `contentHashForSession`.
178
+ const reject = await sessionNodeManager.contentHashForSession(agentName, sessionId, rejectBytes);
179
+ // Best-effort: a send failure still triggers the seal — we are closing regardless.
180
+ const sendResult = await sessionNodeManager.sendContent(agentName, sessionId, rejectBytes, new Uint8Array(reject.hash), randomUUID(), LEAF_KIND_MSG, reject.alg);
181
+ if (sendResult.ok || sendResult.durable) {
182
+ // At the RELAY's position, not the tail, and committed when the send went out OR was durably
183
+ // queued — either way the relay already witnessed its sequence. This is the sharpest case of
184
+ // that rule in the codebase: the seal is initiated a few lines below, so a leaf at the wrong
185
+ // index seals a tree the counterparty can never agree with.
186
+ const placed = sessionNodeManager.placeOwnLeaf(agentName, sessionId, Buffer.from(reject.hash).toString("hex"), rejectBytes, sendResult.sequenceNumber, randomUUID(), "msg", sentAuthorship(sendResult));
187
+ if (placed.placed) {
188
+ sessionNodeManager.recordTranscriptMessage(agentName, sessionId, placed.leafIndex, "sent", rejectBytes, randomUUID(), sentAuthorship(sendResult));
189
+ }
190
+ logger.info("session.away.inbox.oneshot.rejected", {
191
+ agentName, sessionId, sequenceNumber: placed.placed ? placed.leafIndex : placed.heldAt,
192
+ committed: placed.placed, queued: !sendResult.ok,
193
+ });
194
+ }
195
+ else {
196
+ // Not queued anywhere — the rejection is gone. We still seal (we are closing regardless), and
197
+ // the counterparty simply never learns why, so say that plainly.
198
+ logger.error("session.away.inbox.oneshot.reject_send_failed", {
199
+ agentName, sessionId, reason: sendResult.reason, cause: sendResult.cause,
200
+ impact: "the rejection is lost and was NOT queued — the session seals with no explanation to the counterparty",
201
+ });
202
+ }
203
+ /**
204
+ * The divergence gate has to hold on the path with no operator. `cello_close_session` refuses a
205
+ * diverged record; this autonomous path must too, and the LOG is its whole surface because
206
+ * there is no caller awaiting an answer.
207
+ */
208
+ /**
209
+ * ASKED AGAIN, BECAUSE THE SEND ABOVE TOOK A ROUND TRIP. The checks at entry were true when the
210
+ * caller's message arrived; an operator who started replying during our own send would not have
211
+ * been visible then. Sealing is the irreversible half, so the last thing before it is the same
212
+ * question, freshly asked.
213
+ */
214
+ if (sendClaims.held(agentName, sessionId) || readSession(agentName, sessionId).weSpoke) {
215
+ logger.info("session.away.inbox.oneshot.seal_skipped_operator_returned", {
216
+ agentName, sessionId,
217
+ impact: "the operator spoke while this was closing, so the session is NOT sealed — it is theirs to close",
218
+ });
219
+ return;
220
+ }
221
+ const readiness = sessionNodeManager.sealReadiness(agentName, sessionId);
222
+ if (readiness.diverged) {
223
+ logger.warn("session.away.inbox.oneshot.seal_skipped_diverged", {
224
+ agentName, sessionId, treeSize: readiness.treeSize, highWaterSeq: readiness.highWaterSeq,
225
+ impact: "this side's tree parted from the relay's ordering, so the seal was NOT initiated — the session stays closeable by hand, where the operator can compare counts with the counterparty first",
226
+ });
227
+ return;
228
+ }
229
+ await initiateSeal(agentName, sessionId, record);
230
+ }
231
+ /**
232
+ * Seal via the RELAY-mediated path, not the signaling one.
233
+ *
234
+ * The signaling path compares leaf counts, and this party's tree includes the rejection sent
235
+ * milliseconds ago while the counterparty's may not have ingested it yet — a race that fails the
236
+ * seal for a reason that is not real. The relay path posts a SEAL ctrl leaf and waits for the
237
+ * counterparty to co-seal independently, so no count comparison happens at all.
238
+ */
239
+ async function initiateSeal(agentName, sessionId, record) {
240
+ const correlationId = randomUUID();
241
+ const sk = sealKey(agentName, sessionId);
242
+ if (sealInterruptedInProgress.has(sk))
243
+ return;
244
+ sealInterruptedInProgress.add(sk);
245
+ try {
246
+ let resolveSeal;
247
+ const sealedP = new Promise((r) => { resolveSeal = r; });
248
+ pendingSealWaiters.set(sk, resolveSeal);
249
+ const submit = await sessionNodeManager.submitSealLeaf(agentName, sessionId, correlationId);
250
+ if (!submit.ok && submit.reason !== "responder_seal_already_submitted") {
251
+ pendingSealWaiters.delete(sk);
252
+ if (submit.reason === "relay_unavailable" || isLocalCredentialRefusal(submit.reason)) {
253
+ const fallback = await handleActiveSealFlow(sessionId, record, correlationId);
254
+ if (fallback.ok)
255
+ logger.info("session.away.inbox.oneshot.seal_initiated", { agentName, sessionId, path: "signaling_fallback" });
256
+ else
257
+ logger.warn("session.away.inbox.oneshot.seal_initiate_failed", { agentName, sessionId, reason: fallback.reason, path: "signaling_fallback" });
258
+ }
259
+ else {
260
+ logger.warn("session.away.inbox.oneshot.seal_initiate_failed", { agentName, sessionId, reason: submit.reason });
261
+ }
262
+ return;
263
+ }
264
+ logger.info("session.away.inbox.oneshot.seal_initiated", { agentName, sessionId, path: "relay" });
265
+ const bilateralTimeoutMs = Number(process.env["CELLO_SEAL_BILATERAL_TIMEOUT_MS"]) || 660_000;
266
+ let timer;
267
+ const timeoutP = new Promise((r) => { timer = setTimeout(() => r(null), bilateralTimeoutMs); });
268
+ const completion = await Promise.race([sealedP, timeoutP]);
269
+ clearTimeout(timer);
270
+ pendingSealWaiters.delete(sk);
271
+ if (completion !== null) {
272
+ // A REFUSED certificate resolves the waiter rather than being dropped, so the two must be
273
+ // told apart — logging a refusal as "sealed" is the silent acceptance to avoid.
274
+ if ("refused" in completion) {
275
+ logger.error("session.away.inbox.oneshot.seal_refused", {
276
+ agentName, sessionId, reason: completion.reason, detail: completion.detail,
277
+ impact: "the away auto-seal was REFUSED: the directory returned a validly signed root that does not describe this conversation. The session is NOT sealed and nothing was signed with this agent's key.",
278
+ });
279
+ return;
280
+ }
281
+ logger.info("session.away.inbox.oneshot.sealed", { agentName, sessionId, sealedRoot: completion.rootHex });
282
+ return;
283
+ }
284
+ const escalation = submit.ok
285
+ ? { reportedRootHex: submit.reportedRootHex, sequenceNumber: submit.sequenceNumber }
286
+ : submit.reason === "responder_seal_already_submitted" && typeof submit.reportedRootHex === "string" && typeof submit.sequenceNumber === "number"
287
+ ? { reportedRootHex: submit.reportedRootHex, sequenceNumber: submit.sequenceNumber }
288
+ : null;
289
+ if (!escalation) {
290
+ logger.warn("session.away.inbox.oneshot.seal_pending", { agentName, sessionId });
291
+ return;
292
+ }
293
+ // THE SHARED ESCALATION, not a second copy — a duplicate drifted once and missed every
294
+ // refusal the shared one gained (empty carry, gappy chain, two of our own ctrl leaves).
295
+ const uni = await runUnilateralEscalation({ logger, sessionNodeManager, sendOver, pendingUnilateralWaiters, sealKey, getKeyProvider: (a) => keyProviders.get(a), timeoutMs: UNILATERAL_SEAL_TIMEOUT_MS }, agentName, sessionId, escalation, correlationId, { refuseOnUnusableCarry: true });
296
+ if (uni.ok) {
297
+ logger.info("session.away.inbox.oneshot.sealed", { agentName, sessionId, sealedRoot: uni.sealed_root, sealType: "unilateral" });
298
+ }
299
+ else {
300
+ // CARRY THE GUIDANCE: it is the sentence telling an operator whether to retry or
301
+ // force-abandon, and this log is the path's only surface.
302
+ logger.warn("session.away.inbox.oneshot.seal_unilateral_failed", { agentName, sessionId, reason: uni.reason, guidance: uni.guidance });
303
+ }
304
+ }
305
+ finally {
306
+ sealInterruptedInProgress.delete(sealKey(agentName, sessionId));
307
+ }
308
+ }
309
+ return { closeInboxIfIgnored };
310
+ }
311
+ //# sourceMappingURL=away-inbox-oneshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"away-inbox-oneshot.js","sourceRoot":"","sources":["../src/away-inbox-oneshot.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,KAAK,EACV,YAAY,EACb,MAAM,YAAY,CAAC;AA2EpB,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAKzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAS7E"}
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,KAAK,EACV,YAAY,EACb,MAAM,YAAY,CAAC;AA6EpB,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAKzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAS7E"}
package/dist/daemon.js CHANGED
@@ -47,6 +47,8 @@ import { wireDocumentGate } from "./document-gate-wiring.js";
47
47
  import { documentsEnabled } from "./document-flag.js";
48
48
  import { createSignalingWiring } from "./signaling-wiring.js";
49
49
  import { createAttendanceWiring } from "./attendance-wiring.js";
50
+ import { createAwayInboxOneshot } from "./away-inbox-oneshot.js";
51
+ import { createSendClaims } from "./send-claims.js";
50
52
  import { startBootCore } from "./boot-core.js";
51
53
  import { startBootAgents } from "./boot-agents.js";
52
54
  import { startBootConnectionState } from "./boot-connection-state.js";
@@ -262,6 +264,11 @@ async function startDaemonHoldingLock(config, singletonLock) {
262
264
  // DOD-M15-AWAYSCOPE-1 took the one-shot rejection out, and with it every seal dependency this
263
265
  // wiring used to hold — it can no longer initiate a seal at all, which is the point.
264
266
  const { attendanceCount, sendAwayResponse, backgroundSeals, awayAckSent } = createAttendanceWiring({ logger, sessionNodeManager, perConnectionState, securityGateway });
267
+ // DOD-INBOX-ONESHOT-1 enforces what the away reply promised, in its own file — merging it with the
268
+ // greeting is how both were deleted together. `sendClaims` is shared with cello_send.
269
+ const sendClaims = createSendClaims();
270
+ const { closeInboxIfIgnored } = createAwayInboxOneshot({ logger, sessionNodeManager, awayAckSent, sendClaims,
271
+ keyProviders, sealKey, sealInterruptedInProgress, pendingSealWaiters, pendingUnilateralWaiters, sendOver, handleActiveSealFlow });
265
272
  // M8C-TGDOOR-1: the Telegram doorbell (telegram-doorbell.ts). Content-free by construction — the
266
273
  // module is never handed message text, so it cannot leak any (DOD-INV-CONTENTFREE), and it has no
267
274
  // session-send seam, so nothing from Telegram can enter a CELLO content path (D6).
@@ -738,6 +745,7 @@ async function startDaemonHoldingLock(config, singletonLock) {
738
745
  sessionNodeManager,
739
746
  securityGateway,
740
747
  retryQueue,
748
+ sendClaims,
741
749
  getConnState: (connectionId) => perConnectionState.get(connectionId),
742
750
  resolveCurrentAgent,
743
751
  NO_CURRENT_AGENT_RESPONSE,
@@ -818,11 +826,9 @@ async function startDaemonHoldingLock(config, singletonLock) {
818
826
  sessionNodeManager.setOnContentArrived((agentName, sessionId, senderPubkey) => {
819
827
  // MONIKER-4 AC2: the message doorbell names the sender the same way the session doorbell does.
820
828
  notificationDispatcher.dispatchCelloMessage(agentName, sessionId, senderPubkey, resolveWho(agentName, senderPubkey, sessionId));
821
- // DOD-M15-AWAYSCOPE-1 — THE AWAY REPLY FIRED HERE, and it was the defect: an unattended agent
822
- // auto-acked every inbound message on an already-accepted session, and that greeting took a
823
- // hash-chain leaf no seal could then certify. Nothing replaces it here — the counterparty learns
824
- // this side is online-but-unattended out of band, on the liveness frame, which takes no leaf.
825
- // The doorbell above is the only thing an arriving message may trigger. See attendance-wiring.
829
+ // DOD-M15-AWAYSCOPE-1 — THE AWAY GREETING FIRED HERE and took a leaf no seal could certify; it is
830
+ // NOT coming back. DOD-INBOX-ONESHOT-1 is the half deleted with it. See away-inbox-oneshot.ts.
831
+ void closeInboxIfIgnored(agentName, sessionId);
826
832
  // M8C-TGDOOR-1: message-waiting — coalesced (ring-once-until-read) inside sendTelegramDoorbell.
827
833
  void sendTelegramDoorbell(agentName, sessionId, "message_waiting", "New message waiting");
828
834
  });