@skrr-ai/cli 0.1.109 → 0.1.111

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 (434) hide show
  1. package/bin/run.js +15 -1
  2. package/dist/base-command.d.ts +44 -1
  3. package/dist/base-command.js +194 -33
  4. package/dist/commands/actions/list.js +2 -1
  5. package/dist/commands/agenda/trigger/create.js +1 -1
  6. package/dist/commands/agenda/trigger/list.js +2 -1
  7. package/dist/commands/agent-groups/list.js +2 -1
  8. package/dist/commands/agents/actions/list.js +2 -1
  9. package/dist/commands/agents/always-on/status.js +5 -0
  10. package/dist/commands/agents/chat.js +4 -1
  11. package/dist/commands/agents/duplicate.js +4 -0
  12. package/dist/commands/agents/eval/list.js +2 -1
  13. package/dist/commands/agents/files/list.js +2 -1
  14. package/dist/commands/agents/folders/list.js +2 -1
  15. package/dist/commands/agents/goals/list.js +2 -1
  16. package/dist/commands/agents/intuitions/list.js +8 -5
  17. package/dist/commands/agents/list.d.ts +12 -0
  18. package/dist/commands/agents/list.js +45 -8
  19. package/dist/commands/agents/releases/known-issues/list.js +2 -1
  20. package/dist/commands/agents/releases/list.js +5 -1
  21. package/dist/commands/agents/releases/trusted-publishers/list.js +2 -1
  22. package/dist/commands/agents/roles/list.js +2 -1
  23. package/dist/commands/agents/skills/list.js +2 -1
  24. package/dist/commands/agents/todos/list.js +2 -1
  25. package/dist/commands/agents/triggers/create.js +1 -1
  26. package/dist/commands/agents/triggers/list.js +2 -1
  27. package/dist/commands/agents/triggers/update.js +1 -1
  28. package/dist/commands/agents/update.d.ts +11 -0
  29. package/dist/commands/agents/update.js +58 -2
  30. package/dist/commands/api-keys/list.js +2 -1
  31. package/dist/commands/apps/channel.d.ts +20 -0
  32. package/dist/commands/apps/channel.js +64 -0
  33. package/dist/commands/apps/check-draft.d.ts +12 -0
  34. package/dist/commands/apps/check-draft.js +41 -0
  35. package/dist/commands/apps/check.d.ts +42 -0
  36. package/dist/commands/apps/check.js +91 -0
  37. package/dist/commands/apps/create.d.ts +15 -0
  38. package/dist/commands/apps/create.js +59 -0
  39. package/dist/commands/apps/data/put.d.ts +18 -0
  40. package/dist/commands/apps/data/put.js +72 -0
  41. package/dist/commands/apps/data/query.d.ts +20 -0
  42. package/dist/commands/apps/data/query.js +88 -0
  43. package/dist/commands/apps/disclosure.d.ts +16 -0
  44. package/dist/commands/apps/disclosure.js +71 -0
  45. package/dist/commands/apps/file/cat.d.ts +15 -0
  46. package/dist/commands/apps/file/cat.js +50 -0
  47. package/dist/commands/apps/file/ls.d.ts +13 -0
  48. package/dist/commands/apps/file/ls.js +47 -0
  49. package/dist/commands/apps/file/mv.d.ts +15 -0
  50. package/dist/commands/apps/file/mv.js +49 -0
  51. package/dist/commands/apps/file/rm.d.ts +15 -0
  52. package/dist/commands/apps/file/rm.js +53 -0
  53. package/dist/commands/apps/file/write.d.ts +17 -0
  54. package/dist/commands/apps/file/write.js +81 -0
  55. package/dist/commands/apps/install.d.ts +19 -0
  56. package/dist/commands/apps/install.js +136 -0
  57. package/dist/commands/apps/installations/list.d.ts +11 -0
  58. package/dist/commands/apps/installations/list.js +49 -0
  59. package/dist/commands/apps/installations/show.d.ts +12 -0
  60. package/dist/commands/apps/installations/show.js +61 -0
  61. package/dist/commands/apps/layout/set.d.ts +11 -0
  62. package/dist/commands/apps/layout/set.js +125 -0
  63. package/dist/commands/apps/layout/show.d.ts +9 -0
  64. package/dist/commands/apps/layout/show.js +33 -0
  65. package/dist/commands/apps/list.d.ts +10 -0
  66. package/dist/commands/apps/list.js +45 -0
  67. package/dist/commands/apps/logs.d.ts +13 -0
  68. package/dist/commands/apps/logs.js +55 -0
  69. package/dist/commands/apps/preview.d.ts +12 -0
  70. package/dist/commands/apps/preview.js +39 -0
  71. package/dist/commands/apps/publish/propose.d.ts +14 -0
  72. package/dist/commands/apps/publish/propose.js +45 -0
  73. package/dist/commands/apps/pull.d.ts +14 -0
  74. package/dist/commands/apps/pull.js +56 -0
  75. package/dist/commands/apps/push.d.ts +15 -0
  76. package/dist/commands/apps/push.js +75 -0
  77. package/dist/commands/apps/reconsent.d.ts +13 -0
  78. package/dist/commands/apps/reconsent.js +67 -0
  79. package/dist/commands/apps/report.d.ts +20 -0
  80. package/dist/commands/apps/report.js +63 -0
  81. package/dist/commands/apps/resume.d.ts +12 -0
  82. package/dist/commands/apps/resume.js +36 -0
  83. package/dist/commands/apps/settings/set.d.ts +13 -0
  84. package/dist/commands/apps/settings/set.js +54 -0
  85. package/dist/commands/apps/settings/show.d.ts +11 -0
  86. package/dist/commands/apps/settings/show.js +31 -0
  87. package/dist/commands/apps/show.d.ts +12 -0
  88. package/dist/commands/apps/show.js +49 -0
  89. package/dist/commands/apps/suspend.d.ts +12 -0
  90. package/dist/commands/apps/suspend.js +35 -0
  91. package/dist/commands/apps/uninstall.d.ts +13 -0
  92. package/dist/commands/apps/uninstall.js +43 -0
  93. package/dist/commands/apps/upgrade.d.ts +14 -0
  94. package/dist/commands/apps/upgrade.js +49 -0
  95. package/dist/commands/apps/version/create.d.ts +14 -0
  96. package/dist/commands/apps/version/create.js +53 -0
  97. package/dist/commands/apps/version/show.d.ts +12 -0
  98. package/dist/commands/apps/version/show.js +39 -0
  99. package/dist/commands/apps/versions.d.ts +12 -0
  100. package/dist/commands/apps/versions.js +40 -0
  101. package/dist/commands/apps/webhooks/list.d.ts +12 -0
  102. package/dist/commands/apps/webhooks/list.js +47 -0
  103. package/dist/commands/characters/list.js +2 -1
  104. package/dist/commands/chats/files/list.js +2 -1
  105. package/dist/commands/chats/folders/list.js +2 -1
  106. package/dist/commands/chats/list.js +2 -1
  107. package/dist/commands/chats/spaces/list.js +2 -1
  108. package/dist/commands/chats/widgets/list.js +2 -1
  109. package/dist/commands/code/jobs/list.js +4 -1
  110. package/dist/commands/commerce/incidents/list.js +2 -1
  111. package/dist/commands/commitments/accounting.js +3 -0
  112. package/dist/commands/commitments/action-proposals.d.ts +8 -0
  113. package/dist/commands/commitments/action-proposals.js +17 -2
  114. package/dist/commands/commitments/cost.d.ts +11 -0
  115. package/dist/commands/commitments/cost.js +25 -0
  116. package/dist/commands/commitments/create.js +6 -1
  117. package/dist/commands/commitments/endpoints/list.js +2 -1
  118. package/dist/commands/commitments/links/list.js +2 -1
  119. package/dist/commands/commitments/list.js +2 -1
  120. package/dist/commands/commitments/liveness.d.ts +30 -0
  121. package/dist/commands/commitments/liveness.js +22 -5
  122. package/dist/commands/commitments/pack/list.js +2 -1
  123. package/dist/commands/commitments/preflight.js +6 -2
  124. package/dist/commands/commitments/update.js +10 -1
  125. package/dist/commands/compass/list.js +2 -1
  126. package/dist/commands/context.js +7 -1
  127. package/dist/commands/convos/list.js +3 -2
  128. package/dist/commands/daemon/install.js +17 -1
  129. package/dist/commands/daemon/login.js +14 -0
  130. package/dist/commands/dm/list.js +2 -1
  131. package/dist/commands/dm/work.d.ts +19 -0
  132. package/dist/commands/dm/work.js +54 -0
  133. package/dist/commands/feeds/list.js +2 -1
  134. package/dist/commands/followups/list.js +2 -1
  135. package/dist/commands/followups/plans/cancel.d.ts +13 -0
  136. package/dist/commands/followups/plans/cancel.js +26 -0
  137. package/dist/commands/followups/plans/create.d.ts +11 -0
  138. package/dist/commands/followups/plans/create.js +35 -0
  139. package/dist/commands/followups/plans/list.d.ts +13 -0
  140. package/dist/commands/followups/plans/list.js +50 -0
  141. package/dist/commands/followups/plans/observability.d.ts +11 -0
  142. package/dist/commands/followups/plans/observability.js +46 -0
  143. package/dist/commands/followups/plans/revise.d.ts +13 -0
  144. package/dist/commands/followups/plans/revise.js +35 -0
  145. package/dist/commands/followups/plans/show.d.ts +11 -0
  146. package/dist/commands/followups/plans/show.js +32 -0
  147. package/dist/commands/goals/key-results/list.js +2 -1
  148. package/dist/commands/goals/labels/list.js +3 -2
  149. package/dist/commands/goals/list.js +3 -2
  150. package/dist/commands/grants/list.js +2 -1
  151. package/dist/commands/harnesses/grants/list.js +2 -1
  152. package/dist/commands/harnesses/leases/list.js +2 -1
  153. package/dist/commands/harnesses/list.js +10 -1
  154. package/dist/commands/harnesses/prune.d.ts +26 -0
  155. package/dist/commands/harnesses/prune.js +172 -0
  156. package/dist/commands/ingress/list.js +2 -1
  157. package/dist/commands/initiatives/list.js +2 -1
  158. package/dist/commands/instruction-blocks/list.js +2 -1
  159. package/dist/commands/instructions/list.js +2 -1
  160. package/dist/commands/integrations/connections/list.js +2 -1
  161. package/dist/commands/integrations/tools/list.js +2 -1
  162. package/dist/commands/labels/list.js +3 -2
  163. package/dist/commands/learning/adapters.d.ts +16 -0
  164. package/dist/commands/learning/adapters.js +44 -0
  165. package/dist/commands/login.js +11 -0
  166. package/dist/commands/machines/dedicated/list.js +2 -1
  167. package/dist/commands/machines/hosted/list.js +2 -1
  168. package/dist/commands/machines/list.js +2 -1
  169. package/dist/commands/machines/show.js +5 -2
  170. package/dist/commands/measures/list.js +2 -1
  171. package/dist/commands/memory/list.js +2 -1
  172. package/dist/commands/memory/proposals/list.js +2 -1
  173. package/dist/commands/memory/stores/list.js +2 -1
  174. package/dist/commands/memory/topics/list.js +2 -1
  175. package/dist/commands/memory/versions/list.js +2 -1
  176. package/dist/commands/messages/list.js +2 -1
  177. package/dist/commands/northstars/intents/list.js +2 -1
  178. package/dist/commands/northstars/list.js +2 -1
  179. package/dist/commands/northstars/recommendations/list.js +2 -1
  180. package/dist/commands/outbox/list.js +2 -1
  181. package/dist/commands/profiles/list.js +2 -1
  182. package/dist/commands/projects/docs/list.js +8 -1
  183. package/dist/commands/projects/updates/list.js +2 -1
  184. package/dist/commands/proposals/list.js +2 -1
  185. package/dist/commands/requests/comments/list.js +2 -1
  186. package/dist/commands/requests/list.js +2 -1
  187. package/dist/commands/shares/list.js +2 -1
  188. package/dist/commands/shortcuts/list.js +2 -1
  189. package/dist/commands/signals/monitors/list.js +2 -1
  190. package/dist/commands/signals/schemas/list.js +2 -1
  191. package/dist/commands/signals/sources/list.js +2 -1
  192. package/dist/commands/space-directory-views/list.js +2 -1
  193. package/dist/commands/spaces/actions/list.js +4 -3
  194. package/dist/commands/spaces/briefs/list.js +2 -1
  195. package/dist/commands/spaces/cycles/list.js +2 -1
  196. package/dist/commands/spaces/files/folders/list.js +2 -1
  197. package/dist/commands/spaces/files/list.js +3 -2
  198. package/dist/commands/spaces/heartbeats/list.js +3 -2
  199. package/dist/commands/spaces/labels/list.js +3 -2
  200. package/dist/commands/spaces/list.d.ts +3 -18
  201. package/dist/commands/spaces/list.js +28 -35
  202. package/dist/commands/spaces/live/cards/list.js +2 -1
  203. package/dist/commands/spaces/members/list.d.ts +1 -0
  204. package/dist/commands/spaces/members/list.js +4 -1
  205. package/dist/commands/spaces/show.js +2 -2
  206. package/dist/commands/spaces/skills/list.js +6 -2
  207. package/dist/commands/spaces/states/list.js +2 -1
  208. package/dist/commands/spaces/views/list.js +2 -1
  209. package/dist/commands/spaces/widgets/list.js +3 -2
  210. package/dist/commands/spaces/workflow-templates/list.js +2 -1
  211. package/dist/commands/spaces/workflows/fixtures/list.js +2 -1
  212. package/dist/commands/spaces/workflows/list.js +3 -2
  213. package/dist/commands/spaces/workflows/proposals/list.js +2 -1
  214. package/dist/commands/spaces/workflows/start.js +3 -1
  215. package/dist/commands/spaces/workflows/triggers/list.js +2 -1
  216. package/dist/commands/spaces/workflows/validate.js +12 -2
  217. package/dist/commands/store/acquisitions/list.js +2 -1
  218. package/dist/commands/store/admissions/list.js +17 -1
  219. package/dist/commands/store/advisories/list.js +2 -1
  220. package/dist/commands/store/follows/list.js +2 -1
  221. package/dist/commands/store/publishers/domains/list.js +2 -1
  222. package/dist/commands/store/reports/list.js +2 -1
  223. package/dist/commands/subscriptions/list.js +2 -1
  224. package/dist/commands/tasks/actionability.js +7 -30
  225. package/dist/commands/tasks/activity.js +14 -8
  226. package/dist/commands/tasks/approvals/list.js +2 -1
  227. package/dist/commands/tasks/assign.d.ts +1 -0
  228. package/dist/commands/tasks/assign.js +43 -7
  229. package/dist/commands/tasks/attachments/list.js +2 -1
  230. package/dist/commands/tasks/chat/send.js +34 -0
  231. package/dist/commands/tasks/comments/add.js +6 -1
  232. package/dist/commands/tasks/comments/list.js +2 -1
  233. package/dist/commands/tasks/complete.js +26 -2
  234. package/dist/commands/tasks/continue.d.ts +18 -0
  235. package/dist/commands/tasks/continue.js +54 -0
  236. package/dist/commands/tasks/create-tree.d.ts +5 -0
  237. package/dist/commands/tasks/create-tree.js +399 -219
  238. package/dist/commands/tasks/create.d.ts +1 -0
  239. package/dist/commands/tasks/create.js +63 -11
  240. package/dist/commands/tasks/deliverable/add.js +10 -3
  241. package/dist/commands/tasks/deliverable/list.js +2 -1
  242. package/dist/commands/tasks/events/list.js +2 -1
  243. package/dist/commands/tasks/execution-state.d.ts +12 -0
  244. package/dist/commands/tasks/execution-state.js +28 -0
  245. package/dist/commands/tasks/expectations/assess.js +40 -5
  246. package/dist/commands/tasks/guide.d.ts +10 -0
  247. package/dist/commands/tasks/guide.js +20 -0
  248. package/dist/commands/tasks/labels/list.js +2 -1
  249. package/dist/commands/tasks/list.d.ts +19 -0
  250. package/dist/commands/tasks/list.js +103 -6
  251. package/dist/commands/tasks/move.js +10 -2
  252. package/dist/commands/tasks/preflight.d.ts +14 -0
  253. package/dist/commands/tasks/preflight.js +77 -0
  254. package/dist/commands/tasks/rearm-recurrence.js +22 -3
  255. package/dist/commands/tasks/resource/list.js +2 -1
  256. package/dist/commands/tasks/result/submit.js +10 -1
  257. package/dist/commands/tasks/review.js +6 -1
  258. package/dist/commands/tasks/revisions.d.ts +2 -0
  259. package/dist/commands/tasks/revisions.js +8 -1
  260. package/dist/commands/tasks/show.d.ts +8 -0
  261. package/dist/commands/tasks/show.js +81 -43
  262. package/dist/commands/tasks/start.d.ts +1 -0
  263. package/dist/commands/tasks/start.js +35 -0
  264. package/dist/commands/tasks/templates/list.js +2 -1
  265. package/dist/commands/tasks/timeline.d.ts +5 -0
  266. package/dist/commands/tasks/timeline.js +9 -1
  267. package/dist/commands/tasks/unschedule.js +5 -1
  268. package/dist/commands/tasks/update.d.ts +1 -0
  269. package/dist/commands/tasks/update.js +36 -3
  270. package/dist/commands/tasks/updates/add.js +6 -1
  271. package/dist/commands/tasks/updates/list.js +2 -1
  272. package/dist/commands/tasks/upsert.d.ts +1 -0
  273. package/dist/commands/tasks/upsert.js +8 -1
  274. package/dist/commands/token/list.js +2 -1
  275. package/dist/commands/tokens/list.js +2 -1
  276. package/dist/commands/tones/list.js +4 -2
  277. package/dist/commands/triggers/audit.js +12 -3
  278. package/dist/commands/triggers/create.js +1 -1
  279. package/dist/commands/triggers/fire-detail.d.ts +7 -0
  280. package/dist/commands/triggers/fire-detail.js +30 -12
  281. package/dist/commands/triggers/fire.js +13 -3
  282. package/dist/commands/triggers/list.js +2 -1
  283. package/dist/commands/triggers/parse-intent.js +1 -1
  284. package/dist/commands/triggers/update.js +1 -1
  285. package/dist/commands/views/list.js +2 -1
  286. package/dist/commands/webhooks/list.js +2 -1
  287. package/dist/commands/whoami.js +1 -1
  288. package/dist/commands/widgets/list.js +2 -1
  289. package/dist/commands/widgets/save-as-app.d.ts +13 -0
  290. package/dist/commands/widgets/save-as-app.js +65 -0
  291. package/dist/commands/work-views/list.js +2 -1
  292. package/dist/commands/worklog/list.js +2 -1
  293. package/dist/commands/workspaces/grants.js +1 -4
  294. package/dist/commands/workspaces/list.js +3 -2
  295. package/dist/commands/workspaces/members.d.ts +1 -0
  296. package/dist/commands/workspaces/members.js +10 -7
  297. package/dist/generated/managed-instruction-guides.json +2 -2
  298. package/dist/help.js +7 -0
  299. package/dist/lib/agent-proactive-baseline.d.ts +9 -0
  300. package/dist/lib/agent-proactive-baseline.js +44 -0
  301. package/dist/lib/agentic-stream.d.ts +4 -1
  302. package/dist/lib/agentic-stream.js +29 -4
  303. package/dist/lib/appData.d.ts +75 -0
  304. package/dist/lib/appData.js +274 -0
  305. package/dist/lib/appInstallations.d.ts +117 -0
  306. package/dist/lib/appInstallations.js +960 -0
  307. package/dist/lib/appSettings.d.ts +3 -0
  308. package/dist/lib/appSettings.js +71 -0
  309. package/dist/lib/appWebhooks.d.ts +7 -0
  310. package/dist/lib/appWebhooks.js +59 -0
  311. package/dist/lib/apps-command.d.ts +44 -0
  312. package/dist/lib/apps-command.js +164 -0
  313. package/dist/lib/apps.d.ts +45 -0
  314. package/dist/lib/apps.js +148 -0
  315. package/dist/lib/appsCheck.d.ts +12 -0
  316. package/dist/lib/appsCheck.js +173 -0
  317. package/dist/lib/appsFs.d.ts +58 -0
  318. package/dist/lib/appsFs.js +384 -0
  319. package/dist/lib/auth-failure.d.ts +20 -0
  320. package/dist/lib/auth-failure.js +40 -3
  321. package/dist/lib/cli-installers.d.ts +9 -2
  322. package/dist/lib/command-miss.js +107 -0
  323. package/dist/lib/commitment-loop-status.js +25 -3
  324. package/dist/lib/commitment-product.js +5 -2
  325. package/dist/lib/commitments.d.ts +45 -3
  326. package/dist/lib/commitments.js +139 -41
  327. package/dist/lib/compasses.d.ts +4 -0
  328. package/dist/lib/compasses.js +11 -0
  329. package/dist/lib/daemon-machine-identity-copy.d.ts +14 -0
  330. package/dist/lib/daemon-machine-identity-copy.js +27 -0
  331. package/dist/lib/daemon-machine-identity.d.ts +27 -0
  332. package/dist/lib/daemon-machine-identity.js +61 -0
  333. package/dist/lib/daemon-setup.js +7 -7
  334. package/dist/lib/daemonHandoff.d.ts +19 -1
  335. package/dist/lib/daemonHandoff.js +62 -2
  336. package/dist/lib/dedicated-ssh.d.ts +2 -0
  337. package/dist/lib/dedicated-ssh.js +98 -28
  338. package/dist/lib/harnesses.d.ts +71 -0
  339. package/dist/lib/harnesses.js +70 -0
  340. package/dist/lib/json-output.d.ts +33 -0
  341. package/dist/lib/json-output.js +37 -0
  342. package/dist/lib/list-output.d.ts +9 -4
  343. package/dist/lib/list-output.js +38 -9
  344. package/dist/lib/lookbackPlans.d.ts +13 -0
  345. package/dist/lib/lookbackPlans.js +68 -0
  346. package/dist/lib/machines.d.ts +27 -6
  347. package/dist/lib/machines.js +25 -14
  348. package/dist/lib/member-output.d.ts +20 -0
  349. package/dist/lib/member-output.js +57 -0
  350. package/dist/lib/preflight-copy.d.ts +7 -0
  351. package/dist/lib/preflight-copy.js +31 -0
  352. package/dist/lib/profile-machine-identity-guard.js +11 -1
  353. package/dist/lib/roles.d.ts +2 -2
  354. package/dist/lib/task-admission.d.ts +9 -0
  355. package/dist/lib/task-admission.js +35 -0
  356. package/dist/lib/task-batch.d.ts +4 -0
  357. package/dist/lib/task-batch.js +2 -0
  358. package/dist/lib/task-economics.d.ts +10 -0
  359. package/dist/lib/task-economics.js +24 -2
  360. package/dist/lib/task-operations.d.ts +25 -0
  361. package/dist/lib/task-operations.js +123 -0
  362. package/dist/lib/task-preflight.d.ts +35 -0
  363. package/dist/lib/task-preflight.js +121 -0
  364. package/dist/lib/task-resource-references.d.ts +23 -0
  365. package/dist/lib/task-resource-references.js +119 -0
  366. package/dist/lib/task-spec-verification.d.ts +42 -0
  367. package/dist/lib/task-spec-verification.js +101 -0
  368. package/dist/lib/task-work.d.ts +11 -0
  369. package/dist/lib/task-work.js +41 -0
  370. package/dist/lib/task-write-attribution.d.ts +26 -0
  371. package/dist/lib/task-write-attribution.js +47 -0
  372. package/dist/lib/tasks.d.ts +13 -0
  373. package/dist/lib/tasks.js +61 -8
  374. package/dist/lib/triggers.d.ts +18 -0
  375. package/dist/lib/triggers.js +97 -5
  376. package/dist/lib/usage-discovery.d.ts +4 -0
  377. package/dist/lib/usage-discovery.js +14 -4
  378. package/dist/lib/widgetApps.d.ts +10 -0
  379. package/dist/lib/widgetApps.js +47 -0
  380. package/dist/lib/widgetStaticScan.js +25 -1
  381. package/dist/lib/workflow-run-view.d.ts +4 -0
  382. package/dist/lib/workflow-run-view.js +5 -0
  383. package/dist/lib/workspaces.d.ts +33 -9
  384. package/dist/lib/workspaces.js +19 -3
  385. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/computerWire.d.ts +14 -1
  386. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/computerWire.js +47 -2
  387. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonToolApproval.d.ts +49 -1
  388. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonToolApproval.js +26 -0
  389. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonWire.d.ts +118 -0
  390. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonWire.js +614 -0
  391. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.d.ts +1 -1
  392. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.js +5 -3
  393. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/machineUuid.d.ts +60 -0
  394. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/machineUuid.js +130 -6
  395. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/refresh.d.ts +2 -0
  396. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/refresh.js +15 -2
  397. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/refreshClassification.d.ts +5 -0
  398. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/refreshClassification.js +3 -1
  399. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/sessionRevocation.d.ts +177 -0
  400. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/sessionRevocation.js +484 -0
  401. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/telemetryRedaction.d.ts +11 -0
  402. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/telemetryRedaction.js +46 -7
  403. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/toolApprovalSignature.d.ts +232 -0
  404. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/toolApprovalSignature.js +372 -0
  405. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/types.d.ts +17 -1
  406. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/types.js +12 -1
  407. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/computerWire.d.ts +14 -1
  408. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/computerWire.js +45 -2
  409. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonToolApproval.d.ts +49 -1
  410. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonToolApproval.js +24 -0
  411. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonWire.d.ts +118 -0
  412. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonWire.js +608 -0
  413. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.d.ts +1 -1
  414. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.js +1 -1
  415. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/machineUuid.d.ts +60 -0
  416. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/machineUuid.js +128 -6
  417. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/refresh.d.ts +2 -0
  418. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/refresh.js +15 -2
  419. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/refreshClassification.d.ts +5 -0
  420. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/refreshClassification.js +3 -1
  421. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/sessionRevocation.d.ts +177 -0
  422. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/sessionRevocation.js +472 -0
  423. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/telemetryRedaction.d.ts +11 -0
  424. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/telemetryRedaction.js +44 -6
  425. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/toolApprovalSignature.d.ts +232 -0
  426. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/toolApprovalSignature.js +360 -0
  427. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/types.d.ts +17 -1
  428. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/types.js +12 -1
  429. package/dist/node_modules/@skrr-ai/auth-core/package.json +31 -1
  430. package/dist/node_modules/@skrr-ai/data-provider/index.js +25255 -18711
  431. package/docs/v1/operations.md +52 -0
  432. package/docs/v1/space-search.md +19 -0
  433. package/oclif.manifest.json +4843 -513
  434. package/package.json +32 -2
