getbotons 0.0.0-stage → 0.1.0

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 (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +505 -2
  3. package/installer/admin.mjs +6 -0
  4. package/installer/botons.mjs +430 -0
  5. package/installer/brain-clis.mjs +28 -0
  6. package/installer/linger.mjs +39 -0
  7. package/installer/output.mjs +27 -0
  8. package/installer/revision.mjs +30 -0
  9. package/installer/shell-path.mjs +66 -0
  10. package/installer/source-lock.json +2891 -0
  11. package/package.json +26 -4
  12. package/payload/LICENSE +21 -0
  13. package/payload/SECURITY.md +33 -0
  14. package/payload/installer/admin.mjs +6 -0
  15. package/payload/installer/botons.mjs +430 -0
  16. package/payload/installer/brain-clis.mjs +28 -0
  17. package/payload/installer/linger.mjs +39 -0
  18. package/payload/installer/output.mjs +27 -0
  19. package/payload/installer/revision.mjs +30 -0
  20. package/payload/installer/shell-path.mjs +66 -0
  21. package/payload/installer/source-lock.json +2891 -0
  22. package/payload/npm-shrinkwrap.json +51 -0
  23. package/payload/package.json +13 -0
  24. package/payload/scripts/backup.ts +47 -0
  25. package/payload/scripts/botons-backup.service +15 -0
  26. package/payload/scripts/botons-backup.timer +11 -0
  27. package/payload/scripts/botons.service +36 -0
  28. package/payload/scripts/check-browser.ts +90 -0
  29. package/payload/scripts/doctor.ts +790 -0
  30. package/payload/scripts/install-backup-timer.ts +52 -0
  31. package/payload/scripts/install-service.ts +206 -0
  32. package/payload/scripts/login.ts +17 -0
  33. package/payload/scripts/migrate-names.ts +47 -0
  34. package/payload/scripts/pair.ts +163 -0
  35. package/payload/scripts/restore.ts +108 -0
  36. package/payload/server/bin/botons +4 -0
  37. package/payload/server/bin/legacy/minion +4 -0
  38. package/payload/server/bin/legacy/tots +4 -0
  39. package/payload/server/src/acting.ts +16 -0
  40. package/payload/server/src/api-keys.ts +544 -0
  41. package/payload/server/src/api.ts +1484 -0
  42. package/payload/server/src/app.ts +546 -0
  43. package/payload/server/src/approvals.ts +873 -0
  44. package/payload/server/src/ask-rules.ts +181 -0
  45. package/payload/server/src/audit.ts +158 -0
  46. package/payload/server/src/auth.ts +497 -0
  47. package/payload/server/src/backup.ts +382 -0
  48. package/payload/server/src/brain-login.ts +75 -0
  49. package/payload/server/src/browser-cert.ts +67 -0
  50. package/payload/server/src/browser-handoff.ts +119 -0
  51. package/payload/server/src/browser-handover.ts +175 -0
  52. package/payload/server/src/browser-policy.ts +210 -0
  53. package/payload/server/src/browser-proxy.ts +580 -0
  54. package/payload/server/src/browser-request.ts +335 -0
  55. package/payload/server/src/browser-screenshot.ts +56 -0
  56. package/payload/server/src/browser-send.ts +155 -0
  57. package/payload/server/src/browser.ts +2164 -0
  58. package/payload/server/src/callback.ts +218 -0
  59. package/payload/server/src/capabilities.ts +90 -0
  60. package/payload/server/src/cards.ts +243 -0
  61. package/payload/server/src/cli/approve-mcp.ts +119 -0
  62. package/payload/server/src/cli/botons.ts +629 -0
  63. package/payload/server/src/cli/browser-mcp.ts +168 -0
  64. package/payload/server/src/cli/workspace-file.ts +78 -0
  65. package/payload/server/src/cli-homes.ts +38 -0
  66. package/payload/server/src/cli-install.ts +104 -0
  67. package/payload/server/src/cli-updates.ts +112 -0
  68. package/payload/server/src/codex-config-repair.ts +80 -0
  69. package/payload/server/src/config.ts +473 -0
  70. package/payload/server/src/connector-access.ts +158 -0
  71. package/payload/server/src/connector-launch.ts +203 -0
  72. package/payload/server/src/connectors.ts +947 -0
  73. package/payload/server/src/disk-usage.ts +62 -0
  74. package/payload/server/src/engine.ts +2328 -0
  75. package/payload/server/src/env-init.ts +5 -0
  76. package/payload/server/src/events.ts +46 -0
  77. package/payload/server/src/files.ts +528 -0
  78. package/payload/server/src/github-access.ts +52 -0
  79. package/payload/server/src/health.ts +117 -0
  80. package/payload/server/src/held-dir.ts +96 -0
  81. package/payload/server/src/hooks.ts +141 -0
  82. package/payload/server/src/http.ts +207 -0
  83. package/payload/server/src/index.ts +139 -0
  84. package/payload/server/src/install-type.ts +11 -0
  85. package/payload/server/src/instructions.ts +204 -0
  86. package/payload/server/src/isolation.ts +234 -0
  87. package/payload/server/src/legacy-upgrade.ts +668 -0
  88. package/payload/server/src/limits.ts +44 -0
  89. package/payload/server/src/lock.ts +75 -0
  90. package/payload/server/src/log.ts +137 -0
  91. package/payload/server/src/managed-clis.ts +65 -0
  92. package/payload/server/src/mcp-client.ts +229 -0
  93. package/payload/server/src/notify.ts +193 -0
  94. package/payload/server/src/oauth-connections.ts +650 -0
  95. package/payload/server/src/oauth.ts +311 -0
  96. package/payload/server/src/outbound.ts +142 -0
  97. package/payload/server/src/portable.ts +1669 -0
  98. package/payload/server/src/prompt.ts +676 -0
  99. package/payload/server/src/providers/api-brain.ts +612 -0
  100. package/payload/server/src/providers/api-history.ts +131 -0
  101. package/payload/server/src/providers/api-tools.ts +481 -0
  102. package/payload/server/src/providers/api-wire.ts +690 -0
  103. package/payload/server/src/providers/claude-cli.ts +620 -0
  104. package/payload/server/src/providers/cli-check.ts +265 -0
  105. package/payload/server/src/providers/cli-turn.ts +20 -0
  106. package/payload/server/src/providers/codex-cli.ts +552 -0
  107. package/payload/server/src/providers/codex-workspace.ts +61 -0
  108. package/payload/server/src/providers/failures.ts +143 -0
  109. package/payload/server/src/providers/index.ts +131 -0
  110. package/payload/server/src/providers/mcp-stdio.ts +147 -0
  111. package/payload/server/src/providers/mock.ts +94 -0
  112. package/payload/server/src/providers/process.ts +268 -0
  113. package/payload/server/src/providers/readiness.ts +43 -0
  114. package/payload/server/src/providers/sse.ts +73 -0
  115. package/payload/server/src/providers/types.ts +173 -0
  116. package/payload/server/src/rates.ts +128 -0
  117. package/payload/server/src/reactions.ts +266 -0
  118. package/payload/server/src/recent-logs.ts +489 -0
  119. package/payload/server/src/rehearsal.ts +593 -0
  120. package/payload/server/src/rehearsals.ts +303 -0
  121. package/payload/server/src/replay.ts +165 -0
  122. package/payload/server/src/sandbox.ts +767 -0
  123. package/payload/server/src/schedule.ts +214 -0
  124. package/payload/server/src/scheduler.ts +24 -0
  125. package/payload/server/src/schema.ts +882 -0
  126. package/payload/server/src/secrets.ts +46 -0
  127. package/payload/server/src/setup.ts +356 -0
  128. package/payload/server/src/skill-packages.ts +363 -0
  129. package/payload/server/src/skills.ts +527 -0
  130. package/payload/server/src/spend.ts +255 -0
  131. package/payload/server/src/ssrf.ts +126 -0
  132. package/payload/server/src/starter-gate.ts +168 -0
  133. package/payload/server/src/starters.ts +610 -0
  134. package/payload/server/src/storage.ts +32 -0
  135. package/payload/server/src/store.ts +3087 -0
  136. package/payload/server/src/tailnet.ts +132 -0
  137. package/payload/server/src/templates.ts +454 -0
  138. package/payload/server/src/trash.ts +772 -0
  139. package/payload/server/src/util.ts +97 -0
  140. package/payload/server/src/webhooks.ts +216 -0
  141. package/payload/server/src/work-feed.ts +473 -0
  142. package/payload/shared/app-version.d.mts +1 -0
  143. package/payload/shared/app-version.mjs +3 -0
  144. package/payload/shared/boton.ts +323 -0
  145. package/payload/shared/brand.ts +107 -0
  146. package/payload/shared/cards.ts +427 -0
  147. package/payload/shared/effort.ts +91 -0
  148. package/payload/shared/files.ts +104 -0
  149. package/payload/shared/handoff.ts +97 -0
  150. package/payload/shared/install-commands.ts +7 -0
  151. package/payload/shared/legacy-names.d.mts +35 -0
  152. package/payload/shared/legacy-names.mjs +244 -0
  153. package/payload/shared/live-view.ts +94 -0
  154. package/payload/shared/look-critter.ts +189 -0
  155. package/payload/shared/look-tater.ts +127 -0
  156. package/payload/shared/look.ts +200 -0
  157. package/payload/shared/reactions.ts +43 -0
  158. package/payload/shared/seeded.ts +34 -0
  159. package/payload/shared/services.ts +90 -0
  160. package/payload/shared/types.ts +3016 -0
  161. package/payload/shared/util.ts +68 -0
  162. package/payload/shared/versions.ts +44 -0
  163. package/payload/shared/wake.ts +164 -0
  164. package/payload/web/dist/apple-touch-icon.png +0 -0
  165. package/payload/web/dist/assets/Icons-nytVAa9g.js +1 -0
  166. package/payload/web/dist/assets/NewBotDialog-DXr2XhDP.js +1 -0
  167. package/payload/web/dist/assets/PairScreen-CMcJO7cQ.js +1 -0
  168. package/payload/web/dist/assets/Panel-Bvqz3I3m.js +4 -0
  169. package/payload/web/dist/assets/ReactionPicker-B0SKsjiy.js +1 -0
  170. package/payload/web/dist/assets/SettingRows-CvLomtuo.js +4 -0
  171. package/payload/web/dist/assets/SettingsDialog-CQ41LV-P.js +8 -0
  172. package/payload/web/dist/assets/Setup-C-3P7Mtn.js +1 -0
  173. package/payload/web/dist/assets/Skills-DXMH69kH.js +1 -0
  174. package/payload/web/dist/assets/StarterSetup-Ce2V1_Cs.js +5 -0
  175. package/payload/web/dist/assets/Steps-CKtB3GAM.js +1 -0
  176. package/payload/web/dist/assets/emoji-catalog-DfpPz8qw.js +540 -0
  177. package/payload/web/dist/assets/index-BEU7FDxV.css +1 -0
  178. package/payload/web/dist/assets/index-Dhwn-rf0.js +3 -0
  179. package/payload/web/dist/assets/react-C1iE8mnY.js +9 -0
  180. package/payload/web/dist/assets/reactions-rw0YeCmA.js +1 -0
  181. package/payload/web/dist/assets/rolldown-runtime-XKyaHtl9.js +1 -0
  182. package/payload/web/dist/assets/util-Cx5feSJu.js +1 -0
  183. package/payload/web/dist/assets/vendor-B3qdcjGo.js +14 -0
  184. package/payload/web/dist/favicon.svg +1 -0
  185. package/payload/web/dist/icon-192.png +0 -0
  186. package/payload/web/dist/icon-512.png +0 -0
  187. package/payload/web/dist/icon.svg +1 -0
  188. package/payload/web/dist/index.html +67 -0
  189. package/payload/web/dist/manifest.webmanifest +12 -0
  190. package/shared/legacy-names.d.mts +35 -0
  191. package/shared/legacy-names.mjs +244 -0
@@ -0,0 +1,30 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
3
+ import { basename, join, resolve } from 'node:path';
4
+ import { spawnSync } from 'node:child_process';
5
+
6
+ /** Report only a commit hash, never a source URL that could contain credentials. */
7
+ export function installerRevision(root) {
8
+ let commit = null;
9
+ if (existsSync(join(root, '.git'))) {
10
+ const result = spawnSync('git', ['rev-parse', 'HEAD'], { cwd: root, encoding: 'utf8' });
11
+ if (result.status === 0 && /^[a-f0-9]{40}$/.test(result.stdout.trim())) commit = result.stdout.trim();
12
+ }
13
+ if (!commit) {
14
+ try {
15
+ // npm strips .git while packing Git dependencies, but retains the resolved SHA in its cache lock.
16
+ const cache = resolve(root, '../..');
17
+ if (basename(resolve(root, '..')) === 'node_modules') {
18
+ const lock = JSON.parse(readFileSync(join(cache, 'package-lock.json'), 'utf8'));
19
+ const entry = lock.packages?.[`node_modules/${basename(root)}`];
20
+ commit = /#([a-f0-9]{40})$/.exec(entry?.resolved || '')?.[1] || null;
21
+ }
22
+ } catch { /* Cache metadata is optional; the fingerprint still identifies the running code. */ }
23
+ }
24
+ const hash = createHash('sha256');
25
+ const installer = join(root, 'installer');
26
+ for (const file of readdirSync(installer).filter(name => name.endsWith('.mjs')).sort()) {
27
+ hash.update(file).update('\0').update(readFileSync(join(installer, file))).update('\0');
28
+ }
29
+ return `Botons installer: commit ${commit || 'unavailable'}, fingerprint ${hash.digest('hex')}`;
30
+ }
@@ -0,0 +1,66 @@
1
+ import { existsSync, readFileSync, writeFileSync, appendFileSync, mkdirSync } from 'node:fs';
2
+ import { basename, dirname, join, resolve } from 'node:path';
3
+ import { PATH_BLOCK_NAMES } from '../shared/legacy-names.mjs';
4
+
5
+ const blockOf = (name) => `\n# >>> ${name} PATH >>>\ncase ":$PATH:" in\n *":$HOME/.local/bin:"*) ;;\n *) export PATH="$HOME/.local/bin:$PATH" ;;\nesac\n# <<< ${name} PATH <<<\n`;
6
+ const block = blockOf('botons');
7
+ // The block under its deprecated names counts as there, and goes on uninstall (shared/legacy-names.mjs).
8
+ const markers = ['botons', ...PATH_BLOCK_NAMES].map(name => `# >>> ${name} PATH >>>`);
9
+ const blocks = [block, ...PATH_BLOCK_NAMES.map(blockOf)];
10
+ const files = ['.bashrc', '.zshrc', '.profile'];
11
+ export function onPath(home, path = '') {
12
+ return path.split(':').some(entry => entry && resolve(entry) === join(home, '.local/bin'));
13
+ }
14
+ export function profileAddsPath(home, shell = '') {
15
+ const kind = basename(shell);
16
+ const candidates = kind === 'bash' ? ['.bash_profile', '.bash_login', '.profile'] : kind === 'zsh' ? ['.zprofile', '.zlogin'] : ['.profile'];
17
+ for (const name of candidates) {
18
+ const path = join(home, name);
19
+ if (!existsSync(path)) continue;
20
+ const text = readFileSync(path, 'utf8');
21
+ const adds = text.split('\n').filter(line => !/^\s*#/.test(line)).some(line => /^\s*(?:export\s+)?PATH=/.test(line) && (/(?:\$HOME|\$\{HOME\}|~)\/\.local\/bin/.test(line) || line.includes(join(home, ".local/bin"))));
22
+ if (adds) return true;
23
+ // Bash only reads the first existing login profile. Follow its explicit .profile inclusion.
24
+ if (kind === 'bash') {
25
+ if (name !== '.profile' && /(?:source|\.)\s+["']?(?:\$HOME|~)\/\.profile["']?(?:\s|$)/m.test(text)) {
26
+ return profileAddsPath(home, '/bin/sh');
27
+ }
28
+ return false;
29
+ }
30
+ }
31
+ return false;
32
+ }
33
+ export async function configurePath({ home, shell, path, yes }, ask, log = console.log) {
34
+ if (onPath(home, path)) return true;
35
+ try {
36
+ if (!profileAddsPath(home, shell)) {
37
+ const kind = basename(shell || '');
38
+ const rc = join(home, kind === 'bash' ? '.bashrc' : kind === 'zsh' ? '.zshrc' : '.profile');
39
+ const text = existsSync(rc) ? readFileSync(rc, 'utf8') : '';
40
+ if (!markers.some(m => text.includes(m))) {
41
+ await ask(`Append the marked Botons PATH block to ${rc} so new shells find ~/.local/bin/botons`, yes);
42
+ // The owner may edit the file while answering. Preserve those edits and recheck the marker.
43
+ const latest = existsSync(rc) ? readFileSync(rc, 'utf8') : '';
44
+ if (!markers.some(m => latest.includes(m)) && !profileAddsPath(home, shell)) {
45
+ mkdirSync(dirname(rc), { recursive: true });
46
+ appendFileSync(rc, block);
47
+ }
48
+ }
49
+ }
50
+ } catch (error) { log(`PATH setup skipped: ${error.message}. Use ~/.local/bin/botons until your shell PATH is configured.`); }
51
+
52
+ return false;
53
+ }
54
+ export function removePathBlock(home, log = console.log) {
55
+ for (const name of files) {
56
+ const path = join(home, name);
57
+ try {
58
+ if (!existsSync(path)) continue;
59
+ const text = readFileSync(path, 'utf8');
60
+ const cleaned = blocks.reduce((t, b) => t.replaceAll(b, ''), text);
61
+ if (cleaned !== text) writeFileSync(path, cleaned);
62
+ } catch (error) {
63
+ log(`WARNING: Could not remove the Botons PATH block from ${path}: ${error.message}. Remove the marked block manually if present.`);
64
+ }
65
+ }
66
+ }