@withbuddi/buddi 0.1.0-pre.40 → 0.1.0-pre.41

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 (241) hide show
  1. package/extension/manifest.json +2 -2
  2. package/node_modules/@buddi/cli/dist/.tsbuildinfo +1 -1
  3. package/node_modules/@buddi/cli/dist/args.d.ts +2 -0
  4. package/node_modules/@buddi/cli/dist/args.d.ts.map +1 -1
  5. package/node_modules/@buddi/cli/dist/args.js +11 -2
  6. package/node_modules/@buddi/cli/dist/args.js.map +1 -1
  7. package/node_modules/@buddi/cli/dist/backup/index.d.ts +3 -1
  8. package/node_modules/@buddi/cli/dist/backup/index.d.ts.map +1 -1
  9. package/node_modules/@buddi/cli/dist/backup/index.js +16 -1
  10. package/node_modules/@buddi/cli/dist/backup/index.js.map +1 -1
  11. package/node_modules/@buddi/cli/dist/commands.d.ts.map +1 -1
  12. package/node_modules/@buddi/cli/dist/commands.js +5 -3
  13. package/node_modules/@buddi/cli/dist/commands.js.map +1 -1
  14. package/node_modules/@buddi/cli/dist/main.d.ts +4 -1
  15. package/node_modules/@buddi/cli/dist/main.d.ts.map +1 -1
  16. package/node_modules/@buddi/cli/dist/main.js +41 -3
  17. package/node_modules/@buddi/cli/dist/main.js.map +1 -1
  18. package/node_modules/@buddi/cli/dist/mode.d.ts +41 -0
  19. package/node_modules/@buddi/cli/dist/mode.d.ts.map +1 -0
  20. package/node_modules/@buddi/cli/dist/mode.js +103 -0
  21. package/node_modules/@buddi/cli/dist/mode.js.map +1 -0
  22. package/node_modules/@buddi/cli/dist/paths.d.ts +13 -1
  23. package/node_modules/@buddi/cli/dist/paths.d.ts.map +1 -1
  24. package/node_modules/@buddi/cli/dist/paths.js +23 -2
  25. package/node_modules/@buddi/cli/dist/paths.js.map +1 -1
  26. package/node_modules/@buddi/cli/dist/uninstall-cmd.d.ts +12 -2
  27. package/node_modules/@buddi/cli/dist/uninstall-cmd.d.ts.map +1 -1
  28. package/node_modules/@buddi/cli/dist/uninstall-cmd.js +63 -12
  29. package/node_modules/@buddi/cli/dist/uninstall-cmd.js.map +1 -1
  30. package/node_modules/@buddi/cli/dist/vault-cmd.d.ts +3 -0
  31. package/node_modules/@buddi/cli/dist/vault-cmd.d.ts.map +1 -1
  32. package/node_modules/@buddi/cli/dist/vault-cmd.js +26 -5
  33. package/node_modules/@buddi/cli/dist/vault-cmd.js.map +1 -1
  34. package/node_modules/@buddi/core/dist/.tsbuildinfo +1 -1
  35. package/node_modules/@buddi/core/dist/uninstall.d.ts +18 -0
  36. package/node_modules/@buddi/core/dist/uninstall.d.ts.map +1 -1
  37. package/node_modules/@buddi/core/dist/uninstall.js +47 -0
  38. package/node_modules/@buddi/core/dist/uninstall.js.map +1 -1
  39. package/node_modules/@buddi/gateway/dist/.tsbuildinfo +1 -1
  40. package/node_modules/@buddi/gateway/dist/codex-accounts.d.ts +2 -0
  41. package/node_modules/@buddi/gateway/dist/codex-accounts.d.ts.map +1 -1
  42. package/node_modules/@buddi/gateway/dist/codex-accounts.js +4 -4
  43. package/node_modules/@buddi/gateway/dist/codex-accounts.js.map +1 -1
  44. package/node_modules/@buddi/gateway/dist/serve.d.ts.map +1 -1
  45. package/node_modules/@buddi/gateway/dist/serve.js +31 -0
  46. package/node_modules/@buddi/gateway/dist/serve.js.map +1 -1
  47. package/node_modules/@buddi/gateway/dist/web/api-routes.d.ts.map +1 -1
  48. package/node_modules/@buddi/gateway/dist/web/api-routes.js +20 -2
  49. package/node_modules/@buddi/gateway/dist/web/api-routes.js.map +1 -1
  50. package/node_modules/@buddi/gateway/dist/web/cli-tool.d.ts +11 -0
  51. package/node_modules/@buddi/gateway/dist/web/cli-tool.d.ts.map +1 -0
  52. package/node_modules/@buddi/gateway/dist/web/cli-tool.js +27 -0
  53. package/node_modules/@buddi/gateway/dist/web/cli-tool.js.map +1 -0
  54. package/node_modules/@buddi/gateway/dist/web/extension.d.ts +14 -0
  55. package/node_modules/@buddi/gateway/dist/web/extension.d.ts.map +1 -1
  56. package/node_modules/@buddi/gateway/dist/web/extension.js +22 -1
  57. package/node_modules/@buddi/gateway/dist/web/extension.js.map +1 -1
  58. package/node_modules/@buddi/gateway/dist/web/lock.d.ts +12 -0
  59. package/node_modules/@buddi/gateway/dist/web/lock.d.ts.map +1 -1
  60. package/node_modules/@buddi/gateway/dist/web/lock.js +13 -0
  61. package/node_modules/@buddi/gateway/dist/web/lock.js.map +1 -1
  62. package/node_modules/@buddi/gateway/dist/web/onboarding.d.ts +19 -2
  63. package/node_modules/@buddi/gateway/dist/web/onboarding.d.ts.map +1 -1
  64. package/node_modules/@buddi/gateway/dist/web/onboarding.js +9 -2
  65. package/node_modules/@buddi/gateway/dist/web/onboarding.js.map +1 -1
  66. package/node_modules/@buddi/gateway/dist/web/passphrase-notice.d.ts +64 -0
  67. package/node_modules/@buddi/gateway/dist/web/passphrase-notice.d.ts.map +1 -0
  68. package/node_modules/@buddi/gateway/dist/web/passphrase-notice.js +112 -0
  69. package/node_modules/@buddi/gateway/dist/web/passphrase-notice.js.map +1 -0
  70. package/node_modules/@buddi/gateway/dist/web/server.d.ts.map +1 -1
  71. package/node_modules/@buddi/gateway/dist/web/server.js +71 -5
  72. package/node_modules/@buddi/gateway/dist/web/server.js.map +1 -1
  73. package/node_modules/@buddi/gateway/dist/web/take-on.d.ts +28 -3
  74. package/node_modules/@buddi/gateway/dist/web/take-on.d.ts.map +1 -1
  75. package/node_modules/@buddi/gateway/dist/web/take-on.js +48 -3
  76. package/node_modules/@buddi/gateway/dist/web/take-on.js.map +1 -1
  77. package/node_modules/@buddi/gateway/dist/web/uninstall.d.ts +36 -0
  78. package/node_modules/@buddi/gateway/dist/web/uninstall.d.ts.map +1 -0
  79. package/node_modules/@buddi/gateway/dist/web/uninstall.js +116 -0
  80. package/node_modules/@buddi/gateway/dist/web/uninstall.js.map +1 -0
  81. package/node_modules/@buddi/install/dist/.tsbuildinfo +1 -1
  82. package/node_modules/@buddi/install/dist/app-layout.d.ts +4 -0
  83. package/node_modules/@buddi/install/dist/app-layout.d.ts.map +1 -1
  84. package/node_modules/@buddi/install/dist/app-layout.js +6 -0
  85. package/node_modules/@buddi/install/dist/app-layout.js.map +1 -1
  86. package/node_modules/@buddi/install/dist/cli-shim.d.ts +76 -0
  87. package/node_modules/@buddi/install/dist/cli-shim.d.ts.map +1 -0
  88. package/node_modules/@buddi/install/dist/cli-shim.js +215 -0
  89. package/node_modules/@buddi/install/dist/cli-shim.js.map +1 -0
  90. package/node_modules/@buddi/install/dist/environment.d.ts +90 -1
  91. package/node_modules/@buddi/install/dist/environment.d.ts.map +1 -1
  92. package/node_modules/@buddi/install/dist/environment.js +216 -3
  93. package/node_modules/@buddi/install/dist/environment.js.map +1 -1
  94. package/node_modules/@buddi/install/dist/launcher.d.ts.map +1 -1
  95. package/node_modules/@buddi/install/dist/launcher.js +140 -5
  96. package/node_modules/@buddi/install/dist/launcher.js.map +1 -1
  97. package/node_modules/@buddi/install/dist/product-uninstall.d.ts +86 -0
  98. package/node_modules/@buddi/install/dist/product-uninstall.d.ts.map +1 -0
  99. package/node_modules/@buddi/install/dist/product-uninstall.js +150 -0
  100. package/node_modules/@buddi/install/dist/product-uninstall.js.map +1 -0
  101. package/node_modules/@buddi/install/dist/supervisor.d.ts +16 -1
  102. package/node_modules/@buddi/install/dist/supervisor.d.ts.map +1 -1
  103. package/node_modules/@buddi/install/dist/supervisor.js +191 -10
  104. package/node_modules/@buddi/install/dist/supervisor.js.map +1 -1
  105. package/node_modules/@buddi/install/dist/uninstall.d.ts +20 -1
  106. package/node_modules/@buddi/install/dist/uninstall.d.ts.map +1 -1
  107. package/node_modules/@buddi/install/dist/uninstall.js +84 -13
  108. package/node_modules/@buddi/install/dist/uninstall.js.map +1 -1
  109. package/node_modules/@buddi/runtime/dist/.tsbuildinfo +1 -1
  110. package/node_modules/@buddi/runtime/dist/codex-oauth.d.ts +6 -0
  111. package/node_modules/@buddi/runtime/dist/codex-oauth.d.ts.map +1 -1
  112. package/node_modules/@buddi/runtime/dist/codex-oauth.js +15 -0
  113. package/node_modules/@buddi/runtime/dist/codex-oauth.js.map +1 -1
  114. package/node_modules/@buddi/runtime/dist/openai.d.ts +9 -2
  115. package/node_modules/@buddi/runtime/dist/openai.d.ts.map +1 -1
  116. package/node_modules/@buddi/runtime/dist/openai.js +117 -16
  117. package/node_modules/@buddi/runtime/dist/openai.js.map +1 -1
  118. package/package.json +2 -2
  119. package/packages/cli/dist/.tsbuildinfo +1 -1
  120. package/packages/cli/dist/args.d.ts +2 -0
  121. package/packages/cli/dist/args.d.ts.map +1 -1
  122. package/packages/cli/dist/args.js +11 -2
  123. package/packages/cli/dist/args.js.map +1 -1
  124. package/packages/cli/dist/backup/index.d.ts +3 -1
  125. package/packages/cli/dist/backup/index.d.ts.map +1 -1
  126. package/packages/cli/dist/backup/index.js +16 -1
  127. package/packages/cli/dist/backup/index.js.map +1 -1
  128. package/packages/cli/dist/commands.d.ts.map +1 -1
  129. package/packages/cli/dist/commands.js +5 -3
  130. package/packages/cli/dist/commands.js.map +1 -1
  131. package/packages/cli/dist/main.d.ts +4 -1
  132. package/packages/cli/dist/main.d.ts.map +1 -1
  133. package/packages/cli/dist/main.js +41 -3
  134. package/packages/cli/dist/main.js.map +1 -1
  135. package/packages/cli/dist/mode.d.ts +41 -0
  136. package/packages/cli/dist/mode.d.ts.map +1 -0
  137. package/packages/cli/dist/mode.js +103 -0
  138. package/packages/cli/dist/mode.js.map +1 -0
  139. package/packages/cli/dist/paths.d.ts +13 -1
  140. package/packages/cli/dist/paths.d.ts.map +1 -1
  141. package/packages/cli/dist/paths.js +23 -2
  142. package/packages/cli/dist/paths.js.map +1 -1
  143. package/packages/cli/dist/uninstall-cmd.d.ts +12 -2
  144. package/packages/cli/dist/uninstall-cmd.d.ts.map +1 -1
  145. package/packages/cli/dist/uninstall-cmd.js +63 -12
  146. package/packages/cli/dist/uninstall-cmd.js.map +1 -1
  147. package/packages/cli/dist/vault-cmd.d.ts +3 -0
  148. package/packages/cli/dist/vault-cmd.d.ts.map +1 -1
  149. package/packages/cli/dist/vault-cmd.js +26 -5
  150. package/packages/cli/dist/vault-cmd.js.map +1 -1
  151. package/packages/core/dist/.tsbuildinfo +1 -1
  152. package/packages/core/dist/uninstall.d.ts +18 -0
  153. package/packages/core/dist/uninstall.d.ts.map +1 -1
  154. package/packages/core/dist/uninstall.js +47 -0
  155. package/packages/core/dist/uninstall.js.map +1 -1
  156. package/packages/gateway/dist/.tsbuildinfo +1 -1
  157. package/packages/gateway/dist/codex-accounts.d.ts +2 -0
  158. package/packages/gateway/dist/codex-accounts.d.ts.map +1 -1
  159. package/packages/gateway/dist/codex-accounts.js +4 -4
  160. package/packages/gateway/dist/codex-accounts.js.map +1 -1
  161. package/packages/gateway/dist/serve.d.ts.map +1 -1
  162. package/packages/gateway/dist/serve.js +31 -0
  163. package/packages/gateway/dist/serve.js.map +1 -1
  164. package/packages/gateway/dist/web/api-routes.d.ts.map +1 -1
  165. package/packages/gateway/dist/web/api-routes.js +20 -2
  166. package/packages/gateway/dist/web/api-routes.js.map +1 -1
  167. package/packages/gateway/dist/web/cli-tool.d.ts +11 -0
  168. package/packages/gateway/dist/web/cli-tool.d.ts.map +1 -0
  169. package/packages/gateway/dist/web/cli-tool.js +27 -0
  170. package/packages/gateway/dist/web/cli-tool.js.map +1 -0
  171. package/packages/gateway/dist/web/extension.d.ts +14 -0
  172. package/packages/gateway/dist/web/extension.d.ts.map +1 -1
  173. package/packages/gateway/dist/web/extension.js +22 -1
  174. package/packages/gateway/dist/web/extension.js.map +1 -1
  175. package/packages/gateway/dist/web/lock.d.ts +12 -0
  176. package/packages/gateway/dist/web/lock.d.ts.map +1 -1
  177. package/packages/gateway/dist/web/lock.js +13 -0
  178. package/packages/gateway/dist/web/lock.js.map +1 -1
  179. package/packages/gateway/dist/web/onboarding.d.ts +19 -2
  180. package/packages/gateway/dist/web/onboarding.d.ts.map +1 -1
  181. package/packages/gateway/dist/web/onboarding.js +9 -2
  182. package/packages/gateway/dist/web/onboarding.js.map +1 -1
  183. package/packages/gateway/dist/web/passphrase-notice.d.ts +64 -0
  184. package/packages/gateway/dist/web/passphrase-notice.d.ts.map +1 -0
  185. package/packages/gateway/dist/web/passphrase-notice.js +112 -0
  186. package/packages/gateway/dist/web/passphrase-notice.js.map +1 -0
  187. package/packages/gateway/dist/web/server.d.ts.map +1 -1
  188. package/packages/gateway/dist/web/server.js +71 -5
  189. package/packages/gateway/dist/web/server.js.map +1 -1
  190. package/packages/gateway/dist/web/take-on.d.ts +28 -3
  191. package/packages/gateway/dist/web/take-on.d.ts.map +1 -1
  192. package/packages/gateway/dist/web/take-on.js +48 -3
  193. package/packages/gateway/dist/web/take-on.js.map +1 -1
  194. package/packages/gateway/dist/web/uninstall.d.ts +36 -0
  195. package/packages/gateway/dist/web/uninstall.d.ts.map +1 -0
  196. package/packages/gateway/dist/web/uninstall.js +116 -0
  197. package/packages/gateway/dist/web/uninstall.js.map +1 -0
  198. package/packages/install/dist/.tsbuildinfo +1 -1
  199. package/packages/install/dist/app-layout.d.ts +4 -0
  200. package/packages/install/dist/app-layout.d.ts.map +1 -1
  201. package/packages/install/dist/app-layout.js +6 -0
  202. package/packages/install/dist/app-layout.js.map +1 -1
  203. package/packages/install/dist/cli-shim.d.ts +76 -0
  204. package/packages/install/dist/cli-shim.d.ts.map +1 -0
  205. package/packages/install/dist/cli-shim.js +215 -0
  206. package/packages/install/dist/cli-shim.js.map +1 -0
  207. package/packages/install/dist/environment.d.ts +90 -1
  208. package/packages/install/dist/environment.d.ts.map +1 -1
  209. package/packages/install/dist/environment.js +216 -3
  210. package/packages/install/dist/environment.js.map +1 -1
  211. package/packages/install/dist/launcher.d.ts.map +1 -1
  212. package/packages/install/dist/launcher.js +140 -5
  213. package/packages/install/dist/launcher.js.map +1 -1
  214. package/packages/install/dist/product-uninstall.d.ts +86 -0
  215. package/packages/install/dist/product-uninstall.d.ts.map +1 -0
  216. package/packages/install/dist/product-uninstall.js +150 -0
  217. package/packages/install/dist/product-uninstall.js.map +1 -0
  218. package/packages/install/dist/supervisor.d.ts +16 -1
  219. package/packages/install/dist/supervisor.d.ts.map +1 -1
  220. package/packages/install/dist/supervisor.js +191 -10
  221. package/packages/install/dist/supervisor.js.map +1 -1
  222. package/packages/install/dist/uninstall.d.ts +20 -1
  223. package/packages/install/dist/uninstall.d.ts.map +1 -1
  224. package/packages/install/dist/uninstall.js +84 -13
  225. package/packages/install/dist/uninstall.js.map +1 -1
  226. package/packages/runtime/dist/.tsbuildinfo +1 -1
  227. package/packages/runtime/dist/codex-oauth.d.ts +6 -0
  228. package/packages/runtime/dist/codex-oauth.d.ts.map +1 -1
  229. package/packages/runtime/dist/codex-oauth.js +15 -0
  230. package/packages/runtime/dist/codex-oauth.js.map +1 -1
  231. package/packages/runtime/dist/openai.d.ts +9 -2
  232. package/packages/runtime/dist/openai.d.ts.map +1 -1
  233. package/packages/runtime/dist/openai.js +117 -16
  234. package/packages/runtime/dist/openai.js.map +1 -1
  235. package/packages/web/dist/assets/index-BkxHX_8g.js +146 -0
  236. package/packages/web/dist/assets/{index-DYfeUW-0.css → index-D2rOodlH.css} +1 -1
  237. package/packages/web/dist/assets/{lottie_light-DB7hai8n.js → lottie_light-D-P1tn3V.js} +1 -1
  238. package/packages/web/dist/build.json +1 -1
  239. package/packages/web/dist/index.html +2 -2
  240. package/packages/web/dist/precache.json +4 -4
  241. package/packages/web/dist/assets/index-CO4OawAX.js +0 -146