@@ -56,5 +56,65 @@ export declare function getMachineUuidProfile(): string | null;
56
56
  * profile that already held credentials; see the block above.
57
57
  */
58
58
  export declare function getMachineUuid(): string;
59
+ /**
60
+ * The `machineUuid` a process running as `profile` sends, WITHOUT changing which
61
+ * profile this process runs as.
62
+ *
63
+ * The CLI needs the answer for the profile it is about to hand a credential to,
64
+ * and asks the daemon binary what IT will send (`accept-handoff --print-id`).
65
+ * Two programs that compute one identity can only be known to agree by
66
+ * comparing them, and a daemon that predates per-profile identities does not
67
+ * agree: it sends the hardware value whatever the profile's
68
+ * `machine-identity.json` says, so a credential minted for what it reports
69
+ * registers the profile on the default machine's row (the OSK-13845 failure, now
70
+ * reached through version skew rather than through the rule). The comparison
71
+ * needs this: the expected value for the TARGET profile, which is not
72
+ * necessarily the one this process is running as.
73
+ *
74
+ * Decides and persists the profile's identity if nothing has yet — the same
75
+ * side effect `getMachineUuid()` has, for the same reason.
76
+ */
77
+ export declare function getMachineUuidForProfile(profile: string | null | undefined): string;
78
+ export type MachineIdentityReason =
79
+ /** The default profile, which always uses this computer's own identity. */
80
+ 'default_profile'
81
+ /** A hosted runtime, whose identity the control plane issued. */
82
+ | 'hosted_runtime'
83
+ /** A profile that held no credentials when its identity was first decided. */
84
+ | 'new_profile'
85
+ /** A profile that already held credentials, so it keeps the shared identity. */
86
+ | 'pre_existing_profile'
87
+ /** Recovered from the copy kept outside the profile after product state was removed. */
88
+ | 'restored_profile'
89
+ /** The profile's record could not be read (the identity is still the one in use). */
90
+ | 'unrecorded';
91
+ export interface MachineIdentityDescription {
92
+ /** The profile this process runs as; null for the default profile. */
93
+ profile: string | null;
94
+ /** The value sent to the server as `machineUuid`. */
95
+ machineUuid: string;
96
+ /** This computer's own identity. */
97
+ hardware: string;
98
+ /**
99
+ * A non-default profile that registers on the SAME machine row as the default
100
+ * profile: they share one Daemon row, one device-key pin and one machine page.
101
+ */
102
+ sharesDefaultMachine: boolean;
103
+ reason: MachineIdentityReason;
104
+ /** The files that made a profile "already hold credentials", when recorded. */
105
+ evidence: string[];
106
+ decidedAt: string | null;
107
+ /** One sentence for a person. Written once, here, so no surface words it differently. */
108
+ sentence: string;
109
+ }
110
+ /**
111
+ * Which machine this process registers as, and WHY — the question a person has
112
+ * when two profiles turn up on one machine page and the logs say nothing.
113
+ *
114
+ * A read, not a decision: it reports the identity `getMachineUuid()` settled on
115
+ * (settling it if nothing has, exactly as any caller would) and the record that
116
+ * explains it. It never changes what a profile registers as.
117
+ */
118
+ export declare function describeMachineIdentity(): MachineIdentityDescription;
59
119
  /** @internal test seam — forget the cached value so the next call re-probes. */
