@raidiant/notifai 11.7.1 → 12.0.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (409) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/NOTICE +16 -0
  3. package/THIRD_PARTY_NOTICES +725 -0
  4. package/bin/notifai.mjs +11387 -0
  5. package/data/install.ps1 +318 -0
  6. package/data/release.json +1 -0
  7. package/inventory.json +1 -0
  8. package/npm-adapter-files.json +52 -0
  9. package/package.json +14 -44
  10. package/README.md +0 -168
  11. package/dist/agent-update-notice.d.ts +0 -7
  12. package/dist/agent-update-notice.js +0 -77
  13. package/dist/agent-update-notice.js.map +0 -1
  14. package/dist/atomic-file.d.ts +0 -30
  15. package/dist/atomic-file.js +0 -148
  16. package/dist/atomic-file.js.map +0 -1
  17. package/dist/attendant-update.d.ts +0 -15
  18. package/dist/attendant-update.js +0 -96
  19. package/dist/attendant-update.js.map +0 -1
  20. package/dist/claude-wake.d.ts +0 -108
  21. package/dist/claude-wake.js +0 -369
  22. package/dist/claude-wake.js.map +0 -1
  23. package/dist/cli-bin.d.ts +0 -26
  24. package/dist/cli-bin.js +0 -220
  25. package/dist/cli-bin.js.map +0 -1
  26. package/dist/cli-contract.d.ts +0 -16
  27. package/dist/cli-contract.js +0 -27
  28. package/dist/cli-contract.js.map +0 -1
  29. package/dist/cli-release.d.ts +0 -36
  30. package/dist/cli-release.js +0 -85
  31. package/dist/cli-release.js.map +0 -1
  32. package/dist/client.d.ts +0 -109
  33. package/dist/client.js +0 -217
  34. package/dist/client.js.map +0 -1
  35. package/dist/codex-answer-control.d.ts +0 -14
  36. package/dist/codex-answer-control.js +0 -41
  37. package/dist/codex-answer-control.js.map +0 -1
  38. package/dist/codex-answer-presentation.d.ts +0 -18
  39. package/dist/codex-answer-presentation.js +0 -113
  40. package/dist/codex-answer-presentation.js.map +0 -1
  41. package/dist/codex-input-lifecycle.d.ts +0 -10
  42. package/dist/codex-input-lifecycle.js +0 -63
  43. package/dist/codex-input-lifecycle.js.map +0 -1
  44. package/dist/codex-native-control.d.ts +0 -13
  45. package/dist/codex-native-control.js +0 -120
  46. package/dist/codex-native-control.js.map +0 -1
  47. package/dist/codex-native-turn.d.ts +0 -37
  48. package/dist/codex-native-turn.js +0 -155
  49. package/dist/codex-native-turn.js.map +0 -1
  50. package/dist/codex-question-bindings.d.ts +0 -76
  51. package/dist/codex-question-bindings.js +0 -151
  52. package/dist/codex-question-bindings.js.map +0 -1
  53. package/dist/codex-queue-control.d.ts +0 -21
  54. package/dist/codex-queue-control.js +0 -59
  55. package/dist/codex-queue-control.js.map +0 -1
  56. package/dist/codex-tool-messages.d.ts +0 -7
  57. package/dist/codex-tool-messages.js +0 -126
  58. package/dist/codex-tool-messages.js.map +0 -1
  59. package/dist/codex-wake.d.ts +0 -58
  60. package/dist/codex-wake.js +0 -135
  61. package/dist/codex-wake.js.map +0 -1
  62. package/dist/command-session.d.ts +0 -14
  63. package/dist/command-session.js +0 -31
  64. package/dist/command-session.js.map +0 -1
  65. package/dist/commands-acknowledge.d.ts +0 -13
  66. package/dist/commands-acknowledge.js +0 -116
  67. package/dist/commands-acknowledge.js.map +0 -1
  68. package/dist/commands-agent-sessions.d.ts +0 -6
  69. package/dist/commands-agent-sessions.js +0 -51
  70. package/dist/commands-agent-sessions.js.map +0 -1
  71. package/dist/commands-ask.d.ts +0 -62
  72. package/dist/commands-ask.js +0 -503
  73. package/dist/commands-ask.js.map +0 -1
  74. package/dist/commands-auth.d.ts +0 -76
  75. package/dist/commands-auth.js +0 -421
  76. package/dist/commands-auth.js.map +0 -1
  77. package/dist/commands-close.d.ts +0 -6
  78. package/dist/commands-close.js +0 -273
  79. package/dist/commands-close.js.map +0 -1
  80. package/dist/commands-config.d.ts +0 -31
  81. package/dist/commands-config.js +0 -272
  82. package/dist/commands-config.js.map +0 -1
  83. package/dist/commands-core.d.ts +0 -145
  84. package/dist/commands-core.js +0 -190
  85. package/dist/commands-core.js.map +0 -1
  86. package/dist/commands-devices.d.ts +0 -41
  87. package/dist/commands-devices.js +0 -144
  88. package/dist/commands-devices.js.map +0 -1
  89. package/dist/commands-doctor.d.ts +0 -25
  90. package/dist/commands-doctor.js +0 -1553
  91. package/dist/commands-doctor.js.map +0 -1
  92. package/dist/commands-guidance.d.ts +0 -27
  93. package/dist/commands-guidance.js +0 -150
  94. package/dist/commands-guidance.js.map +0 -1
  95. package/dist/commands-harness-context.d.ts +0 -57
  96. package/dist/commands-harness-context.js +0 -102
  97. package/dist/commands-harness-context.js.map +0 -1
  98. package/dist/commands-hook-attend.d.ts +0 -70
  99. package/dist/commands-hook-attend.js +0 -655
  100. package/dist/commands-hook-attend.js.map +0 -1
  101. package/dist/commands-hook-diagnostics.d.ts +0 -37
  102. package/dist/commands-hook-diagnostics.js +0 -136
  103. package/dist/commands-hook-diagnostics.js.map +0 -1
  104. package/dist/commands-hook-install.d.ts +0 -26
  105. package/dist/commands-hook-install.js +0 -784
  106. package/dist/commands-hook-install.js.map +0 -1
  107. package/dist/commands-hook-run.d.ts +0 -29
  108. package/dist/commands-hook-run.js +0 -933
  109. package/dist/commands-hook-run.js.map +0 -1
  110. package/dist/commands-hook-shape.d.ts +0 -19
  111. package/dist/commands-hook-shape.js +0 -48
  112. package/dist/commands-hook-shape.js.map +0 -1
  113. package/dist/commands-init.d.ts +0 -42
  114. package/dist/commands-init.js +0 -901
  115. package/dist/commands-init.js.map +0 -1
  116. package/dist/commands-io.d.ts +0 -2
  117. package/dist/commands-io.js +0 -117
  118. package/dist/commands-io.js.map +0 -1
  119. package/dist/commands-logs.d.ts +0 -30
  120. package/dist/commands-logs.js +0 -201
  121. package/dist/commands-logs.js.map +0 -1
  122. package/dist/commands-native-acknowledge.d.ts +0 -8
  123. package/dist/commands-native-acknowledge.js +0 -114
  124. package/dist/commands-native-acknowledge.js.map +0 -1
  125. package/dist/commands-project.d.ts +0 -4
  126. package/dist/commands-project.js +0 -41
  127. package/dist/commands-project.js.map +0 -1
  128. package/dist/commands-receive.d.ts +0 -3
  129. package/dist/commands-receive.js +0 -59
  130. package/dist/commands-receive.js.map +0 -1
  131. package/dist/commands-send-support.d.ts +0 -59
  132. package/dist/commands-send-support.js +0 -258
  133. package/dist/commands-send-support.js.map +0 -1
  134. package/dist/commands-send.d.ts +0 -34
  135. package/dist/commands-send.js +0 -900
  136. package/dist/commands-send.js.map +0 -1
  137. package/dist/commands-setup-proof.d.ts +0 -43
  138. package/dist/commands-setup-proof.js +0 -134
  139. package/dist/commands-setup-proof.js.map +0 -1
  140. package/dist/commands-skill.d.ts +0 -21
  141. package/dist/commands-skill.js +0 -199
  142. package/dist/commands-skill.js.map +0 -1
  143. package/dist/commands-sounds.d.ts +0 -12
  144. package/dist/commands-sounds.js +0 -35
  145. package/dist/commands-sounds.js.map +0 -1
  146. package/dist/commands-update-check.d.ts +0 -6
  147. package/dist/commands-update-check.js +0 -102
  148. package/dist/commands-update-check.js.map +0 -1
  149. package/dist/commands-update-resume.d.ts +0 -7
  150. package/dist/commands-update-resume.js +0 -143
  151. package/dist/commands-update-resume.js.map +0 -1
  152. package/dist/commands-update-skill.d.ts +0 -5
  153. package/dist/commands-update-skill.js +0 -36
  154. package/dist/commands-update-skill.js.map +0 -1
  155. package/dist/commands-update.d.ts +0 -11
  156. package/dist/commands-update.js +0 -286
  157. package/dist/commands-update.js.map +0 -1
  158. package/dist/commands.d.ts +0 -26
  159. package/dist/commands.js +0 -27
  160. package/dist/commands.js.map +0 -1
  161. package/dist/config-schema.d.ts +0 -62
  162. package/dist/config-schema.js +0 -302
  163. package/dist/config-schema.js.map +0 -1
  164. package/dist/config.d.ts +0 -181
  165. package/dist/config.js +0 -357
  166. package/dist/config.js.map +0 -1
  167. package/dist/credentials.d.ts +0 -96
  168. package/dist/credentials.js +0 -342
  169. package/dist/credentials.js.map +0 -1
  170. package/dist/file-lock.d.ts +0 -34
  171. package/dist/file-lock.js +0 -367
  172. package/dist/file-lock.js.map +0 -1
  173. package/dist/generated-session-label.d.ts +0 -2
  174. package/dist/generated-session-label.js +0 -152
  175. package/dist/generated-session-label.js.map +0 -1
  176. package/dist/guidance-content.d.ts +0 -53
  177. package/dist/guidance-content.js +0 -248
  178. package/dist/guidance-content.js.map +0 -1
  179. package/dist/guidance-render.d.ts +0 -25
  180. package/dist/guidance-render.js +0 -47
  181. package/dist/guidance-render.js.map +0 -1
  182. package/dist/guidance.d.ts +0 -69
  183. package/dist/guidance.js +0 -173
  184. package/dist/guidance.js.map +0 -1
  185. package/dist/harness-session-title.d.ts +0 -22
  186. package/dist/harness-session-title.js +0 -74
  187. package/dist/harness-session-title.js.map +0 -1
  188. package/dist/harnesses.d.ts +0 -65
  189. package/dist/harnesses.js +0 -159
  190. package/dist/harnesses.js.map +0 -1
  191. package/dist/hermes-attendant.d.ts +0 -38
  192. package/dist/hermes-attendant.js +0 -337
  193. package/dist/hermes-attendant.js.map +0 -1
  194. package/dist/hermes-plugin.d.ts +0 -11
  195. package/dist/hermes-plugin.js +0 -299
  196. package/dist/hermes-plugin.js.map +0 -1
  197. package/dist/hook-acknowledgements.d.ts +0 -70
  198. package/dist/hook-acknowledgements.js +0 -490
  199. package/dist/hook-acknowledgements.js.map +0 -1
  200. package/dist/hook-adapter.d.ts +0 -48
  201. package/dist/hook-adapter.js +0 -419
  202. package/dist/hook-adapter.js.map +0 -1
  203. package/dist/hook-events.d.ts +0 -105
  204. package/dist/hook-events.js +0 -130
  205. package/dist/hook-events.js.map +0 -1
  206. package/dist/hook-gates.d.ts +0 -7
  207. package/dist/hook-gates.js +0 -20
  208. package/dist/hook-gates.js.map +0 -1
  209. package/dist/hook-input.d.ts +0 -10
  210. package/dist/hook-input.js +0 -64
  211. package/dist/hook-input.js.map +0 -1
  212. package/dist/hook-lifecycle.d.ts +0 -112
  213. package/dist/hook-lifecycle.js +0 -2031
  214. package/dist/hook-lifecycle.js.map +0 -1
  215. package/dist/hook-project-sessions.d.ts +0 -28
  216. package/dist/hook-project-sessions.js +0 -141
  217. package/dist/hook-project-sessions.js.map +0 -1
  218. package/dist/hook-question-lock.d.ts +0 -29
  219. package/dist/hook-question-lock.js +0 -217
  220. package/dist/hook-question-lock.js.map +0 -1
  221. package/dist/hook-question-retirement.d.ts +0 -74
  222. package/dist/hook-question-retirement.js +0 -314
  223. package/dist/hook-question-retirement.js.map +0 -1
  224. package/dist/hook-question-state.d.ts +0 -58
  225. package/dist/hook-question-state.js +0 -239
  226. package/dist/hook-question-state.js.map +0 -1
  227. package/dist/hook-session-state.d.ts +0 -127
  228. package/dist/hook-session-state.js +0 -488
  229. package/dist/hook-session-state.js.map +0 -1
  230. package/dist/hook-types.d.ts +0 -476
  231. package/dist/hook-types.js +0 -4
  232. package/dist/hook-types.js.map +0 -1
  233. package/dist/injection-render.d.ts +0 -36
  234. package/dist/injection-render.js +0 -61
  235. package/dist/injection-render.js.map +0 -1
  236. package/dist/install-hooks.d.ts +0 -470
  237. package/dist/install-hooks.js +0 -1622
  238. package/dist/install-hooks.js.map +0 -1
  239. package/dist/integration-health.d.ts +0 -26
  240. package/dist/integration-health.js +0 -133
  241. package/dist/integration-health.js.map +0 -1
  242. package/dist/interactive.d.ts +0 -22
  243. package/dist/interactive.js +0 -644
  244. package/dist/interactive.js.map +0 -1
  245. package/dist/invocation-context.d.ts +0 -47
  246. package/dist/invocation-context.js +0 -164
  247. package/dist/invocation-context.js.map +0 -1
  248. package/dist/local-path.d.ts +0 -7
  249. package/dist/local-path.js +0 -27
  250. package/dist/local-path.js.map +0 -1
  251. package/dist/logging.d.ts +0 -157
  252. package/dist/logging.js +0 -599
  253. package/dist/logging.js.map +0 -1
  254. package/dist/main-run.d.ts +0 -1
  255. package/dist/main-run.js +0 -42
  256. package/dist/main-run.js.map +0 -1
  257. package/dist/main.d.ts +0 -2
  258. package/dist/main.js +0 -12
  259. package/dist/main.js.map +0 -1
  260. package/dist/native-answer-operation.d.ts +0 -70
  261. package/dist/native-answer-operation.js +0 -247
  262. package/dist/native-answer-operation.js.map +0 -1
  263. package/dist/native-skills.d.ts +0 -64
  264. package/dist/native-skills.js +0 -167
  265. package/dist/native-skills.js.map +0 -1
  266. package/dist/node-floor.d.ts +0 -19
  267. package/dist/node-floor.js +0 -32
  268. package/dist/node-floor.js.map +0 -1
  269. package/dist/npm-invocation.d.ts +0 -34
  270. package/dist/npm-invocation.js +0 -53
  271. package/dist/npm-invocation.js.map +0 -1
  272. package/dist/openclaw-continuation-bridge.d.ts +0 -7
  273. package/dist/openclaw-continuation-bridge.js +0 -64
  274. package/dist/openclaw-continuation-bridge.js.map +0 -1
  275. package/dist/openclaw-gateway-readiness.d.ts +0 -1
  276. package/dist/openclaw-gateway-readiness.js +0 -24
  277. package/dist/openclaw-gateway-readiness.js.map +0 -1
  278. package/dist/openclaw-generation.d.ts +0 -21
  279. package/dist/openclaw-generation.js +0 -115
  280. package/dist/openclaw-generation.js.map +0 -1
  281. package/dist/openclaw-message-bridge.d.ts +0 -8
  282. package/dist/openclaw-message-bridge.js +0 -93
  283. package/dist/openclaw-message-bridge.js.map +0 -1
  284. package/dist/openclaw-pending.d.ts +0 -8
  285. package/dist/openclaw-pending.js +0 -47
  286. package/dist/openclaw-pending.js.map +0 -1
  287. package/dist/openclaw-plugin.d.ts +0 -75
  288. package/dist/openclaw-plugin.js +0 -1353
  289. package/dist/openclaw-plugin.js.map +0 -1
  290. package/dist/openclaw-session-access.d.ts +0 -12
  291. package/dist/openclaw-session-access.js +0 -79
  292. package/dist/openclaw-session-access.js.map +0 -1
  293. package/dist/opencode-plugin.d.ts +0 -88
  294. package/dist/opencode-plugin.js +0 -286
  295. package/dist/opencode-plugin.js.map +0 -1
  296. package/dist/orca-session-title.d.ts +0 -11
  297. package/dist/orca-session-title.js +0 -111
  298. package/dist/orca-session-title.js.map +0 -1
  299. package/dist/pack-feedback-slice.d.ts +0 -35
  300. package/dist/pack-feedback-slice.js +0 -126
  301. package/dist/pack-feedback-slice.js.map +0 -1
  302. package/dist/pairing-qr.d.ts +0 -5
  303. package/dist/pairing-qr.js +0 -24
  304. package/dist/pairing-qr.js.map +0 -1
  305. package/dist/pending-pairing.d.ts +0 -38
  306. package/dist/pending-pairing.js +0 -70
  307. package/dist/pending-pairing.js.map +0 -1
  308. package/dist/platform.d.ts +0 -67
  309. package/dist/platform.js +0 -140
  310. package/dist/platform.js.map +0 -1
  311. package/dist/process-identity.d.ts +0 -26
  312. package/dist/process-identity.js +0 -82
  313. package/dist/process-identity.js.map +0 -1
  314. package/dist/program.d.ts +0 -59
  315. package/dist/program.js +0 -691
  316. package/dist/program.js.map +0 -1
  317. package/dist/project-enablement.d.ts +0 -21
  318. package/dist/project-enablement.js +0 -71
  319. package/dist/project-enablement.js.map +0 -1
  320. package/dist/question-settlement-process.d.ts +0 -17
  321. package/dist/question-settlement-process.js +0 -35
  322. package/dist/question-settlement-process.js.map +0 -1
  323. package/dist/question-timing.d.ts +0 -46
  324. package/dist/question-timing.js +0 -48
  325. package/dist/question-timing.js.map +0 -1
  326. package/dist/readiness.d.ts +0 -153
  327. package/dist/readiness.js +0 -149
  328. package/dist/readiness.js.map +0 -1
  329. package/dist/release.d.ts +0 -31
  330. package/dist/release.js +0 -52
  331. package/dist/release.js.map +0 -1
  332. package/dist/send-attempts.d.ts +0 -26
  333. package/dist/send-attempts.js +0 -139
  334. package/dist/send-attempts.js.map +0 -1
  335. package/dist/send.d.ts +0 -115
  336. package/dist/send.js +0 -421
  337. package/dist/send.js.map +0 -1
  338. package/dist/session-activation.d.ts +0 -13
  339. package/dist/session-activation.js +0 -64
  340. package/dist/session-activation.js.map +0 -1
  341. package/dist/session-attendant-probe.d.ts +0 -85
  342. package/dist/session-attendant-probe.js +0 -173
  343. package/dist/session-attendant-probe.js.map +0 -1
  344. package/dist/session-attendant-state.d.ts +0 -70
  345. package/dist/session-attendant-state.js +0 -256
  346. package/dist/session-attendant-state.js.map +0 -1
  347. package/dist/session-attendant.d.ts +0 -143
  348. package/dist/session-attendant.js +0 -520
  349. package/dist/session-attendant.js.map +0 -1
  350. package/dist/session-delivery.d.ts +0 -249
  351. package/dist/session-delivery.js +0 -576
  352. package/dist/session-delivery.js.map +0 -1
  353. package/dist/session-handoff.d.ts +0 -98
  354. package/dist/session-handoff.js +0 -118
  355. package/dist/session-handoff.js.map +0 -1
  356. package/dist/session-input-wakes.d.ts +0 -78
  357. package/dist/session-input-wakes.js +0 -239
  358. package/dist/session-input-wakes.js.map +0 -1
  359. package/dist/session-inputs.d.ts +0 -57
  360. package/dist/session-inputs.js +0 -434
  361. package/dist/session-inputs.js.map +0 -1
  362. package/dist/session-labels.d.ts +0 -56
  363. package/dist/session-labels.js +0 -396
  364. package/dist/session-labels.js.map +0 -1
  365. package/dist/session-message-handoff.d.ts +0 -39
  366. package/dist/session-message-handoff.js +0 -107
  367. package/dist/session-message-handoff.js.map +0 -1
  368. package/dist/setup-destinations.d.ts +0 -23
  369. package/dist/setup-destinations.js +0 -44
  370. package/dist/setup-destinations.js.map +0 -1
  371. package/dist/skill-integrity.d.ts +0 -54
  372. package/dist/skill-integrity.js +0 -164
  373. package/dist/skill-integrity.js.map +0 -1
  374. package/dist/skill-source/manifest.json +0 -40
  375. package/dist/skill-source/notifai/SKILL.md +0 -350
  376. package/dist/skill-source/notifai/references/diagnostics.md +0 -36
  377. package/dist/skill-source/notifai/references/harness-setup.md +0 -384
  378. package/dist/skill-source/notifai/references/native-questions.md +0 -51
  379. package/dist/skill-source/notifai/references/notes-and-edits.md +0 -54
  380. package/dist/skill-source/notifai/references/send-details.md +0 -14
  381. package/dist/skill-source/notifai/references/updates.md +0 -116
  382. package/dist/skill-source/notifai/references/writing-examples.md +0 -56
  383. package/dist/sound-ref.d.ts +0 -23
  384. package/dist/sound-ref.js +0 -28
  385. package/dist/sound-ref.js.map +0 -1
  386. package/dist/ui/banner.d.ts +0 -22
  387. package/dist/ui/banner.js +0 -87
  388. package/dist/ui/banner.js.map +0 -1
  389. package/dist/ui/config-view.d.ts +0 -30
  390. package/dist/ui/config-view.js +0 -108
  391. package/dist/ui/config-view.js.map +0 -1
  392. package/dist/ui/help.d.ts +0 -44
  393. package/dist/ui/help.js +0 -107
  394. package/dist/ui/help.js.map +0 -1
  395. package/dist/ui/theme.d.ts +0 -90
  396. package/dist/ui/theme.js +0 -244
  397. package/dist/ui/theme.js.map +0 -1
  398. package/dist/update-handoff.d.ts +0 -29
  399. package/dist/update-handoff.js +0 -69
  400. package/dist/update-handoff.js.map +0 -1
  401. package/dist/url-policy.d.ts +0 -85
  402. package/dist/url-policy.js +0 -369
  403. package/dist/url-policy.js.map +0 -1
  404. package/dist/version.d.ts +0 -40
  405. package/dist/version.js +0 -132
  406. package/dist/version.js.map +0 -1
  407. package/dist/wake-support.d.ts +0 -40
  408. package/dist/wake-support.js +0 -95
  409. package/dist/wake-support.js.map +0 -1