@@ -61,7 +61,7 @@ import { setDelegatesFromWeb } from './write.js';
61
61
  import { mlxhBaseUrl, probeMlxh } from '../mlxh.js';
62
62
  import { PullRefusal, createOllamaPulls, ollamaMachine } from '../ollama-local.js';
63
63
  import { OnboardingRefusal, hasOwnerAgent, WEB_ONBOARDING_STEPS, WEB_ONBOARDING_SURFACE, claimOpeningTurn, createFirstAgent, OLLAMA_BASE_URL, probeOllama, readOnboarding, rebindBrain, updateFirstAgent, withFirstRunFacts, readFirstAgentPersona } from './onboarding.js';
64
- import { TakeOnRefusal, readTakeOn, startTakeOn } from './take-on.js';
64
+ import { TakeOnRefusal, readTakeOn, readTakeOnOffers, startTakeOn } from './take-on.js';
65
65
  import { TelegramWebError, saveTelegramToken, telegramBot, telegramDevices, telegramPairing, telegramStatus, unpairTelegramDevice, } from './telegram.js';
66
66
  import { PAGE_ROUTE, sendPageFile, actOnPage, actRateLimited, listPageDescriptors, runPageQuery, } from './pages.js';
67
67
  import { listSecrets, ownerLoginKey, ownerLoginNames, ownerLoginStore, secretUses, secretsAct } from './secrets.js';