60
120
  export declare function __resetMachineUuidCacheForTest(): void;
@@ -218,7 +218,7 @@ function readPersistedChoice(file, hardware, profile, requireProfile = false) {
218
218
  return null;
219
219
  }
220
220
  }
221
- function persistChoice(dir, file, hardware, machineUuid, reason, profile) {
221
+ function persistChoice(dir, file, hardware, machineUuid, reason, profile, evidence) {
222
222
  try {
223
223
  fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
224
224
  const tmp = `${file}.${process.pid}.${Date.now()}.tmp`;
@@ -228,6 +228,12 @@ function persistChoice(dir, file, hardware, machineUuid, reason, profile) {
228
228
  machineUuid,
229
229
  profile,
230
230
  reason,
231
+ // WHICH file made a profile "already hold credentials". The reason alone
232
+ // says a profile shares the default's machine row; this says what put it
233
+ // there, which is the difference between "an older Skrr set it up" and
234
+ // "its first credential was written before anything chose its identity".
235
+ // Additive: a reader that predates it ignores the field.
236
+ ...(evidence && evidence.length > 0 ? { evidence: [...evidence] } : {}),
231
237
  decidedAt: new Date().toISOString(),
232
238
  };
233
239
  fs.writeFileSync(tmp, `${JSON.stringify(body)}\n`, { mode: 0o600 });
@@ -267,7 +273,7 @@ function resolveProfileMachineUuid(profile, hardware) {
267
273
  persistChoice(dir, file, hardware, chosen, 'restored_profile', profile);
268
274
  }
269
275
  if (!chosen) {
270
- const preExisting = PRE_EXISTING_PROFILE_EVIDENCE.some((name) => {
276
+ const evidence = PRE_EXISTING_PROFILE_EVIDENCE.filter((name) => {
271
277
  try {
272
278
  return fs.existsSync(path.join(dir, name));
273
279
  }
@@ -275,8 +281,9 @@ function resolveProfileMachineUuid(profile, hardware) {
275
281
  return false;
276
282
  }
277
283
  });
284
+ const preExisting = evidence.length > 0;
278
285
  chosen = preExisting ? hardware : qualifyMachineUuid(hardware, profile);
279
- persistChoice(dir, file, hardware, chosen, preExisting ? 'pre_existing_profile' : 'new_profile', profile);
286
+ persistChoice(dir, file, hardware, chosen, preExisting ? 'pre_existing_profile' : 'new_profile', profile, evidence);
280
287
  }
281
288
  preserveRecoveryChoice(profile, hardware, chosen);
282
289
  profileChoiceCache.set(cacheKey, chosen);
@@ -296,14 +303,129 @@ function resolveProfileMachineUuid(profile, hardware) {
296
303
  * profile that already held credentials; see the block above.
297
304
  */
298
305
  export function getMachineUuid() {
306
+ return getMachineUuidForProfile(activeMachineProfile);
307
+ }
308
+ /**
309
+ * The `machineUuid` a process running as `profile` sends, WITHOUT changing which
310
+ * profile this process runs as.
311
+ *
312
+ * The CLI needs the answer for the profile it is about to hand a credential to,
313
+ * and asks the daemon binary what IT will send (`accept-handoff --print-id`).
314
+ * Two programs that compute one identity can only be known to agree by
315
+ * comparing them, and a daemon that predates per-profile identities does not
316
+ * agree: it sends the hardware value whatever the profile's
317
+ * `machine-identity.json` says, so a credential minted for what it reports
318
+ * registers the profile on the default machine's row (the OSK-13845 failure, now
319
+ * reached through version skew rather than through the rule). The comparison
320
+ * needs this: the expected value for the TARGET profile, which is not
321
+ * necessarily the one this process is running as.
322
+ *
323
+ * Decides and persists the profile's identity if nothing has yet — the same
324
+ * side effect `getMachineUuid()` has, for the same reason.
325
+ */
326
+ export function getMachineUuidForProfile(profile) {
299
327
  const hardware = getHardwareMachineUuid();
300
328
  // A hosted runtime's identity is ISSUED and fenced by the control plane.
301
329
  if (hostedRuntimeIdOverride('OVERSKY_MACHINE_UUID'))
302
330
  return hardware;
303
- const profile = activeMachineProfile;
304
- if (!profile || profile === DEFAULT_PROFILE_NAME)
331
+ const name = typeof profile === 'string' ? profile.trim() : '';
332
+ if (!name || name === DEFAULT_PROFILE_NAME)
305
333
  return hardware;
306
- return resolveProfileMachineUuid(profile, hardware);
334
+ return resolveProfileMachineUuid(name, hardware);
335
+ }
336
+ function readRecordedChoice(profile) {
337
+ try {
338
+ const file = path.join(resolveConfigRoot(), 'profiles', profile, MACHINE_IDENTITY_FILENAME);
339
+ const parsed = JSON.parse(fs.readFileSync(file, 'utf-8'));
340
+ const reason = parsed.reason === 'new_profile' ||
341
+ parsed.reason === 'pre_existing_profile' ||
342
+ parsed.reason === 'restored_profile'
343
+ ? parsed.reason
344
+ : null;
345
+ return {
346
+ reason,
347
+ evidence: Array.isArray(parsed.evidence)
348
+ ? parsed.evidence.filter((e) => typeof e === 'string')
349
+ : [],
350
+ decidedAt: typeof parsed.decidedAt === 'string' ? parsed.decidedAt : null,
351
+ };
352
+ }
353
+ catch {
354
+ return { reason: null, evidence: [], decidedAt: null };
355
+ }
356
+ }
357
+ /**
358
+ * Which machine this process registers as, and WHY — the question a person has
359
+ * when two profiles turn up on one machine page and the logs say nothing.
360
+ *
361
+ * A read, not a decision: it reports the identity `getMachineUuid()` settled on
362
+ * (settling it if nothing has, exactly as any caller would) and the record that
363
+ * explains it. It never changes what a profile registers as.
364
+ */
365
+ export function describeMachineIdentity() {
366
+ const hardware = getHardwareMachineUuid();
367
+ const machineUuid = getMachineUuid();
368
+ const active = activeMachineProfile;
369
+ const profile = active && active !== DEFAULT_PROFILE_NAME ? active : null;
370
+ const base = { profile, machineUuid, hardware };
371
+ if (hostedRuntimeIdOverride('OVERSKY_MACHINE_UUID')) {
372
+ return {
373
+ ...base,
374
+ sharesDefaultMachine: false,
375
+ reason: 'hosted_runtime',
376
+ evidence: [],
377
+ decidedAt: null,
378
+ sentence: 'This runtime is hosted; its machine identity was issued by the control plane.',
379
+ };
380
+ }
381
+ if (!profile) {
382
+ return {
383
+ ...base,
384
+ sharesDefaultMachine: false,
385
+ reason: 'default_profile',
386
+ evidence: [],
387
+ decidedAt: null,
388
+ sentence: "The default profile uses this computer's own machine identity.",
389
+ };
390
+ }
391
+ const recorded = readRecordedChoice(profile);
392
+ const sharesDefaultMachine = machineUuid === hardware;
393
+ const reason = recorded.reason ?? 'unrecorded';
394
+ const decided = recorded.decidedAt ? ` (decided ${recorded.decidedAt})` : '';
395
+ const held = recorded.evidence.length > 0 ? ` (${recorded.evidence.join(', ')})` : '';
396
+ let sentence;
397
+ if (reason === 'new_profile') {
398
+ sentence =
399
+ `Profile '${profile}' has its own machine identity: it held no credentials when that ` +
400
+ `identity was first chosen${decided}.`;
401
+ }
402
+ else if (reason === 'pre_existing_profile') {
403
+ sentence =
404
+ `Profile '${profile}' shares this computer's default machine identity: it already held ` +
405
+ `credentials${held} when its identity was first chosen${decided}, and the server ties ` +
406
+ 'those credentials to that identity, so changing it would sign the profile out.';
407
+ }
408
+ else if (reason === 'restored_profile') {
409
+ sentence = sharesDefaultMachine
410
+ ? `Profile '${profile}' shares this computer's default machine identity, restored from the ` +
411
+ `copy kept outside the profile after its state was removed${decided}.`
412
+ : `Profile '${profile}' has its own machine identity, restored from the copy kept outside ` +
413
+ `the profile after its state was removed${decided}.`;
414
+ }
415
+ else {
416
+ sentence = sharesDefaultMachine
417
+ ? `Profile '${profile}' uses this computer's default machine identity; the record of why ` +
418
+ 'could not be read.'
419
+ : `Profile '${profile}' has its own machine identity; the record of why could not be read.`;
420
+ }
421
+ return {
422
+ ...base,
423
+ sharesDefaultMachine,
424
+ reason,
425
+ evidence: recorded.evidence,
426
+ decidedAt: recorded.decidedAt,
427
+ sentence,
428
+ };
307
429
  }
308
430
  /** @internal test seam — forget the cached value so the next call re-probes. */
309
431
  export function __resetMachineUuidCacheForTest() {
@@ -282,6 +282,8 @@ export declare function needsReauthState(): {
282
282
  * which one they hit (OSK-12116).
283
283
  */
284
284
  message?: string;
285
+ /** OSK-16941 — the server's session-revocation reason, when one was latched. */
286
+ revocationReason?: string;
285
287
  since?: number;
286
288
  };
287
289
  export declare function clearReauthState(): void;
@@ -835,8 +835,18 @@ async function doRefresh(serverUrl, currentRefreshToken, daemonId, options = {})
835
835
  statusCode: 401,
836
836
  },
837
837
  });
838
- persistReauthState({ code, message: parsedBody.message, at: Date.now() });
839
- throw new PermanentAuthFailure(code, parsedBody.message || code);
838
+ // OSK-16941 — keep WHY a revoked session was revoked, so the CLI and the
839
+ // desktop banner can tell the person instead of a bare code.
840
+ const revocationReason = code === 'SESSION_REVOKED' && typeof parsedBody.reason === 'string'
841
+ ? parsedBody.reason.slice(0, 64)
842
+ : undefined;
843
+ persistReauthState({
844
+ code,
845
+ message: parsedBody.message,
846
+ ...(revocationReason ? { revocationReason } : {}),
847
+ at: Date.now(),
848
+ });
849
+ throw new PermanentAuthFailure(code, parsedBody.message || code, revocationReason);
840
850
  }
841
851
  // Unknown-shape 401 — unknown code, missing code, or unparseable body.
842
852
  // By construction this is NOT a daemon's actual refresh-family burn
@@ -959,6 +969,9 @@ export function needsReauthState() {
959
969
  ...(typeof state.message === 'string' && state.message.length > 0
960
970
  ? { message: state.message }
961
971
  : {}),
972
+ ...(typeof state.revocationReason === 'string' && state.revocationReason.length > 0
973
+ ? { revocationReason: state.revocationReason }
974
+ : {}),
962
975
  since: state.at,
963
976
  };
964
977
  }
@@ -21,6 +21,11 @@ export interface RefreshResponseShape {
21
21
  code?: string;
22
22
  /** Optional human-readable error message. */
23
23
  message?: string;
24
+ /**
25
+ * OSK-16941 — with `code: 'SESSION_REVOKED'`, why the session was revoked
26
+ * (`@skrr-ai/data-provider` `SESSION_REVOCATION_REASONS`).
27
+ */
28
+ reason?: string;
24
29
  /** When 200, the new access token. */
25
30
  token?: string;
26
31
  /** When 200, the (possibly rotated) refresh token. */
@@ -97,7 +97,9 @@ export function classifyRefreshResponse(status, body) {
97
97
  const fallback = body?.code === 'REFRESH_MISSING' ? 'Refresh token missing' : reason;
98
98
  return {
99
99
  kind: 'failure',
100
- failure: new PermanentAuthFailure(reason, body?.message ?? fallback),
100
+ failure: new PermanentAuthFailure(reason, body?.message ?? fallback, reason === 'SESSION_REVOKED' && typeof body?.reason === 'string'
101
+ ? body.reason
102
+ : undefined),
101
103
  };
102
104
  }
103
105
  // Unknown-shape 401 (no code, or a code we don't recognise). This is NOT a
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Why a session was signed out, and what the person should do next (OSK-16941).
3
+ *
4
+ * ## Why this file exists
5
+ *
6
+ * The server always knew why it refused a session: `requireJwtAuth` answers
7
+ * `401 SESSION_REVOKED` with a `reason` for an inactive account, an account-wide
8
+ * revocation, a password change and a per-session sign-out. Nothing passed it
9
+ * on. The CLI dropped the field, the web client folded every unrecognised code
10
+ * into "your saved credentials are no longer valid", and a refresh refused for a
11
+ * revoked session answered with no code at all. A person signed out with no
12
+ * explanation reasonably concludes their account was stolen.
13
+ *
14
+ * So the vocabulary lives here, once, beside the one function that turns a
15
+ * reason into words: the API writes these codes, the web login page, the desktop
16
+ * banner, the desktop main process (OS notification and tray) and the CLI all
17
+ * render them through `describeSessionRevocation`.
18
+ *
19
+ * ## Why auth-core, behind its own subpath
20
+ *
21
+ * It was declared in `@skrr-ai/data-provider`, which the Electron main process
22
+ * does not (and should not) depend on — so main kept printing the server's raw
23
+ * message in the OS notification and the tray. auth-core is already the
24
+ * package that LATCHES the reason (`refresh.ts` writes `revocationReason` into
25
+ * `needs-reauth.json`), and every desktop, daemon and CLI process already
26
+ * depends on it. This module imports nothing, so the
27
+ * `@skrr-ai/auth-core/session-revocation` subpath is safe in a browser, React
28
+ * Native and Node alike, the same way `first-party-harness` is.
29
+ * `@skrr-ai/data-provider` re-exports it unchanged: there is still exactly one
30
+ * declaration of the vocabulary and one copy of its words.
31
+ *
32
+ * ## Three closed lists
33
+ *
34
+ * - `SESSION_REVOCATION_REASONS` — what a refused CLIENT is told. Wire values;
35
+ * the 401 body's `reason` field. The account-state members keep the spelling
36
+ * `requireJwtAuth` already sent (`banned`, `pending_deletion`, ...), so a
37
+ * client that already switched on them keeps working.
38
+ * - `SESSION_REVOCATION_CAUSES` — what HAPPENED, recorded in Security activity
39
+ * when sessions are revoked. Each cause names its trigger and the reason the
40
+ * signed-out client is told.
41
+ * - `SESSION_REVOCATION_TRIGGERS` — who or what did it.
42
+ *
43
+ * ## Unknown is a member, and it is never hidden
44
+ *
45
+ * Each list carries an explicit `unknown`. A missing, empty or unrecognised
46
+ * value normalizes to it, and its copy says plainly that we could not tell why.
47
+ * It is never folded into the nearest reassuring reading: "Everything reads
48
+ * healthy and the thing is unusable" (root CLAUDE.md) is exactly what an
49
+ * optimistic default here would produce.
50
+ *
51
+ * Copy avoids contractions in code strings so a terminal and a source file read
52
+ * them the same; the web reads the localized keys instead.
53
+ */
54
+ /**
55
+ * The CLI binary the `cli` surface names when the caller passes no `bin`. A
56
+ * literal because this module imports nothing; `@skrr-ai/data-provider`'s
57
+ * `sessionRevocation.spec` asserts it equals `BRAND_NAME`, so the two cannot
58
+ * drift.
59
+ */
60
+ export declare const SESSION_REVOCATION_DEFAULT_BIN: "skrr";
61
+ export declare const SESSION_REVOCATION_REASONS: readonly ["password_change", "sessions_revoked", "logged_out", "session_limit", "sign_in_method_removed", "security_check", "machine_removed", "banned", "disabled", "deleted", "pending_deletion", "unknown"];
62
+ export type SessionRevocationReason = (typeof SESSION_REVOCATION_REASONS)[number];
63
+ export declare const SESSION_REVOCATION_UNKNOWN: "unknown";
64
+ /**
65
+ * The login-page query parameter that carries a revocation reason across the
66
+ * sign-out redirect (`/login?reason=SESSION_REVOKED&revocation=password_change`).
67
+ * `reason` keeps the refusal CODE it always carried, so a login page that
68
+ * predates this still says something.
69
+ */
70
+ export declare const SESSION_REVOCATION_QUERY_PARAM: "revocation";
71
+ export declare function isSessionRevocationReason(value: unknown): value is SessionRevocationReason;
72
+ /**
73
+ * The canonical reason for any value a server or a URL handed us. Anything not
74
+ * in the vocabulary is `unknown` — never a guess.
75
+ */
76
+ export declare function normalizeSessionRevocationReason(value: unknown): SessionRevocationReason;
77
+ /**
78
+ * Refusal codes that end a session WITHOUT revoking it, each of which a surface
79
+ * explains in its own sentence (expired, no longer valid). Every other code a
80
+ * refusal latch can carry is read as a revocation.
81
+ */
82
+ export declare const NON_REVOCATION_REFUSAL_CODES: readonly ["REFRESH_EXPIRED", "TOKEN_EXPIRED", "REFRESH_INVALID", "TOKEN_INVALID"];
83
+ export type NonRevocationRefusalCode = (typeof NON_REVOCATION_REFUSAL_CODES)[number];
84
+ export declare function isNonRevocationRefusalCode(value: unknown): value is NonRevocationRefusalCode;
85
+ /**
86
+ * The revocation reason a refusal names — from a refusal CODE (`SESSION_REVOKED`,
87
+ * `REFRESH_REUSED`, ...) and the revocation reason that travelled beside it —
88
+ * or `null` when the code is one of `NON_REVOCATION_REFUSAL_CODES`.
89
+ *
90
+ * - A revocation reason, when present, always wins.
91
+ * - `SESSION_REVOKED` with no reason beside it IS a revocation whose reason we
92
+ * do not know, so it is `unknown`.
93
+ * - `REFRESH_REUSED` is the refresh-family burn, i.e. a security check.
94
+ * - Any other code, including none at all, is `unknown`: "we could not tell
95
+ * why", never a guess.
96
+ *
97
+ * Shared by the web banner and the desktop main process so the two read one
98
+ * latch the same way.
99
+ */
100
+ export declare function sessionRevocationForRefusal(code: string | undefined | null, revocation?: string | undefined | null): SessionRevocationReason | null;
101
+ export declare const SESSION_REVOCATION_NEXT_STEPS: readonly ["sign_in", "sign_in_and_review", "cancel_deletion", "contact_support", "use_another_account"];
102
+ export type SessionRevocationNextStep = (typeof SESSION_REVOCATION_NEXT_STEPS)[number];
103
+ /** Where the copy is shown: the CLI names its command, an app names a screen. */
104
+ export type SessionRevocationSurface = 'cli' | 'app';
105
+ /** Translation keys the web client renders; English values mirror the copy above. */
106
+ export interface SessionRevocationKeys {
107
+ title: `com_auth_revoked_${SessionRevocationReason}_title`;
108
+ detail: `com_auth_revoked_${SessionRevocationReason}_detail`;
109
+ nextStep: `com_auth_revoked_next_${SessionRevocationNextStep}`;
110
+ }
111
+ export interface SessionRevocationDescription {
112
+ /** The canonical reason; `unknown` for anything unrecognised or missing. */
113
+ reason: SessionRevocationReason;
114
+ /**
115
+ * The value as received when it was NOT a recognised reason (and not empty),
116
+ * so a surface can show the code it could not explain instead of losing it.
117
+ */
118
+ unrecognized: string | null;
119
+ title: string;
120
+ detail: string;
121
+ nextStep: SessionRevocationNextStep;
122
+ /** The next step as a sentence for the requested surface. */
123
+ nextStepText: string;
124
+ /** Whether the person should look at Security activity to explain it. */
125
+ reviewSecurityActivity: boolean;
126
+ keys: SessionRevocationKeys;
127
+ }
128
+ /**
129
+ * THE copy for a revoked session. Never throws, whatever it is given: the server
130
+ * can ship a reason before a client knows it, and that case must still say
131
+ * something true ("we could not tell why"), not nothing.
132
+ */
133
+ export declare function describeSessionRevocation(value: unknown, { surface, bin, }?: {
134
+ surface?: SessionRevocationSurface;
135
+ bin?: string;
136
+ }): SessionRevocationDescription;
137
+ /** One line for a terminal or a notification: title, detail and next step. */
138
+ export declare function formatSessionRevocation(value: unknown, options?: {
139
+ surface?: SessionRevocationSurface;
140
+ bin?: string;
141
+ }): string;
142
+ export declare const SESSION_REVOCATION_TRIGGERS: readonly ["account_owner", "administrator", "security_system", "external_provider", "account_lifecycle", "unknown"];
143
+ export type SessionRevocationTrigger = (typeof SESSION_REVOCATION_TRIGGERS)[number];
144
+ export declare const SESSION_REVOCATION_CAUSES: readonly ["password_change", "password_reset", "sign_out_everywhere", "sign_out_other_sessions", "session_signed_out", "two_factor_change", "email_change", "email_change_reverted", "account_recovery", "reported_not_me", "sign_in_method_removed", "machine_removed", "oauth_app_revoked", "session_limit", "suspicious_reuse", "administrator", "account_suspended", "external_provider", "account_deletion_scheduled", "account_superseded", "unverified_account_cleanup", "unknown"];
145
+ export type SessionRevocationCause = (typeof SESSION_REVOCATION_CAUSES)[number];
146
+ interface CauseFacts {
147
+ trigger: SessionRevocationTrigger;
148
+ /** What a client signed out by this cause is told. */
149
+ reason: SessionRevocationReason;
150
+ /** English sentence for the Security activity row. */
151
+ copy: string;
152
+ }
153
+ export declare const SESSION_REVOCATION_CAUSE_FACTS: Readonly<Record<SessionRevocationCause, CauseFacts>>;
154
+ export declare const SESSION_REVOCATION_TRIGGER_COPY: Readonly<Record<SessionRevocationTrigger, string>>;
155
+ export declare function normalizeSessionRevocationCause(value: unknown): SessionRevocationCause;
156
+ export declare function normalizeSessionRevocationTrigger(value: unknown): SessionRevocationTrigger;
157
+ export interface SessionRevocationActivityDescription {
158
+ cause: SessionRevocationCause;
159
+ trigger: SessionRevocationTrigger;
160
+ reason: SessionRevocationReason;
161
+ causeText: string;
162
+ triggerText: string;
163
+ keys: {
164
+ cause: `com_nav_security_activity_revocation_cause_${SessionRevocationCause}`;
165
+ trigger: `com_nav_security_activity_revocation_trigger_${SessionRevocationTrigger}`;
166
+ };
167
+ }
168
+ /**
169
+ * How Security activity explains one recorded revocation. A stored trigger wins
170
+ * over the cause's usual one (an administrator can change a password too); an
171
+ * unreadable one is `unknown`, never the cause's default.
172
+ */
173
+ export declare function describeSessionRevocationActivity(record: {
174
+ cause?: unknown;
175
+ trigger?: unknown;
176
+ }): SessionRevocationActivityDescription;
177
+ export {};