@skrr-ai/cli 0.1.110 → 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 (391) hide show
  1. package/bin/run.js +15 -1
  2. package/dist/base-command.d.ts +31 -3
  3. package/dist/base-command.js +136 -22
  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/list.js +2 -1
  26. package/dist/commands/api-keys/list.js +2 -1
  27. package/dist/commands/apps/channel.d.ts +20 -0
  28. package/dist/commands/apps/channel.js +64 -0
  29. package/dist/commands/apps/check-draft.d.ts +12 -0
  30. package/dist/commands/apps/check-draft.js +41 -0
  31. package/dist/commands/apps/check.d.ts +42 -0
  32. package/dist/commands/apps/check.js +91 -0
  33. package/dist/commands/apps/create.d.ts +15 -0
  34. package/dist/commands/apps/create.js +59 -0
  35. package/dist/commands/apps/data/put.d.ts +18 -0
  36. package/dist/commands/apps/data/put.js +72 -0
  37. package/dist/commands/apps/data/query.d.ts +20 -0
  38. package/dist/commands/apps/data/query.js +88 -0
  39. package/dist/commands/apps/disclosure.d.ts +16 -0
  40. package/dist/commands/apps/disclosure.js +71 -0
  41. package/dist/commands/apps/file/cat.d.ts +15 -0
  42. package/dist/commands/apps/file/cat.js +50 -0
  43. package/dist/commands/apps/file/ls.d.ts +13 -0
  44. package/dist/commands/apps/file/ls.js +47 -0
  45. package/dist/commands/apps/file/mv.d.ts +15 -0
  46. package/dist/commands/apps/file/mv.js +49 -0
  47. package/dist/commands/apps/file/rm.d.ts +15 -0
  48. package/dist/commands/apps/file/rm.js +53 -0
  49. package/dist/commands/apps/file/write.d.ts +17 -0
  50. package/dist/commands/apps/file/write.js +81 -0
  51. package/dist/commands/apps/install.d.ts +19 -0
  52. package/dist/commands/apps/install.js +136 -0
  53. package/dist/commands/apps/installations/list.d.ts +11 -0
  54. package/dist/commands/apps/installations/list.js +49 -0
  55. package/dist/commands/apps/installations/show.d.ts +12 -0
  56. package/dist/commands/apps/installations/show.js +61 -0
  57. package/dist/commands/apps/layout/set.d.ts +11 -0
  58. package/dist/commands/apps/layout/set.js +125 -0
  59. package/dist/commands/apps/layout/show.d.ts +9 -0
  60. package/dist/commands/apps/layout/show.js +33 -0
  61. package/dist/commands/apps/list.d.ts +10 -0
  62. package/dist/commands/apps/list.js +45 -0
  63. package/dist/commands/apps/logs.d.ts +13 -0
  64. package/dist/commands/apps/logs.js +55 -0
  65. package/dist/commands/apps/preview.d.ts +12 -0
  66. package/dist/commands/apps/preview.js +39 -0
  67. package/dist/commands/apps/publish/propose.d.ts +14 -0
  68. package/dist/commands/apps/publish/propose.js +45 -0
  69. package/dist/commands/apps/pull.d.ts +14 -0
  70. package/dist/commands/apps/pull.js +56 -0
  71. package/dist/commands/apps/push.d.ts +15 -0
  72. package/dist/commands/apps/push.js +75 -0
  73. package/dist/commands/apps/reconsent.d.ts +13 -0
  74. package/dist/commands/apps/reconsent.js +67 -0
  75. package/dist/commands/apps/report.d.ts +20 -0
  76. package/dist/commands/apps/report.js +63 -0
  77. package/dist/commands/apps/resume.d.ts +12 -0
  78. package/dist/commands/apps/resume.js +36 -0
  79. package/dist/commands/apps/settings/set.d.ts +13 -0
  80. package/dist/commands/apps/settings/set.js +54 -0
  81. package/dist/commands/apps/settings/show.d.ts +11 -0
  82. package/dist/commands/apps/settings/show.js +31 -0
  83. package/dist/commands/apps/show.d.ts +12 -0
  84. package/dist/commands/apps/show.js +49 -0
  85. package/dist/commands/apps/suspend.d.ts +12 -0
  86. package/dist/commands/apps/suspend.js +35 -0
  87. package/dist/commands/apps/uninstall.d.ts +13 -0
  88. package/dist/commands/apps/uninstall.js +43 -0
  89. package/dist/commands/apps/upgrade.d.ts +14 -0
  90. package/dist/commands/apps/upgrade.js +49 -0
  91. package/dist/commands/apps/version/create.d.ts +14 -0
  92. package/dist/commands/apps/version/create.js +53 -0
  93. package/dist/commands/apps/version/show.d.ts +12 -0
  94. package/dist/commands/apps/version/show.js +39 -0
  95. package/dist/commands/apps/versions.d.ts +12 -0
  96. package/dist/commands/apps/versions.js +40 -0
  97. package/dist/commands/apps/webhooks/list.d.ts +12 -0
  98. package/dist/commands/apps/webhooks/list.js +47 -0
  99. package/dist/commands/characters/list.js +2 -1
  100. package/dist/commands/chats/files/list.js +2 -1
  101. package/dist/commands/chats/folders/list.js +2 -1
  102. package/dist/commands/chats/list.js +2 -1
  103. package/dist/commands/chats/spaces/list.js +2 -1
  104. package/dist/commands/chats/widgets/list.js +2 -1
  105. package/dist/commands/code/jobs/list.js +4 -1
  106. package/dist/commands/commerce/incidents/list.js +2 -1
  107. package/dist/commands/commitments/accounting.js +3 -0
  108. package/dist/commands/commitments/action-proposals.d.ts +8 -0
  109. package/dist/commands/commitments/action-proposals.js +17 -2
  110. package/dist/commands/commitments/cost.d.ts +11 -0
  111. package/dist/commands/commitments/cost.js +25 -0
  112. package/dist/commands/commitments/create.js +6 -1
  113. package/dist/commands/commitments/endpoints/list.js +2 -1
  114. package/dist/commands/commitments/links/list.js +2 -1
  115. package/dist/commands/commitments/list.js +2 -1
  116. package/dist/commands/commitments/liveness.d.ts +30 -0
  117. package/dist/commands/commitments/liveness.js +22 -5
  118. package/dist/commands/commitments/pack/list.js +2 -1
  119. package/dist/commands/commitments/preflight.js +6 -2
  120. package/dist/commands/commitments/update.js +10 -1
  121. package/dist/commands/compass/list.js +2 -1
  122. package/dist/commands/context.js +7 -1
  123. package/dist/commands/convos/list.js +3 -2
  124. package/dist/commands/dm/list.js +2 -1
  125. package/dist/commands/dm/work.d.ts +19 -0
  126. package/dist/commands/dm/work.js +54 -0
  127. package/dist/commands/feeds/list.js +2 -1
  128. package/dist/commands/followups/list.js +2 -1
  129. package/dist/commands/followups/plans/cancel.d.ts +13 -0
  130. package/dist/commands/followups/plans/cancel.js +26 -0
  131. package/dist/commands/followups/plans/create.d.ts +11 -0
  132. package/dist/commands/followups/plans/create.js +35 -0
  133. package/dist/commands/followups/plans/list.d.ts +13 -0
  134. package/dist/commands/followups/plans/list.js +50 -0
  135. package/dist/commands/followups/plans/observability.d.ts +11 -0
  136. package/dist/commands/followups/plans/observability.js +46 -0
  137. package/dist/commands/followups/plans/revise.d.ts +13 -0
  138. package/dist/commands/followups/plans/revise.js +35 -0
  139. package/dist/commands/followups/plans/show.d.ts +11 -0
  140. package/dist/commands/followups/plans/show.js +32 -0
  141. package/dist/commands/goals/key-results/list.js +2 -1
  142. package/dist/commands/goals/labels/list.js +3 -2
  143. package/dist/commands/goals/list.js +3 -2
  144. package/dist/commands/grants/list.js +2 -1
  145. package/dist/commands/harnesses/grants/list.js +2 -1
  146. package/dist/commands/harnesses/leases/list.js +2 -1
  147. package/dist/commands/harnesses/list.js +10 -1
  148. package/dist/commands/ingress/list.js +2 -1
  149. package/dist/commands/initiatives/list.js +2 -1
  150. package/dist/commands/instruction-blocks/list.js +2 -1
  151. package/dist/commands/instructions/list.js +2 -1
  152. package/dist/commands/integrations/connections/list.js +2 -1
  153. package/dist/commands/integrations/tools/list.js +2 -1
  154. package/dist/commands/labels/list.js +3 -2
  155. package/dist/commands/learning/adapters.d.ts +16 -0
  156. package/dist/commands/learning/adapters.js +44 -0
  157. package/dist/commands/machines/dedicated/list.js +2 -1
  158. package/dist/commands/machines/hosted/list.js +2 -1
  159. package/dist/commands/machines/list.js +2 -1
  160. package/dist/commands/machines/show.js +5 -2
  161. package/dist/commands/measures/list.js +2 -1
  162. package/dist/commands/memory/list.js +2 -1
  163. package/dist/commands/memory/proposals/list.js +2 -1
  164. package/dist/commands/memory/stores/list.js +2 -1
  165. package/dist/commands/memory/topics/list.js +2 -1
  166. package/dist/commands/memory/versions/list.js +2 -1
  167. package/dist/commands/messages/list.js +2 -1
  168. package/dist/commands/northstars/intents/list.js +2 -1
  169. package/dist/commands/northstars/list.js +2 -1
  170. package/dist/commands/northstars/recommendations/list.js +2 -1
  171. package/dist/commands/outbox/list.js +2 -1
  172. package/dist/commands/profiles/list.js +2 -1
  173. package/dist/commands/projects/docs/list.js +8 -1
  174. package/dist/commands/projects/updates/list.js +2 -1
  175. package/dist/commands/proposals/list.js +2 -1
  176. package/dist/commands/requests/comments/list.js +2 -1
  177. package/dist/commands/requests/list.js +2 -1
  178. package/dist/commands/shares/list.js +2 -1
  179. package/dist/commands/shortcuts/list.js +2 -1
  180. package/dist/commands/signals/monitors/list.js +2 -1
  181. package/dist/commands/signals/schemas/list.js +2 -1
  182. package/dist/commands/signals/sources/list.js +2 -1
  183. package/dist/commands/space-directory-views/list.js +2 -1
  184. package/dist/commands/spaces/actions/list.js +4 -3
  185. package/dist/commands/spaces/briefs/list.js +2 -1
  186. package/dist/commands/spaces/cycles/list.js +2 -1
  187. package/dist/commands/spaces/files/folders/list.js +2 -1
  188. package/dist/commands/spaces/files/list.js +3 -2
  189. package/dist/commands/spaces/heartbeats/list.js +3 -2
  190. package/dist/commands/spaces/labels/list.js +3 -2
  191. package/dist/commands/spaces/list.d.ts +3 -18
  192. package/dist/commands/spaces/list.js +28 -35
  193. package/dist/commands/spaces/live/cards/list.js +2 -1
  194. package/dist/commands/spaces/members/list.d.ts +1 -0
  195. package/dist/commands/spaces/members/list.js +4 -1
  196. package/dist/commands/spaces/show.js +2 -2
  197. package/dist/commands/spaces/skills/list.js +6 -2
  198. package/dist/commands/spaces/states/list.js +2 -1
  199. package/dist/commands/spaces/views/list.js +2 -1
  200. package/dist/commands/spaces/widgets/list.js +3 -2
  201. package/dist/commands/spaces/workflow-templates/list.js +2 -1
  202. package/dist/commands/spaces/workflows/fixtures/list.js +2 -1
  203. package/dist/commands/spaces/workflows/list.js +3 -2
  204. package/dist/commands/spaces/workflows/proposals/list.js +2 -1
  205. package/dist/commands/spaces/workflows/triggers/list.js +2 -1
  206. package/dist/commands/store/acquisitions/list.js +2 -1
  207. package/dist/commands/store/admissions/list.js +17 -1
  208. package/dist/commands/store/advisories/list.js +2 -1
  209. package/dist/commands/store/follows/list.js +2 -1
  210. package/dist/commands/store/publishers/domains/list.js +2 -1
  211. package/dist/commands/store/reports/list.js +2 -1
  212. package/dist/commands/subscriptions/list.js +2 -1
  213. package/dist/commands/tasks/actionability.js +7 -30
  214. package/dist/commands/tasks/activity.js +3 -7
  215. package/dist/commands/tasks/approvals/list.js +2 -1
  216. package/dist/commands/tasks/assign.d.ts +1 -0
  217. package/dist/commands/tasks/assign.js +43 -7
  218. package/dist/commands/tasks/attachments/list.js +2 -1
  219. package/dist/commands/tasks/chat/send.js +34 -0
  220. package/dist/commands/tasks/comments/add.js +6 -1
  221. package/dist/commands/tasks/comments/list.js +2 -1
  222. package/dist/commands/tasks/complete.js +26 -2
  223. package/dist/commands/tasks/continue.d.ts +18 -0
  224. package/dist/commands/tasks/continue.js +54 -0
  225. package/dist/commands/tasks/create-tree.d.ts +5 -0
  226. package/dist/commands/tasks/create-tree.js +399 -219
  227. package/dist/commands/tasks/create.d.ts +1 -0
  228. package/dist/commands/tasks/create.js +63 -11
  229. package/dist/commands/tasks/deliverable/add.js +10 -3
  230. package/dist/commands/tasks/deliverable/list.js +2 -1
  231. package/dist/commands/tasks/events/list.js +2 -1
  232. package/dist/commands/tasks/execution-state.d.ts +12 -0
  233. package/dist/commands/tasks/execution-state.js +28 -0
  234. package/dist/commands/tasks/expectations/assess.js +40 -5
  235. package/dist/commands/tasks/guide.d.ts +10 -0
  236. package/dist/commands/tasks/guide.js +20 -0
  237. package/dist/commands/tasks/labels/list.js +2 -1
  238. package/dist/commands/tasks/list.d.ts +19 -0
  239. package/dist/commands/tasks/list.js +97 -4
  240. package/dist/commands/tasks/move.js +10 -2
  241. package/dist/commands/tasks/preflight.d.ts +14 -0
  242. package/dist/commands/tasks/preflight.js +77 -0
  243. package/dist/commands/tasks/resource/list.js +2 -1
  244. package/dist/commands/tasks/result/submit.js +10 -1
  245. package/dist/commands/tasks/review.js +6 -1
  246. package/dist/commands/tasks/revisions.d.ts +2 -0
  247. package/dist/commands/tasks/revisions.js +8 -1
  248. package/dist/commands/tasks/show.js +17 -11
  249. package/dist/commands/tasks/start.d.ts +1 -0
  250. package/dist/commands/tasks/start.js +35 -0
  251. package/dist/commands/tasks/templates/list.js +2 -1
  252. package/dist/commands/tasks/timeline.d.ts +5 -0
  253. package/dist/commands/tasks/timeline.js +9 -1
  254. package/dist/commands/tasks/update.d.ts +1 -0
  255. package/dist/commands/tasks/update.js +25 -2
  256. package/dist/commands/tasks/updates/add.js +6 -1
  257. package/dist/commands/tasks/updates/list.js +2 -1
  258. package/dist/commands/tasks/upsert.d.ts +1 -0
  259. package/dist/commands/tasks/upsert.js +8 -1
  260. package/dist/commands/token/list.js +2 -1
  261. package/dist/commands/tokens/list.js +2 -1
  262. package/dist/commands/tones/list.js +4 -2
  263. package/dist/commands/triggers/list.js +2 -1
  264. package/dist/commands/views/list.js +2 -1
  265. package/dist/commands/webhooks/list.js +2 -1
  266. package/dist/commands/whoami.js +1 -1
  267. package/dist/commands/widgets/list.js +2 -1
  268. package/dist/commands/widgets/save-as-app.d.ts +13 -0
  269. package/dist/commands/widgets/save-as-app.js +65 -0
  270. package/dist/commands/work-views/list.js +2 -1
  271. package/dist/commands/worklog/list.js +2 -1
  272. package/dist/commands/workspaces/list.js +3 -2
  273. package/dist/commands/workspaces/members.d.ts +1 -0
  274. package/dist/commands/workspaces/members.js +5 -2
  275. package/dist/generated/managed-instruction-guides.json +2 -2
  276. package/dist/help.js +7 -0
  277. package/dist/lib/agent-proactive-baseline.d.ts +9 -0
  278. package/dist/lib/agent-proactive-baseline.js +44 -0
  279. package/dist/lib/agentic-stream.d.ts +4 -1
  280. package/dist/lib/agentic-stream.js +29 -4
  281. package/dist/lib/appData.d.ts +75 -0
  282. package/dist/lib/appData.js +274 -0
  283. package/dist/lib/appInstallations.d.ts +117 -0
  284. package/dist/lib/appInstallations.js +960 -0
  285. package/dist/lib/appSettings.d.ts +3 -0
  286. package/dist/lib/appSettings.js +71 -0
  287. package/dist/lib/appWebhooks.d.ts +7 -0
  288. package/dist/lib/appWebhooks.js +59 -0
  289. package/dist/lib/apps-command.d.ts +44 -0
  290. package/dist/lib/apps-command.js +164 -0
  291. package/dist/lib/apps.d.ts +45 -0
  292. package/dist/lib/apps.js +148 -0
  293. package/dist/lib/appsCheck.d.ts +12 -0
  294. package/dist/lib/appsCheck.js +173 -0
  295. package/dist/lib/appsFs.d.ts +58 -0
  296. package/dist/lib/appsFs.js +384 -0
  297. package/dist/lib/auth-failure.d.ts +20 -0
  298. package/dist/lib/auth-failure.js +40 -3
  299. package/dist/lib/cli-installers.d.ts +9 -2
  300. package/dist/lib/command-miss.js +107 -0
  301. package/dist/lib/commitment-loop-status.js +25 -3
  302. package/dist/lib/commitments.d.ts +44 -3
  303. package/dist/lib/commitments.js +107 -9
  304. package/dist/lib/compasses.d.ts +4 -0
  305. package/dist/lib/compasses.js +11 -0
  306. package/dist/lib/daemon-setup.js +7 -7
  307. package/dist/lib/daemonHandoff.js +3 -2
  308. package/dist/lib/dedicated-ssh.d.ts +2 -0
  309. package/dist/lib/dedicated-ssh.js +98 -28
  310. package/dist/lib/json-output.d.ts +33 -0
  311. package/dist/lib/json-output.js +37 -0
  312. package/dist/lib/list-output.d.ts +9 -4
  313. package/dist/lib/list-output.js +36 -9
  314. package/dist/lib/lookbackPlans.d.ts +13 -0
  315. package/dist/lib/lookbackPlans.js +68 -0
  316. package/dist/lib/machines.d.ts +27 -6
  317. package/dist/lib/machines.js +25 -14
  318. package/dist/lib/member-output.d.ts +20 -0
  319. package/dist/lib/member-output.js +57 -0
  320. package/dist/lib/preflight-copy.d.ts +7 -0
  321. package/dist/lib/preflight-copy.js +31 -0
  322. package/dist/lib/roles.d.ts +2 -2
  323. package/dist/lib/task-admission.d.ts +9 -0
  324. package/dist/lib/task-admission.js +35 -0
  325. package/dist/lib/task-batch.d.ts +4 -0
  326. package/dist/lib/task-batch.js +2 -0
  327. package/dist/lib/task-operations.d.ts +25 -0
  328. package/dist/lib/task-operations.js +123 -0
  329. package/dist/lib/task-preflight.d.ts +35 -0
  330. package/dist/lib/task-preflight.js +121 -0
  331. package/dist/lib/task-resource-references.d.ts +23 -0
  332. package/dist/lib/task-resource-references.js +119 -0
  333. package/dist/lib/task-spec-verification.d.ts +42 -0
  334. package/dist/lib/task-spec-verification.js +101 -0
  335. package/dist/lib/task-work.d.ts +11 -0
  336. package/dist/lib/task-work.js +41 -0
  337. package/dist/lib/task-write-attribution.d.ts +26 -0
  338. package/dist/lib/task-write-attribution.js +47 -0
  339. package/dist/lib/tasks.d.ts +13 -0
  340. package/dist/lib/tasks.js +61 -8
  341. package/dist/lib/triggers.d.ts +7 -0
  342. package/dist/lib/triggers.js +54 -4
  343. package/dist/lib/usage-discovery.d.ts +4 -0
  344. package/dist/lib/usage-discovery.js +14 -4
  345. package/dist/lib/widgetApps.d.ts +10 -0
  346. package/dist/lib/widgetApps.js +47 -0
  347. package/dist/lib/widgetStaticScan.js +25 -1
  348. package/dist/lib/workspaces.d.ts +11 -4
  349. package/dist/lib/workspaces.js +7 -3
  350. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/computerWire.d.ts +14 -1
  351. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/computerWire.js +47 -2
  352. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonToolApproval.d.ts +49 -1
  353. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonToolApproval.js +26 -0
  354. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonWire.d.ts +118 -0
  355. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonWire.js +614 -0
  356. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/refresh.d.ts +2 -0
  357. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/refresh.js +15 -2
  358. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/refreshClassification.d.ts +5 -0
  359. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/refreshClassification.js +3 -1
  360. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/sessionRevocation.d.ts +177 -0
  361. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/sessionRevocation.js +484 -0
  362. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/telemetryRedaction.d.ts +11 -0
  363. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/telemetryRedaction.js +46 -7
  364. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/toolApprovalSignature.d.ts +232 -0
  365. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/toolApprovalSignature.js +372 -0
  366. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/types.d.ts +17 -1
  367. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/types.js +12 -1
  368. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/computerWire.d.ts +14 -1
  369. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/computerWire.js +45 -2
  370. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonToolApproval.d.ts +49 -1
  371. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonToolApproval.js +24 -0
  372. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonWire.d.ts +118 -0
  373. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonWire.js +608 -0
  374. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/refresh.d.ts +2 -0
  375. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/refresh.js +15 -2
  376. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/refreshClassification.d.ts +5 -0
  377. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/refreshClassification.js +3 -1
  378. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/sessionRevocation.d.ts +177 -0
  379. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/sessionRevocation.js +472 -0
  380. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/telemetryRedaction.d.ts +11 -0
  381. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/telemetryRedaction.js +44 -6
  382. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/toolApprovalSignature.d.ts +232 -0
  383. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/toolApprovalSignature.js +360 -0
  384. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/types.d.ts +17 -1
  385. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/types.js +12 -1
  386. package/dist/node_modules/@skrr-ai/auth-core/package.json +30 -0
  387. package/dist/node_modules/@skrr-ai/data-provider/index.js +25239 -18730
  388. package/docs/v1/operations.md +52 -0
  389. package/docs/v1/space-search.md +19 -0
  390. package/oclif.manifest.json +4719 -479
  391. package/package.json +23 -2