@@ -136,6 +136,9 @@ import { StreamBudget, frame, resumeCursor, streamConversation } from './stream.
136
136
  import { ensureWebToken, verifyTicket } from './token.js';
137
137
  import { MAX_UPLOAD_BYTES, readUpload } from './upload.js';
138
138
  import { LOCKED_BODY, LockUnavailable, allowedWhileLocked, clientOf, createLock } from './lock.js';
139
+ import { acknowledgePassphrase, passphraseNotice } from './passphrase-notice.js';
140
+ import { cliToolRoute } from './cli-tool.js';
141
+ import { createTokenStore, uninstallBackupRoute, uninstallJobRoute, uninstallPlanRoute, uninstallRoute as removeBuddiRoute, withoutPassphrase } from './uninstall.js';
139
142
  import { matchApiRoute, TOKEN_REFUSALS } from './api-routes.js';
140
143
  import { QUIET_UNAVAILABLE_TEXT, pluginCommands } from './composer.js';
141
144
  import { createEngagementHooks } from '../missions/engagement.js';
@@ -370,6 +373,8 @@ export function createWebApp(deps) {
370
373
  },
371
374
  recoveryActive: () => inRecovery(deps.pool),
372
375
  });
376
+ /** Remove buddi from this Mac: the token its plan mints (web/uninstall.ts). */
377
+ const uninstallTokens = createTokenStore();
373
378
  const lock = createLock({ pool: deps.pool, sessions, now: deps.now, get timezone() { return deps.timezone; }, widgets, needsYou, log });
