@raidiant/notifai 11.7.1 → 12.0.0-beta.6

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 (409) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/NOTICE +16 -0
  3. package/THIRD_PARTY_NOTICES +725 -0
  4. package/bin/notifai.mjs +11387 -0
  5. package/data/install.ps1 +318 -0
  6. package/data/release.json +1 -0
  7. package/inventory.json +1 -0
  8. package/npm-adapter-files.json +52 -0
  9. package/package.json +14 -44
  10. package/README.md +0 -168
  11. package/dist/agent-update-notice.d.ts +0 -7
  12. package/dist/agent-update-notice.js +0 -77
  13. package/dist/agent-update-notice.js.map +0 -1
  14. package/dist/atomic-file.d.ts +0 -30
  15. package/dist/atomic-file.js +0 -148
  16. package/dist/atomic-file.js.map +0 -1
  17. package/dist/attendant-update.d.ts +0 -15
  18. package/dist/attendant-update.js +0 -96
  19. package/dist/attendant-update.js.map +0 -1
  20. package/dist/claude-wake.d.ts +0 -108
  21. package/dist/claude-wake.js +0 -369
  22. package/dist/claude-wake.js.map +0 -1
  23. package/dist/cli-bin.d.ts +0 -26
  24. package/dist/cli-bin.js +0 -220
  25. package/dist/cli-bin.js.map +0 -1
  26. package/dist/cli-contract.d.ts +0 -16
  27. package/dist/cli-contract.js +0 -27
  28. package/dist/cli-contract.js.map +0 -1
  29. package/dist/cli-release.d.ts +0 -36
  30. package/dist/cli-release.js +0 -85
  31. package/dist/cli-release.js.map +0 -1
  32. package/dist/client.d.ts +0 -109
  33. package/dist/client.js +0 -217
  34. package/dist/client.js.map +0 -1
  35. package/dist/codex-answer-control.d.ts +0 -14
  36. package/dist/codex-answer-control.js +0 -41
  37. package/dist/codex-answer-control.js.map +0 -1
  38. package/dist/codex-answer-presentation.d.ts +0 -18
  39. package/dist/codex-answer-presentation.js +0 -113
  40. package/dist/codex-answer-presentation.js.map +0 -1
  41. package/dist/codex-input-lifecycle.d.ts +0 -10
  42. package/dist/codex-input-lifecycle.js +0 -63
  43. package/dist/codex-input-lifecycle.js.map +0 -1
  44. package/dist/codex-native-control.d.ts +0 -13
  45. package/dist/codex-native-control.js +0 -120
  46. package/dist/codex-native-control.js.map +0 -1
  47. package/dist/codex-native-turn.d.ts +0 -37
  48. package/dist/codex-native-turn.js +0 -155
  49. package/dist/codex-native-turn.js.map +0 -1
  50. package/dist/codex-question-bindings.d.ts +0 -76
  51. package/dist/codex-question-bindings.js +0 -151
  52. package/dist/codex-question-bindings.js.map +0 -1
  53. package/dist/codex-queue-control.d.ts +0 -21
  54. package/dist/codex-queue-control.js +0 -59
  55. package/dist/codex-queue-control.js.map +0 -1
  56. package/dist/codex-tool-messages.d.ts +0 -7
  57. package/dist/codex-tool-messages.js +0 -126
  58. package/dist/codex-tool-messages.js.map +0 -1
  59. package/dist/codex-wake.d.ts +0 -58
  60. package/dist/codex-wake.js +0 -135
  61. package/dist/codex-wake.js.map +0 -1
  62. package/dist/command-session.d.ts +0 -14
  63. package/dist/command-session.js +0 -31
  64. package/dist/command-session.js.map +0 -1
  65. package/dist/commands-acknowledge.d.ts +0 -13
  66. package/dist/commands-acknowledge.js +0 -116
  67. package/dist/commands-acknowledge.js.map +0 -1
  68. package/dist/commands-agent-sessions.d.ts +0 -6
  69. package/dist/commands-agent-sessions.js +0 -51
  70. package/dist/commands-agent-sessions.js.map +0 -1
  71. package/dist/commands-ask.d.ts +0 -62
  72. package/dist/commands-ask.js +0 -503
  73. package/dist/commands-ask.js.map +0 -1
  74. package/dist/commands-auth.d.ts +0 -76
  75. package/dist/commands-auth.js +0 -421
  76. package/dist/commands-auth.js.map +0 -1
  77. package/dist/commands-close.d.ts +0 -6
  78. package/dist/commands-close.js +0 -273
  79. package/dist/commands-close.js.map +0 -1
  80. package/dist/commands-config.d.ts +0 -31
  81. package/dist/commands-config.js +0 -272
  82. package/dist/commands-config.js.map +0 -1
  83. package/dist/commands-core.d.ts +0 -145
  84. package/dist/commands-core.js +0 -190
  85. package/dist/commands-core.js.map +0 -1
  86. package/dist/commands-devices.d.ts +0 -41
  87. package/dist/commands-devices.js +0 -144
  88. package/dist/commands-devices.js.map +0 -1
  89. package/dist/commands-doctor.d.ts +0 -25
  90. package/dist/commands-doctor.js +0 -1553
  91. package/dist/commands-doctor.js.map +0 -1
  92. package/dist/commands-guidance.d.ts +0 -27
  93. package/dist/commands-guidance.js +0 -150
  94. package/dist/commands-guidance.js.map +0 -1
  95. package/dist/commands-harness-context.d.ts +0 -57
  96. package/dist/commands-harness-context.js +0 -102
  97. package/dist/commands-harness-context.js.map +0 -1
  98. package/dist/commands-hook-attend.d.ts +0 -70
  99. package/dist/commands-hook-attend.js +0 -655
  100. package/dist/commands-hook-attend.js.map +0 -1
  101. package/dist/commands-hook-diagnostics.d.ts +0 -37
  102. package/dist/commands-hook-diagnostics.js +0 -136
  103. package/dist/commands-hook-diagnostics.js.map +0 -1
  104. package/dist/commands-hook-install.d.ts +0 -26
  105. package/dist/commands-hook-install.js +0 -784
  106. package/dist/commands-hook-install.js.map +0 -1
  107. package/dist/commands-hook-run.d.ts +0 -29
  108. package/dist/commands-hook-run.js +0 -933
  109. package/dist/commands-hook-run.js.map +0 -1
  110. package/dist/commands-hook-shape.d.ts +0 -19
  111. package/dist/commands-hook-shape.js +0 -48
  112. package/dist/commands-hook-shape.js.map +0 -1
  113. package/dist/commands-init.d.ts +0 -42
  114. package/dist/commands-init.js +0 -901
  115. package/dist/commands-init.js.map +0 -1
  116. package/dist/commands-io.d.ts +0 -2
  117. package/dist/commands-io.js +0 -117
  118. package/dist/commands-io.js.map +0 -1
  119. package/dist/commands-logs.d.ts +0 -30
  120. package/dist/commands-logs.js +0 -201
  121. package/dist/commands-logs.js.map +0 -1
  122. package/dist/commands-native-acknowledge.d.ts +0 -8
  123. package/dist/commands-native-acknowledge.js +0 -114
  124. package/dist/commands-native-acknowledge.js.map +0 -1
  125. package/dist/commands-project.d.ts +0 -4
  126. package/dist/commands-project.js +0 -41
  127. package/dist/commands-project.js.map +0 -1
  128. package/dist/commands-receive.d.ts +0 -3
  129. package/dist/commands-receive.js +0 -59
  130. package/dist/commands-receive.js.map +0 -1
  131. package/dist/commands-send-support.d.ts +0 -59
  132. package/dist/commands-send-support.js +0 -258
  133. package/dist/commands-send-support.js.map +0 -1
  134. package/dist/commands-send.d.ts +0 -34
  135. package/dist/commands-send.js +0 -900
  136. package/dist/commands-send.js.map +0 -1
  137. package/dist/commands-setup-proof.d.ts +0 -43
  138. package/dist/commands-setup-proof.js +0 -134
  139. package/dist/commands-setup-proof.js.map +0 -1
  140. package/dist/commands-skill.d.ts +0 -21
  141. package/dist/commands-skill.js +0 -199
  142. package/dist/commands-skill.js.map +0 -1
  143. package/dist/commands-sounds.d.ts +0 -12
  144. package/dist/commands-sounds.js +0 -35
  145. package/dist/commands-sounds.js.map +0 -1
  146. package/dist/commands-update-check.d.ts +0 -6
  147. package/dist/commands-update-check.js +0 -102
  148. package/dist/commands-update-check.js.map +0 -1
  149. package/dist/commands-update-resume.d.ts +0 -7
  150. package/dist/commands-update-resume.js +0 -143
  151. package/dist/commands-update-resume.js.map +0 -1
  152. package/dist/commands-update-skill.d.ts +0 -5
  153. package/dist/commands-update-skill.js +0 -36
  154. package/dist/commands-update-skill.js.map +0 -1
  155. package/dist/commands-update.d.ts +0 -11
  156. package/dist/commands-update.js +0 -286
  157. package/dist/commands-update.js.map +0 -1
  158. package/dist/commands.d.ts +0 -26
  159. package/dist/commands.js +0 -27
  160. package/dist/commands.js.map +0 -1
  161. package/dist/config-schema.d.ts +0 -62
  162. package/dist/config-schema.js +0 -302
  163. package/dist/config-schema.js.map +0 -1
  164. package/dist/config.d.ts +0 -181
  165. package/dist/config.js +0 -357
  166. package/dist/config.js.map +0 -1
  167. package/dist/credentials.d.ts +0 -96
  168. package/dist/credentials.js +0 -342
  169. package/dist/credentials.js.map +0 -1
  170. package/dist/file-lock.d.ts +0 -34
  171. package/dist/file-lock.js +0 -367
  172. package/dist/file-lock.js.map +0 -1
  173. package/dist/generated-session-label.d.ts +0 -2
  174. package/dist/generated-session-label.js +0 -152
  175. package/dist/generated-session-label.js.map +0 -1
  176. package/dist/guidance-content.d.ts +0 -53
  177. package/dist/guidance-content.js +0 -248
  178. package/dist/guidance-content.js.map +0 -1
  179. package/dist/guidance-render.d.ts +0 -25
  180. package/dist/guidance-render.js +0 -47
  181. package/dist/guidance-render.js.map +0 -1
  182. package/dist/guidance.d.ts +0 -69
  183. package/dist/guidance.js +0 -173
  184. package/dist/guidance.js.map +0 -1
  185. package/dist/harness-session-title.d.ts +0 -22
  186. package/dist/harness-session-title.js +0 -74
  187. package/dist/harness-session-title.js.map +0 -1
  188. package/dist/harnesses.d.ts +0 -65
  189. package/dist/harnesses.js +0 -159
  190. package/dist/harnesses.js.map +0 -1
  191. package/dist/hermes-attendant.d.ts +0 -38
  192. package/dist/hermes-attendant.js +0 -337
  193. package/dist/hermes-attendant.js.map +0 -1
  194. package/dist/hermes-plugin.d.ts +0 -11
  195. package/dist/hermes-plugin.js +0 -299
  196. package/dist/hermes-plugin.js.map +0 -1
  197. package/dist/hook-acknowledgements.d.ts +0 -70
  198. package/dist/hook-acknowledgements.js +0 -490
  199. package/dist/hook-acknowledgements.js.map +0 -1
  200. package/dist/hook-adapter.d.ts +0 -48
  201. package/dist/hook-adapter.js +0 -419
  202. package/dist/hook-adapter.js.map +0 -1
  203. package/dist/hook-events.d.ts +0 -105
  204. package/dist/hook-events.js +0 -130
  205. package/dist/hook-events.js.map +0 -1
  206. package/dist/hook-gates.d.ts +0 -7
  207. package/dist/hook-gates.js +0 -20
  208. package/dist/hook-gates.js.map +0 -1
  209. package/dist/hook-input.d.ts +0 -10
  210. package/dist/hook-input.js +0 -64
  211. package/dist/hook-input.js.map +0 -1
  212. package/dist/hook-lifecycle.d.ts +0 -112
  213. package/dist/hook-lifecycle.js +0 -2031
  214. package/dist/hook-lifecycle.js.map +0 -1
  215. package/dist/hook-project-sessions.d.ts +0 -28
  216. package/dist/hook-project-sessions.js +0 -141
  217. package/dist/hook-project-sessions.js.map +0 -1
  218. package/dist/hook-question-lock.d.ts +0 -29
  219. package/dist/hook-question-lock.js +0 -217
  220. package/dist/hook-question-lock.js.map +0 -1
  221. package/dist/hook-question-retirement.d.ts +0 -74
  222. package/dist/hook-question-retirement.js +0 -314
  223. package/dist/hook-question-retirement.js.map +0 -1
  224. package/dist/hook-question-state.d.ts +0 -58
  225. package/dist/hook-question-state.js +0 -239
  226. package/dist/hook-question-state.js.map +0 -1
  227. package/dist/hook-session-state.d.ts +0 -127
  228. package/dist/hook-session-state.js +0 -488
  229. package/dist/hook-session-state.js.map +0 -1
  230. package/dist/hook-types.d.ts +0 -476
  231. package/dist/hook-types.js +0 -4
  232. package/dist/hook-types.js.map +0 -1
  233. package/dist/injection-render.d.ts +0 -36
  234. package/dist/injection-render.js +0 -61
  235. package/dist/injection-render.js.map +0 -1
  236. package/dist/install-hooks.d.ts +0 -470
  237. package/dist/install-hooks.js +0 -1622
  238. package/dist/install-hooks.js.map +0 -1
  239. package/dist/integration-health.d.ts +0 -26
  240. package/dist/integration-health.js +0 -133
  241. package/dist/integration-health.js.map +0 -1
  242. package/dist/interactive.d.ts +0 -22
  243. package/dist/interactive.js +0 -644
  244. package/dist/interactive.js.map +0 -1
  245. package/dist/invocation-context.d.ts +0 -47
  246. package/dist/invocation-context.js +0 -164
  247. package/dist/invocation-context.js.map +0 -1
  248. package/dist/local-path.d.ts +0 -7
  249. package/dist/local-path.js +0 -27
  250. package/dist/local-path.js.map +0 -1
  251. package/dist/logging.d.ts +0 -157
  252. package/dist/logging.js +0 -599
  253. package/dist/logging.js.map +0 -1
  254. package/dist/main-run.d.ts +0 -1
  255. package/dist/main-run.js +0 -42
  256. package/dist/main-run.js.map +0 -1
  257. package/dist/main.d.ts +0 -2
  258. package/dist/main.js +0 -12
  259. package/dist/main.js.map +0 -1
  260. package/dist/native-answer-operation.d.ts +0 -70
  261. package/dist/native-answer-operation.js +0 -247
  262. package/dist/native-answer-operation.js.map +0 -1
  263. package/dist/native-skills.d.ts +0 -64
  264. package/dist/native-skills.js +0 -167
  265. package/dist/native-skills.js.map +0 -1
  266. package/dist/node-floor.d.ts +0 -19
  267. package/dist/node-floor.js +0 -32
  268. package/dist/node-floor.js.map +0 -1
  269. package/dist/npm-invocation.d.ts +0 -34
  270. package/dist/npm-invocation.js +0 -53
  271. package/dist/npm-invocation.js.map +0 -1
  272. package/dist/openclaw-continuation-bridge.d.ts +0 -7
  273. package/dist/openclaw-continuation-bridge.js +0 -64
  274. package/dist/openclaw-continuation-bridge.js.map +0 -1
  275. package/dist/openclaw-gateway-readiness.d.ts +0 -1
  276. package/dist/openclaw-gateway-readiness.js +0 -24
  277. package/dist/openclaw-gateway-readiness.js.map +0 -1
  278. package/dist/openclaw-generation.d.ts +0 -21
  279. package/dist/openclaw-generation.js +0 -115
  280. package/dist/openclaw-generation.js.map +0 -1
  281. package/dist/openclaw-message-bridge.d.ts +0 -8
  282. package/dist/openclaw-message-bridge.js +0 -93
  283. package/dist/openclaw-message-bridge.js.map +0 -1
  284. package/dist/openclaw-pending.d.ts +0 -8
  285. package/dist/openclaw-pending.js +0 -47
  286. package/dist/openclaw-pending.js.map +0 -1
  287. package/dist/openclaw-plugin.d.ts +0 -75
  288. package/dist/openclaw-plugin.js +0 -1353
  289. package/dist/openclaw-plugin.js.map +0 -1
  290. package/dist/openclaw-session-access.d.ts +0 -12
  291. package/dist/openclaw-session-access.js +0 -79
  292. package/dist/openclaw-session-access.js.map +0 -1
  293. package/dist/opencode-plugin.d.ts +0 -88
  294. package/dist/opencode-plugin.js +0 -286
  295. package/dist/opencode-plugin.js.map +0 -1
  296. package/dist/orca-session-title.d.ts +0 -11
  297. package/dist/orca-session-title.js +0 -111
  298. package/dist/orca-session-title.js.map +0 -1
  299. package/dist/pack-feedback-slice.d.ts +0 -35
  300. package/dist/pack-feedback-slice.js +0 -126
  301. package/dist/pack-feedback-slice.js.map +0 -1
  302. package/dist/pairing-qr.d.ts +0 -5
  303. package/dist/pairing-qr.js +0 -24
  304. package/dist/pairing-qr.js.map +0 -1
  305. package/dist/pending-pairing.d.ts +0 -38
  306. package/dist/pending-pairing.js +0 -70
  307. package/dist/pending-pairing.js.map +0 -1
  308. package/dist/platform.d.ts +0 -67
  309. package/dist/platform.js +0 -140
  310. package/dist/platform.js.map +0 -1
  311. package/dist/process-identity.d.ts +0 -26
  312. package/dist/process-identity.js +0 -82
  313. package/dist/process-identity.js.map +0 -1
  314. package/dist/program.d.ts +0 -59
  315. package/dist/program.js +0 -691
  316. package/dist/program.js.map +0 -1
  317. package/dist/project-enablement.d.ts +0 -21
  318. package/dist/project-enablement.js +0 -71
  319. package/dist/project-enablement.js.map +0 -1
  320. package/dist/question-settlement-process.d.ts +0 -17
  321. package/dist/question-settlement-process.js +0 -35
  322. package/dist/question-settlement-process.js.map +0 -1
  323. package/dist/question-timing.d.ts +0 -46
  324. package/dist/question-timing.js +0 -48
  325. package/dist/question-timing.js.map +0 -1
  326. package/dist/readiness.d.ts +0 -153
  327. package/dist/readiness.js +0 -149
  328. package/dist/readiness.js.map +0 -1
  329. package/dist/release.d.ts +0 -31
  330. package/dist/release.js +0 -52
  331. package/dist/release.js.map +0 -1
  332. package/dist/send-attempts.d.ts +0 -26
  333. package/dist/send-attempts.js +0 -139
  334. package/dist/send-attempts.js.map +0 -1
  335. package/dist/send.d.ts +0 -115
  336. package/dist/send.js +0 -421
  337. package/dist/send.js.map +0 -1
  338. package/dist/session-activation.d.ts +0 -13
  339. package/dist/session-activation.js +0 -64
  340. package/dist/session-activation.js.map +0 -1
  341. package/dist/session-attendant-probe.d.ts +0 -85
  342. package/dist/session-attendant-probe.js +0 -173
  343. package/dist/session-attendant-probe.js.map +0 -1
  344. package/dist/session-attendant-state.d.ts +0 -70
  345. package/dist/session-attendant-state.js +0 -256
  346. package/dist/session-attendant-state.js.map +0 -1
  347. package/dist/session-attendant.d.ts +0 -143
  348. package/dist/session-attendant.js +0 -520
  349. package/dist/session-attendant.js.map +0 -1
  350. package/dist/session-delivery.d.ts +0 -249
  351. package/dist/session-delivery.js +0 -576
  352. package/dist/session-delivery.js.map +0 -1
  353. package/dist/session-handoff.d.ts +0 -98
  354. package/dist/session-handoff.js +0 -118
  355. package/dist/session-handoff.js.map +0 -1
  356. package/dist/session-input-wakes.d.ts +0 -78
  357. package/dist/session-input-wakes.js +0 -239
  358. package/dist/session-input-wakes.js.map +0 -1
  359. package/dist/session-inputs.d.ts +0 -57
  360. package/dist/session-inputs.js +0 -434
  361. package/dist/session-inputs.js.map +0 -1
  362. package/dist/session-labels.d.ts +0 -56
  363. package/dist/session-labels.js +0 -396
  364. package/dist/session-labels.js.map +0 -1
  365. package/dist/session-message-handoff.d.ts +0 -39
  366. package/dist/session-message-handoff.js +0 -107
  367. package/dist/session-message-handoff.js.map +0 -1
  368. package/dist/setup-destinations.d.ts +0 -23
  369. package/dist/setup-destinations.js +0 -44
  370. package/dist/setup-destinations.js.map +0 -1
  371. package/dist/skill-integrity.d.ts +0 -54
  372. package/dist/skill-integrity.js +0 -164
  373. package/dist/skill-integrity.js.map +0 -1
  374. package/dist/skill-source/manifest.json +0 -40
  375. package/dist/skill-source/notifai/SKILL.md +0 -350
  376. package/dist/skill-source/notifai/references/diagnostics.md +0 -36
  377. package/dist/skill-source/notifai/references/harness-setup.md +0 -384
  378. package/dist/skill-source/notifai/references/native-questions.md +0 -51
  379. package/dist/skill-source/notifai/references/notes-and-edits.md +0 -54
  380. package/dist/skill-source/notifai/references/send-details.md +0 -14
  381. package/dist/skill-source/notifai/references/updates.md +0 -116
  382. package/dist/skill-source/notifai/references/writing-examples.md +0 -56
  383. package/dist/sound-ref.d.ts +0 -23
  384. package/dist/sound-ref.js +0 -28
  385. package/dist/sound-ref.js.map +0 -1
  386. package/dist/ui/banner.d.ts +0 -22
  387. package/dist/ui/banner.js +0 -87
  388. package/dist/ui/banner.js.map +0 -1
  389. package/dist/ui/config-view.d.ts +0 -30
  390. package/dist/ui/config-view.js +0 -108
  391. package/dist/ui/config-view.js.map +0 -1
  392. package/dist/ui/help.d.ts +0 -44
  393. package/dist/ui/help.js +0 -107
  394. package/dist/ui/help.js.map +0 -1
  395. package/dist/ui/theme.d.ts +0 -90
  396. package/dist/ui/theme.js +0 -244
  397. package/dist/ui/theme.js.map +0 -1
  398. package/dist/update-handoff.d.ts +0 -29
  399. package/dist/update-handoff.js +0 -69
  400. package/dist/update-handoff.js.map +0 -1
  401. package/dist/url-policy.d.ts +0 -85
  402. package/dist/url-policy.js +0 -369
  403. package/dist/url-policy.js.map +0 -1
  404. package/dist/version.d.ts +0 -40
  405. package/dist/version.js +0 -132
  406. package/dist/version.js.map +0 -1
  407. package/dist/wake-support.d.ts +0 -40
  408. package/dist/wake-support.js +0 -95
  409. package/dist/wake-support.js.map +0 -1