@@ -0,0 +1,372 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TOOL_APPROVAL_SIGNED_CAPABILITY = void 0;
4
+ exports.approvalPublicKeyFromKeyObject = approvalPublicKeyFromKeyObject;
5
+ exports.canonicalApprovalKeysetText = canonicalApprovalKeysetText;
6
+ exports.buildApprovalKeysetDocument = buildApprovalKeysetDocument;
7
+ exports.endorseApprovalKeysetText = endorseApprovalKeysetText;
8
+ exports.parseApprovalKeysetText = parseApprovalKeysetText;
9
+ exports.verifyApprovalKeysetDocument = verifyApprovalKeysetDocument;
10
+ exports.signToolApproval = signToolApproval;
11
+ exports.verifySignedToolApproval = verifySignedToolApproval;
12
+ exports.verifyToolApprovalAttestation = verifyToolApprovalAttestation;
13
+ const node_crypto_1 = require("node:crypto");
14
+ const daemonToolApproval_js_1 = require("./daemonToolApproval.js");
15
+ /**
16
+ * Platform-signed tool approvals (OSK-16614) — attestation v2.
17
+ *
18
+ * v1 (`daemonToolApproval.ts`) is a plain JSON object whose authority is the
19
+ * channel it arrived on. That stops the MODEL approving itself, and nothing
20
+ * else: anything that can put a `daemon:tool:request` on the daemon's channel
21
+ * — a websocket or SSE layer bug, a relay, the Redis pub/sub bridge the
22
+ * request crosses, an injected event, a peer holding a stolen daemon session
23
+ * — can approve any `manual`-category call by writing the field.
24
+ *
25
+ * v2 is `{v: 2, payload, kid, sig}`: an Ed25519 signature by a platform
26
+ * approval key over the canonical JSON `payload`, which carries the v1 claims
27
+ * plus the `daemonId` and `sessionId` it was minted for. The daemon verifies
28
+ * it against a keyset it PINNED outside the approval decision (fetched over
29
+ * authenticated HTTPS, TOFU, per server origin) and that only changes through
30
+ * a keyset signed by a key it already trusts.
31
+ *
32
+ * What it stops: every writer to the channel that cannot reach the signing
33
+ * key. What it does NOT stop: a fully compromised API host with access to the
34
+ * key, or server code that mints without a person having answered — the key
35
+ * says "the platform says a person approved this call", not that one did.
36
+ * Only an approval signed by the approving person's own device closes that,
37
+ * and that is the long-term target this format is shaped for (a second key
38
+ * class in the same keyset), not something it claims today.
39
+ *
40
+ * Pure: node:crypto only, no schema library (auth-core is schema-free), no
41
+ * I/O. Where the keyset is stored and how it is fetched is the daemon's
42
+ * (`daemon/src/permissions/approval-keyset.ts`); where the private key lives
43
+ * is the server's (`api/server/utils/toolApprovalSigning.js`).
44
+ */
45
+ /**
46
+ * Announced by a daemon that holds a pinned approval keyset and therefore
47
+ * verifies v2. The daemon announces it ONLY while pinned — positive
48
+ * withholding on its side too — and the server mints v2 only for a daemon
49
+ * that announced it, v1 otherwise.
50
+ */
51
+ exports.TOOL_APPROVAL_SIGNED_CAPABILITY = 'tool_approval_signed_v1';
52
+ /**
53
+ * Domain separation: the signed bytes are prefixed, so a signature made for
54
+ * an attestation can never verify as a keyset or vice versa, whatever JSON
55
+ * either happens to contain.
56
+ */
57
+ const ATTESTATION_SIGNING_DOMAIN = 'skrr-tool-approval-v2\n';
58
+ const KEYSET_SIGNING_DOMAIN = 'skrr-tool-approval-keyset-v1\n';
59
+ /** A key id: short, printable, and safe to put in a log line. */
60
+ const KID_PATTERN = /^[A-Za-z0-9._-]{1,64}$/;
61
+ /** Bounds on untrusted wire input, so a hostile document cannot cost much. */
62
+ const MAX_PAYLOAD_BYTES = 4096;
63
+ const MAX_KEYSET_BYTES = 16 * 1024;
64
+ const MAX_KEYSET_KEYS = 16;
65
+ const MAX_KEYSET_SIGNATURES = 16;
66
+ /** Derive the wire public key from a private (or public) Ed25519 KeyObject. */
67
+ function approvalPublicKeyFromKeyObject(kid, key) {
68
+ const publicKey = key.type === 'private' ? (0, node_crypto_1.createPublicKey)(key) : key;
69
+ const der = publicKey.export({ format: 'der', type: 'spki' });
70
+ return { kid, publicKeySpkiB64: Buffer.from(der).toString('base64') };
71
+ }
72
+ function ed25519PublicKey(publicKeySpkiB64) {
73
+ try {
74
+ const key = (0, node_crypto_1.createPublicKey)({
75
+ key: Buffer.from(publicKeySpkiB64, 'base64'),
76
+ format: 'der',
77
+ type: 'spki',
78
+ });
79
+ return key.asymmetricKeyType === 'ed25519' ? key : null;
80
+ }
81
+ catch {
82
+ return null;
83
+ }
84
+ }
85
+ function verifySignature(domain, message, sigB64, key) {
86
+ try {
87
+ const sig = Buffer.from(sigB64, 'base64');
88
+ // An Ed25519 signature is exactly 64 bytes; anything else is not one, and
89
+ // base64 decoding is lenient enough that the check is worth making.
90
+ if (sig.length !== 64)
91
+ return false;
92
+ return (0, node_crypto_1.verify)(null, Buffer.from(domain + message, 'utf8'), key, sig);
93
+ }
94
+ catch {
95
+ return false;
96
+ }
97
+ }
98
+ function signMessage(domain, message, privateKey) {
99
+ return (0, node_crypto_1.sign)(null, Buffer.from(domain + message, 'utf8'), privateKey).toString('base64');
100
+ }
101
+ /** Code-unit order: the same on every runtime, unlike `localeCompare`. */
102
+ function compareKid(a, b) {
103
+ if (a === b)
104
+ return 0;
105
+ return a < b ? -1 : 1;
106
+ }
107
+ /** Canonical keyset text: keys sorted by kid, canonical JSON. */
108
+ function canonicalApprovalKeysetText(keyset) {
109
+ const keys = [...keyset.keys]
110
+ .map((k) => ({ kid: k.kid, publicKeySpkiB64: k.publicKeySpkiB64 }))
111
+ .sort((a, b) => compareKid(a.kid, b.kid));
112
+ return (0, daemonToolApproval_js_1.canonicalApprovalJson)({ v: 1, seq: keyset.seq, keys });
113
+ }
114
+ /**
115
+ * Server side: the document for a keyring. Every signer signs, and every
116
+ * signer's public key is listed. `endorsements` are signatures made OFFLINE
117
+ * over the same canonical text by a root key the daemon may have embedded
118
+ * (see `verifyApprovalKeysetDocument`'s `anchors`); the text is deterministic
119
+ * — no timestamp — precisely so an endorsement can be made ahead of time.
120
+ */
121
+ function buildApprovalKeysetDocument(args) {
122
+ const keyset = canonicalApprovalKeysetText({
123
+ v: 1,
124
+ seq: args.seq,
125
+ keys: args.signers.map((s) => approvalPublicKeyFromKeyObject(s.kid, s.privateKey)),
126
+ });
127
+ return {
128
+ keyset,
129
+ signatures: [
130
+ ...args.signers.map((s) => ({
131
+ kid: s.kid,
132
+ sig: signMessage(KEYSET_SIGNING_DOMAIN, keyset, s.privateKey),
133
+ })),
134
+ ...(args.endorsements ?? []),
135
+ ],
136
+ };
137
+ }
138
+ /** Sign keyset text with one key — for an offline root endorsement. */
139
+ function endorseApprovalKeysetText(keysetText, signer) {
140
+ return {
141
+ kid: signer.kid,
142
+ sig: signMessage(KEYSET_SIGNING_DOMAIN, keysetText, signer.privateKey),
143
+ };
144
+ }
145
+ /** Parse and validate keyset text. Null when it is not a well-formed keyset. */
146
+ function parseApprovalKeysetText(text) {
147
+ if (typeof text !== 'string' || text.length === 0 || text.length > MAX_KEYSET_BYTES) {
148
+ return null;
149
+ }
150
+ let parsed;
151
+ try {
152
+ parsed = JSON.parse(text);
153
+ }
154
+ catch {
155
+ return null;
156
+ }
157
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
158
+ return null;
159
+ const p = parsed;
160
+ if (p.v !== 1 || !Number.isSafeInteger(p.seq) || p.seq < 1)
161
+ return null;
162
+ if (!Array.isArray(p.keys) || p.keys.length === 0 || p.keys.length > MAX_KEYSET_KEYS) {
163
+ return null;
164
+ }
165
+ const keys = [];
166
+ const seen = new Set();
167
+ for (const entry of p.keys) {
168
+ if (!entry || typeof entry !== 'object')
169
+ return null;
170
+ const { kid, publicKeySpkiB64 } = entry;
171
+ if (typeof kid !== 'string' || !KID_PATTERN.test(kid) || seen.has(kid))
172
+ return null;
173
+ if (typeof publicKeySpkiB64 !== 'string' || !ed25519PublicKey(publicKeySpkiB64))
174
+ return null;
175
+ seen.add(kid);
176
+ keys.push({ kid, publicKeySpkiB64 });
177
+ }
178
+ const keyset = { v: 1, seq: p.seq, keys };
179
+ // One byte representation per keyset: a pinned keyset is compared by its
180
+ // text, so a non-canonical spelling of the same keys must not read as a
181
+ // different set (or the same seq would look like a conflict).
182
+ return canonicalApprovalKeysetText(keyset) === text ? keyset : null;
183
+ }
184
+ /**
185
+ * Daemon side: decide whether to adopt a keyset document.
186
+ *
187
+ * - Pinned: at least one signature must verify under a key in the PINNED set
188
+ * (or an anchor). The new set may drop or add keys — that is rotation — but
189
+ * its `seq` may not fall, and the same `seq` must be the same set.
190
+ * - Not pinned, anchors given (an embedded root for this server origin): at
191
+ * least one signature must verify under an anchor. No TOFU.
192
+ * - Not pinned, no anchors: trust on first use. The document must still be
193
+ * signed by a key it lists (proof that whoever served it holds one), but
194
+ * its authority is the authenticated HTTPS fetch it came from.
195
+ *
196
+ * A signature is checked against the TRUSTED copy of a key, looked up by kid —
197
+ * never against the key the new document lists under that kid, or a document
198
+ * could swap a key's bytes while keeping its name.
199
+ */
200
+ function verifyApprovalKeysetDocument(doc, trust) {
201
+ if (!doc || typeof doc !== 'object' || Array.isArray(doc)) {
202
+ return { ok: false, reason: 'malformed' };
203
+ }
204
+ const d = doc;
205
+ const keyset = parseApprovalKeysetText(d.keyset);
206
+ if (!keyset)
207
+ return { ok: false, reason: 'malformed' };
208
+ const text = d.keyset;
209
+ if (!Array.isArray(d.signatures) ||
210
+ d.signatures.length === 0 ||
211
+ d.signatures.length > MAX_KEYSET_SIGNATURES) {
212
+ return { ok: false, reason: 'malformed' };
213
+ }
214
+ // A list, not a map: an anchor and a pinned key that share a kid are both
215
+ // tried, so neither can shadow the other.
216
+ let trusted = [
217
+ ...(trust.anchors ?? []),
218
+ ...(trust.pinned?.keys ?? []),
219
+ ];
220
+ if (trusted.length === 0)
221
+ trusted = keyset.keys;
222
+ const signed = d.signatures.some((entry) => {
223
+ if (!entry || typeof entry !== 'object')
224
+ return false;
225
+ const { kid, sig } = entry;
226
+ if (typeof kid !== 'string' || typeof sig !== 'string')
227
+ return false;
228
+ return trusted.some((k) => {
229
+ if (k.kid !== kid)
230
+ return false;
231
+ const key = ed25519PublicKey(k.publicKeySpkiB64);
232
+ return key ? verifySignature(KEYSET_SIGNING_DOMAIN, text, sig, key) : false;
233
+ });
234
+ });
235
+ if (!signed)
236
+ return { ok: false, reason: 'untrusted' };
237
+ if (!trust.pinned)
238
+ return { ok: true, keyset, text, change: 'first_pin' };
239
+ if (keyset.seq < trust.pinned.seq)
240
+ return { ok: false, reason: 'rollback' };
241
+ if (keyset.seq === trust.pinned.seq) {
242
+ return canonicalApprovalKeysetText(trust.pinned) === text
243
+ ? { ok: true, keyset, text, change: 'unchanged' }
244
+ : { ok: false, reason: 'conflict' };
245
+ }
246
+ return { ok: true, keyset, text, change: 'rotated' };
247
+ }
248
+ /** Server side: mint and sign a v2 attestation after a person approved THIS call. */
249
+ function signToolApproval(args) {
250
+ const now = args.now ?? Date.now();
251
+ const payload = {
252
+ v: 2,
253
+ toolUseId: args.toolUseId,
254
+ toolName: args.toolName,
255
+ inputSha256: (0, daemonToolApproval_js_1.canonicalToolInputDigest)(args.toolInput),
256
+ decidedBy: 'user',
257
+ daemonId: args.daemonId,
258
+ sessionId: args.sessionId,
259
+ issuedAt: now,
260
+ expiresAt: now + (args.ttlMs ?? daemonToolApproval_js_1.ATTESTED_TOOL_APPROVAL_TTL_MS),
261
+ };
262
+ const text = (0, daemonToolApproval_js_1.canonicalApprovalJson)(payload);
263
+ return {
264
+ v: 2,
265
+ payload: text,
266
+ kid: args.signer.kid,
267
+ sig: signMessage(ATTESTATION_SIGNING_DOMAIN, text, args.signer.privateKey),
268
+ };
269
+ }
270
+ /**
271
+ * Daemon side: verify a v2 attestation against the pinned keyset and the call.
272
+ * Order matters: nothing in the payload is READ until the signature verified
273
+ * under a pinned key, so an unsigned claim can never pick which check runs.
274
+ */
275
+ function verifySignedToolApproval(approval, call, keyset) {
276
+ if (approval === undefined || approval === null)
277
+ return { ok: false, reason: 'absent' };
278
+ if (typeof approval !== 'object' || Array.isArray(approval)) {
279
+ return { ok: false, reason: 'malformed' };
280
+ }
281
+ const a = approval;
282
+ if (a.v !== 2 ||
283
+ typeof a.payload !== 'string' ||
284
+ a.payload.length > MAX_PAYLOAD_BYTES ||
285
+ typeof a.kid !== 'string' ||
286
+ typeof a.sig !== 'string') {
287
+ return { ok: false, reason: 'malformed' };
288
+ }
289
+ const pinnedKey = keyset.keys.find((k) => k.kid === a.kid);
290
+ const key = pinnedKey ? ed25519PublicKey(pinnedKey.publicKeySpkiB64) : null;
291
+ if (!key)
292
+ return { ok: false, reason: 'unknown_key' };
293
+ if (!verifySignature(ATTESTATION_SIGNING_DOMAIN, a.payload, a.sig, key)) {
294
+ return { ok: false, reason: 'signature' };
295
+ }
296
+ let parsed;
297
+ try {
298
+ parsed = JSON.parse(a.payload);
299
+ }
300
+ catch {
301
+ return { ok: false, reason: 'malformed' };
302
+ }
303
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
304
+ return { ok: false, reason: 'malformed' };
305
+ }
306
+ const p = parsed;
307
+ if (p.v !== 2 ||
308
+ typeof p.toolUseId !== 'string' ||
309
+ typeof p.toolName !== 'string' ||
310
+ typeof p.inputSha256 !== 'string' ||
311
+ p.decidedBy !== 'user' ||
312
+ typeof p.daemonId !== 'string' ||
313
+ typeof p.sessionId !== 'string' ||
314
+ typeof p.issuedAt !== 'number' ||
315
+ typeof p.expiresAt !== 'number') {
316
+ return { ok: false, reason: 'malformed' };
317
+ }
318
+ // A signed approval for another daemon (or another session on this one) is
319
+ // a valid signature over the wrong question. Checked before freshness so the
320
+ // log says WHICH wrong question when both are wrong.
321
+ if (!call.daemonId ||
322
+ p.daemonId !== call.daemonId ||
323
+ !call.sessionId ||
324
+ p.sessionId !== call.sessionId) {
325
+ return { ok: false, reason: 'daemon_binding' };
326
+ }
327
+ const claims = (0, daemonToolApproval_js_1.verifyAttestedToolApprovalClaims)({
328
+ toolUseId: p.toolUseId,
329
+ toolName: p.toolName,
330
+ inputSha256: p.inputSha256,
331
+ issuedAt: p.issuedAt,
332
+ expiresAt: p.expiresAt,
333
+ }, call);
334
+ if (!claims.ok)
335
+ return claims;
336
+ return { ok: true, toolUseId: p.toolUseId, expiresAt: p.expiresAt };
337
+ }
338
+ /**
339
+ * Daemon side: THE decision for any attestation, whatever version arrived.
340
+ *
341
+ * - pinned → only v2 verified against the pinned keyset approves; v1 is
342
+ * refused as `unsigned` (downgrade protection).
343
+ * - unpinned → legacy: v1 is verified exactly as before; v2 is refused as
344
+ * `unpinned` (nothing here could check it — the server should
345
+ * not have sent it, since this daemon did not announce
346
+ * `tool_approval_signed_v1`).
347
+ * - unreadable → nothing approves.
348
+ *
349
+ * Returns the claims the spend-once ledger keys on when it approves.
350
+ */
351
+ function verifyToolApprovalAttestation(approval, call, pin) {
352
+ if (approval === undefined || approval === null)
353
+ return { ok: false, reason: 'absent' };
354
+ const version = approval && typeof approval === 'object' && !Array.isArray(approval)
355
+ ? approval.v
356
+ : undefined;
357
+ if (pin.state === 'unreadable')
358
+ return { ok: false, reason: 'pin_unreadable' };
359
+ if (pin.state === 'pinned') {
360
+ if (version === 1)
361
+ return { ok: false, reason: 'unsigned' };
362
+ const verdict = verifySignedToolApproval(approval, call, pin.keyset);
363
+ return verdict.ok ? { ...verdict, signed: true } : verdict;
364
+ }
365
+ if (version === 2)
366
+ return { ok: false, reason: 'unpinned' };
367
+ const legacy = (0, daemonToolApproval_js_1.verifyAttestedToolApproval)(approval, call);
368
+ if (!legacy.ok)
369
+ return legacy;
370
+ const a = approval;
371
+ return { ok: true, toolUseId: a.toolUseId, expiresAt: a.expiresAt, signed: false };
372
+ }
@@ -82,7 +82,16 @@ export interface TokenPair {
82
82
  export type PermanentAuthReason = 'REFRESH_INVALID' | 'REFRESH_REUSED' | 'REFRESH_EXPIRED' | 'SESSION_REVOKED' | 'DEVICE_KEY_MISMATCH' | 'TOKEN_INVALID' | 'TOKEN_EXPIRED' | 'UNKNOWN_401';
83
83
  export declare class PermanentAuthFailure extends Error {
84
84
  readonly code: PermanentAuthReason;
85
- constructor(code: PermanentAuthReason, message: string);
85
+ /**
86
+ * OSK-16941 — for `SESSION_REVOKED`, the server's `reason` (a
87
+ * `SESSION_REVOCATION_REASONS` value, `./sessionRevocation.ts`) exactly as
88
+ * received, or undefined when the server sent none. Deliberately not
89
+ * normalized here: a surface rendering it with `describeSessionRevocation`
90
+ * turns a missing or unknown value into the "we could not tell why" copy,
91
+ * and keeps an unrecognised code visible rather than losing it.
92
+ */
93
+ readonly revocationReason?: string;
94
+ constructor(code: PermanentAuthReason, message: string, revocationReason?: string);
86
95
  }
87
96
  export declare class TransientAuthFailure extends Error {
88
97
  readonly cause?: unknown;
@@ -91,6 +100,13 @@ export declare class TransientAuthFailure extends Error {
91
100
  export interface ReauthState {
92
101
  code: string;
93
102
  message?: string;
103
+ /**
104
+ * OSK-16941 — the server's session-revocation `reason` for a
105
+ * `SESSION_REVOKED` latch, so the CLI and desktop can say WHY the person was
106
+ * signed out. Absent on latches written before it existed and on refusals
107
+ * that were not revocations.
108
+ */
109
+ revocationReason?: string;
94
110
  /** Epoch ms. */
95
111
  at: number;
96
112
  }
@@ -8,10 +8,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.TransientAuthFailure = exports.PermanentAuthFailure = void 0;
9
9
  class PermanentAuthFailure extends Error {
10
10
  code;
11
- constructor(code, message) {
11
+ /**
12
+ * OSK-16941 — for `SESSION_REVOKED`, the server's `reason` (a
13
+ * `SESSION_REVOCATION_REASONS` value, `./sessionRevocation.ts`) exactly as
14
+ * received, or undefined when the server sent none. Deliberately not
15
+ * normalized here: a surface rendering it with `describeSessionRevocation`
16
+ * turns a missing or unknown value into the "we could not tell why" copy,
17
+ * and keeps an unrecognised code visible rather than losing it.
18
+ */
19
+ revocationReason;
20
+ constructor(code, message, revocationReason) {
12
21
  super(message);
13
22
  this.name = 'PermanentAuthFailure';
14
23
  this.code = code;
24
+ if (revocationReason !== undefined)
25
+ this.revocationReason = revocationReason;
15
26
  }
16
27
  }
17
28
  exports.PermanentAuthFailure = PermanentAuthFailure;
@@ -108,6 +108,8 @@ export declare const COMPUTER_EVENTS: {
108
108
  * them. Needs `computer_browser_file_chooser_v1`.
109
109
  */
110
110
  readonly fileChooser: "computer:surface:filechooser";
111
+ /** Deliberate semantic teaching in the browser controlled by this attachment. */
112
+ readonly teaching: "computer:surface:teaching";
111
113
  };
112
114
  /**
113
115
  * API ⇄ daemon. The daemon transports (Socket.IO and SSE) carry no
@@ -135,6 +137,7 @@ export declare const DAEMON_COMPUTER_EVENTS: {
135
137
  readonly dialog: "daemon:computer:surface:dialog";
136
138
  readonly copy: "daemon:computer:surface:copy";
137
139
  readonly fileChooser: "daemon:computer:surface:filechooser";
140
+ readonly teaching: "daemon:computer:surface:teaching";
138
141
  /**
139
142
  * Pin or unpin the surface an open human-input request names (§8): a pinned
140
143
  * surface is not reclaimed by idle or wall-clock expiry. Fire-and-forget,
@@ -244,6 +247,9 @@ export declare const COMPUTER_CAPABILITIES: {
244
247
  * them (headless refuses them), so no surface may claim to show one.
245
248
  */
246
249
  readonly browserPage: "computer_browser_page_v1";
250
+ readonly browserTeaching: "computer_browser_teaching_v1";
251
+ /** Separately consented, origin-filtered semantic activity review. */
252
+ readonly browserActivityReview: "computer_browser_activity_review_v1";
247
253
  /** Sharing a person's own surface with an agent session (§5.4). */
248
254
  readonly surfaceShare: "computer_surface_share_v1";
249
255
  /** Pinning a surface an open human-input request names: `daemon:computer:surface:pin` (§8). */
@@ -1036,7 +1042,7 @@ export declare function computerDeclaredServiceSpec(raw: unknown): {
1036
1042
  * caller can never be handed an address off the machine.
1037
1043
  */
1038
1044
  export declare function computerDeclaredServiceUrl(service: Pick<ComputerDeclaredServiceSpec, 'port'> & Partial<Pick<ComputerDeclaredServiceSpec, 'path' | 'protocol'>>): string;
1039
- export declare const COMPUTER_MACHINE_KINDS: readonly ["dedicated", "personal"];
1045
+ export declare const COMPUTER_MACHINE_KINDS: readonly ["dedicated", "personal", "space"];
1040
1046
  export type ComputerMachineKind = (typeof COMPUTER_MACHINE_KINDS)[number];
1041
1047
  /**
1042
1048
  * One picture per machine state; none of them is a spinner without a bound,
@@ -1148,3 +1154,10 @@ export interface ComputerDaemonLogResult {
1148
1154
  /** Lines the redaction rewrote anywhere in the ring (a count, never content). */
1149
1155
  redactedLines: number;
1150
1156
  }
1157
+ /** Exact origins only: neither URL paths nor credentials broaden consent. */
1158
+ export interface BrowserActivityOriginPolicy {
1159
+ allowOrigins: string[];
1160
+ excludeOrigins: string[];
1161
+ }
1162
+ export declare function normalizeBrowserActivityOriginPolicy(input: unknown): BrowserActivityOriginPolicy;
1163
+ export declare function browserActivityOriginAllowed(policy: BrowserActivityOriginPolicy, url: unknown): boolean;
@@ -111,6 +111,8 @@ export const COMPUTER_EVENTS = {
111
111
  * them. Needs `computer_browser_file_chooser_v1`.
112
112
  */
113
113
  fileChooser: 'computer:surface:filechooser',
114
+ /** Deliberate semantic teaching in the browser controlled by this attachment. */
115
+ teaching: 'computer:surface:teaching',
114
116
  };
115
117
  /**
116
118
  * API ⇄ daemon. The daemon transports (Socket.IO and SSE) carry no
@@ -139,6 +141,7 @@ export const DAEMON_COMPUTER_EVENTS = {
139
141
  dialog: 'daemon:computer:surface:dialog',
140
142
  copy: 'daemon:computer:surface:copy',
141
143
  fileChooser: 'daemon:computer:surface:filechooser',
144
+ teaching: 'daemon:computer:surface:teaching',
142
145
  /**
143
146
  * Pin or unpin the surface an open human-input request names (§8): a pinned
144
147
  * surface is not reclaimed by idle or wall-clock expiry. Fire-and-forget,
@@ -264,6 +267,9 @@ export const COMPUTER_CAPABILITIES = {
264
267
  * them (headless refuses them), so no surface may claim to show one.
265
268
  */
266
269
  browserPage: 'computer_browser_page_v1',
270
+ browserTeaching: 'computer_browser_teaching_v1',
271
+ /** Separately consented, origin-filtered semantic activity review. */
272
+ browserActivityReview: 'computer_browser_activity_review_v1',
267
273
  /** Sharing a person's own surface with an agent session (§5.4). */
268
274
  surfaceShare: 'computer_surface_share_v1',
269
275
  /** Pinning a surface an open human-input request names: `daemon:computer:surface:pin` (§8). */
@@ -1111,7 +1117,7 @@ export function computerDeclaredServiceUrl(service) {
1111
1117
  // ---------------------------------------------------------------------------
1112
1118
  // Machines and power (§10, §18)
1113
1119
  // ---------------------------------------------------------------------------
1114
- export const COMPUTER_MACHINE_KINDS = ['dedicated', 'personal'];
1120
+ export const COMPUTER_MACHINE_KINDS = ['dedicated', 'personal', 'space'];
1115
1121
  /**
1116
1122
  * One picture per machine state; none of them is a spinner without a bound,
1117
1123
  * and none collapses two states into the reassuring one.
@@ -1212,7 +1218,7 @@ export function computerShowsDesktop(phase) {
1212
1218
  }
1213
1219
  /** Power actions are offered for a Dedicated Runtime only; a personal machine has none (§18). */
1214
1220
  export function computerOffersPowerActions(machineKind) {
1215
- return machineKind === 'dedicated';
1221
+ return machineKind === 'dedicated' || machineKind === 'space';
1216
1222
  }
1217
1223
  // ---------------------------------------------------------------------------
1218
1224
  // The daemon's own log (`computer_daemon_log_v1`)
@@ -1243,3 +1249,40 @@ export const COMPUTER_DAEMON_LOG_LIMITS = {
1243
1249
  rateMax: 30,
1244
1250
  rateWindowMs: 60 * 1000,
1245
1251
  };
1252
+ export function normalizeBrowserActivityOriginPolicy(input) {
1253
+ if (!input || typeof input !== 'object' || Array.isArray(input))
1254
+ throw new Error('Choose exact allowed and excluded web origins');
1255
+ const value = input;
1256
+ if (Object.keys(value).some((key) => !['allowOrigins', 'excludeOrigins'].includes(key)))
1257
+ throw new Error('Unsupported source filter');
1258
+ const origins = (items, required) => {
1259
+ if (!Array.isArray(items) || items.length > 20 || (required && !items.length))
1260
+ throw new Error('Choose from one to twenty allowed origins and up to twenty excluded origins');
1261
+ return [...new Set(items.map((item) => {
1262
+ if (typeof item !== 'string' || item.length > 500)
1263
+ throw new Error('Use an exact http or https origin without a path, credentials, query or fragment');
1264
+ let url;
1265
+ try {
1266
+ url = new URL(item);
1267
+ }
1268
+ catch {
1269
+ throw new Error('Use an exact http or https origin');
1270
+ }
1271
+ if (!['http:', 'https:'].includes(url.protocol) || url.hostname.includes('*') || url.username || url.password || item !== url.origin)
1272
+ throw new Error('Use an exact http or https origin without a path, credentials, query or fragment');
1273
+ return url.origin;
1274
+ }))].sort();
1275
+ };
1276
+ return { allowOrigins: origins(value.allowOrigins, true), excludeOrigins: origins(value.excludeOrigins, false) };
1277
+ }
1278
+ export function browserActivityOriginAllowed(policy, url) {
1279
+ if (typeof url !== 'string')
1280
+ return false;
1281
+ try {
1282
+ const origin = new URL(url).origin;
1283
+ return ['http:', 'https:'].includes(new URL(url).protocol) && policy.allowOrigins.includes(origin) && !policy.excludeOrigins.includes(origin);
1284
+ }
1285
+ catch {
1286
+ return false;
1287
+ }
1288
+ }
@@ -31,6 +31,11 @@
31
31
  * and the daemon spends each approval once: a second delivery of the same
32
32
  * attestation inside its window is refused as `replayed`. That ledger lives
33
33
  * in daemon memory, so a daemon restart inside the (≤60s) window forgets it.
34
+ *
35
+ * v2 (OSK-16614, `toolApprovalSignature.ts`) carries the same claims signed by
36
+ * a platform Ed25519 key and bound to the daemon and session; a daemon that has
37
+ * pinned the platform's keyset accepts only v2. This module stays the v1
38
+ * format and the checks both versions share.
34
39
  */
35
40
  /** Announced by a daemon that honours `attestedApproval` on daemon:tool:request. */
36
41
  export declare const DAEMON_TOOL_ATTESTED_APPROVAL_CAPABILITY = "daemon_tool_attested_approval_v1";
@@ -84,6 +89,14 @@ export interface AttestedToolApproval {
84
89
  issuedAt: number;
85
90
  expiresAt: number;
86
91
  }
92
+ /**
93
+ * Deterministic serialization for the input digest: objects sort keys
94
+ * recursively, arrays keep order, non-JSON values normalize the way
95
+ * `JSON.stringify` would emit them (undefined/functions in objects drop, in
96
+ * arrays become null). Both runtimes must digest the SAME bytes — the server
97
+ * mints and the daemon verifies — so this lives here, once.
98
+ */
99
+ export declare function canonicalApprovalJson(value: unknown): string;
87
100
  /** The digest both sides compute over `toolInput`. */
88
101
  export declare function canonicalToolInputDigest(toolInput: unknown): string;
89
102
  /** Server side: mint the attestation after a person approved THIS call. */
@@ -106,8 +119,24 @@ export declare function mintAttestedToolApproval(args: {
106
119
  * - `replayed` — this exact approval was already spent on this daemon
107
120
  * (the ledger is the verifier's caller's, see the daemon's
108
121
  * `permissions/attestation-ledger.ts`)
122
+ *
123
+ * Signed approvals (`tool_approval_signed_v1`, `toolApprovalSignature.ts`):
124
+ * - `unsigned` — a v1 (unsigned) attestation reached a daemon that has
125
+ * pinned the platform's approval keyset: a downgrade
126
+ * - `unknown_key` — signed by a key id the pinned keyset does not hold
127
+ * - `signature` — the signature does not verify over the payload
128
+ * - `daemon_binding` — signed for a different daemon or session
129
+ * - `unpinned` — a v2 attestation reached a daemon holding no keyset,
130
+ * so nothing here can verify it
131
+ * - `pin_unreadable` — the pinned keyset file exists and cannot be read;
132
+ * nothing is accepted rather than falling back to v1
133
+ *
134
+ * All are internal-only for the person: the daemon log line
135
+ * (`describePermissionRefusalForLog`, `attestation=<reason>`) names them, and
136
+ * the refusal text a caller reads distinguishes only `absent` from "did not
137
+ * verify" so a probing caller learns nothing new.
109
138
  */
110
- export type AttestedToolApprovalRefusalReason = 'absent' | 'malformed' | 'binding' | 'expired' | 'window' | 'replayed';
139
+ export type AttestedToolApprovalRefusalReason = 'absent' | 'malformed' | 'binding' | 'expired' | 'window' | 'replayed' | 'unsigned' | 'unknown_key' | 'signature' | 'daemon_binding' | 'unpinned' | 'pin_unreadable';
111
140
  export type AttestedToolApprovalVerdict = {
112
141
  ok: true;
113
142
  } | {
@@ -131,3 +160,22 @@ export declare function verifyAttestedToolApproval(approval: unknown, call: {
131
160
  toolInput: unknown;
132
161
  now?: number;
133
162
  }): AttestedToolApprovalVerdict;
163
+ /**
164
+ * The checks every attestation version shares once its claims are trusted to
165
+ * be what the issuer wrote: freshness, the verifier-owned window, and the
166
+ * binding to this exact call. v1 reaches here after a shape check; v2
167
+ * (`toolApprovalSignature.ts`) only after its signature verified, so one
168
+ * implementation decides "expired", "window" and "binding" for both.
169
+ */
170
+ export declare function verifyAttestedToolApprovalClaims(a: {
171
+ toolUseId: string;
172
+ toolName: string;
173
+ inputSha256: string;
174
+ issuedAt: number;
175
+ expiresAt: number;
176
+ }, call: {
177
+ toolUseId: string;
178
+ toolName: string;
179
+ toolInput: unknown;
180
+ now?: number;
181
+ }): AttestedToolApprovalVerdict;