374
379
  const openStreams = new Map();
375
380
  /*
@@ -1214,12 +1219,21 @@ export function createWebApp(deps) {
1214
1219
  examplesDir: EXAMPLES_AGENTS_DIR,
1215
1220
  reload: () => deps.catalog.reload?.(),
1216
1221
  registry: deps.registry,
1222
+ offers: (opts) => readTakeOnOffers({ env: deps.env ?? process.env, log }, opts),
1217
1223
  });
1218
1224
  /** What the backup routes need: the environment, and somewhere to log. */
1219
1225
  const backupDeps = () => ({
1220
1226
  env: deps.env ?? process.env,
1221
1227
  log,
1222
1228
  });
1229
+ /** Home's passphrase card: the backups, the words, and where "I saved it" is kept. */
1230
+ const noticeDeps = () => ({
1231
+ pool: deps.pool,
1232
+ listBackups: () => listBackups(backupDeps()),
1233
+ passphrase: () => passphraseRoute(backupDeps(), 'GET'),
1234
+ now: deps.now,
1235
+ log,
1236
+ });
1223
1237
  /** What the plugin page routes need: the registry, and the owner's context. */
1224
1238
  const pagesDeps = () => ({ registry: deps.registry, ctx: deps.ctx, now: deps.now, log });
