@raidiant/notifai 11.7.1 → 12.0.0-beta.13

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 +57 -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
package/dist/send.js DELETED
@@ -1,421 +0,0 @@
1
- import { COLLAPSE_KEY_MAX_BYTES, INTERRUPTION_LEVELS, MEDIA_MAX_ITEMS, NOTIFICATION_SCHEMA_VERSION, QUESTION_TEXT_MAX_LENGTH, SUMMARY_MAX_LENGTH, NOTIFICATION_KINDS, PLATFORMS, } from '@raidiant/notifai-protocol';
2
- import { isCliSoundRef, unknownSoundMessage } from './sound-ref.js';
3
- /** A backslash-n pair that was not itself escaped as a literal backslash. */
4
- const ACCIDENTAL_ESCAPED_NEWLINE = /(?:^|[^\\])\\n/;
5
- export function hasAccidentalEscapedNewlines(body) {
6
- return ACCIDENTAL_ESCAPED_NEWLINE.test(body);
7
- }
8
- export function accidentalEscapedNewlineMessage() {
9
- return [
10
- 'This body contains the two-character sequence \\n, which is sent literally and shows as \\n on the device.',
11
- 'To send a real line break, pass a multiline --body or --body-file -.',
12
- 'If you meant the visible characters \\n, pass --literal-backslash-n.',
13
- ].join('\n');
14
- }
15
- export function rejectAccidentalEscapedNewlines(body, allowLiteral) {
16
- if (allowLiteral === true || body === undefined)
17
- return null;
18
- return hasAccidentalEscapedNewlines(body) ? accidentalEscapedNewlineMessage() : null;
19
- }
20
- /** Validate media cardinality and positional alt pairing before any upload starts. */
21
- export function validateMediaInputs(images, alts) {
22
- const imageCount = images?.length ?? 0;
23
- const imageAlts = alts ?? [];
24
- if (imageCount > MEDIA_MAX_ITEMS)
25
- return `Attach at most ${MEDIA_MAX_ITEMS} images.`;
26
- if (imageAlts.length > imageCount) {
27
- return `Received ${imageAlts.length} --image-alt values for ${imageCount} --image values.`;
28
- }
29
- if (imageAlts.some((alt) => alt.length < 1 || alt.length > 256)) {
30
- return '--image-alt must be 1-256 characters.';
31
- }
32
- return null;
33
- }
34
- /** Validate a frozen value-object manifest without collapsing sparse alt text. */
35
- function validateMediaManifest(media) {
36
- if (media.length > MEDIA_MAX_ITEMS)
37
- return `Attach at most ${MEDIA_MAX_ITEMS} images.`;
38
- if (media.some((item) => item.alt !== undefined && (item.alt.length < 1 || item.alt.length > 256))) {
39
- return 'Media alt text must be 1-256 characters.';
40
- }
41
- return null;
42
- }
43
- /**
44
- * A body may reference an attached image only through Markdown image syntax:
45
- * `![what it shows](media:1)` for a position in `--image` order, or
46
- * `![…](media:med_…)` for an id that is also attached. Companions resolve
47
- * the `media:` scheme only as an image target; a bare token or a link would
48
- * reach the User as raw text, so both are refused here rather than rendered
49
- * wrongly there.
50
- */
51
- const MEDIA_IMAGE_REFERENCE = /!\[[^\]\n]*\]\(\s*<?media:([^\s)>]*)>?(?:\s+(?:"[^"\n]*"|'[^'\n]*'|\([^\n)]*\)))?\s*\)/g;
52
- /** A stray `media:` token outside image syntax: a position or a media id. */
53
- const STRAY_MEDIA_REFERENCE = /media:(?:\d+(?![A-Za-z0-9_-])|med_[A-Za-z0-9_-]+)/;
54
- /** Split Markdown into literal code (fences and spans) and the prose around it. */
55
- function markdownProseSegments(body) {
56
- const segments = [];
57
- let fence = null;
58
- let prose = '';
59
- let code = '';
60
- const flushProse = () => {
61
- if (prose.length === 0)
62
- return;
63
- segments.push(...inlineCodeSegments(prose));
64
- prose = '';
65
- };
66
- // Keep each line's own newline so the segments concatenate back to the body.
67
- for (const line of body.split(/(?<=\n)/)) {
68
- if (fence !== null) {
69
- code += line;
70
- const close = line.trim().match(/^(`{3,}|~{3,})\s*$/);
71
- if (close?.[1]?.[0] === fence.marker && close[1].length >= fence.length) {
72
- segments.push({ text: code, code: true });
73
- code = '';
74
- fence = null;
75
- }
76
- continue;
77
- }
78
- const open = line.trim().match(/^(`{3,}|~{3,})/);
79
- if (open?.[1]) {
80
- flushProse();
81
- fence = { marker: open[1][0], length: open[1].length };
82
- code = line;
83
- continue;
84
- }
85
- prose += line;
86
- }
87
- flushProse();
88
- if (code.length > 0)
89
- segments.push({ text: code, code: true });
90
- return segments;
91
- }
92
- /** Split prose at backtick spans so a literal `media:1` in code stays literal. */
93
- function inlineCodeSegments(prose) {
94
- const segments = [];
95
- let cursor = 0;
96
- const runs = /`+/g;
97
- let match;
98
- while ((match = runs.exec(prose)) !== null) {
99
- const open = match[0];
100
- const closeIndex = prose.indexOf(open, match.index + open.length);
101
- if (closeIndex === -1)
102
- continue;
103
- const end = closeIndex + open.length;
104
- if (match.index > cursor)
105
- segments.push({ text: prose.slice(cursor, match.index), code: false });
106
- segments.push({ text: prose.slice(match.index, end), code: true });
107
- cursor = end;
108
- runs.lastIndex = end;
109
- }
110
- if (cursor < prose.length)
111
- segments.push({ text: prose.slice(cursor), code: false });
112
- return segments;
113
- }
114
- /**
115
- * Rewrite authorable 1-based media positions to canonical ready media ids and
116
- * refuse every other shape of media reference before anything is sent.
117
- */
118
- export function rewriteMediaReferences(body, mediaIds) {
119
- let error;
120
- const rewritten = markdownProseSegments(body)
121
- .map((segment) => {
122
- if (segment.code || error !== undefined)
123
- return segment.text;
124
- const images = [];
125
- // Choose a marker absent from authored text. A fixed private-use
126
- // character lets input such as `\uE0000\uE000` impersonate a placeholder
127
- // and duplicate an image reference during restoration.
128
- let imageMarker = '\uE000';
129
- while (segment.text.includes(imageMarker))
130
- imageMarker += '\uE000';
131
- const masked = segment.text.replace(MEDIA_IMAGE_REFERENCE, (reference, target) => {
132
- if (error !== undefined)
133
- return reference;
134
- let mediaId;
135
- if (/^\d+$/.test(target)) {
136
- const position = Number(target);
137
- mediaId = String(position) === target ? mediaIds[position - 1] : undefined;
138
- if (mediaId === undefined) {
139
- error = `Body reference "media:${target}" has no matching --image occurrence.`;
140
- return reference;
141
- }
142
- }
143
- else if (/^med_[A-Za-z0-9_-]+$/.test(target)) {
144
- if (!mediaIds.includes(target)) {
145
- error = `Body reference "media:${target}" is not attached; pass it with --image.`;
146
- return reference;
147
- }
148
- mediaId = target;
149
- }
150
- else {
151
- error = `Body reference "media:${target}" is neither an --image position nor a media id.`;
152
- return reference;
153
- }
154
- images.push(reference.replace(`media:${target}`, `media:${mediaId}`));
155
- return `${imageMarker}${images.length - 1}${imageMarker}`;
156
- });
157
- if (error !== undefined)
158
- return segment.text;
159
- const stray = masked.match(STRAY_MEDIA_REFERENCE);
160
- if (stray !== null) {
161
- error =
162
- `Body reference "${stray[0]}" is not a Markdown image. Write ` +
163
- `![what it shows](${stray[0]}) — a bare or linked media reference is never rendered.`;
164
- return segment.text;
165
- }
166
- return images.reduce((restored, image, index) => restored.replaceAll(`${imageMarker}${index}${imageMarker}`, image), masked);
167
- })
168
- .join('');
169
- return error === undefined ? { ok: true, body: rewritten } : { ok: false, error };
170
- }
171
- /** Merge flags over resolved config into a Notification Request draft. */
172
- export function buildDraft(config, flags, invocation = {}) {
173
- if (!flags.title || !flags.summary || flags.summary.trim() === '') {
174
- return { ok: false, error: 'Both --title and --summary are required.' };
175
- }
176
- if (Array.from(flags.summary).length > SUMMARY_MAX_LENGTH) {
177
- return {
178
- ok: false,
179
- error: `--summary must be at most ${SUMMARY_MAX_LENGTH} Unicode characters.`,
180
- };
181
- }
182
- if (/[\u0000-\u001F\u007F-\u009F\u2028\u2029]/u.test(flags.summary)) {
183
- return { ok: false, error: '--summary must be one line of plain text.' };
184
- }
185
- const platform = resolvePlatform(flags.platform);
186
- if (!platform) {
187
- return { ok: false, error: `Unknown platform "${flags.platform}" — use ${PLATFORMS.join(' or ')}.` };
188
- }
189
- if (flags.media !== undefined && (flags.image !== undefined || flags.imageAlt !== undefined)) {
190
- return { ok: false, error: 'Internal media manifests cannot be combined with --image or --image-alt.' };
191
- }
192
- const imageIds = flags.media?.map((item) => item.media_id) ?? flags.image ?? [];
193
- const imageAlts = flags.imageAlt ?? [];
194
- const mediaInputError = flags.media === undefined
195
- ? validateMediaInputs(imageIds, imageAlts)
196
- : validateMediaManifest(flags.media);
197
- if (mediaInputError !== null)
198
- return { ok: false, error: mediaInputError };
199
- const media = flags.media ??
200
- imageIds.map((media_id, index) => ({
201
- media_id,
202
- ...(imageAlts[index] !== undefined ? { alt: imageAlts[index] } : {}),
203
- }));
204
- const body = flags.body === undefined
205
- ? undefined
206
- : rewriteMediaReferences(flags.body, imageIds);
207
- if (body !== undefined && !body.ok)
208
- return body;
209
- const deviceIds = flags.all ? null : (flags.device?.length ? flags.device : config.devices.value);
210
- const targets = deviceIds && deviceIds.length > 0 ? { mode: 'selected', device_ids: deviceIds } : { mode: 'all' };
211
- if (flags.kind !== undefined &&
212
- !NOTIFICATION_KINDS.includes(flags.kind)) {
213
- return {
214
- ok: false,
215
- error: `Unknown kind "${flags.kind}" — supported: ${NOTIFICATION_KINDS.map((kind) => `"${kind}"`).join(', ')}.`,
216
- };
217
- }
218
- // Explicit --sound and the saved sound key outrank kind. The server is the
219
- // one that applies kind, Project, and Account maps — stamping a kind default
220
- // here would look like an explicit choice and skip those layers. `none` is
221
- // still silent.
222
- const sound = flags.sound !== undefined ? flags.sound : config.sound.value;
223
- if (sound !== null && sound !== undefined && !isCliSoundRef(sound)) {
224
- return {
225
- ok: false,
226
- error: unknownSoundMessage(sound),
227
- };
228
- }
229
- const level = flags.level !== undefined ? flags.level : config.interruption_level.value;
230
- if (level !== null &&
231
- level !== undefined &&
232
- !INTERRUPTION_LEVELS.includes(level)) {
233
- return { ok: false, error: `Unknown interruption level "${level}".` };
234
- }
235
- if (platform === 'android' && level !== null && level !== undefined) {
236
- return {
237
- ok: false,
238
- error: 'Android does not support caller-selected interruption levels. Remove --level or unset the configured interruption_level; kind, notification channels, and device settings own attention on Android.',
239
- };
240
- }
241
- const appleOptions = {};
242
- const androidOptions = {};
243
- if (sound === 'none') {
244
- appleOptions.sound = null;
245
- androidOptions.sound = null;
246
- }
247
- else if (sound !== null && sound !== undefined) {
248
- appleOptions.sound = sound;
249
- androidOptions.sound = sound;
250
- }
251
- if (flags.threadId !== undefined) {
252
- appleOptions.thread_id = flags.threadId;
253
- androidOptions.thread_id = flags.threadId;
254
- }
255
- if (level !== null && level !== undefined) {
256
- appleOptions.interruption_level = level;
257
- }
258
- if (flags.data?.length) {
259
- const data = {};
260
- for (const pair of flags.data) {
261
- const eq = pair.indexOf('=');
262
- if (eq <= 0)
263
- return { ok: false, error: `--data expects key=value, got "${pair}".` };
264
- data[pair.slice(0, eq)] = pair.slice(eq + 1);
265
- }
266
- appleOptions.custom_data = data;
267
- androidOptions.custom_data = data;
268
- }
269
- const ttl = flags.ttl ?? config.ttl_seconds.value;
270
- const collapse = flags.collapseKey ?? config.collapse_key.value;
271
- if (collapse !== null &&
272
- collapse !== undefined &&
273
- Buffer.byteLength(collapse, 'utf8') > COLLAPSE_KEY_MAX_BYTES) {
274
- return {
275
- ok: false,
276
- error: `--collapse-key must be at most ${COLLAPSE_KEY_MAX_BYTES} UTF-8 bytes.`,
277
- };
278
- }
279
- if (flags.projectless === true && flags.project !== undefined) {
280
- return { ok: false, error: 'Choose either --project or --projectless, not both.' };
281
- }
282
- const project = flags.projectless === true
283
- ? undefined
284
- : flags.project ?? config.project.value ?? invocation.inferredProject;
285
- // Ids are derived from labels so an agent writing a one-liner does not have
286
- // to invent them, but they stay the stable thing it branches on afterwards.
287
- const choices = parseChoices(flags.choice);
288
- if (choices === 'invalid') {
289
- return {
290
- ok: false,
291
- error: CHOICE_USAGE,
292
- };
293
- }
294
- if (flags.multi && choices === null && flags.questions === undefined) {
295
- return { ok: false, error: '--multi needs answers to select between; add --choice.' };
296
- }
297
- if (flags.reply &&
298
- flags.questions === undefined &&
299
- Array.from(flags.summary).length > QUESTION_TEXT_MAX_LENGTH) {
300
- return {
301
- ok: false,
302
- error: `Keep the question within ${QUESTION_TEXT_MAX_LENGTH} characters and put ` +
303
- 'the longer explanation in the optional Markdown Body.',
304
- };
305
- }
306
- const hasAppleOptions = Object.keys(appleOptions).length > 0;
307
- const hasAndroidOptions = Object.keys(androidOptions).length > 0;
308
- let platformOptions;
309
- if (flags.platform === undefined) {
310
- if (hasAppleOptions || hasAndroidOptions) {
311
- platformOptions = {
312
- ...(hasAppleOptions ? { ios: appleOptions, macos: appleOptions } : {}),
313
- ...(hasAndroidOptions ? { android: androidOptions } : {}),
314
- };
315
- }
316
- }
317
- else if (platform === 'android') {
318
- if (hasAndroidOptions)
319
- platformOptions = { android: androidOptions };
320
- }
321
- else if (hasAppleOptions) {
322
- platformOptions =
323
- platform === 'ios' ? { ios: appleOptions } : { macos: appleOptions };
324
- }
325
- const draft = {
326
- schema_version: NOTIFICATION_SCHEMA_VERSION,
327
- ...(flags.kind !== undefined
328
- ? { kind: flags.kind }
329
- : {}),
330
- ...(flags.lifecycle !== undefined ? { lifecycle: flags.lifecycle } : {}),
331
- ...(project !== null && project !== undefined ? { project } : {}),
332
- ...(invocation.source !== undefined ? { source: invocation.source } : {}),
333
- presentation: {
334
- title: flags.title,
335
- summary: flags.summary,
336
- ...(body !== undefined ? { body: body.body } : {}),
337
- ...(media.length > 0 ? { media } : {}),
338
- },
339
- targets,
340
- delivery: { ttl_seconds: ttl, collapse_key: collapse },
341
- ...(flags.reply
342
- ? {
343
- reply: {
344
- expires_in_seconds: flags.replyWindow ?? config.reply_window_seconds.value,
345
- questions: flags.questions ?? [
346
- {
347
- id: 'q1',
348
- text: flags.summary,
349
- ...(choices !== null ? { choices } : {}),
350
- ...(flags.multi ? { multi: true } : {}),
351
- },
352
- ],
353
- },
354
- }
355
- : {}),
356
- ...(platformOptions !== undefined ? { platform: platformOptions } : {}),
357
- };
358
- return { ok: true, draft, platform };
359
- }
360
- function resolvePlatform(value) {
361
- if (value === undefined)
362
- return 'ios';
363
- return PLATFORMS.includes(value) ? value : null;
364
- }
365
- /** Human one-screen receipt summary; agents use --json instead. */
366
- export function formatReceipt(receipt) {
367
- const lines = [];
368
- const overall = receipt.overall === 'provider_accepted_all'
369
- ? 'accepted by the push provider for every device'
370
- : receipt.overall === 'provider_accepted_partial'
371
- ? 'accepted for some devices'
372
- : receipt.overall === 'provider_rejected_all'
373
- ? 'rejected for every device'
374
- : 'still in flight';
375
- lines.push(`request ${receipt.request_id}${receipt.replayed ? ' (replayed)' : ''}: ${overall}`);
376
- for (const d of receipt.deliveries) {
377
- const detail = d.provider_reason ? ` (${d.provider_reason})` : '';
378
- lines.push(` ${d.device_name}: ${d.state}${detail}`);
379
- }
380
- lines.push(` device receipt is not assessed here; run notifai status ${receipt.request_id} for Companion Receipt evidence`);
381
- for (const w of receipt.warnings)
382
- lines.push(` warning ${w.path}: ${w.message}`);
383
- return lines.join('\n');
384
- }
385
- /** Stable exit codes: 0 ok/pending, 1 rejected everywhere. */
386
- export function receiptExitCode(receipt) {
387
- return receipt.overall === 'provider_rejected_all' ? 1 : 0;
388
- }
389
- /**
390
- * One flag occurrence, one answer: `--choice Staging --choice Production` ->
391
- * `[{id:'staging',label:'Staging'}, ...]`.
392
- *
393
- * Commas are ordinary characters. The old single-value comma split produced
394
- * buttons the agent never intended ("Nothing, I'll review" became two answers)
395
- * and nothing downstream could detect it, so the delimiter form is gone
396
- * rather than guarded: a label is a label.
397
- */
398
- export function parseChoices(value) {
399
- if (value === undefined || value.length === 0)
400
- return null;
401
- const labels = value.map((part) => part.trim()).filter((part) => part.length > 0);
402
- if (labels.length < 2 || labels.length > 6)
403
- return 'invalid';
404
- const choices = labels.map((label) => ({ id: slugify(label), label }));
405
- if (choices.some((choice) => choice.id === ''))
406
- return 'invalid';
407
- if (new Set(choices.map((choice) => choice.id)).size !== choices.length)
408
- return 'invalid';
409
- return choices;
410
- }
411
- /** Message shared by every surface that accepts choice labels. */
412
- export const CHOICE_USAGE = 'Offer 2-6 answers, one --choice flag per answer, unique once slugified — ' +
413
- 'e.g. --choice "Yes, ship it" --choice "Not yet".';
414
- export function slugify(label) {
415
- return label
416
- .toLowerCase()
417
- .replace(/[^a-z0-9]+/g, '-')
418
- .replace(/^-+|-+$/g, '')
419
- .slice(0, 32);
420
- }
421
- //# sourceMappingURL=send.js.map
package/dist/send.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"send.js","sourceRoot":"","sources":["../src/send.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- import type { HookHarness } from './hook-types.js';
2
- export declare const WORKER_ACTIVATION_CONTEXT = "Notifai worker context: an Agent Event is a meaningful occurrence in your work; a Notification Request is a deliberate User-visible message about one. Report Agent Events to the parent and do not send Notification Requests unless the parent explicitly delegated that ownership. If delegated, load the Notifai skill and run `notifai guidance` before composing one.";
3
- export declare const MISSING_LIFECYCLE_GUIDANCE_CONTEXT = "Notifai lifecycle guidance could not be loaded, so Project Enablement is unverified. Run `notifai init --json` to check setup, then `notifai guidance` before deciding whether or how to send a Notification Request.";
4
- /** One lifecycle meaning, encoded for each harness output contract. */
5
- export declare function sessionActivationOutput(harness: HookHarness | undefined, hookEventName: 'SessionStart' | 'SubagentStart', cwd?: string, env?: NodeJS.ProcessEnv, notice?: string): string | undefined;
6
- /** Inject a journaled device answer into the User's new turn. */
7
- export declare function userPromptContextOutput(harness: HookHarness | undefined, context: string): string | undefined;
8
- /**
9
- * Cursor currently accepts sessionStart context without reliably delivering it
10
- * to the model. Its native post-Stop follow-up is the narrow fallback and is
11
- * claimed once per conversation by the hook-state layer.
12
- */
13
- export declare function cursorStopActivationOutput(cwd?: string, env?: NodeJS.ProcessEnv, notice?: string): string;
@@ -1,64 +0,0 @@
1
- import { Buffer } from 'node:buffer';
2
- import { GUIDANCE_CONTEXT_MAX_BYTES, boundedEffectiveGuidance } from './guidance-render.js';
3
- const ROOT_OWNERSHIP = 'Notifai is enabled for this Project. You own Notification Requests unless explicitly assigned elsewhere. Load the Notifai skill before your first Notification Request. ' +
4
- 'Load the skill\'s naming rules on a change of job. ' +
5
- 'Follow the effective guidance below. Under it, when owned or coordinated work needs a User decision, approval, sign-in, credential setup or physical action, register with `notifai ask` in the same turn as the conversation question; conversation alone misses an away User. Ask for safe setup or readiness, never for credentials. Harness permission prompts stay in the harness. ' +
6
- 'Missing readiness: `notifai init --json`.';
7
- export const WORKER_ACTIVATION_CONTEXT = 'Notifai worker context: an Agent Event is a meaningful occurrence in your work; a Notification Request is a deliberate User-visible message about one. Report Agent Events to the parent and do not send Notification Requests unless the parent explicitly delegated that ownership. If delegated, load the Notifai skill and run `notifai guidance` before composing one.';
8
- export const MISSING_LIFECYCLE_GUIDANCE_CONTEXT = 'Notifai lifecycle guidance could not be loaded, so Project Enablement is unverified. Run `notifai init --json` to check setup, then `notifai guidance` before deciding whether or how to send a Notification Request.';
9
- function rootActivationContext(cwd, env, notice, maxBytes = GUIDANCE_CONTEXT_MAX_BYTES) {
10
- const opening = notice === undefined ? ROOT_OWNERSHIP : `${ROOT_OWNERSHIP}\n\n${notice}`;
11
- const guidance = boundedEffectiveGuidance({
12
- cwd,
13
- env,
14
- maxBytes: maxBytes - Buffer.byteLength(`${opening}\n\n`, 'utf8'),
15
- });
16
- return `${opening}\n\n${guidance.ok ? guidance.content : guidance.fallback}`;
17
- }
18
- /** One lifecycle meaning, encoded for each harness output contract. */
19
- export function sessionActivationOutput(harness, hookEventName, cwd = process.cwd(), env = process.env, notice) {
20
- const context = hookEventName === 'SubagentStart'
21
- ? WORKER_ACTIVATION_CONTEXT
22
- : rootActivationContext(cwd, env, notice, harness === 'hermes' ? 3900 : GUIDANCE_CONTEXT_MAX_BYTES);
23
- if (harness === 'opencode' || harness === 'openclaw' || harness === 'hermes')
24
- return context;
25
- if (harness === 'cursor') {
26
- return JSON.stringify({ additional_context: context });
27
- }
28
- if (harness === 'claude-code' || harness === 'codex') {
29
- return JSON.stringify({
30
- hookSpecificOutput: {
31
- hookEventName,
32
- additionalContext: context,
33
- },
34
- });
35
- }
36
- return undefined;
37
- }
38
- /** Inject a journaled device answer into the User's new turn. */
39
- export function userPromptContextOutput(harness, context) {
40
- if (harness === 'opencode' || harness === 'openclaw')
41
- return context;
42
- if (harness === 'cursor')
43
- return JSON.stringify({ additional_context: context });
44
- if (harness === 'claude-code' || harness === 'codex') {
45
- return JSON.stringify({
46
- hookSpecificOutput: {
47
- hookEventName: 'UserPromptSubmit',
48
- additionalContext: context,
49
- },
50
- });
51
- }
52
- return undefined;
53
- }
54
- /**
55
- * Cursor currently accepts sessionStart context without reliably delivering it
56
- * to the model. Its native post-Stop follow-up is the narrow fallback and is
57
- * claimed once per conversation by the hook-state layer.
58
- */
59
- export function cursorStopActivationOutput(cwd = process.cwd(), env = process.env, notice) {
60
- return JSON.stringify({
61
- followup_message: rootActivationContext(cwd, env, notice),
62
- });
63
- }
64
- //# sourceMappingURL=session-activation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-activation.js","sourceRoot":"","sources":["../src/session-activation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAE3F,MAAM,cAAc,GAClB,0KAA0K;IAC1K,qDAAqD;IACrD,0XAA0X;IAC1X,2CAA2C,CAAA;AAE7C,MAAM,CAAC,MAAM,yBAAyB,GACpC,6WAA6W,CAAA;AAE/W,MAAM,CAAC,MAAM,kCAAkC,GAC7C,uNAAuN,CAAA;AAEzN,SAAS,qBAAqB,CAAC,GAAW,EAAE,GAAsB,EAAE,MAAe,EAAE,QAAQ,GAAG,0BAA0B;IACxH,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,OAAO,MAAM,EAAE,CAAA;IACxF,MAAM,QAAQ,GAAG,wBAAwB,CAAC;QACxC,GAAG;QACH,GAAG;QACH,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,OAAO,MAAM,EAAE,MAAM,CAAC;KACjE,CAAC,CAAA;IACF,OAAO,GAAG,OAAO,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAA;AAC9E,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,uBAAuB,CACrC,OAAgC,EAChC,aAA+C,EAC/C,MAAc,OAAO,CAAC,GAAG,EAAE,EAC3B,MAAyB,OAAO,CAAC,GAAG,EACpC,MAAe;IAEf,MAAM,OAAO,GAAG,aAAa,KAAK,eAAe;QAC/C,CAAC,CAAC,yBAAyB;QAC3B,CAAC,CAAC,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAA;IACrG,IAAI,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAA;IAC5F,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,CAAA;IACxD,CAAC;IACD,IAAI,OAAO,KAAK,aAAa,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,kBAAkB,EAAE;gBAClB,aAAa;gBACb,iBAAiB,EAAE,OAAO;aAC3B;SACF,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,uBAAuB,CACrC,OAAgC,EAChC,OAAe;IAEf,IAAI,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,UAAU;QAAE,OAAO,OAAO,CAAA;IACpE,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,CAAA;IAChF,IAAI,OAAO,KAAK,aAAa,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,kBAAkB,EAAE;gBAClB,aAAa,EAAE,kBAAkB;gBACjC,iBAAiB,EAAE,OAAO;aAC3B;SACF,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CACxC,MAAc,OAAO,CAAC,GAAG,EAAE,EAC3B,MAAyB,OAAO,CAAC,GAAG,EACpC,MAAe;IAEf,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,gBAAgB,EAAE,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC;KAC1D,CAAC,CAAA;AACJ,CAAC"}
@@ -1,85 +0,0 @@
1
- import type { HookHarness } from './hook-types.js';
2
- import { type ProcessIdentity } from './process-identity.js';
3
- import type { HarnessProbe } from './session-attendant.js';
4
- import type { SessionActivity } from '@raidiant/notifai-protocol';
5
- /** Whether this build runs a Session Attendant for a harness on a platform, and why not. */
6
- export type AttendantSupport = {
7
- supported: true;
8
- } | {
9
- supported: false;
10
- reason: string;
11
- };
12
- export declare function attendantSupport(harness: HookHarness | undefined, platform: NodeJS.Platform): AttendantSupport;
13
- /** The Gateway process plus current CLI-owned generation prove OpenClaw presence. */
14
- export declare function openclawAttendanceProbe(options: {
15
- sessionKey: string;
16
- generationId: string;
17
- gateway: ProcessIdentity;
18
- env: NodeJS.ProcessEnv;
19
- endedByHook: () => boolean;
20
- activity?: () => SessionActivity | null;
21
- readStart?: (pid: number) => string | null;
22
- exists?: (pid: number) => boolean;
23
- }): () => HarnessProbe;
24
- export interface ClaudeProbeAdapters {
25
- readDescriptor(pid: number): unknown;
26
- pidExists(pid: number): boolean;
27
- readStart(pid: number): string | null;
28
- /** This process's current parent; the kernel updates it when the parent exits. */
29
- parentPid(): number;
30
- }
31
- export declare function claudeDescriptorDir(env: NodeJS.ProcessEnv): string;
32
- export declare function systemClaudeProbeAdapters(env: NodeJS.ProcessEnv): ClaudeProbeAdapters;
33
- /**
34
- * The Claude Code probe. Every call re-establishes the evidence; nothing is
35
- * carried over from an earlier call, so one failed check can never be
36
- * followed by `running` without a fresh successful one.
37
- *
38
- * - The harness PID is gone, or now belongs to a process with another start
39
- * time: `ended` (harness-gone). Checked on every call: a SIGKILLed harness
40
- * leaves its descriptor behind, and a reused PID would satisfy the rest.
41
- * While the harness is still this process's parent the identity holds
42
- * without a lookup — a parent cannot be replaced under a living child;
43
- * otherwise (an npx adapter in between, or an orphaned attendant) the start
44
- * time is read again.
45
- * - The start time cannot be read: `uncertain`.
46
- * - The descriptor for that PID names another session id: `/clear` or
47
- * `/resume` replaced this session in the same process: `ended`.
48
- * - The descriptor is missing: Claude Code 2.1.282 removes it about a second
49
- * *before* SessionEnd and exit, so with the process alive this is
50
- * `uncertain`.
51
- * - The descriptor's `procStart` (UTC `ps` text) differs from the harness
52
- * start read the same way: the evidence disagrees, `uncertain`.
53
- *
54
- * Activity comes from the descriptor `status`: `idle` is idle, anything else
55
- * (busy, waiting on a permission prompt) is working.
56
- */
57
- export declare function claudeAttendanceProbe(options: {
58
- sessionId: string;
59
- harness: ProcessIdentity;
60
- /** SessionEnd's marker for exactly this incarnation. */
61
- endedByHook: () => boolean;
62
- adapters: ClaudeProbeAdapters;
63
- }): () => HarnessProbe;
64
- /**
65
- * The Codex probe. Codex publishes no session descriptor, so the evidence is
66
- * the Codex process that started this attendant and the thread's own hooks:
67
- *
68
- * - SessionEnd's marker for this incarnation: `ended`. Codex runs SessionEnd
69
- * when the thread closes, is archived or deleted, or unloads after idling
70
- * with no client, then kills the attendant.
71
- * - The Codex PID is gone or now names a process with another start time:
72
- * `ended` (harness-gone). A crashed or killed Codex never runs SessionEnd
73
- * and leaves the attendant behind in its own process group.
74
- * - The start time cannot be read: `uncertain`.
75
- *
76
- * Activity comes from this thread's prompt, trusted tool, and turn-end hooks.
77
- */
78
- export declare function codexAttendanceProbe(options: {
79
- harness: ProcessIdentity;
80
- /** SessionEnd's marker for exactly this incarnation. */
81
- endedByHook: () => boolean;
82
- /** Working while this thread's latest recorded turn has not ended. */
83
- activity: () => SessionActivity | null;
84
- adapters: Pick<ClaudeProbeAdapters, 'pidExists' | 'readStart' | 'parentPid'>;
85
- }): () => HarnessProbe;