beehaven 0.8.16

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 (171) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +201 -0
  3. package/dist/__tests__/_cli-switch.js +105 -0
  4. package/dist/__tests__/agent-wrap-probe.js +136 -0
  5. package/dist/agent-attribution.js +192 -0
  6. package/dist/agent-identity-daemon.js +135 -0
  7. package/dist/agent-onboard.js +156 -0
  8. package/dist/agent-scope.js +79 -0
  9. package/dist/agent-sessions.js +370 -0
  10. package/dist/agent-state.js +482 -0
  11. package/dist/app-manifest.js +221 -0
  12. package/dist/app-signer.js +54 -0
  13. package/dist/app-signing.js +127 -0
  14. package/dist/audio-play.js +98 -0
  15. package/dist/avatar-protocol.js +25 -0
  16. package/dist/avatar-route.js +79 -0
  17. package/dist/bee/cloud-proxy.js +130 -0
  18. package/dist/blocked-actions.js +120 -0
  19. package/dist/build-channel.js +101 -0
  20. package/dist/buildings/daemon-workspace.js +475 -0
  21. package/dist/claude-bridge.js +310 -0
  22. package/dist/claude-credential-store.js +633 -0
  23. package/dist/clearly-sync.js +518 -0
  24. package/dist/clearly.js +616 -0
  25. package/dist/cli-state.js +334 -0
  26. package/dist/cli.js +6973 -0
  27. package/dist/commands/agent-skills.js +302 -0
  28. package/dist/commands/agent.js +1310 -0
  29. package/dist/commands/app.js +1123 -0
  30. package/dist/commands/auth.js +171 -0
  31. package/dist/commands/building-shell.js +392 -0
  32. package/dist/commands/canvas.js +932 -0
  33. package/dist/commands/claude.js +218 -0
  34. package/dist/commands/compliance.js +387 -0
  35. package/dist/commands/compose.js +507 -0
  36. package/dist/commands/composition.js +95 -0
  37. package/dist/commands/connect-session.js +409 -0
  38. package/dist/commands/conversations.js +160 -0
  39. package/dist/commands/costs.js +443 -0
  40. package/dist/commands/d1.js +253 -0
  41. package/dist/commands/daemon-cmd.js +162 -0
  42. package/dist/commands/deploy.js +164 -0
  43. package/dist/commands/design.js +617 -0
  44. package/dist/commands/dev-generate.js +125 -0
  45. package/dist/commands/dev.js +109 -0
  46. package/dist/commands/devices.js +135 -0
  47. package/dist/commands/explain-router.js +24 -0
  48. package/dist/commands/explain.js +882 -0
  49. package/dist/commands/explore.js +264 -0
  50. package/dist/commands/help.js +2418 -0
  51. package/dist/commands/init.js +408 -0
  52. package/dist/commands/install.js +129 -0
  53. package/dist/commands/library.js +229 -0
  54. package/dist/commands/marketplace.js +138 -0
  55. package/dist/commands/mcp-install.js +476 -0
  56. package/dist/commands/mention.js +257 -0
  57. package/dist/commands/omni.js +529 -0
  58. package/dist/commands/secrets.js +323 -0
  59. package/dist/commands/self-update.js +206 -0
  60. package/dist/commands/sheet.js +264 -0
  61. package/dist/commands/shell-output.js +309 -0
  62. package/dist/commands/shell.js +1048 -0
  63. package/dist/commands/shop.js +368 -0
  64. package/dist/commands/skills.js +311 -0
  65. package/dist/commands/slides.js +418 -0
  66. package/dist/commands/swarm.js +341 -0
  67. package/dist/commands/ticket.js +1301 -0
  68. package/dist/commands/tool.js +312 -0
  69. package/dist/commands/trash.js +106 -0
  70. package/dist/commands/treehouse.js +120 -0
  71. package/dist/commands/user.js +240 -0
  72. package/dist/commands/voice-tts.js +319 -0
  73. package/dist/commands/voice.js +166 -0
  74. package/dist/commands/watch-git.js +401 -0
  75. package/dist/commands/webhook.js +159 -0
  76. package/dist/commands/workspace.js +3354 -0
  77. package/dist/composition-repos.js +91 -0
  78. package/dist/daemon-avatar.js +130 -0
  79. package/dist/daemon-claude-code-auto-install.js +52 -0
  80. package/dist/daemon-client.js +363 -0
  81. package/dist/daemon-codex.js +349 -0
  82. package/dist/daemon-entry.js +101 -0
  83. package/dist/daemon-fetch-allowlist.js +194 -0
  84. package/dist/daemon-gemini.js +224 -0
  85. package/dist/daemon-mcp-clearly.js +353 -0
  86. package/dist/daemon-mcp-sandbox.js +127 -0
  87. package/dist/daemon-omni-company.js +338 -0
  88. package/dist/daemon-omni-hooks.js +375 -0
  89. package/dist/daemon-omni-identity.js +229 -0
  90. package/dist/daemon-omni-pipeline.js +251 -0
  91. package/dist/daemon-omni-policies.js +346 -0
  92. package/dist/daemon-omni-principal.js +580 -0
  93. package/dist/daemon-omni-tool-gate.js +116 -0
  94. package/dist/daemon-omni.js +1442 -0
  95. package/dist/daemon-path-transform.js +120 -0
  96. package/dist/daemon-write-sandbox.js +191 -0
  97. package/dist/daemon.js +4471 -0
  98. package/dist/dashboard.js +846 -0
  99. package/dist/dep-installer.js +286 -0
  100. package/dist/dev-mode.js +67 -0
  101. package/dist/doc-indexer.js +169 -0
  102. package/dist/e2e-crypto.js +94 -0
  103. package/dist/feature-flags.js +154 -0
  104. package/dist/file-browser.js +88 -0
  105. package/dist/first-party-hives.js +211 -0
  106. package/dist/folder-sync.js +226 -0
  107. package/dist/health.js +56 -0
  108. package/dist/ipc-auth.js +299 -0
  109. package/dist/ipc-client.js +495 -0
  110. package/dist/ipc-server.js +684 -0
  111. package/dist/keychain.js +224 -0
  112. package/dist/lib/admin-client.js +73 -0
  113. package/dist/lib/mobile-build-parser.js +156 -0
  114. package/dist/local-app-manager.js +660 -0
  115. package/dist/log-redaction.js +89 -0
  116. package/dist/logger.js +108 -0
  117. package/dist/manifest.js +143 -0
  118. package/dist/marketplace.js +793 -0
  119. package/dist/min-version-copy.js +51 -0
  120. package/dist/min-version.js +214 -0
  121. package/dist/public-surface.js +23 -0
  122. package/dist/relay-presets.js +89 -0
  123. package/dist/relay.js +2723 -0
  124. package/dist/repl.js +619 -0
  125. package/dist/setup-relay.js +363 -0
  126. package/dist/setup-service.js +536 -0
  127. package/dist/shared/bee-memory/index.js +6 -0
  128. package/dist/shared/bee-memory/types.js +682 -0
  129. package/dist/shared/claude-code/daemon-types.js +112 -0
  130. package/dist/shared/claude-code/index.js +2 -0
  131. package/dist/shared/claude-code/types.js +1 -0
  132. package/dist/shared/status/schema.js +133 -0
  133. package/dist/shell-session.js +198 -0
  134. package/dist/speak-lock.js +97 -0
  135. package/dist/spinner.js +57 -0
  136. package/dist/telemetry.js +166 -0
  137. package/dist/terminal/block-parser.js +207 -0
  138. package/dist/terminal/shell-integration.js +108 -0
  139. package/dist/transcript-tailer.js +215 -0
  140. package/dist/tts-qwen3.js +547 -0
  141. package/dist/types.js +4 -0
  142. package/dist/utm.js +38 -0
  143. package/dist/verb-surface.js +331 -0
  144. package/dist/version-utils.js +85 -0
  145. package/dist/watcher.js +207 -0
  146. package/package.json +88 -0
  147. package/python/qwen3_tts.py +230 -0
  148. package/scripts/stamp-build-channel.mjs +115 -0
  149. package/scripts/sync-installed.mjs +159 -0
  150. package/scripts/sync-skills.mjs +112 -0
  151. package/skills/README.md +24 -0
  152. package/skills/agent-doodle-space/SKILL.md +118 -0
  153. package/skills/agent-home/SKILL.md +98 -0
  154. package/skills/beehaven-cli/SKILL.md +144 -0
  155. package/skills/claude-shopper/README.md +90 -0
  156. package/skills/claude-shopper/SKILL.md +151 -0
  157. package/skills/clearly-agent/SKILL.md +183 -0
  158. package/skills/clearly-canvas/SKILL.md +222 -0
  159. package/skills/clearly-canvas/authoring.md +160 -0
  160. package/skills/clearly-canvas/communications.md +32 -0
  161. package/skills/clearly-canvas/composition-patterns.md +84 -0
  162. package/skills/clearly-canvas/example.mjs +78 -0
  163. package/skills/clearly-canvas/project-plans.md +156 -0
  164. package/skills/clearly-canvas/review.mjs +68 -0
  165. package/skills/clearly-workspace/SKILL.md +79 -0
  166. package/skills/clearly-workspace/survey.mjs +101 -0
  167. package/skills/codebase-map/SKILL.md +142 -0
  168. package/skills/design-craft/SKILL.md +300 -0
  169. package/skills/index.json +79 -0
  170. package/skills/layout-systems/SKILL.md +184 -0
  171. package/skills/pair-on-canvas/SKILL.md +92 -0