1225
1239
  const agentOffersDeps = () => ({
@@ -1930,8 +1944,21 @@ export function createWebApp(deps) {
1930
1944
  return reply(res, await listBackups(backupDeps()));
1931
1945
  case '/api/backups/schedule':
1932
1946
  return reply(res, await scheduleRoute(backupDeps(), 'GET'));
1933
- case '/api/backups/passphrase':
1947
+ case '/api/backups/passphrase': {
1948
+ // Behind the PIN when there is one: Settings → Backup reveals it with POST …/reveal.
1949
+ const allowed = await lock.verify(undefined);
1950
+ if (!allowed.ok)
1951
+ return sendJson(res, 403, { error: 'Type your PIN to see the passphrase.', needsPin: true });
1934
1952
  return reply(res, await passphraseRoute(backupDeps(), 'GET'));
1953
+ }
1954
+ /* Home's card after the first encrypted backup, until "I saved it" (web/passphrase-notice.ts). */
1955
+ /* The words, so from this computer only, and behind the PIN when there is one (the card then reveals with POST …/reveal). */
1956
+ case '/api/backups/passphrase/notice': {
1957
+ if (session.via !== 'local')
1958
+ return sendJson(res, 403, { error: 'The passphrase shows on the computer buddi runs on.' });
1959
+ const allowed = await lock.verify(undefined);
1960
+ return sendJson(res, 200, await passphraseNotice(noticeDeps(), { words: allowed.ok }));
1961
+ }
1935
1962
  /*
1936
1963
  * Plugins: what is installed, what is staged and waiting to be read,
1937
1964
  * and the trust sentence the page shows above the install field. A
@@ -1974,7 +2001,7 @@ export function createWebApp(deps) {
1974
2001
  case '/api/secrets/uses':
1975
2002
  return reply(res, await secretUses(secretsDeps(), url));
1976
2003
  case '/api/onboarding':
1977
- return sendJson(res, 200, await readOnboarding(onboardingDeps()));
2004
+ return sendJson(res, 200, await readOnboarding(onboardingDeps(), { withOffers: true }));
1978
2005
  /*
1979
2006
  * Is Ollama running on this machine? Asked from here, never from the
1980
2007
  * page: the dashboard bundle reaches no host but its own, and the
@@ -2053,10 +2080,28 @@ export function createWebApp(deps) {
2053
2080
  }
2054
2081
  const upgradeJob = /^\/api\/upgrade\/jobs\/([0-9a-f-]{36})$/i.exec(path);
2055
2082
  if (upgradeJob)
2056
- return reply(res, await upgradeJobRoute(versionDeps(), upgradeJob[1]));
2083
+ return reply(res, withoutPassphrase(await upgradeJobRoute(versionDeps(), upgradeJob[1])));
2057
2084
  const backupJob = /^\/api\/backups\/jobs\/([0-9a-f-]{36})$/i.exec(path);
2058
2085
  if (backupJob)
2059
- return reply(res, await backupJobRoute(backupDeps(), backupJob[1]));
2086
+ return reply(res, withoutPassphrase(await backupJobRoute(backupDeps(), backupJob[1])));
2087
+ /* buddi.app's command line tool: whether it is installed, from this computer only. */
2088
+ if (path === '/api/system/cli') {
2089
+ if (session.via !== 'local')
2090
+ return sendJson(res, 403, { error: 'Change this from the computer buddi runs on.' });
2091
+ return reply(res, await cliToolRoute(deps.env ?? process.env, 'GET'));
2092
+ }
2093
+ /* Remove buddi from this Mac: the plan (with its token) and the last backup's job, from this computer only. */
2094
+ if (path === '/api/system/uninstall') {
2095
+ if (session.via !== 'local')
2096
+ return sendJson(res, 403, { error: 'Remove buddi from the computer it runs on.' });
2097
+ return reply(res, await uninstallPlanRoute({ env: deps.env ?? process.env, now: deps.now }, uninstallTokens));
2098
+ }
2099
+ const uninstallJob = /^\/api\/system\/uninstall\/jobs\/([0-9a-f-]{36})$/i.exec(path);
2100
+ if (uninstallJob) {
2101
+ if (session.via !== 'local')
2102
+ return sendJson(res, 403, { error: 'Remove buddi from the computer it runs on.' });
2103
+ return reply(res, await uninstallJobRoute({ env: deps.env ?? process.env }, uninstallJob[1]));
2104
+ }
2060
2105
  const catalogueJob = /^\/api\/catalogue\/jobs\/([0-9a-f-]{36})$/i.exec(path);
2061
2106
  if (catalogueJob)
2062
2107
  return reply(res, catalogueJobRoute(catalogueJob[1]));
@@ -3353,6 +3398,27 @@ export function createWebApp(deps) {
3353
3398
  return reply(res, await upgradeRoute(versionDeps(), body));
3354
3399
  if (path === '/api/backups')
3355
3400
  return reply(res, await createBackupRoute(backupDeps(), body));
3401
+ if (path === '/api/backups/passphrase/notice')
3402
+ return sendJson(res, 200, await acknowledgePassphrase({ pool: deps.pool, now: deps.now }));
3403
+ if (path === '/api/system/cli') {
3404
+ if (session.via !== 'local')
3405
+ return sendJson(res, 403, { error: 'Change this from the computer buddi runs on.' });
3406
+ return reply(res, await cliToolRoute(deps.env ?? process.env, 'POST'));
3407
+ }
3408
+ if (path === '/api/system/uninstall/backup' || path === '/api/system/uninstall') {
3409
+ if (session.via !== 'local')
3410
+ return sendJson(res, 403, { error: 'Remove buddi from the computer it runs on.' });
3411
+ const uninstallDeps = { env: deps.env ?? process.env, now: deps.now };
3412
+ return reply(res, path === '/api/system/uninstall/backup'
3413
+ ? await uninstallBackupRoute(uninstallDeps, uninstallTokens, body)
3414
+ : await removeBuddiRoute(uninstallDeps, uninstallTokens, body));
3415
+ }
3416
+ if (path === '/api/backups/passphrase/reveal') {
3417
+ const allowed = await lock.verify(body.pin);
3418
+ if (!allowed.ok)
3419
+ return sendJson(res, allowed.status, allowed.body);
3420
+ return reply(res, await passphraseRoute(backupDeps(), 'GET'));
3421
+ }
3356
3422
  if (path === '/api/backups/verify')
3357
3423
  return reply(res, await verifyBackupRoute(backupDeps(), body));
3358
3424
  if (path === '/api/backups/restore') {