@raidiant/notifai 11.7.1 → 12.0.0-beta.11

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 +53 -0
  2. package/NOTICE +16 -0
  3. package/THIRD_PARTY_NOTICES +725 -0
  4. package/bin/notifai.mjs +11420 -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,98 +0,0 @@
1
- /**
2
- * Hand one message into a running Agent Session, in place.
3
- *
4
- * The one harness write every hand-off shares: the answer waiter's wake routes
5
- * and the Session Attendant's Session Messages both end here. It never cold
6
- * resumes: a stopped session is reported as stopped, and only the answer route
7
- * decides what to do about that (Session Messages never resume a session).
8
- *
9
- * `begin` is the commit point. It is called immediately before the
10
- * irreversible write, after every check that can refuse without writing; when
11
- * it returns false nothing is handed over. A `failed` result after `begin`
12
- * means the write may or may not have reached the harness.
13
- */
14
- import { type ClaudeSessionDescriptor, type ClaudeWakeAdapters } from './claude-wake.js';
15
- import { type CodexWakeAdapters } from './codex-wake.js';
16
- import { type WriteGuard } from './wake-support.js';
17
- export type SessionWriteResult = {
18
- status: 'written';
19
- route: 'inbox-socket' | 'session-queue' | 'tool-hook';
20
- /** Claude only: whether the session was idle or busy when the message was posted. */
21
- sessionState?: 'live-idle' | 'live-busy';
22
- }
23
- /** Nothing was written: the exact session could not be proven reachable in place. */
24
- | {
25
- status: 'unavailable';
26
- reason: string;
27
- }
28
- /** Claude only: no process hosts the session any more; nothing was written. */
29
- | {
30
- status: 'stopped';
31
- }
32
- /** `begin` refused (SessionEnd won, a claim lapsed, the lease cannot cover the write). */
33
- | {
34
- status: 'cancelled';
35
- }
36
- /** `begin` succeeded, then the write guard stopped the write before any byte left. */
37
- | {
38
- status: 'aborted';
39
- reason: string;
40
- }
41
- /** The write started and failed; it may or may not have reached the harness. */
42
- | {
43
- status: 'failed';
44
- reason: string;
45
- error: unknown;
46
- };
47
- /**
48
- * The Claude session descriptor of the process that will post, when it names
49
- * this exact session. Read once, when the writer starts: a descriptor that
50
- * appears later is not evidence that this process is that session's child.
51
- */
52
- export declare function claudeSourceDescriptor(sessionId: string, sourcePid: number, adapters: Pick<ClaudeWakeAdapters, 'readDescriptor'>): ClaudeSessionDescriptor | null;
53
- /**
54
- * Claude Code's own-child inbox route. Claude delivers an inbox-socket line
55
- * only from a verified descendant of the receiving process, so the writer must
56
- * be that exact session's child: `sourcePid` is its harness process, observed
57
- * again right before the write.
58
- *
59
- * `holdAfterSend` keeps the posting process alive while macOS verifies the
60
- * sender's ancestry. A resident writer (the Session Attendant) stays alive
61
- * anyway and skips the wait.
62
- */
63
- export declare function deliverIntoClaudeSession(options: {
64
- sessionId: string;
65
- sourcePid: number;
66
- sourceDescriptor: ClaudeSessionDescriptor | null;
67
- adapters: ClaudeWakeAdapters;
68
- text: string;
69
- begin(): boolean;
70
- holdAfterSend?: boolean;
71
- /** Checked at the socket itself, after it connects and before its first byte. */
72
- guard?: WriteGuard;
73
- /** Names the posting process in refusal reasons, which logs keep verbatim. */
74
- writer: string;
75
- }): Promise<SessionWriteResult>;
76
- /**
77
- * Codex's durable per-thread inbox. Exit 0 proves the queue stored the
78
- * message, never that the thread consumed it, and a stopped thread drains it
79
- * the next time it opens.
80
- */
81
- export declare function deliverIntoCodexThread(options: {
82
- threadId: string;
83
- cwd: string;
84
- env: NodeJS.ProcessEnv;
85
- adapters: CodexWakeAdapters;
86
- text: string;
87
- begin(): boolean;
88
- /**
89
- * A claimed write's bound: checked after `begin`, immediately before the
90
- * queue writer starts, and its `remainingMs` then bounds the writer's whole
91
- * life. A writer still running at that deadline has its process group
92
- * killed and is reported `failed`: it may have written.
93
- */
94
- guard?: WriteGuard;
95
- /** Receives the queue writer's process group as soon as it exists. */
96
- onSpawn?: (pgid: number) => void;
97
- }): Promise<SessionWriteResult>;
98
- export declare function claudeSocketLine(text: string): string;
@@ -1,118 +0,0 @@
1
- /**
2
- * Hand one message into a running Agent Session, in place.
3
- *
4
- * The one harness write every hand-off shares: the answer waiter's wake routes
5
- * and the Session Attendant's Session Messages both end here. It never cold
6
- * resumes: a stopped session is reported as stopped, and only the answer route
7
- * decides what to do about that (Session Messages never resume a session).
8
- *
9
- * `begin` is the commit point. It is called immediately before the
10
- * irreversible write, after every check that can refuse without writing; when
11
- * it returns false nothing is handed over. A `failed` result after `begin`
12
- * means the write may or may not have reached the harness.
13
- */
14
- import { CLAUDE_POST_SEND_LIVENESS_MS, observeClaudeSession, parseDescriptor, } from './claude-wake.js';
15
- import { inspectCodexQueue } from './codex-wake.js';
16
- import { WriteAbortedError, WriteDeadlineError } from './wake-support.js';
17
- /**
18
- * The Claude session descriptor of the process that will post, when it names
19
- * this exact session. Read once, when the writer starts: a descriptor that
20
- * appears later is not evidence that this process is that session's child.
21
- */
22
- export function claudeSourceDescriptor(sessionId, sourcePid, adapters) {
23
- try {
24
- const parsed = parseDescriptor(adapters.readDescriptor(sourcePid));
25
- return parsed !== null && parsed.sessionId === sessionId && parsed.pid === sourcePid
26
- ? parsed
27
- : null;
28
- }
29
- catch {
30
- // Delivery fails closed below; a missing descriptor must never break the caller.
31
- return null;
32
- }
33
- }
34
- /**
35
- * Claude Code's own-child inbox route. Claude delivers an inbox-socket line
36
- * only from a verified descendant of the receiving process, so the writer must
37
- * be that exact session's child: `sourcePid` is its harness process, observed
38
- * again right before the write.
39
- *
40
- * `holdAfterSend` keeps the posting process alive while macOS verifies the
41
- * sender's ancestry. A resident writer (the Session Attendant) stays alive
42
- * anyway and skips the wait.
43
- */
44
- export async function deliverIntoClaudeSession(options) {
45
- const { adapters, writer } = options;
46
- const observation = await observeClaudeSession(options.sessionId, adapters);
47
- if (observation.state === 'unknown')
48
- return { status: 'unavailable', reason: observation.reason };
49
- if (options.sourceDescriptor === null) {
50
- return {
51
- status: 'unavailable',
52
- reason: `the ${writer} cannot prove exact Claude session ownership`,
53
- };
54
- }
55
- if (observation.state === 'stopped')
56
- return { status: 'stopped' };
57
- if (observation.descriptor.pid !== options.sourcePid ||
58
- options.sourceDescriptor.startedAt !== observation.descriptor.startedAt) {
59
- return {
60
- status: 'unavailable',
61
- reason: `the ${writer} is not the observed exact Claude session child`,
62
- };
63
- }
64
- if (!options.begin())
65
- return { status: 'cancelled' };
66
- try {
67
- await adapters.sendSocket(observation.descriptor.messagingSocketPath, claudeSocketLine(options.text), options.guard);
68
- }
69
- catch (err) {
70
- if (err instanceof WriteAbortedError)
71
- return { status: 'aborted', reason: err.message };
72
- return { status: 'failed', reason: err instanceof Error ? err.message : String(err), error: err };
73
- }
74
- if (options.holdAfterSend !== false)
75
- await adapters.sleep(CLAUDE_POST_SEND_LIVENESS_MS);
76
- return { status: 'written', route: 'inbox-socket', sessionState: observation.state };
77
- }
78
- /**
79
- * Codex's durable per-thread inbox. Exit 0 proves the queue stored the
80
- * message, never that the thread consumed it, and a stopped thread drains it
81
- * the next time it opens.
82
- */
83
- export async function deliverIntoCodexThread(options) {
84
- const readiness = inspectCodexQueue(options.threadId, options.env);
85
- if (readiness.state === 'unavailable')
86
- return { status: 'unavailable', reason: readiness.reason };
87
- if (!options.begin())
88
- return { status: 'cancelled' };
89
- if (options.guard !== undefined && !options.guard.writable()) {
90
- return { status: 'aborted', reason: 'the claim or lease lapsed before the queue writer started' };
91
- }
92
- const budget = options.guard?.remainingMs() ?? Number.POSITIVE_INFINITY;
93
- const deadline = new AbortController();
94
- const timer = Number.isFinite(budget) ? setTimeout(() => deadline.abort(), Math.max(0, budget)) : undefined;
95
- try {
96
- await options.adapters.queue(readiness.threadId, options.cwd, options.text, options.onSpawn, deadline.signal);
97
- }
98
- catch (err) {
99
- return { status: 'failed', reason: err instanceof Error ? err.message : String(err), error: err };
100
- }
101
- finally {
102
- if (timer !== undefined)
103
- clearTimeout(timer);
104
- }
105
- if (deadline.signal.aborted) {
106
- // The writer finished, but only after its claim's write boundary.
107
- const error = new WriteDeadlineError('the queue writer finished after its claim deadline');
108
- return { status: 'failed', reason: error.message, error };
109
- }
110
- return { status: 'written', route: 'session-queue' };
111
- }
112
- export function claudeSocketLine(text) {
113
- return `${JSON.stringify({
114
- type: 'user',
115
- message: { role: 'user', content: text },
116
- })}\n`;
117
- }
118
- //# sourceMappingURL=session-handoff.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-handoff.js","sourceRoot":"","sources":["../src/session-handoff.ts"],"names":[],"mappings":"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"}
@@ -1,78 +0,0 @@
1
- /** Durable wake attempts. Native I/O never runs inside the session-state lock. */
2
- import type { NativeTurnSnapshot } from './codex-native-turn.js';
3
- import { type QueueControl } from './codex-queue-control.js';
4
- import { type ProcessIdentity } from './process-identity.js';
5
- export interface InputWakeAttempt {
6
- token: string;
7
- ownerKey: string;
8
- incarnation: string;
9
- generation: number | null;
10
- namespace: string;
11
- inputIds: string[];
12
- text: string;
13
- writer: ProcessIdentity;
14
- phase: 'prepared' | 'sending' | 'accepted' | 'unknown' | 'consumed' | 'cancelled';
15
- detached: boolean;
16
- nativeId?: string;
17
- cleanupChecks?: number;
18
- recoveryEvidence?: {
19
- identity: string;
20
- file: string;
21
- size: number;
22
- highWater: number;
23
- turnId: string;
24
- idleSince?: number;
25
- checkedAt: number;
26
- };
27
- nextCheckAt?: number;
28
- }
29
- type Scope = {
30
- sessionId: string;
31
- env: NodeJS.ProcessEnv;
32
- };
33
- type Owner = {
34
- key: string;
35
- incarnation: string;
36
- generation: number | null;
37
- };
38
- export declare const readInputWakes: ({ sessionId, env }: Scope) => InputWakeAttempt[];
39
- /** Persist election before the first native byte. Pending IDs include input
40
- * revision, not just a reusable question ID. Callbacks must only read: this
41
- * runs under the session-state lock, including the final activity check. */
42
- export declare function electInputWake(input: Scope & {
43
- owner: Owner;
44
- namespace: string;
45
- pendingIds(): string[] | null;
46
- mayWake(): boolean;
47
- text(token: string): string;
48
- }): InputWakeAttempt | null;
49
- /** The second gate covers a hook drain or a new prompt after election. A
50
- * drain after admission detaches the attempt; its late receipt is retained. */
51
- export declare function admitInputWake(input: Scope & {
52
- token: string;
53
- control: QueueControl;
54
- pendingIds(): string[] | null;
55
- mayWake(): boolean;
56
- }): Promise<void>;
57
- /** Detach before cleanup I/O so an old deletion cannot suppress new input. */
58
- export declare function detachInputWakes(input: Scope & {
59
- pendingIds(): string[] | null;
60
- }): void;
61
- /** A prompt identifies its own attempt. Manual receive has no such identity. */
62
- export declare function observeInputWake(scope: Scope, token: string): void;
63
- /** Reconnect is read/reconcile only: never add an uncertain attempt again. */
64
- export declare function reconcileInputWakes(scope: Scope, control: QueueControl, now?: number): Promise<void>;
65
- /** One content-free liveness replacement for each immutable pending revision.
66
- * Absence is not rejection: an old wake may still arrive. This does not alter
67
- * the input delivery journal or repeat any answer presentation.
68
- * Native/eligibility readers must be synchronous and mutation-free. */
69
- export declare function recoverUncertainInputWake(input: Scope & {
70
- owner: Owner;
71
- control: QueueControl;
72
- pendingIds(): string[] | null;
73
- mayWake(): boolean;
74
- native(): NativeTurnSnapshot | null;
75
- text(token: string): string;
76
- monotonic?: () => number;
77
- }): Promise<InputWakeAttempt | null>;
78
- export {};
@@ -1,239 +0,0 @@
1
- import { randomUUID } from 'node:crypto';
2
- import { CodexControlNotSent } from './codex-native-control.js';
3
- import {} from './codex-queue-control.js';
4
- import { readSessionIncarnation, readSessionState, sessionHasEnded, updateSessionState } from './hook-session-state.js';
5
- import { currentProcessIdentity, processIdentityLiveness } from './process-identity.js';
6
- import { readAttendantLease } from './session-attendant-state.js';
7
- const CLEANUP_BATCH = 8;
8
- const RETAINED_DETACHED = 64;
9
- const terminal = (attempt) => ['consumed', 'cancelled'].includes(attempt.phase);
10
- export const readInputWakes = ({ sessionId, env }) => readSessionState(sessionId, env).input_wake_attempts ?? [];
11
- function owns(scope, owner) {
12
- const current = readSessionIncarnation(scope.sessionId, scope.env);
13
- if (current?.key !== owner.key || current.incarnation !== owner.incarnation || sessionHasEnded(scope.sessionId, scope.env) ||
14
- current.harness_process === undefined || processIdentityLiveness(current.harness_process) !== 'alive')
15
- return false;
16
- if (owner.generation === null)
17
- return true;
18
- const lease = readAttendantLease(scope.sessionId, scope.env);
19
- return lease?.incarnation === owner.incarnation && lease.generation === owner.generation;
20
- }
21
- function mutate(scope, transform) {
22
- updateSessionState(scope.sessionId, scope.env, state => {
23
- const attempts = transform(state.input_wake_attempts ?? []);
24
- const finished = attempts.filter(terminal).slice(-32);
25
- // An evicted unresolved record is abandoned cleanup, never cancellation.
26
- // Keep live writers until their native operation's bounded deadline ends.
27
- const prunable = attempts.filter(a => !terminal(a) && a.detached &&
28
- !(a.phase === 'sending' && processIdentityLiveness(a.writer) !== 'gone'));
29
- const retained = new Set(prunable.slice(-RETAINED_DETACHED).map(a => a.token));
30
- const active = attempts.filter(a => !terminal(a) && (!prunable.includes(a) || retained.has(a.token)));
31
- return { ...state, input_wake_attempts: active.concat(finished) };
32
- });
33
- }
34
- /** Persist election before the first native byte. Pending IDs include input
35
- * revision, not just a reusable question ID. Callbacks must only read: this
36
- * runs under the session-state lock, including the final activity check. */
37
- export function electInputWake(input) {
38
- const writer = currentProcessIdentity();
39
- if (writer === null)
40
- return null;
41
- let elected = null;
42
- mutate(input, attempts => {
43
- if (!owns(input, input.owner) || !input.mayWake())
44
- return attempts;
45
- const ids = input.pendingIds();
46
- if (ids === null || ids.length === 0)
47
- return attempts;
48
- const outstanding = attempts.filter(a => a.incarnation === input.owner.incarnation && !a.detached && !terminal(a));
49
- const coalesced = outstanding.find(a => a.phase === 'accepted' || a.phase === 'prepared' ||
50
- (a.phase === 'sending' && processIdentityLiveness(a.writer) !== 'gone'));
51
- if (coalesced !== undefined)
52
- return attempts.map(a => a.token === coalesced.token
53
- ? { ...a, inputIds: [...new Set([...a.inputIds, ...ids])] } : a);
54
- // A genuinely new revision may escape an unresolved older wake.
55
- const covered = new Set(outstanding.flatMap(a => a.inputIds));
56
- if (outstanding.length > 0 && ids.every(id => covered.has(id)))
57
- return attempts;
58
- // Bound admitted operations even if several callers stall before receipt.
59
- if (attempts.filter(a => a.phase === 'sending' && processIdentityLiveness(a.writer) !== 'gone').length >= CLEANUP_BATCH)
60
- return attempts;
61
- attempts = attempts.map(a => outstanding.includes(a) ? { ...a, detached: true } : a);
62
- const token = randomUUID();
63
- elected = { token, ownerKey: input.owner.key, incarnation: input.owner.incarnation,
64
- generation: input.owner.generation, namespace: input.namespace, inputIds: ids,
65
- text: input.text(token), writer, phase: 'prepared', detached: false };
66
- return [...attempts, elected];
67
- });
68
- return elected;
69
- }
70
- /** The second gate covers a hook drain or a new prompt after election. A
71
- * drain after admission detaches the attempt; its late receipt is retained. */
72
- export async function admitInputWake(input) {
73
- let sending;
74
- mutate(input, attempts => attempts.map(a => {
75
- if (a.token !== input.token || a.phase !== 'prepared')
76
- return a;
77
- const owner = { key: a.ownerKey, incarnation: a.incarnation, generation: a.generation };
78
- const ids = input.pendingIds();
79
- if (ids === null)
80
- return a;
81
- const pending = new Set(ids);
82
- if (a.detached || input.control.threadId !== input.sessionId || input.control.namespace !== a.namespace || !owns(input, owner) || !input.mayWake() || !a.inputIds.some(id => pending.has(id))) {
83
- return { ...a, phase: 'cancelled', detached: true };
84
- }
85
- sending = { ...a, phase: 'sending' };
86
- return sending;
87
- }));
88
- if (sending === undefined)
89
- return;
90
- try {
91
- const id = await input.control.add(sending.token, sending.text);
92
- mutate(input, attempts => attempts.map(a => a.token !== input.token ? a : {
93
- ...a, nativeId: id, phase: terminal(a) ? a.phase : 'accepted',
94
- }));
95
- }
96
- catch (error) {
97
- if (error instanceof CodexControlNotSent) {
98
- mutate(input, attempts => attempts.map(a => a.token === input.token && !terminal(a) ? { ...a, phase: 'cancelled', detached: true } : a));
99
- return;
100
- }
101
- // A crash/timeout/refusal after admission can have reached the backend.
102
- // It never becomes a new add, including after this helper restarts.
103
- mutate(input, attempts => attempts.map(a => a.token === input.token && !terminal(a) ? { ...a, phase: 'unknown' } : a));
104
- }
105
- }
106
- /** Detach before cleanup I/O so an old deletion cannot suppress new input. */
107
- export function detachInputWakes(input) {
108
- mutate(input, attempts => {
109
- const ids = input.pendingIds();
110
- if (ids === null)
111
- return attempts;
112
- const pending = new Set(ids);
113
- return attempts.map(a => !terminal(a) && !a.inputIds.some(id => pending.has(id)) ? { ...a, detached: true } : a);
114
- });
115
- }
116
- /** A prompt identifies its own attempt. Manual receive has no such identity. */
117
- export function observeInputWake(scope, token) {
118
- mutate(scope, attempts => attempts.map(a => a.token === token ? { ...a, phase: 'consumed', detached: true } : a));
119
- }
120
- /** Reconnect is read/reconcile only: never add an uncertain attempt again. */
121
- export async function reconcileInputWakes(scope, control, now = Date.now()) {
122
- if (control.threadId !== scope.sessionId)
123
- return;
124
- const candidates = readInputWakes(scope)
125
- .filter(a => !terminal(a) && a.namespace === control.namespace && (a.nextCheckAt ?? 0) <= now)
126
- .sort((a, b) => (a.nextCheckAt ?? 0) - (b.nextCheckAt ?? 0)).slice(0, CLEANUP_BATCH);
127
- for (const captured of candidates) {
128
- // Claim the backoff before native I/O so overlapping helpers cannot scan
129
- // the same whole backlog. Every pass does at most eight native lookups.
130
- let claimed = false;
131
- mutate(scope, attempts => attempts.map(a => {
132
- if (a.token !== captured.token || terminal(a) || (a.nextCheckAt ?? 0) > now)
133
- return a;
134
- claimed = true;
135
- const checks = (a.cleanupChecks ?? 0) + 1;
136
- return { ...a, cleanupChecks: checks, nextCheckAt: now + Math.min(30_000, 2_000 * 2 ** Math.min(checks - 1, 4)) };
137
- }));
138
- if (!claimed)
139
- continue;
140
- let a = captured;
141
- if (a.phase === 'prepared') {
142
- if (a.detached || !owns(scope, { key: a.ownerKey, incarnation: a.incarnation, generation: a.generation }) || processIdentityLiveness(a.writer) === 'gone') {
143
- mutate(scope, attempts => attempts.map(v => v.token === a.token && v.phase === 'prepared' ? { ...v, phase: 'cancelled', detached: true } : v));
144
- }
145
- continue;
146
- }
147
- try {
148
- if (a.nativeId === undefined) {
149
- const found = await control.find(a.token, a.text);
150
- // Absence also means it may have dequeued. Ambiguity is not ownership.
151
- if (typeof found === 'string')
152
- continue;
153
- mutate(scope, attempts => attempts.map(v => v.token === a.token ? { ...v, nativeId: found.id } : v));
154
- }
155
- // A drain/observation could have occurred during list. Use current state.
156
- const current = readInputWakes(scope).find(v => v.token === a.token);
157
- if (current === undefined || terminal(current) || !current.detached || current.nativeId === undefined)
158
- continue;
159
- a = current;
160
- const deleted = await control.remove(a.nativeId);
161
- if (deleted)
162
- mutate(scope, attempts => attempts.map(v => v.token === a.token && !terminal(v) ? { ...v, phase: 'cancelled', detached: true } : v));
163
- // Delete-absent never means cancelled. A late token observation can still
164
- // settle this exact attempt without clearing a newer attempt.
165
- }
166
- catch { /* Keep unresolved intent for the next bounded reconciliation. */ }
167
- }
168
- }
169
- /** One content-free liveness replacement for each immutable pending revision.
170
- * Absence is not rejection: an old wake may still arrive. This does not alter
171
- * the input delivery journal or repeat any answer presentation.
172
- * Native/eligibility readers must be synchronous and mutation-free. */
173
- export async function recoverUncertainInputWake(input) {
174
- if (input.control.threadId !== input.sessionId)
175
- return null;
176
- const old = readInputWakes(input).find(a => !a.detached && !terminal(a) && a.phase !== 'prepared' &&
177
- a.incarnation === input.owner.incarnation && a.namespace === input.control.namespace);
178
- if (old === undefined || (old.phase === 'sending' && processIdentityLiveness(old.writer) !== 'gone'))
179
- return null;
180
- // Every fresh connection has already established this home/thread association.
181
- let found;
182
- try {
183
- found = await input.control.find(old.token, old.text);
184
- }
185
- catch {
186
- return null;
187
- }
188
- if (typeof found !== 'string') {
189
- mutate(input, attempts => attempts.map(a => a.token === old.token ? { ...a, nativeId: found.id } : a));
190
- return null;
191
- }
192
- if (found !== 'absent')
193
- return null;
194
- const writer = currentProcessIdentity();
195
- if (writer === null)
196
- return null;
197
- let replacement = null;
198
- updateSessionState(input.sessionId, input.env, state => {
199
- if (!owns(input, input.owner))
200
- return state;
201
- const attempts = state.input_wake_attempts ?? [];
202
- const current = attempts.find(a => a.token === old.token);
203
- if (current === undefined || current.detached || terminal(current) || current.nativeId !== old.nativeId || current.phase !== old.phase)
204
- return state;
205
- const native = input.native();
206
- const ids = input.pendingIds();
207
- if (native === null || ids === null || ids.length === 0 || !current.inputIds.some(id => ids.includes(id)))
208
- return state;
209
- const now = (input.monotonic ?? (() => Number(process.hrtime.bigint() / 1000000n)))();
210
- const prior = current.recoveryEvidence;
211
- if (prior !== undefined && (prior.identity !== native.identity || prior.file !== native.file || native.size < prior.highWater))
212
- return state;
213
- const same = prior !== undefined && prior.identity === native.identity && prior.file === native.file &&
214
- native.size >= prior.size && now >= prior.checkedAt;
215
- const advanced = same && native.latest.ended && native.latest.id !== prior.turnId && native.latest.offset >= prior.size;
216
- const continuous = same && now - prior.checkedAt <= 6_000 && native.latest.id === prior.turnId;
217
- const idleSince = native.latest.ended ? continuous ? prior.idleSince ?? now : now : undefined;
218
- const evidence = { identity: native.identity, file: native.file,
219
- size: same ? prior.size : native.size, highWater: native.size, turnId: same ? prior.turnId : native.latest.id,
220
- ...(idleSince === undefined ? {} : { idleSince }), checkedAt: now };
221
- const eligible = native.latest.ended && input.mayWake() && (advanced || (idleSince !== undefined && now - idleSince >= 30_000));
222
- const used = state.input_wake_recovery?.incarnation === current.incarnation ? state.input_wake_recovery.inputIds : [];
223
- const fresh = ids.filter(id => !used.includes(id));
224
- // Retain the budget across drain/re-add and process restart. Reaching this
225
- // safety cap disables uncertainty replacement, never ordinary new wakes.
226
- if (!eligible || fresh.length === 0 || used.length + fresh.length > 256) {
227
- return { ...state, input_wake_attempts: attempts.map(a => a.token === current.token ? { ...a, recoveryEvidence: evidence } : a) };
228
- }
229
- const token = randomUUID();
230
- replacement = { token, ownerKey: input.owner.key, incarnation: input.owner.incarnation,
231
- generation: input.owner.generation, namespace: input.control.namespace, inputIds: ids,
232
- text: input.text(token), writer, phase: 'prepared', detached: false };
233
- return { ...state,
234
- input_wake_recovery: { incarnation: current.incarnation, inputIds: [...used, ...fresh] },
235
- input_wake_attempts: [...attempts.map(a => a.token === current.token ? { ...a, detached: true } : a), replacement] };
236
- });
237
- return replacement;
238
- }
239
- //# sourceMappingURL=session-input-wakes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-input-wakes.js","sourceRoot":"","sources":["../src/session-input-wakes.ts"],"names":[],"mappings":"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"}
@@ -1,57 +0,0 @@
1
- import type { AttendanceMessage } from '@raidiant/notifai-protocol';
2
- import type { AcceptedAnswerDelivery, AnsweredPending, EscalationDeliveryRoute, SessionState } from './hook-types.js';
3
- import type { Logger } from './logging.js';
4
- import { type DeliveryLease, type NativeAnswerPresentation, type SequencerDeps } from './session-delivery.js';
5
- import { connectCodexQueue } from './codex-queue-control.js';
6
- export declare function sessionInputWake(token?: string): string;
7
- /** Atomically coalesce native wakes until one actually reaches its consumer. */
8
- export declare function wakeSessionInputs(sessionId: string, env: NodeJS.ProcessEnv, send: (text: string) => Promise<boolean>, log?: Logger): Promise<void>;
9
- export declare function observeSessionInputWake(sessionId: string, env: NodeJS.ProcessEnv, prompt: string | undefined): void;
10
- export declare function stageSessionAnswers(sessionId: string, env: NodeJS.ProcessEnv, accepted: AcceptedAnswerDelivery): void;
11
- /** The existing route wakes the exact owner, but no longer owns answer text. */
12
- export declare function sessionInputRoute(sessionId: string, env: NodeJS.ProcessEnv, route: EscalationDeliveryRoute, log?: Logger, wakeOwner?: 'producer' | 'attendant'): EscalationDeliveryRoute;
13
- /** Cache only: the service remains authoritative and claims fence stale copies. */
14
- export declare function stageSessionMessages(sessionId: string, env: NodeJS.ProcessEnv, lease: DeliveryLease, messages: readonly AttendanceMessage[]): void;
15
- export declare function readSessionMessages(sessionId: string, env: NodeJS.ProcessEnv, lease: DeliveryLease): AttendanceMessage[];
16
- export declare function hasSessionInputs(sessionId: string, env: NodeJS.ProcessEnv, lease: DeliveryLease | null): boolean;
17
- /** Read-only under the state lock. Unknown cache state is not an empty inbox. */
18
- export declare function pendingInputRevisionIds(sessionId: string, env: NodeJS.ProcessEnv, lease: DeliveryLease | null, state?: SessionState): string[] | null;
19
- /** Optional exact queue integration. False means capability was unavailable
20
- * before election, so the existing supported CLI wake remains the fallback. */
21
- export declare function wakeCodexSessionInputs(input: {
22
- sessionId: string;
23
- env: NodeJS.ProcessEnv;
24
- lease: DeliveryLease;
25
- mayWrite(): boolean;
26
- mayWake(): boolean;
27
- unknownAllowed?(): boolean;
28
- connect?: typeof connectCodexQueue;
29
- }): Promise<boolean>;
30
- /** Hook drains and the resident observer both call this bounded cleanup path.
31
- * It never elects a wake, claims input, or acquires the delivery sequencer. */
32
- export declare function reconcileSessionInputWakes(sessionId: string, env: NodeJS.ProcessEnv, connect?: typeof connectCodexQueue): Promise<void>;
33
- export interface PreparedInputAnswer {
34
- presentation: NativeAnswerPresentation;
35
- /** Refresh exact binding evidence inside the final consumption transaction. */
36
- validate(state: SessionState): {
37
- state: SessionState;
38
- valid: boolean;
39
- };
40
- write(mayWrite: () => boolean): Promise<void>;
41
- close(): void;
42
- }
43
- export interface NativeInputAnswers {
44
- eligible(answer: AnsweredPending, state: SessionState): boolean;
45
- /** No answer bytes. Null chooses ordinary presentation of the same prefix. */
46
- prepare(answer: AnsweredPending, state: SessionState, deadline: number): Promise<PreparedInputAnswer | null>;
47
- }
48
- /** One ordered prefix, at most 20 inputs, with ownership checked at the byte. */
49
- declare function drainSessionInputsOnce(input: {
50
- sequencer: SequencerDeps;
51
- lease: DeliveryLease | null;
52
- mayWrite(): boolean;
53
- write(text: string): void;
54
- nativeAnswers?: NativeInputAnswers;
55
- }): Promise<boolean>;
56
- export declare function drainSessionInputs(input: Parameters<typeof drainSessionInputsOnce>[0]): Promise<boolean>;
57
- export {};