@@ -1,396 +0,0 @@
1
- import { createHash } from 'node:crypto';
2
- import { copyFileSync, existsSync, readFileSync } from 'node:fs';
3
- import path from 'node:path';
4
- import { SESSION_LABEL_MAX_LENGTH } from '@raidiant/notifai-protocol';
5
- import { atomicWriteFileSync } from './atomic-file.js';
6
- import { stateDir } from './config.js';
7
- import { withFileLock } from './file-lock.js';
8
- import { generatedSessionLabel } from './generated-session-label.js';
9
- import { HARNESS_LABELS } from './harnesses.js';
10
- const STORE_VERSION = 1;
11
- const MONTHS = [
12
- 'Jan',
13
- 'Feb',
14
- 'Mar',
15
- 'Apr',
16
- 'May',
17
- 'Jun',
18
- 'Jul',
19
- 'Aug',
20
- 'Sep',
21
- 'Oct',
22
- 'Nov',
23
- 'Dec',
24
- ];
25
- function storePath(env) {
26
- return path.join(stateDir(env), 'session-labels.json');
27
- }
28
- /** The state key cannot reveal the harness's opaque session identifier. */
29
- function sessionKey(sessionId) {
30
- return createHash('sha256').update(sessionId).digest('hex');
31
- }
32
- function emptyStore() {
33
- return { version: STORE_VERSION, sessions: {} };
34
- }
35
- function quarantineInvalidStore(file, raw) {
36
- const digest = createHash('sha256').update(raw).digest('hex');
37
- const backup = path.join(path.dirname(file), `session-labels.invalid-${digest}.json`);
38
- if (existsSync(backup)) {
39
- if (readFileSync(backup, 'utf8') !== raw) {
40
- throw new Error(`the session-name store recovery backup does not match its content hash (${backup})`);
41
- }
42
- return;
43
- }
44
- copyFileSync(file, backup);
45
- }
46
- function recoverInvalidStore(file, raw, store) {
47
- quarantineInvalidStore(file, raw);
48
- writeStore(file, store);
49
- return store;
50
- }
51
- function storedRecord(candidate) {
52
- if (typeof candidate !== 'object' || candidate === null || Array.isArray(candidate))
53
- return null;
54
- const value = candidate;
55
- if (typeof value.label !== 'string' ||
56
- value.label.length === 0 ||
57
- value.label.length > SESSION_LABEL_MAX_LENGTH ||
58
- !['explicit', 'harness', 'fallback'].includes(value.source ?? '') ||
59
- typeof value.first_seen_at !== 'number' ||
60
- !Number.isFinite(value.first_seen_at)) {
61
- return null;
62
- }
63
- const harness = value.harness;
64
- if (harness !== undefined && (typeof harness !== 'string' || !Object.hasOwn(HARNESS_LABELS, harness)))
65
- return null;
66
- if (value.previous_source !== undefined && value.previous_source !== 'fallback')
67
- return null;
68
- return {
69
- label: value.label,
70
- source: value.source,
71
- ...(value.previous_source === undefined ? {} : { previous_source: value.previous_source }),
72
- first_seen_at: value.first_seen_at,
73
- ...(harness === undefined ? {} : { harness }),
74
- };
75
- }
76
- function readStore(file) {
77
- if (!existsSync(file))
78
- return emptyStore();
79
- let rawText;
80
- try {
81
- rawText = readFileSync(file, 'utf8');
82
- }
83
- catch (err) {
84
- throw new Error(`the session-name store ${file} is unreadable: ${err instanceof Error ? err.message : String(err)}`);
85
- }
86
- let parsed;
87
- try {
88
- parsed = JSON.parse(rawText);
89
- }
90
- catch {
91
- return recoverInvalidStore(file, rawText, emptyStore());
92
- }
93
- if (typeof parsed !== 'object' || parsed === null) {
94
- return recoverInvalidStore(file, rawText, emptyStore());
95
- }
96
- const raw = parsed;
97
- if (raw.version !== STORE_VERSION) {
98
- return recoverInvalidStore(file, rawText, emptyStore());
99
- }
100
- if (typeof raw.sessions !== 'object' || raw.sessions === null) {
101
- return recoverInvalidStore(file, rawText, emptyStore());
102
- }
103
- const sessions = {};
104
- let invalidRecordFound = false;
105
- for (const [key, candidate] of Object.entries(raw.sessions)) {
106
- const record = storedRecord(candidate);
107
- if (!/^[a-f0-9]{64}$/.test(key) || record === null) {
108
- invalidRecordFound = true;
109
- continue;
110
- }
111
- sessions[key] = record;
112
- }
113
- const store = { version: STORE_VERSION, sessions };
114
- return invalidRecordFound ? recoverInvalidStore(file, rawText, store) : store;
115
- }
116
- function writeStore(file, store) {
117
- atomicWriteFileSync(file, `${JSON.stringify(store, null, 2)}\n`);
118
- }
119
- function normalizeWhitespace(value) {
120
- return value.trim().replaceAll(/\s+/gu, ' ');
121
- }
122
- /** Match the same UTF-16 length TypeBox enforces at the wire boundary. */
123
- function truncate(value, maxLength) {
124
- if (value.length <= maxLength)
125
- return value;
126
- let prefix = value.slice(0, Math.max(0, maxLength - 1));
127
- const last = prefix.charCodeAt(prefix.length - 1);
128
- if (last >= 0xd800 && last <= 0xdbff)
129
- prefix = prefix.slice(0, -1);
130
- return `${prefix}…`;
131
- }
132
- const UUID_PATTERN = /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/iu;
133
- const HASH_PATTERN = /\b[0-9a-f]{12,}\b/iu;
134
- const HARNESS_ID_PATTERN = /\b(?:ses|thread)_[A-Za-z0-9_-]{8,}\b/iu;
135
- const FILESYSTEM_PATH_PATTERN = /(?:^|[\s("'=:])(?:~[\\/]|[A-Za-z]:[\\/]|\\\\|\/(?:Users|home|private|tmp|var|Volumes|opt|etc|usr|workspace|workspaces)(?:[\\/]|$))/u;
136
- const OPENCODE_PENDING_TITLE = /^New session(?:\s*-\s*\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z)?$/iu;
137
- function containsPrivatePath(value, env) {
138
- if (FILESYSTEM_PATH_PATTERN.test(value))
139
- return true;
140
- const folded = value.toLocaleLowerCase('en-US');
141
- for (const key of ['HOME', 'USERPROFILE', 'TMPDIR']) {
142
- const candidate = env[key]?.trim().replace(/[\\/]+$/u, '');
143
- if (candidate !== undefined &&
144
- candidate.length > 1 &&
145
- folded.includes(candidate.toLocaleLowerCase('en-US'))) {
146
- return true;
147
- }
148
- }
149
- return false;
150
- }
151
- function violatesLabelPrivacy(value, input) {
152
- const sessionId = input.sessionId.trim();
153
- const exposesCurrentId = sessionId.length > 0 &&
154
- (value === sessionId || (sessionId.length >= 8 && value.includes(sessionId)));
155
- return (exposesCurrentId ||
156
- UUID_PATTERN.test(value) ||
157
- HASH_PATTERN.test(value) ||
158
- HARNESS_ID_PATTERN.test(value) ||
159
- containsPrivatePath(value, input.env));
160
- }
161
- function explicitCandidate(value, input) {
162
- if (value === undefined)
163
- return null;
164
- const normalized = normalizeWhitespace(value);
165
- if (normalized.length === 0) {
166
- return { error: '--session-label (or NOTIFAI_SESSION_LABEL) must not be empty.' };
167
- }
168
- if (normalized.length > SESSION_LABEL_MAX_LENGTH) {
169
- return {
170
- error: `--session-label (or NOTIFAI_SESSION_LABEL) must be at most ${SESSION_LABEL_MAX_LENGTH} characters.`,
171
- };
172
- }
173
- if (violatesLabelPrivacy(normalized, input)) {
174
- return {
175
- error: '--session-label (or NOTIFAI_SESSION_LABEL) must not contain a session identifier, hash, or filesystem path.',
176
- };
177
- }
178
- return { label: normalized, source: 'explicit' };
179
- }
180
- export function normalizeExplicitSessionLabel(input) {
181
- const candidate = explicitCandidate(input.label, {
182
- env: input.env,
183
- sessionId: input.sessionId,
184
- });
185
- if (candidate === null) {
186
- return { ok: false, error: '--session-label must not be empty.' };
187
- }
188
- if ('error' in candidate)
189
- return { ok: false, error: candidate.error };
190
- return { ok: true, label: candidate.label };
191
- }
192
- function harnessLabelIsPending(value, input) {
193
- if (input.harnessLabelPending === true)
194
- return true;
195
- if (input.harness !== 'opencode' || value === undefined)
196
- return false;
197
- return OPENCODE_PENDING_TITLE.test(normalizeWhitespace(value));
198
- }
199
- function harnessCandidate(value, input) {
200
- if (value === undefined)
201
- return null;
202
- const normalized = normalizeWhitespace(value);
203
- if (normalized.length === 0 || violatesLabelPrivacy(normalized, input))
204
- return null;
205
- return {
206
- label: truncate(normalized, SESSION_LABEL_MAX_LENGTH),
207
- source: 'harness',
208
- };
209
- }
210
- function pad(value) {
211
- return String(value).padStart(2, '0');
212
- }
213
- /** Stable English shape using the machine's local calendar and clock. */
214
- export function formatSessionFirstSeen(now) {
215
- const date = new Date(now);
216
- return `${MONTHS[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()} ${pad(date.getHours())}:${pad(date.getMinutes())}`;
217
- }
218
- function fallbackCandidate(sessionId) {
219
- return {
220
- label: generatedSessionLabel(sessionId),
221
- source: 'fallback',
222
- };
223
- }
224
- function isLegacyDateFallback(record) {
225
- if (record.source !== 'fallback')
226
- return false;
227
- const owner = record.harness === undefined ? 'Agent' : HARNESS_LABELS[record.harness];
228
- return record.label.startsWith(`${owner} session · `);
229
- }
230
- function withSuffix(base, suffix) {
231
- const room = SESSION_LABEL_MAX_LENGTH - suffix.length;
232
- return `${truncate(base, room)}${suffix}`;
233
- }
234
- function collisionKey(value) {
235
- return value.normalize('NFKC').toLocaleLowerCase('en-US');
236
- }
237
- function uniqueLabel(base, source, harness, now, used) {
238
- if (!used.has(collisionKey(base)))
239
- return base;
240
- if (source === 'fallback') {
241
- for (let ordinal = 2;; ordinal += 1) {
242
- const candidate = withSuffix(base, ` · ${ordinal}`);
243
- if (!used.has(collisionKey(candidate)))
244
- return candidate;
245
- }
246
- }
247
- const owner = harness === undefined ? 'Agent' : HARNESS_LABELS[harness];
248
- const ownerCandidate = withSuffix(base, ` · ${owner}`);
249
- if (!used.has(collisionKey(ownerCandidate)))
250
- return ownerCandidate;
251
- const timed = withSuffix(base, ` · ${owner} · ${formatSessionFirstSeen(now)}`);
252
- if (!used.has(collisionKey(timed)))
253
- return timed;
254
- for (let ordinal = 2;; ordinal += 1) {
255
- const candidate = withSuffix(timed, ` · ${ordinal}`);
256
- if (!used.has(collisionKey(candidate)))
257
- return candidate;
258
- }
259
- }
260
- /**
261
- * Freeze the first accepted human name for one immutable session.
262
- *
263
- * A title supplied by a trusted harness adapter wins, then explicit
264
- * agent/User input, then a generated fallback. The environment-first order is
265
- * what makes `--session-label` safe to pass unconditionally: an agent never
266
- * needs to know which environments name their own sessions, because where one
267
- * does, the explicit label is simply not used. A frozen generated fallback is
268
- * the one exception to permanence: it names nothing, so the first semantic
269
- * candidate to arrive later — a trusted harness title first, then explicit —
270
- * replaces it once. Semantic names then stay frozen even when their branch,
271
- * worktree, title candidate, or notification changes.
272
- */
273
- export function resolveSessionLabel(input) {
274
- const now = input.now ?? Date.now();
275
- const file = storePath(input.env);
276
- const key = sessionKey(input.sessionId);
277
- try {
278
- return withFileLock(`${file}.lock`, () => {
279
- const store = readStore(file);
280
- const existing = store.sessions[key];
281
- if (existing !== undefined) {
282
- const used = new Set(Object.entries(store.sessions)
283
- .filter(([storedKey]) => storedKey !== key)
284
- .map(([, record]) => collisionKey(record.label)));
285
- if (existing.source === 'fallback') {
286
- const native = harnessLabelIsPending(input.harnessLabel, input)
287
- ? null
288
- : harnessCandidate(input.harnessLabel, input);
289
- const explicit = native === null ? explicitCandidate(input.explicitLabel, input) : null;
290
- if (explicit !== null && 'error' in explicit) {
291
- return { ok: false, error: explicit.error };
292
- }
293
- const upgrade = native ?? explicit;
294
- if (upgrade !== null) {
295
- const label = uniqueLabel(upgrade.label, upgrade.source, input.harness, now, used);
296
- store.sessions[key] = {
297
- label,
298
- source: upgrade.source,
299
- previous_source: 'fallback',
300
- first_seen_at: existing.first_seen_at,
301
- ...(input.harness === undefined
302
- ? existing.harness === undefined
303
- ? {}
304
- : { harness: existing.harness }
305
- : { harness: input.harness }),
306
- };
307
- writeStore(file, store);
308
- return { ok: true, label, source: upgrade.source, previousSource: 'fallback' };
309
- }
310
- }
311
- if (!isLegacyDateFallback(existing)) {
312
- const explicit = explicitCandidate(input.explicitLabel, input);
313
- return {
314
- ok: true,
315
- label: existing.label,
316
- source: existing.source,
317
- ...(existing.source !== 'fallback' && explicit !== null &&
318
- !('error' in explicit) && explicit.label !== existing.label
319
- ? { ignoredExplicitLabel: true }
320
- : {}),
321
- ...(existing.previous_source === undefined
322
- ? {}
323
- : { previousSource: existing.previous_source }),
324
- };
325
- }
326
- const label = uniqueLabel(generatedSessionLabel(input.sessionId), 'fallback', input.harness ?? existing.harness, now, used);
327
- store.sessions[key] = { ...existing, label };
328
- writeStore(file, store);
329
- return { ok: true, label, source: existing.source };
330
- }
331
- const nativePending = harnessLabelIsPending(input.harnessLabel, input);
332
- const native = nativePending ? null : harnessCandidate(input.harnessLabel, input);
333
- const explicit = native === null ? explicitCandidate(input.explicitLabel, input) : null;
334
- if (explicit !== null && 'error' in explicit) {
335
- return { ok: false, error: explicit.error };
336
- }
337
- if (explicit === null && nativePending) {
338
- return {
339
- ok: false,
340
- error: "OpenCode is still generating this session's title; retry shortly or pass --session-label.",
341
- };
342
- }
343
- const candidate = native ?? explicit ?? fallbackCandidate(input.sessionId);
344
- const used = new Set(Object.values(store.sessions).map((record) => collisionKey(record.label)));
345
- const label = uniqueLabel(candidate.label, candidate.source, input.harness, now, used);
346
- store.sessions[key] = {
347
- label,
348
- source: candidate.source,
349
- first_seen_at: now,
350
- ...(input.harness === undefined ? {} : { harness: input.harness }),
351
- };
352
- writeStore(file, store);
353
- return { ok: true, label, source: candidate.source };
354
- });
355
- }
356
- catch (err) {
357
- return {
358
- ok: false,
359
- error: `Could not persist this session's name (${file}): ${err instanceof Error ? err.message : String(err)}`,
360
- };
361
- }
362
- }
363
- /** Replace the local frozen label only after the Account-authoritative rename succeeds. */
364
- export function renameStoredSessionLabel(input) {
365
- const normalized = normalizeExplicitSessionLabel(input);
366
- if (!normalized.ok)
367
- return normalized;
368
- const file = storePath(input.env);
369
- const key = sessionKey(input.sessionId);
370
- const now = input.now ?? Date.now();
371
- try {
372
- return withFileLock(`${file}.lock`, () => {
373
- const store = readStore(file);
374
- const existing = store.sessions[key];
375
- store.sessions[key] = {
376
- label: normalized.label,
377
- source: 'explicit',
378
- first_seen_at: existing?.first_seen_at ?? now,
379
- ...(input.harness === undefined
380
- ? existing?.harness === undefined
381
- ? {}
382
- : { harness: existing.harness }
383
- : { harness: input.harness }),
384
- };
385
- writeStore(file, store);
386
- return { ok: true, label: normalized.label, source: 'explicit' };
387
- });
388
- }
389
- catch (err) {
390
- return {
391
- ok: false,
392
- error: `The Account label changed, but this machine could not save it locally (${file}): ${err instanceof Error ? err.message : String(err)}`,
393
- };
394
- }
395
- }
396
- //# sourceMappingURL=session-labels.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-labels.js","sourceRoot":"","sources":["../src/session-labels.ts"],"names":[],"mappings":"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"}
@@ -1,39 +0,0 @@
1
- /**
2
- * How the Session Attendant hands Session Messages — Session Notes and
3
- * post-delivery Answer Edits — into its running Agent Session.
4
- *
5
- * Each message is one claimed hand-off through the session's delivery
6
- * sequencer, in the order the service accepted them: claim under the attendant's
7
- * lease generation, record the acknowledgement it is owed, write the
8
- * structured context in place, report. Nothing is written without a claim,
9
- * nothing after the claim deadline or the attendant's own write margin, and an
10
- * `unconfirmed` message is never written again.
11
- */
12
- import type { AttendanceMessage } from '@raidiant/notifai-protocol';
13
- import { type SequencerDeps } from './session-delivery.js';
14
- import type { AttendantHandle } from './session-attendant.js';
15
- import type { SessionWriteResult } from './session-handoff.js';
16
- import type { WriteGuard } from './wake-support.js';
17
- /**
18
- * - `done`: every message was handed off, settled elsewhere, or waits for the
19
- * next exchange (which returns every message still claimable).
20
- * - `retry-soon`: a message waits on something that resolves in seconds (its
21
- * fenced answer's outcome, the delivery lock, a lease renewal); ask again
22
- * without holding the exchange open.
23
- */
24
- export type MessageHandOffResult = 'done' | 'retry-soon';
25
- export interface MessageHandOffDeps {
26
- sequencer: SequencerDeps;
27
- /** The OpenClaw writer's pinned generation, never a replacement read at acknowledgement time. */
28
- openclawGeneration?: string;
29
- /** Short synchronous hooks must not wait behind another delivery writer. */
30
- lockWaitMs?: number;
31
- /**
32
- * The in-place write: `begin` is its commit point and `guard` is checked at
33
- * the write itself, before the first byte. A write made by a harness
34
- * subprocess (`codex queue`) begins as `subprocess` and reports that
35
- * subprocess's process group through `writerGroup` as soon as it exists.
36
- */
37
- write(text: string, begin: (writer?: 'subprocess') => boolean, guard: WriteGuard, writerGroup: (pgid: number) => void, message: AttendanceMessage): Promise<SessionWriteResult>;
38
- }
39
- export declare function handOffSessionMessages(messages: readonly AttendanceMessage[], attendant: AttendantHandle, deps: MessageHandOffDeps): Promise<MessageHandOffResult>;
@@ -1,107 +0,0 @@
1
- import { clearAcknowledgementObligation, recordMessageAcknowledgementDue } from './hook-acknowledgements.js';
2
- import { sessionMessageContext } from './injection-render.js';
3
- import { answerWriterGone, beginHandOff } from './session-delivery.js';
4
- export async function handOffSessionMessages(messages, attendant, deps) {
5
- const { sequencer } = deps;
6
- const log = sequencer.log;
7
- // The service lists messages in immutable acceptance order, which is the
8
- // User's order. Timestamps can tie and identifiers are random, so neither
9
- // may reorder them: a later edit must never land before an earlier one.
10
- for (const message of messages) {
11
- const generation = attendant.generation();
12
- if (generation === null || !attendant.mayWrite())
13
- return 'retry-soon';
14
- const handOff = await beginHandOff(sequencer, {
15
- lease: { incarnation: attendant.incarnation(), generation },
16
- subjects: [{ type: 'session_message', message_id: message.message_id }],
17
- earlierAnswerWriterGone: () => message.kind === 'answer_edit' &&
18
- answerWriterGone(sequencer.sessionId, sequencer.env, message.request_id, sequencer.liveness, sequencer.groupAlive),
19
- mayWrite: () => attendant.mayWrite(),
20
- ...(deps.lockWaitMs === undefined ? {} : { lockWaitMs: deps.lockWaitMs }),
21
- });
22
- if (handOff === null)
23
- return 'retry-soon';
24
- const refusal = handOff.refused[0];
25
- if (refusal !== undefined) {
26
- await handOff.finish('not-written');
27
- switch (refusal.reason) {
28
- case 'awaiting_earlier_answer':
29
- case 'awaiting_earlier_message':
30
- case 'attempt_pending':
31
- case 'unavailable':
32
- // Later messages keep their order behind this one.
33
- return 'retry-soon';
34
- case 'generation_fenced':
35
- // The lease moved; the attendant re-acquires before anything else.
36
- return 'done';
37
- case 'not_claimable':
38
- case 'not_found':
39
- continue;
40
- default: {
41
- const unsupported = refusal.reason;
42
- throw new Error(`Unsupported claim refusal: ${unsupported}`);
43
- }
44
- }
45
- }
46
- let owed = false;
47
- let result;
48
- try {
49
- result = await deps.write(sessionMessageContext(message), (writer) => {
50
- recordMessageAcknowledgementDue(sequencer.sessionId, sequencer.env, {
51
- message_id: message.message_id,
52
- recorded_at: sequencer.wall(),
53
- text_required: message.agent_acknowledgement_text_required,
54
- ...(deps.openclawGeneration === undefined ? {} : { openclaw_generation: deps.openclawGeneration }),
55
- ...(writer === 'subprocess' ? { queued_context: sessionMessageContext(message) } : {}),
56
- });
57
- owed = true;
58
- if (handOff.begin(undefined, { subprocess: writer === 'subprocess' }))
59
- return true;
60
- clearAcknowledgementObligation(sequencer.sessionId, sequencer.env, message.message_id);
61
- owed = false;
62
- return false;
63
- }, {
64
- // The lease check probes the harness and can block: the claim
65
- // deadline is judged after it, at the last moment before the byte.
66
- writable: () => attendant.mayWrite() && handOff.writable(),
67
- remainingMs: () => handOff.remainingMs(),
68
- }, (pgid) => handOff.recordGroup(pgid), message);
69
- }
70
- catch (err) {
71
- // Thrown before the write (state I/O): nothing reached the harness.
72
- if (owed)
73
- clearAcknowledgementObligation(sequencer.sessionId, sequencer.env, message.message_id);
74
- await handOff.finish('not-written');
75
- throw err;
76
- }
77
- log?.info('delivery.handoff', {
78
- message_id: message.message_id,
79
- kind: message.kind,
80
- write: result.status,
81
- ...(result.status === 'unavailable' || result.status === 'failed' ? { reason: result.reason } : {}),
82
- });
83
- switch (result.status) {
84
- case 'written':
85
- await handOff.finish('written');
86
- continue;
87
- case 'failed':
88
- // It may have arrived: the debt stays and the service hears `unconfirmed`.
89
- await handOff.finish('failed');
90
- continue;
91
- case 'cancelled':
92
- await handOff.finish('not-written');
93
- return 'retry-soon';
94
- case 'aborted':
95
- // Stopped at the socket before any byte left: nothing arrived, nothing is owed.
96
- clearAcknowledgementObligation(sequencer.sessionId, sequencer.env, message.message_id);
97
- await handOff.finish('aborted');
98
- return 'retry-soon';
99
- case 'unavailable':
100
- case 'stopped':
101
- await handOff.finish('not-written');
102
- return 'done';
103
- }
104
- }
105
- return 'done';
106
- }
107
- //# sourceMappingURL=session-message-handoff.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-message-handoff.js","sourceRoot":"","sources":["../src/session-message-handoff.ts"],"names":[],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- /**
2
- * Where a cross-surface setup errand is finished.
3
- *
4
- * Every handoff opens the destination for exactly one errand, carrying the
5
- * platform when this terminal already asked for it. The omnibus help page is
6
- * help: it covers access, two install routes, billing, refunds, deletion,
7
- * privacy and terms, and its own next step is to go somewhere else. Sending
8
- * someone there for a named gate makes them find it themselves.
9
- *
10
- * The server prints these same paths into `next_action`, which is the value
11
- * this CLI prefers whenever it has one. These builders are the fallback for
12
- * the paths where it does not, and they must stay spelled the same.
13
- */
14
- /** The two platforms that can receive a notification. Mac is not one. */
15
- export declare const COMPANION_PLATFORMS: readonly ["iphone", "android"];
16
- export type CompanionPlatform = (typeof COMPANION_PLATFORMS)[number];
17
- export declare function companionPlatformLabel(platform: CompanionPlatform): string;
18
- /** Getting this Account access to Notifai, and nothing else. */
19
- export declare function setupAccessUrl(baseUrl: string, platform?: CompanionPlatform): string;
20
- /** Installing the Companion App on one named platform. */
21
- export declare function setupCompanionUrl(baseUrl: string, platform?: CompanionPlatform): string;
22
- /** General help: billing, policies, and everything setup is not. */
23
- export declare function supportPageUrl(baseUrl: string): string;
@@ -1,44 +0,0 @@
1
- /**
2
- * Where a cross-surface setup errand is finished.
3
- *
4
- * Every handoff opens the destination for exactly one errand, carrying the
5
- * platform when this terminal already asked for it. The omnibus help page is
6
- * help: it covers access, two install routes, billing, refunds, deletion,
7
- * privacy and terms, and its own next step is to go somewhere else. Sending
8
- * someone there for a named gate makes them find it themselves.
9
- *
10
- * The server prints these same paths into `next_action`, which is the value
11
- * this CLI prefers whenever it has one. These builders are the fallback for
12
- * the paths where it does not, and they must stay spelled the same.
13
- */
14
- /** The two platforms that can receive a notification. Mac is not one. */
15
- export const COMPANION_PLATFORMS = ['iphone', 'android'];
16
- export function companionPlatformLabel(platform) {
17
- return platform === 'iphone' ? 'iPhone' : 'Android';
18
- }
19
- /**
20
- * The dashboard a reader can sign in to, which is not always the API origin.
21
- * Only the hosted deployment splits them; a self-host serves both from one.
22
- */
23
- function dashboardOrigin(baseUrl) {
24
- const normalized = baseUrl.replace(/\/+$/, '');
25
- if (normalized === 'https://api.notifai.sh') {
26
- return 'https://app.notifai.sh';
27
- }
28
- return normalized;
29
- }
30
- /** Getting this Account access to Notifai, and nothing else. */
31
- export function setupAccessUrl(baseUrl, platform) {
32
- const base = `${dashboardOrigin(baseUrl)}/setup/access`;
33
- return platform === undefined ? base : `${base}?platform=${platform}`;
34
- }
35
- /** Installing the Companion App on one named platform. */
36
- export function setupCompanionUrl(baseUrl, platform) {
37
- const base = `${dashboardOrigin(baseUrl)}/setup/companion`;
38
- return platform === undefined ? base : `${base}?platform=${platform}`;
39
- }
40
- /** General help: billing, policies, and everything setup is not. */
41
- export function supportPageUrl(baseUrl) {
42
- return `${dashboardOrigin(baseUrl)}/support`;
43
- }
44
- //# sourceMappingURL=setup-destinations.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup-destinations.js","sourceRoot":"","sources":["../src/setup-destinations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,yEAAyE;AACzE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAU,CAAA;AAGjE,MAAM,UAAU,sBAAsB,CAAC,QAA2B;IAChE,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAA;AACrD,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAC9C,IAAI,UAAU,KAAK,wBAAwB,EAAE,CAAC;QAC5C,OAAO,wBAAwB,CAAA;IACjC,CAAC;IACD,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,QAA4B;IAC1E,MAAM,IAAI,GAAG,GAAG,eAAe,CAAC,OAAO,CAAC,eAAe,CAAA;IACvD,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,aAAa,QAAQ,EAAE,CAAA;AACvE,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,QAA4B;IAC7E,MAAM,IAAI,GAAG,GAAG,eAAe,CAAC,OAAO,CAAC,kBAAkB,CAAA;IAC1D,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,aAAa,QAAQ,EAAE,CAAA;AACvE,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,UAAU,CAAA;AAC9C,CAAC"}