@@ -1,173 +0,0 @@
1
- /**
2
- * Per-harness exact-session probes for the Session Attendant.
3
- *
4
- * Each answers one local question every two seconds: is the harness process
5
- * that started this attendant still running, and does it still host this
6
- * exact Agent Session? Anything short of proof is `uncertain`, never `running`.
7
- */
8
- import { readFileSync } from 'node:fs';
9
- import os from 'node:os';
10
- import path from 'node:path';
11
- import { parseDescriptor } from './claude-wake.js';
12
- import { normalizeProcessStart, pidExists, processIdentityLiveness, processStartTime, } from './process-identity.js';
13
- import { readOpenclawGeneration } from './openclaw-generation.js';
14
- import { readSessionIncarnation, sessionHasEnded } from './hook-session-state.js';
15
- export function attendantSupport(harness, platform) {
16
- if (harness === 'grok') {
17
- return { supported: false, reason: 'grok-has-no-exact-session-writer-or-attendant' };
18
- }
19
- if (harness === 'claude-code') {
20
- // The descriptor, inbox socket, and own-child delivery are proven on macOS.
21
- // Windows has none of them; Linux shares the socket design.
22
- return platform === 'darwin' || platform === 'linux'
23
- ? { supported: true }
24
- : { supported: false, reason: `claude-code-${platform}-unproven` };
25
- }
26
- if (harness === 'codex') {
27
- // Proven on macOS: the hook's parent is the Codex process, and Codex keeps
28
- // an async hook for its declared timeout while the thread stays loaded.
29
- // Windows reports no parent the same way.
30
- return platform === 'darwin' || platform === 'linux'
31
- ? { supported: true }
32
- : { supported: false, reason: `codex-${platform}-unproven` };
33
- }
34
- if (harness === 'openclaw') {
35
- return platform === 'darwin'
36
- ? { supported: true }
37
- : { supported: false, reason: `openclaw-${platform}-unproven` };
38
- }
39
- if (harness === 'hermes') {
40
- // The local classic CLI plugin owns an in-process writer and its child.
41
- // Python select() cannot watch that pipe on Windows.
42
- return platform === 'darwin' || platform === 'linux'
43
- ? { supported: true }
44
- : { supported: false, reason: `hermes-${platform}-unproven` };
45
- }
46
- return { supported: false, reason: 'harness-has-no-exact-session-probe' };
47
- }
48
- /** The Gateway process plus current CLI-owned generation prove OpenClaw presence. */
49
- export function openclawAttendanceProbe(options) {
50
- const readStart = options.readStart ?? processStartTime;
51
- const exists = options.exists ?? pidExists;
52
- return () => {
53
- if (options.endedByHook() || sessionHasEnded(options.sessionKey, options.env)) {
54
- return { state: 'ended', reason: 'session-end-hook' };
55
- }
56
- if (processIdentityLiveness(options.gateway, readStart, exists) !== 'alive') {
57
- return { state: 'ended', reason: 'harness-gone' };
58
- }
59
- const current = readOpenclawGeneration(options.sessionKey, options.env);
60
- const incarnation = readSessionIncarnation(options.sessionKey, options.env);
61
- if (current === null || current.ended || !current.activated ||
62
- current.id !== options.generationId ||
63
- incarnation?.openclaw_generation !== options.generationId) {
64
- return { state: 'ended', reason: 'session-replaced' };
65
- }
66
- const activity = options.activity?.() ?? null;
67
- return activity === null
68
- ? { state: 'uncertain', reason: 'gateway-session-unobserved' }
69
- : { state: 'running', activity };
70
- };
71
- }
72
- export function claudeDescriptorDir(env) {
73
- const configured = env['CLAUDE_CONFIG_DIR'];
74
- return path.join(configured && path.isAbsolute(configured) ? configured : path.join(os.homedir(), '.claude'), 'sessions');
75
- }
76
- export function systemClaudeProbeAdapters(env) {
77
- const dir = claudeDescriptorDir(env);
78
- return {
79
- readDescriptor: (pid) => JSON.parse(readFileSync(path.join(dir, `${pid}.json`), 'utf8')),
80
- pidExists,
81
- readStart: processStartTime,
82
- parentPid: () => process.ppid,
83
- };
84
- }
85
- /**
86
- * The Claude Code probe. Every call re-establishes the evidence; nothing is
87
- * carried over from an earlier call, so one failed check can never be
88
- * followed by `running` without a fresh successful one.
89
- *
90
- * - The harness PID is gone, or now belongs to a process with another start
91
- * time: `ended` (harness-gone). Checked on every call: a SIGKILLed harness
92
- * leaves its descriptor behind, and a reused PID would satisfy the rest.
93
- * While the harness is still this process's parent the identity holds
94
- * without a lookup — a parent cannot be replaced under a living child;
95
- * otherwise (an npx adapter in between, or an orphaned attendant) the start
96
- * time is read again.
97
- * - The start time cannot be read: `uncertain`.
98
- * - The descriptor for that PID names another session id: `/clear` or
99
- * `/resume` replaced this session in the same process: `ended`.
100
- * - The descriptor is missing: Claude Code 2.1.282 removes it about a second
101
- * *before* SessionEnd and exit, so with the process alive this is
102
- * `uncertain`.
103
- * - The descriptor's `procStart` (UTC `ps` text) differs from the harness
104
- * start read the same way: the evidence disagrees, `uncertain`.
105
- *
106
- * Activity comes from the descriptor `status`: `idle` is idle, anything else
107
- * (busy, waiting on a permission prompt) is working.
108
- */
109
- export function claudeAttendanceProbe(options) {
110
- const { adapters, harness } = options;
111
- const expectedStart = normalizeProcessStart(harness.start);
112
- return () => {
113
- if (options.endedByHook())
114
- return { state: 'ended', reason: 'session-end-hook' };
115
- const alive = adapters.parentPid() === harness.pid
116
- ? 'alive'
117
- : processIdentityLiveness(harness, adapters.readStart, adapters.pidExists);
118
- if (alive === 'gone')
119
- return { state: 'ended', reason: 'harness-gone' };
120
- let raw;
121
- try {
122
- raw = adapters.readDescriptor(harness.pid);
123
- }
124
- catch {
125
- return { state: 'uncertain', reason: 'descriptor-missing' };
126
- }
127
- const descriptor = parseDescriptor(raw);
128
- if (descriptor === null || descriptor.pid !== harness.pid) {
129
- return { state: 'uncertain', reason: 'descriptor-unrecognised' };
130
- }
131
- if (normalizeProcessStart(descriptor.procStart) !== expectedStart) {
132
- // A stale descriptor, or a clock format this build does not know.
133
- return { state: 'uncertain', reason: 'process-start-mismatch' };
134
- }
135
- if (descriptor.sessionId !== options.sessionId) {
136
- return { state: 'ended', reason: 'session-replaced' };
137
- }
138
- if (alive === 'unknown')
139
- return { state: 'uncertain', reason: 'process-start-unreadable' };
140
- return { state: 'running', activity: descriptor.status === 'idle' ? 'idle' : 'working' };
141
- };
142
- }
143
- /**
144
- * The Codex probe. Codex publishes no session descriptor, so the evidence is
145
- * the Codex process that started this attendant and the thread's own hooks:
146
- *
147
- * - SessionEnd's marker for this incarnation: `ended`. Codex runs SessionEnd
148
- * when the thread closes, is archived or deleted, or unloads after idling
149
- * with no client, then kills the attendant.
150
- * - The Codex PID is gone or now names a process with another start time:
151
- * `ended` (harness-gone). A crashed or killed Codex never runs SessionEnd
152
- * and leaves the attendant behind in its own process group.
153
- * - The start time cannot be read: `uncertain`.
154
- *
155
- * Activity comes from this thread's prompt, trusted tool, and turn-end hooks.
156
- */
157
- export function codexAttendanceProbe(options) {
158
- const { adapters, harness } = options;
159
- return () => {
160
- if (options.endedByHook())
161
- return { state: 'ended', reason: 'session-end-hook' };
162
- const alive = adapters.parentPid() === harness.pid
163
- ? 'alive'
164
- : processIdentityLiveness(harness, adapters.readStart, adapters.pidExists);
165
- if (alive === 'gone')
166
- return { state: 'ended', reason: 'harness-gone' };
167
- if (alive === 'unknown')
168
- return { state: 'uncertain', reason: 'process-start-unreadable' };
169
- const activity = options.activity();
170
- return activity === null ? { state: 'uncertain', reason: 'turn-activity-unobserved' } : { state: 'running', activity };
171
- };
172
- }
173
- //# sourceMappingURL=session-attendant-probe.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-attendant-probe.js","sourceRoot":"","sources":["../src/session-attendant-probe.ts"],"names":[],"mappings":"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"}
@@ -1,70 +0,0 @@
1
- import type { AttendantPhase, AttendantStatus } from './session-attendant.js';
2
- import type { SessionActivity } from '@raidiant/notifai-protocol';
3
- import type { DeliveryLease } from './session-delivery.js';
4
- import { type NativeTurnSnapshot } from './codex-native-turn.js';
5
- /** One live attendant per Agent Session: PID + process start time + incarnation. */
6
- export declare function attendantClaimPath(sessionId: string, env: NodeJS.ProcessEnv): string;
7
- export declare function attendantStatusPath(sessionId: string, env: NodeJS.ProcessEnv): string;
8
- export declare function writeAttendantStatus(sessionId: string, env: NodeJS.ProcessEnv, status: AttendantStatus): void;
9
- export interface AttendantReport {
10
- session_id: string;
11
- phase: AttendantPhase;
12
- /** Whether the recorded attendant process could still be running. */
13
- alive: boolean;
14
- generation: number | null;
15
- activity: string | null;
16
- reason: string | null;
17
- accepts_messages: boolean;
18
- writer_ready: boolean;
19
- updated_at: number;
20
- }
21
- /**
22
- * Every attendant status on this machine, newest first. An attendant whose
23
- * process is gone without writing `exited` is reported as not alive.
24
- */
25
- export declare function listAttendantReports(env: NodeJS.ProcessEnv): AttendantReport[];
26
- /** Admission proof from the exact, live classic-CLI plugin writer. */
27
- export declare function hermesQuestionRouteReady(sessionId: string, env: NodeJS.ProcessEnv, now?: number): boolean;
28
- /**
29
- * The lease a writer beside the attendant (the answer waiter) may claim under:
30
- * the generation the live attendant of this session holds right now, or null.
31
- * The service still decides; a stale read is refused as `generation_fenced`.
32
- */
33
- export declare function readAttendantLease(sessionId: string, env: NodeJS.ProcessEnv): DeliveryLease | null;
34
- /**
35
- * Saved fencing identity for Codex SessionEnd, even if the attendant died
36
- * before the hook started. Ending presence is not a harness write: it must
37
- * survive a missing/dead claim and an exited status. The service checks the
38
- * exact incarnation and generation, so a saved report cannot end a newer
39
- * lease. Only the current local incarnation may supply that identity.
40
- */
41
- export declare function readAttendantEndingLease(sessionId: string, env: NodeJS.ProcessEnv): DeliveryLease | null;
42
- /**
43
- * A thread's own turn boundaries, for a harness that publishes no activity of
44
- * its own (Codex), scoped to one session incarnation (its stable start key).
45
- *
46
- * Starts are observed by synchronous prompt and tool hooks. Automatic goal
47
- * continuations can omit the prompt hook; their first trusted tool callback
48
- * observes the turn instead. Ends come from asynchronous hooks (Stop, Interrupt) that may run late
49
- * or before the start they close, so they are matched by turn id. A start of a
50
- * turn already seen — started or ended — is stale and never replaces the
51
- * current turn. The thread is working while its current turn has no end.
52
- */
53
- export declare function turnActivityPath(sessionId: string, env: NodeJS.ProcessEnv): string;
54
- /** A turn of incarnation `key` started. Ignored when that turn was already seen. */
55
- export declare function recordTurnStart(sessionId: string, env: NodeJS.ProcessEnv, key: string, turnId: string): void;
56
- /** Mutation-free admission check; safe inside the session-state lock. */
57
- export declare function nativeTurnContinues(sessionId: string, env: NodeJS.ProcessEnv, key: string, snapshot: NativeTurnSnapshot): boolean;
58
- /** An async callback may advance only with native order and the same live owner. */
59
- export declare function reconcileNativeTurn(sessionId: string, env: NodeJS.ProcessEnv, key: string, turnId: string, snapshot: NativeTurnSnapshot, stillOwned: () => boolean, starting?: boolean): boolean;
60
- /** A turn ended (or was interrupted), whenever its hook got to run. */
61
- export declare function recordTurnEnd(sessionId: string, env: NodeJS.ProcessEnv, turnId: string): void;
62
- /** Working while incarnation `key`'s current turn has no recorded end. */
63
- export declare function readTurnActivity(sessionId: string, env: NodeJS.ProcessEnv, key: string): SessionActivity;
64
- /** Last observed activity for this owner, never the missing-record idle default.
65
- * This is a display projection only; queue admission requires a fresh native read. */
66
- export declare function observedCodexTurnActivity(sessionId: string, env: NodeJS.ProcessEnv, key: string): SessionActivity | null;
67
- /** Exact active turn, used to reject a tool hook that outlived interruption. */
68
- export declare function currentCodexTurn(sessionId: string, env: NodeJS.ProcessEnv, key: string): string | null;
69
- /** Historical hook success is not proof that the current native turn was seen. */
70
- export declare function codexNativeActivityObserved(sessionId: string, env: NodeJS.ProcessEnv): boolean;
@@ -1,256 +0,0 @@
1
- /** Local files of the Session Attendant: its exclusive claim and its readable status. */
2
- import { existsSync, readdirSync, readFileSync } from 'node:fs';
3
- import path from 'node:path';
4
- import { atomicWriteFileSync } from './atomic-file.js';
5
- import { sanitizeSessionId, stateDir } from './config.js';
6
- import { withFileLock } from './file-lock.js';
7
- import { readSessionIncarnation, readSessionState } from './hook-session-state.js';
8
- import { claimHolderMayRun, readClaimFile } from './hook-question-lock.js';
9
- import { readNativeTurnSnapshot } from './codex-native-turn.js';
10
- /** One live attendant per Agent Session: PID + process start time + incarnation. */
11
- export function attendantClaimPath(sessionId, env) {
12
- return path.join(stateDir(env), 'sessions', `${sanitizeSessionId(sessionId)}.attendant`);
13
- }
14
- export function attendantStatusPath(sessionId, env) {
15
- return path.join(stateDir(env), 'sessions', `${sanitizeSessionId(sessionId)}.attendance.json`);
16
- }
17
- export function writeAttendantStatus(sessionId, env, status) {
18
- atomicWriteFileSync(attendantStatusPath(sessionId, env), `${JSON.stringify({ session_id: sessionId, pid: process.pid, ...status })}\n`);
19
- }
20
- const PHASES = new Set([
21
- 'dormant',
22
- 'unsupported',
23
- 'acquiring',
24
- 'attending',
25
- 'waiting-for-lease',
26
- 'uncertain',
27
- 'exited',
28
- ]);
29
- /**
30
- * Every attendant status on this machine, newest first. An attendant whose
31
- * process is gone without writing `exited` is reported as not alive.
32
- */
33
- export function listAttendantReports(env) {
34
- const directory = path.join(stateDir(env), 'sessions');
35
- if (!existsSync(directory))
36
- return [];
37
- const reports = [];
38
- for (const name of readdirSync(directory)) {
39
- if (!name.endsWith('.attendance.json'))
40
- continue;
41
- try {
42
- const parsed = JSON.parse(readFileSync(path.join(directory, name), 'utf8'));
43
- const sessionId = parsed['session_id'];
44
- const phase = parsed['phase'];
45
- if (typeof sessionId !== 'string' || typeof phase !== 'string' || !PHASES.has(phase))
46
- continue;
47
- const claim = readClaimFile(attendantClaimPath(sessionId, env));
48
- const alive = phase !== 'exited' && claim !== null && claim['pid'] === parsed['pid'] && claimHolderMayRun(claim);
49
- reports.push({
50
- session_id: sessionId,
51
- phase: phase,
52
- alive,
53
- generation: typeof parsed['generation'] === 'number' ? parsed['generation'] : null,
54
- activity: typeof parsed['activity'] === 'string' ? parsed['activity'] : null,
55
- reason: typeof parsed['reason'] === 'string' ? parsed['reason'] : null,
56
- accepts_messages: parsed['accepts_messages'] === true,
57
- writer_ready: parsed['writer_ready'] === true,
58
- updated_at: typeof parsed['updated_at'] === 'number' ? parsed['updated_at'] : 0,
59
- });
60
- }
61
- catch {
62
- // A half-written or foreign file is not an attendant.
63
- }
64
- }
65
- return reports.sort((a, b) => b.updated_at - a.updated_at);
66
- }
67
- /** Admission proof from the exact, live classic-CLI plugin writer. */
68
- export function hermesQuestionRouteReady(sessionId, env, now = Date.now()) {
69
- const report = listAttendantReports(env).find((entry) => entry.session_id === sessionId);
70
- return report !== undefined && report.alive && report.writer_ready &&
71
- now >= report.updated_at && now - report.updated_at <= 5_000 &&
72
- (report.phase === 'dormant' || report.phase === 'acquiring' || report.phase === 'attending');
73
- }
74
- /**
75
- * The lease a writer beside the attendant (the answer waiter) may claim under:
76
- * the generation the live attendant of this session holds right now, or null.
77
- * The service still decides; a stale read is refused as `generation_fenced`.
78
- */
79
- export function readAttendantLease(sessionId, env) {
80
- try {
81
- const status = JSON.parse(readFileSync(attendantStatusPath(sessionId, env), 'utf8'));
82
- const generation = status['generation'];
83
- const incarnation = status['incarnation'];
84
- if (status['phase'] !== 'attending' ||
85
- typeof generation !== 'number' ||
86
- !Number.isInteger(generation) ||
87
- generation < 1 ||
88
- typeof incarnation !== 'string') {
89
- return null;
90
- }
91
- const claim = readClaimFile(attendantClaimPath(sessionId, env));
92
- if (claim === null || claim['pid'] !== status['pid'] || !claimHolderMayRun(claim))
93
- return null;
94
- return { incarnation, generation };
95
- }
96
- catch {
97
- return null;
98
- }
99
- }
100
- /**
101
- * Saved fencing identity for Codex SessionEnd, even if the attendant died
102
- * before the hook started. Ending presence is not a harness write: it must
103
- * survive a missing/dead claim and an exited status. The service checks the
104
- * exact incarnation and generation, so a saved report cannot end a newer
105
- * lease. Only the current local incarnation may supply that identity.
106
- */
107
- export function readAttendantEndingLease(sessionId, env) {
108
- try {
109
- const status = JSON.parse(readFileSync(attendantStatusPath(sessionId, env), 'utf8'));
110
- const generation = status['generation'];
111
- const incarnation = status['incarnation'];
112
- if (status['session_id'] !== sessionId ||
113
- typeof generation !== 'number' ||
114
- !Number.isSafeInteger(generation) ||
115
- generation < 1 ||
116
- typeof incarnation !== 'string' ||
117
- readSessionIncarnation(sessionId, env)?.incarnation !== incarnation) {
118
- return null;
119
- }
120
- return { incarnation, generation };
121
- }
122
- catch {
123
- return null;
124
- }
125
- }
126
- /**
127
- * A thread's own turn boundaries, for a harness that publishes no activity of
128
- * its own (Codex), scoped to one session incarnation (its stable start key).
129
- *
130
- * Starts are observed by synchronous prompt and tool hooks. Automatic goal
131
- * continuations can omit the prompt hook; their first trusted tool callback
132
- * observes the turn instead. Ends come from asynchronous hooks (Stop, Interrupt) that may run late
133
- * or before the start they close, so they are matched by turn id. A start of a
134
- * turn already seen — started or ended — is stale and never replaces the
135
- * current turn. The thread is working while its current turn has no end.
136
- */
137
- export function turnActivityPath(sessionId, env) {
138
- return path.join(stateDir(env), 'sessions', `${sanitizeSessionId(sessionId)}.turns.json`);
139
- }
140
- /** Turn ids kept to recognise a late hook; a late hook trails its turn by seconds. */
141
- const TURNS_KEPT = 32;
142
- function readTurns(file) {
143
- const ids = (value) => Array.isArray(value) ? value.filter((turn) => typeof turn === 'string') : [];
144
- try {
145
- const parsed = JSON.parse(readFileSync(file, 'utf8'));
146
- const native = parsed['native'];
147
- return {
148
- key: typeof parsed['key'] === 'string' ? parsed['key'] : null,
149
- current: typeof parsed['current'] === 'string' ? parsed['current'] : null,
150
- started: ids(parsed['started']),
151
- ended: ids(parsed['ended']),
152
- ...(native !== null && typeof native === 'object' &&
153
- typeof native.file === 'string' && typeof native.identity === 'string' &&
154
- typeof native.offset === 'number' && Number.isSafeInteger(native.offset) && native.offset >= 0
155
- ? { native: { file: native.file, identity: native.identity, offset: native.offset } } : {}),
156
- };
157
- }
158
- catch {
159
- return { key: null, current: null, started: [], ended: [] };
160
- }
161
- }
162
- function updateTurns(sessionId, env, update) {
163
- const file = turnActivityPath(sessionId, env);
164
- withFileLock(`${file}.lock`, () => {
165
- const next = update(readTurns(file));
166
- atomicWriteFileSync(file, `${JSON.stringify({ session_id: sessionId, ...next })}\n`);
167
- },
168
- // The prompt hook runs in front of the User's turn; activity is only a hint.
169
- { waitMs: 500 });
170
- }
171
- const keep = (ids, id) => [...ids.filter((turn) => turn !== id), id].slice(-TURNS_KEPT);
172
- /** A turn of incarnation `key` started. Ignored when that turn was already seen. */
173
- export function recordTurnStart(sessionId, env, key, turnId) {
174
- updateTurns(sessionId, env, (record) => {
175
- const same = record.key === key ? record : { key, current: null, started: [], ended: record.ended };
176
- if (same.started.includes(turnId) || same.ended.includes(turnId))
177
- return same;
178
- return { ...same, current: turnId, started: keep(same.started, turnId) };
179
- });
180
- }
181
- function nativeFollows(same, snapshot) {
182
- const turnId = snapshot.latest.id;
183
- if (same.native !== undefined && (same.native.identity !== snapshot.identity ||
184
- same.native.file !== snapshot.file || same.native.offset > snapshot.latest.offset))
185
- return false;
186
- if (same.current !== null && same.current !== turnId && !same.ended.includes(same.current)) {
187
- const currentOffset = snapshot.positions.get(same.current);
188
- if (currentOffset === undefined || currentOffset > snapshot.latest.offset)
189
- return false;
190
- }
191
- // Confirming native completion is an Idle observation, never resurrection.
192
- if (same.ended.includes(turnId) && !snapshot.latest.ended)
193
- return false;
194
- return true;
195
- }
196
- /** Mutation-free admission check; safe inside the session-state lock. */
197
- export function nativeTurnContinues(sessionId, env, key, snapshot) {
198
- const record = readTurns(turnActivityPath(sessionId, env));
199
- return record.key === key && nativeFollows(record, snapshot);
200
- }
201
- /** An async callback may advance only with native order and the same live owner. */
202
- export function reconcileNativeTurn(sessionId, env, key, turnId, snapshot, stillOwned, starting = false) {
203
- let recorded = false;
204
- updateTurns(sessionId, env, record => {
205
- if (!stillOwned() || snapshot.latest.id !== turnId)
206
- return record;
207
- // A re-arm cannot establish a new incarnation from an older transcript.
208
- if (record.key !== key && !starting)
209
- return record;
210
- const same = record.key === key ? record : { key, current: null, started: [], ended: record.ended };
211
- if (!nativeFollows(same, snapshot))
212
- return record;
213
- recorded = true;
214
- return {
215
- ...same, current: turnId, started: keep(same.started, turnId),
216
- ended: snapshot.latest.ended ? keep(same.ended, turnId) : same.ended,
217
- native: { file: snapshot.file, identity: snapshot.identity, offset: snapshot.latest.offset },
218
- };
219
- });
220
- return recorded;
221
- }
222
- /** A turn ended (or was interrupted), whenever its hook got to run. */
223
- export function recordTurnEnd(sessionId, env, turnId) {
224
- updateTurns(sessionId, env, (record) => ({ ...record, ended: keep(record.ended, turnId) }));
225
- }
226
- /** Working while incarnation `key`'s current turn has no recorded end. */
227
- export function readTurnActivity(sessionId, env, key) {
228
- const { key: recorded, current, ended } = readTurns(turnActivityPath(sessionId, env));
229
- return recorded === key && current !== null && !ended.includes(current) ? 'working' : 'idle';
230
- }
231
- /** Last observed activity for this owner, never the missing-record idle default.
232
- * This is a display projection only; queue admission requires a fresh native read. */
233
- export function observedCodexTurnActivity(sessionId, env, key) {
234
- const record = readTurns(turnActivityPath(sessionId, env));
235
- if (record.key !== key || record.current === null)
236
- return null;
237
- return record.ended.includes(record.current) ? 'idle' : 'working';
238
- }
239
- /** Exact active turn, used to reject a tool hook that outlived interruption. */
240
- export function currentCodexTurn(sessionId, env, key) {
241
- const record = readTurns(turnActivityPath(sessionId, env));
242
- return record.key === key && record.current !== null && !record.ended.includes(record.current)
243
- ? record.current : null;
244
- }
245
- /** Historical hook success is not proof that the current native turn was seen. */
246
- export function codexNativeActivityObserved(sessionId, env) {
247
- const proof = readSessionState(sessionId, env).codex_native_turn;
248
- const owner = readSessionIncarnation(sessionId, env);
249
- if (proof === undefined || owner?.key !== proof.key)
250
- return false;
251
- const native = readNativeTurnSnapshot(proof.transcript_path, sessionId, env);
252
- const record = readTurns(turnActivityPath(sessionId, env));
253
- return native !== null && record.key === owner.key && record.current === native.latest.id &&
254
- proof.turn_id === native.latest.id && (native.latest.ended === record.ended.includes(native.latest.id));
255
- }
256
- //# sourceMappingURL=session-attendant-state.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-attendant-state.js","sourceRoot":"","sources":["../src/session-attendant-state.ts"],"names":[],"mappings":"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"}