@@ -0,0 +1,229 @@
1
+ /**
2
+ * `beehaven library` — browse + search the user's cloud library.
3
+ *
4
+ * The library is the DO-side index of everything the agent can reference:
5
+ * voice recordings, TTS outputs, transcripts, code snippets, clipboard
6
+ * grabs, typed notes. Each row is backed by a body preview (for FTS) and
7
+ * an optional R2 blob (for audio).
8
+ *
9
+ * Commands:
10
+ * beehaven library [list] — recent entries (default)
11
+ * beehaven library list --kind audio-in
12
+ * beehaven library search "query" — FTS across title/body/tags
13
+ * beehaven library get <id> — print a row (with signed url if audio)
14
+ * beehaven library add "text" — save a new text row
15
+ * beehaven library rm <id> — delete a row + its R2 blob
16
+ *
17
+ * All subcommands route through the daemon → relay → DO library-* actions,
18
+ * so any surface that can talk to the daemon (Mac app, other CLIs, agents)
19
+ * sees the same library.
20
+ */
21
+ import { rpcOnce } from '../ipc-client.js';
22
+ function tsToAge(ts) {
23
+ if (!ts)
24
+ return '?';
25
+ const ms = Date.now() - ts;
26
+ if (ms < 60_000)
27
+ return `${Math.round(ms / 1000)}s ago`;
28
+ if (ms < 3_600_000)
29
+ return `${Math.round(ms / 60_000)}m ago`;
30
+ if (ms < 86_400_000)
31
+ return `${Math.round(ms / 3_600_000)}h ago`;
32
+ return `${Math.round(ms / 86_400_000)}d ago`;
33
+ }
34
+ function fmtBytes(n) {
35
+ if (!n)
36
+ return '';
37
+ if (n < 1024)
38
+ return `${n}B`;
39
+ if (n < 1024 * 1024)
40
+ return `${(n / 1024).toFixed(1)}K`;
41
+ return `${(n / 1024 / 1024).toFixed(1)}M`;
42
+ }
43
+ function fmtRow(r) {
44
+ const id = (r.id ?? '').slice(0, 8);
45
+ const kind = (r.kind ?? 'text').padEnd(10);
46
+ const age = tsToAge(r.updated_at ?? r.created_at).padStart(8);
47
+ const size = r.size_bytes ? fmtBytes(r.size_bytes).padStart(6) : ' ';
48
+ const dur = r.duration_ms > 0 ? `${Math.round(r.duration_ms / 1000)}s` : '';
49
+ const title = (r.title ?? '').slice(0, 50);
50
+ const preview = (r.body_preview ?? '').replace(/\s+/g, ' ').slice(0, 40);
51
+ return ` ${id} ${kind} ${age} ${size} ${dur.padEnd(4)} ${title}${preview ? ' — ' + preview : ''}`;
52
+ }
53
+ /**
54
+ * ⚠⚠ PRINT THE HINT AND THE CANDIDATES, NOT JUST THE ERROR LINE (CBH2-30).
55
+ *
56
+ * The server resolves an abbreviated id now, and when it cannot it says WHY — "ids are shown
57
+ * abbreviated and accepted as a 6+ char prefix", or a list of the entries a prefix matched. This
58
+ * printed `result.error` alone and dropped both, which is how the whole class of defect survives:
59
+ * the fix lands on the server and the surface a person reads still shows a dead end.
60
+ *
61
+ * ⚠ THE CANDIDATES ARE THE ANSWER TO AN AMBIGUOUS PREFIX. Without them "matches 3 entries" tells
62
+ * you to type more characters without telling you which ones.
63
+ */
64
+ function printLibraryError(result) {
65
+ console.error(` ${result?.error ?? 'library call failed'}`);
66
+ if (Array.isArray(result?.matches)) {
67
+ for (const m of result.matches.slice(0, 10)) {
68
+ console.error(` ${String(m.id ?? '')} ${String(m.kind ?? '')} ${String(m.title ?? '')}`.trimEnd());
69
+ }
70
+ }
71
+ if (result?.hint)
72
+ console.error(` ${result.hint}`);
73
+ }
74
+ export async function cmdLibrary(args, values) {
75
+ const sub = args[0] || 'list';
76
+ const timeout = Math.max(Number(values.timeout) || 30_000, 30_000);
77
+ try {
78
+ switch (sub) {
79
+ case 'list':
80
+ case 'ls': {
81
+ const result = await rpcOnce('library-list', {
82
+ limit: Number(values.limit) || 20,
83
+ kind: values.kind,
84
+ projectId: values.project,
85
+ }, timeout);
86
+ const rows = result?.rows ?? [];
87
+ if (values.json) {
88
+ console.log(JSON.stringify(rows, null, 2));
89
+ return;
90
+ }
91
+ if (rows.length === 0) {
92
+ console.log(' (library is empty)');
93
+ return;
94
+ }
95
+ console.log(` ${rows.length} entries (most recent first):`);
96
+ console.log('');
97
+ for (const r of rows)
98
+ console.log(fmtRow(r));
99
+ console.log('');
100
+ return;
101
+ }
102
+ case 'search': {
103
+ const query = args.slice(1).join(' ');
104
+ if (!query) {
105
+ console.error(' Usage: beehaven library search "<query>"');
106
+ process.exit(1);
107
+ }
108
+ const result = await rpcOnce('library-search', {
109
+ query,
110
+ limit: Number(values.limit) || 20,
111
+ }, timeout);
112
+ const rows = result?.rows ?? [];
113
+ if (values.json) {
114
+ console.log(JSON.stringify(rows, null, 2));
115
+ return;
116
+ }
117
+ if (rows.length === 0) {
118
+ console.log(` No results for "${query}"`);
119
+ return;
120
+ }
121
+ console.log(` ${rows.length} matches for "${query}":`);
122
+ console.log('');
123
+ for (const r of rows)
124
+ console.log(fmtRow(r));
125
+ console.log('');
126
+ return;
127
+ }
128
+ case 'get':
129
+ case 'show':
130
+ case 'cat': {
131
+ const id = args[1];
132
+ if (!id) {
133
+ console.error(' Usage: beehaven library get <id>');
134
+ process.exit(1);
135
+ }
136
+ const result = await rpcOnce('library-get', {
137
+ id,
138
+ includeSignedUrl: true,
139
+ }, timeout);
140
+ if (result?.error) {
141
+ printLibraryError(result);
142
+ process.exit(1);
143
+ }
144
+ if (values.json) {
145
+ console.log(JSON.stringify(result, null, 2));
146
+ return;
147
+ }
148
+ const row = result.row;
149
+ console.log('');
150
+ console.log(` id: ${row.id}`);
151
+ console.log(` kind: ${row.kind}`);
152
+ console.log(` title: ${row.title}`);
153
+ console.log(` source: ${row.source || '—'}`);
154
+ console.log(` session: ${row.session_id || '—'}`);
155
+ console.log(` created: ${new Date(row.created_at).toISOString()}`);
156
+ if (row.duration_ms > 0)
157
+ console.log(` duration: ${Math.round(row.duration_ms / 1000)}s`);
158
+ if (row.size_bytes > 0)
159
+ console.log(` size: ${fmtBytes(row.size_bytes)}`);
160
+ if (row.r2_key)
161
+ console.log(` r2_key: ${row.r2_key}`);
162
+ if (result.signedUrl)
163
+ console.log(` download: ${result.signedUrl}`);
164
+ console.log(` ref_count: ${row.ref_count ?? 0}`);
165
+ const tags = typeof row.tags === 'string' ? JSON.parse(row.tags || '[]') : row.tags;
166
+ if (tags?.length)
167
+ console.log(` tags: ${tags.join(', ')}`);
168
+ if (row.body_preview) {
169
+ console.log('');
170
+ console.log(' body:');
171
+ console.log(' ' + row.body_preview.split('\n').join('\n '));
172
+ }
173
+ console.log('');
174
+ return;
175
+ }
176
+ case 'add': {
177
+ const text = args.slice(1).join(' ');
178
+ if (!text) {
179
+ console.error(' Usage: beehaven library add "<text>" [--kind text|code|clip|url] [--title "..."] [--tags a,b,c]');
180
+ process.exit(1);
181
+ }
182
+ const tags = values.tags
183
+ ? String(values.tags)
184
+ .split(',')
185
+ .map((t) => t.trim())
186
+ .filter(Boolean)
187
+ : undefined;
188
+ const result = await rpcOnce('library-add', {
189
+ kind: values.kind || 'text',
190
+ title: values.title,
191
+ text,
192
+ tags,
193
+ source: values.source || 'cli',
194
+ projectId: values.project,
195
+ }, timeout);
196
+ if (result?.error) {
197
+ printLibraryError(result);
198
+ process.exit(1);
199
+ }
200
+ console.log(` Added: ${result.id}`);
201
+ return;
202
+ }
203
+ case 'rm':
204
+ case 'delete':
205
+ case 'remove': {
206
+ const id = args[1];
207
+ if (!id) {
208
+ console.error(' Usage: beehaven library rm <id>');
209
+ process.exit(1);
210
+ }
211
+ const result = await rpcOnce('library-delete', { id }, timeout);
212
+ if (result?.error) {
213
+ printLibraryError(result);
214
+ process.exit(1);
215
+ }
216
+ console.log(` Deleted ${id}`);
217
+ return;
218
+ }
219
+ default:
220
+ console.error(` Unknown subcommand: ${sub}`);
221
+ console.error(` Try: beehaven library [list|search|get|add|rm]`);
222
+ process.exit(1);
223
+ }
224
+ }
225
+ catch (err) {
226
+ console.error(` ${err.message}`);
227
+ process.exit(1);
228
+ }
229
+ }
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Marketplace Commands — publish and browse beehaven packages.
3
+ *
4
+ * A package is a beehaven.json manifest + tools + docs + data.
5
+ * Published to R2 via the cloud DO.
6
+ *
7
+ * beehaven publish — publish current project as a package
8
+ * beehaven marketplace — browse available packages
9
+ * beehaven marketplace search — search packages
10
+ *
11
+ * NOTE: `beehaven install` is the shorthand for `beehaven app install` —
12
+ * see commands/app.ts. The previous `cmdInstall` export here (a
13
+ * marketplace-specific install that wrote project files to cwd) was
14
+ * removed when the top-level `install` verb was unified with `app
15
+ * install`. If a separate "install a project-level package" verb is
16
+ * ever needed again, register it under a different name (e.g.
17
+ * `beehaven marketplace install`) to keep the meanings distinct.
18
+ */
19
+ import { existsSync, readFileSync } from 'fs';
20
+ import { join } from 'path';
21
+ import { rpcOnce } from '../ipc-client.js';
22
+ import { loadManifest } from '../manifest.js';
23
+ /**
24
+ * `beehaven publish` — package the current project and publish to marketplace.
25
+ *
26
+ * Reads beehaven.json, validates, creates a package bundle,
27
+ * uploads to the cloud DO which stores it in R2.
28
+ */
29
+ export async function cmdPublish(values) {
30
+ const cwd = process.cwd();
31
+ const manifest = loadManifest(cwd);
32
+ if (!manifest) {
33
+ console.error(' No beehaven.json found in current directory.');
34
+ console.error(' Create one with: beehaven init --template api');
35
+ process.exit(1);
36
+ }
37
+ if (!manifest.name) {
38
+ console.error(' beehaven.json missing required "name" field.');
39
+ process.exit(1);
40
+ }
41
+ console.log(` Publishing ${manifest.name}@${manifest.version || '0.0.0'}...`);
42
+ // Collect package metadata
43
+ const pkg = {
44
+ name: manifest.name,
45
+ version: manifest.version || '0.0.0',
46
+ description: manifest.description || '',
47
+ author: manifest.author || '',
48
+ tools: manifest.tools || [],
49
+ docs: manifest.docs || [],
50
+ install: manifest.install,
51
+ price: manifest.price || 'free',
52
+ };
53
+ // Include tool source files (for command-based tools)
54
+ const toolFiles = {};
55
+ if (manifest.tools) {
56
+ for (const tool of manifest.tools) {
57
+ if (tool.command) {
58
+ // Try to find the script referenced in the command
59
+ const match = tool.command.match(/^(\S+\s+)?(\S+\.\w+)/);
60
+ if (match?.[2]) {
61
+ const scriptPath = join(cwd, match[2]);
62
+ if (existsSync(scriptPath)) {
63
+ toolFiles[match[2]] = readFileSync(scriptPath, 'utf8');
64
+ }
65
+ }
66
+ }
67
+ }
68
+ }
69
+ // Include doc files
70
+ const docFiles = {};
71
+ if (manifest.docs) {
72
+ for (const docPath of manifest.docs) {
73
+ const abs = join(cwd, docPath);
74
+ if (existsSync(abs)) {
75
+ try {
76
+ const stat = require('fs').statSync(abs);
77
+ if (stat.isFile()) {
78
+ docFiles[docPath] = readFileSync(abs, 'utf8');
79
+ }
80
+ }
81
+ catch { }
82
+ }
83
+ }
84
+ }
85
+ try {
86
+ const result = await rpcOnce('marketplace:publish', {
87
+ package: pkg,
88
+ toolFiles,
89
+ docFiles,
90
+ }, 30_000);
91
+ if (result.error) {
92
+ console.error(` Publish failed: ${result.error}`);
93
+ process.exit(1);
94
+ }
95
+ console.log(` Published: ${manifest.name}@${pkg.version}`);
96
+ if (result.url)
97
+ console.log(` URL: ${result.url}`);
98
+ }
99
+ catch (err) {
100
+ console.error(` Error: ${err.message}`);
101
+ process.exit(1);
102
+ }
103
+ }
104
+ /**
105
+ * `beehaven marketplace [search]` — browse or search the marketplace.
106
+ */
107
+ export async function cmdMarketplace(query, values) {
108
+ try {
109
+ const result = await rpcOnce('marketplace:list', { query, limit: 50 }, 15_000);
110
+ if (values.json) {
111
+ console.log(JSON.stringify(result, null, 2));
112
+ return;
113
+ }
114
+ const packages = result.packages || [];
115
+ if (packages.length === 0) {
116
+ console.log(query ? ` No packages matching "${query}".` : ' Marketplace is empty.');
117
+ return;
118
+ }
119
+ console.log('');
120
+ console.log(` Beehaven Marketplace — ${packages.length} package(s)`);
121
+ console.log(' ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
122
+ console.log('');
123
+ for (const pkg of packages) {
124
+ const tools = pkg.tools?.length || 0;
125
+ const price = pkg.price === 'free' ? '\x1b[32mfree\x1b[0m' : `\x1b[33m$${pkg.price}\x1b[0m`;
126
+ console.log(` \x1b[36m${pkg.name}\x1b[0m@${pkg.version || '?'} ${price} ${tools} tool(s)`);
127
+ if (pkg.description)
128
+ console.log(` ${pkg.description}`);
129
+ }
130
+ console.log('');
131
+ console.log(' Install: beehaven install <name>');
132
+ console.log('');
133
+ }
134
+ catch (err) {
135
+ console.error(` Error: ${err.message}`);
136
+ process.exit(1);
137
+ }
138
+ }