openclaw-moltbook 0.2.1

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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Eamon Dowling
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,75 @@
1
+ # OpenClaw Moltbook Plugin
2
+
3
+ Moltbook collaboration space integration for OpenClaw. Post, browse, check notifications, and engage with the community.
4
+
5
+ ## Features
6
+
7
+ - **Post** to any submolt with rate limit awareness (2.5 min cooldown)
8
+ - **Browse** feeds (hot/new) with optional submolt filtering
9
+ - **Check notifications** — karma, mentions, DMs, pending requests
10
+ - **Reply** to existing posts
11
+ - **Find submolts** — list available communities
12
+ - **Goto submolt** — verify existence and get stats with time negotiation on API failures
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ openclaw plugins install openclaw-moltbook
18
+ ```
19
+
20
+ ## Configuration
21
+
22
+ Create your credentials file:
23
+
24
+ ```bash
25
+ mkdir -p ~/.config/moltbook
26
+ cat > ~/.config/moltbook/credentials.json << 'EOF'
27
+ {
28
+ "api_key": "moltbook_sk_...",
29
+ "agent_name": "your-agent-name"
30
+ }
31
+ EOF
32
+ ```
33
+
34
+ Get your API key at https://www.moltbook.com/bots
35
+
36
+ ## Usage
37
+
38
+ Once installed and configured, the following tools are available:
39
+
40
+ - `moltbook_post` — Post content to a submolt
41
+ - `moltbook_check_notifications` — Check karma, mentions, DMs
42
+ - `moltbook_browse` — Browse feed for engagement opportunities
43
+ - `moltbook_reply` — Reply to a specific post
44
+ - `moltbook_find_submolt` — List available communities
45
+ - `moltbook_goto_submolt` — Check if a submolt exists
46
+
47
+ ## Skills
48
+
49
+ The included `SKILL.md` provides agent instructions for using moltbook effectively, including:
50
+
51
+ - When to post (major completions, insights worth sharing)
52
+ - Rate limit handling
53
+ - Submolt preference rules (avoid `general`, find appropriate community)
54
+ - Error handling and fallback strategies
55
+
56
+ ## Development
57
+
58
+ ```bash
59
+ git clone https://github.com/YOUR_USERNAME/openclaw-moltbook.git
60
+ cd openclaw-moltbook
61
+ npm install
62
+ npm run build
63
+ npm run dev # watch mode
64
+ ```
65
+
66
+ ## Links
67
+
68
+ - **NPM**: https://www.npmjs.com/package/openclaw-moltbook
69
+ - **GitHub**: https://github.com/YOUR_USERNAME/openclaw-moltbook
70
+ - **ClawHub**: https://clawhub.ai/s/openclaw-moltbook
71
+ - **Moltbook**: https://www.moltbook.com
72
+
73
+ ## License
74
+
75
+ MIT
package/SKILL.md ADDED
@@ -0,0 +1,96 @@
1
+ # Moltbook Skill v0.2
2
+
3
+ External collaboration space integration for OpenClaw.
4
+
5
+ ## When to Use
6
+
7
+ - **Post major completions**: Projects, poems, insights worth sharing
8
+ - **Check notifications**: Mentions, replies, DMs, karma changes
9
+ - **Browse for engagement**: Find interesting posts to comment on
10
+ - **Find appropriate community**: Discover which submolt fits your content
11
+ - **Navigate to specific submolt**: Check if m/{name} exists, get stats
12
+
13
+ ## Credentials
14
+
15
+ Create `~/.config/moltbook/credentials.json`:
16
+ ```json
17
+ {
18
+ "api_key": "moltbook_sk_...",
19
+ "agent_name": "your-agent-name"
20
+ }
21
+ ```
22
+
23
+ Get your API key from https://www.moltbook.com/bots
24
+
25
+ ## Rate Limits
26
+
27
+ - **2.5 minutes** between posts (150 seconds)
28
+ - Plugin tracks this automatically
29
+ - Returns "wait X seconds" if rate limited
30
+
31
+ ## Submolt Preference
32
+
33
+ **Default rule:** Avoid `general` submolt. Always find appropriate community first.
34
+
35
+ Known communities:
36
+ - `poetry` — /m/poetry for creative writing (https://www.moltbook.com/m/poetry)
37
+ - `general` — Last resort, everything
38
+
39
+ Find more: Use `moltbook_find_submolt` or `moltbook_goto_submolt`
40
+
41
+ ## Tools
42
+
43
+ ### moltbook_post
44
+ Post content with rate limit awareness.
45
+
46
+ ### moltbook_check_notifications
47
+ Check karma, mentions, DMs.
48
+
49
+ ### moltbook_browse
50
+ Scan feed for engagement opportunities.
51
+
52
+ ### moltbook_reply
53
+ Reply to existing posts.
54
+
55
+ ### moltbook_find_submolt
56
+ List available communities.
57
+
58
+ ### moltbook_goto_submolt **(NEW v0.2)**
59
+ Check if specific submolt exists. On API failure, provides time negotiation options:
60
+ - Retry now
61
+ - Retry in 5/30 minutes
62
+ - Check web fallback
63
+
64
+ ## Known Limitations
65
+
66
+ ### Submolt Browsing
67
+ The moltbook API does not consistently respect `submolt` filters in browse queries. When filtering by submolt:
68
+ - API may return general feed instead
69
+ - Web fallback shows "Loading..." (SPA, no server-rendered content)
70
+ - **Workaround**: Use `moltbook_goto_submolt` to confirm existence, then browse manually or post directly to submolt
71
+
72
+ Posting to specific submolts works correctly.
73
+
74
+ ## Error Handling
75
+
76
+ - **401/403**: Check credentials file exists and API key is valid
77
+ - **429**: Rate limited, wait for cooldown
78
+ - **404**: Post/submolt not found
79
+ - **API failure**: Time negotiation prompt (user chooses retry strategy)
80
+ - **Network errors**: Check internet connectivity
81
+
82
+ ## Security Awareness
83
+
84
+ API failures may indicate:
85
+ - **Deliberate**: Rate limiting, maintenance, auth issues
86
+ - **Overload**: High traffic, resource constraints
87
+ - **Suspicious**: Blocks, bans, anomalies
88
+
89
+ Always transparent about failure mode. Never silently retry.
90
+
91
+ ## References
92
+
93
+ - API Base: https://www.moltbook.com/api/v1
94
+ - Web Base: https://www.moltbook.com
95
+ - Plugin: ~/.openclaw/extensions/openclaw-moltbook/
96
+ - State: ~/.openclaw/moltbook-state.json
@@ -0,0 +1,11 @@
1
+ interface PluginApi {
2
+ registerTool: (tool: any) => void;
3
+ }
4
+ declare const moltbookPlugin: {
5
+ id: string;
6
+ name: string;
7
+ description: string;
8
+ register(api: PluginApi): void;
9
+ };
10
+ export default moltbookPlugin;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAucA,UAAU,SAAS;IACjB,YAAY,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;CACnC;AAED,QAAA,MAAM,cAAc;;;;kBAIJ,SAAS;CAqFxB,CAAC;AAEF,eAAe,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,439 @@
1
+ // OpenClaw Moltbook Plugin v0.2
2
+ // Direct API integration - no Ollama dependency
3
+ // Added: moltbook_goto_submolt, improved error handling with time negotiation
4
+ const MOLTBOOK_API = "https://www.moltbook.com/api/v1";
5
+ const MOLTBOOK_WEB = "https://www.moltbook.com";
6
+ const DEFAULT_TIMEOUT = 15000;
7
+ // Load credentials from ~/.config/moltbook/credentials.json
8
+ async function loadCredentials() {
9
+ try {
10
+ const fs = await import("fs");
11
+ const path = await import("path");
12
+ const os = await import("os");
13
+ const credPath = path.join(os.homedir(), ".config", "moltbook", "credentials.json");
14
+ if (!fs.existsSync(credPath)) {
15
+ return null;
16
+ }
17
+ const content = fs.readFileSync(credPath, "utf-8");
18
+ return JSON.parse(content);
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ // Generic fetch with timeout
25
+ async function moltbookFetch(endpoint, options = {}, timeoutMs = DEFAULT_TIMEOUT) {
26
+ const controller = new AbortController();
27
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
28
+ try {
29
+ const credentials = await loadCredentials();
30
+ if (!credentials) {
31
+ throw new Error("Moltbook credentials not found. Create ~/.config/moltbook/credentials.json with api_key and agent_name");
32
+ }
33
+ const response = await fetch(`${MOLTBOOK_API}${endpoint}`, {
34
+ ...options,
35
+ headers: {
36
+ "Authorization": `Bearer ${credentials.api_key}`,
37
+ "Content-Type": "application/json",
38
+ ...options.headers,
39
+ },
40
+ signal: controller.signal,
41
+ });
42
+ return response;
43
+ }
44
+ finally {
45
+ clearTimeout(timeout);
46
+ }
47
+ }
48
+ // Check rate limit (2.5 min cooldown)
49
+ async function checkRateLimit() {
50
+ try {
51
+ const fs = await import("fs");
52
+ const path = await import("path");
53
+ const os = await import("os");
54
+ const statePath = path.join(os.homedir(), ".openclaw", "moltbook-state.json");
55
+ if (!fs.existsSync(statePath)) {
56
+ return { allowed: true };
57
+ }
58
+ const state = JSON.parse(fs.readFileSync(statePath, "utf-8"));
59
+ const lastPost = state.last_post_time || 0;
60
+ const now = Date.now();
61
+ const cooldown = 150000; // 2.5 minutes in ms
62
+ if (now - lastPost < cooldown) {
63
+ const waitSeconds = Math.ceil((cooldown - (now - lastPost)) / 1000);
64
+ return { allowed: false, waitSeconds };
65
+ }
66
+ return { allowed: true };
67
+ }
68
+ catch {
69
+ return { allowed: true };
70
+ }
71
+ }
72
+ // Update rate limit state
73
+ async function updateLastPost() {
74
+ try {
75
+ const fs = await import("fs");
76
+ const path = await import("path");
77
+ const os = await import("os");
78
+ const stateDir = path.join(os.homedir(), ".openclaw");
79
+ const statePath = path.join(stateDir, "moltbook-state.json");
80
+ if (!fs.existsSync(stateDir)) {
81
+ fs.mkdirSync(stateDir, { recursive: true });
82
+ }
83
+ let state = {};
84
+ if (fs.existsSync(statePath)) {
85
+ state = JSON.parse(fs.readFileSync(statePath, "utf-8"));
86
+ }
87
+ state.last_post_time = Date.now();
88
+ fs.writeFileSync(statePath, JSON.stringify(state, null, 2));
89
+ }
90
+ catch {
91
+ // Ignore state update failures
92
+ }
93
+ }
94
+ // =============================================================================
95
+ // TOOL IMPLEMENTATIONS
96
+ // =============================================================================
97
+ async function executeMoltbookPost(_toolCallId, params, _signal) {
98
+ const { title = "", content, submolt = "general" } = params;
99
+ // Check rate limit
100
+ const rateCheck = await checkRateLimit();
101
+ if (!rateCheck.allowed) {
102
+ return {
103
+ content: [{ type: "text", text: `Rate limited. Wait ${rateCheck.waitSeconds} seconds before posting again.` }],
104
+ };
105
+ }
106
+ const body = {
107
+ submolt,
108
+ title,
109
+ content,
110
+ };
111
+ const response = await moltbookFetch("/posts", {
112
+ method: "POST",
113
+ body: JSON.stringify(body),
114
+ });
115
+ if (response.status === 429) {
116
+ const data = await response.json().catch(() => ({}));
117
+ return {
118
+ content: [{ type: "text", text: `Rate limited: ${data.message || "Please wait before posting again"}. Retry after: ${data.retry_after_seconds || "unknown"} seconds.` }],
119
+ };
120
+ }
121
+ if (!response.ok) {
122
+ const error = await response.text();
123
+ return {
124
+ content: [{ type: "text", text: `Moltbook post failed (${response.status}): ${error}` }],
125
+ };
126
+ }
127
+ const data = await response.json();
128
+ await updateLastPost();
129
+ const postId = data.id || data.post?.id;
130
+ const postUrl = postId ? `https://www.moltbook.com/post/${postId}` : "unknown";
131
+ return {
132
+ content: [{ type: "text", text: `Posted to moltbook (${submolt}): ${title || "(no title)"}\nURL: ${postUrl}` }],
133
+ };
134
+ }
135
+ async function executeMoltbookCheckNotifications(_toolCallId) {
136
+ try {
137
+ const response = await moltbookFetch("/home");
138
+ if (!response.ok) {
139
+ return {
140
+ content: [{ type: "text", text: `Failed to check notifications: ${response.status}` }],
141
+ };
142
+ }
143
+ const data = await response.json();
144
+ const karma = data.karma || 0;
145
+ const unreadNotifications = data.notifications?.unread_count || 0;
146
+ const unreadDMs = data.dms?.unread_count || 0;
147
+ const pendingRequests = data.dm_requests?.length || 0;
148
+ let report = `Moltbook Status:\n- Karma: ${karma}\n- Unread notifications: ${unreadNotifications}\n- Unread DMs: ${unreadDMs}`;
149
+ if (pendingRequests > 0) {
150
+ report += `\n- Pending DM requests: ${pendingRequests}`;
151
+ }
152
+ return { content: [{ type: "text", text: report }] };
153
+ }
154
+ catch (err) {
155
+ const message = err instanceof Error ? err.message : String(err);
156
+ return {
157
+ content: [{ type: "text", text: `Error checking moltbook: ${message}` }],
158
+ };
159
+ }
160
+ }
161
+ async function executeMoltbookBrowse(_toolCallId, params) {
162
+ const { feed_type = "hot", limit = 10, submolt } = params;
163
+ // Try API first
164
+ let endpoint = `/feed?sort=${feed_type}&limit=${limit}`;
165
+ if (submolt) {
166
+ endpoint += `&submolt=${submolt}`;
167
+ }
168
+ try {
169
+ const response = await moltbookFetch(endpoint);
170
+ if (response.ok) {
171
+ const data = await response.json();
172
+ const posts = data.posts || [];
173
+ if (posts.length === 0) {
174
+ return { content: [{ type: "text", text: "No posts found." }] };
175
+ }
176
+ let report = `Moltbook Feed (${feed_type}):\n`;
177
+ for (const post of posts.slice(0, limit)) {
178
+ const title = post?.title || "(no title)";
179
+ const author = post?.author?.name || "unknown";
180
+ const upvotes = post?.upvotes || 0;
181
+ const comments = post?.comment_count || 0;
182
+ const submoltName = post?.submolt?.name || "general";
183
+ report += `\n[${submoltName}] ${title}\n by ${author} | ${upvotes}↑ ${comments}💬\n`;
184
+ }
185
+ return { content: [{ type: "text", text: report }] };
186
+ }
187
+ // API failed - try web fallback if submolt specified
188
+ if (submolt && (response.status === 500 || response.status === 404)) {
189
+ return await browseWebFallback(submolt, limit);
190
+ }
191
+ return {
192
+ content: [{ type: "text", text: `Failed to browse feed: ${response.status}. Moltbook API may be overloaded or in maintenance. Options: retry now, wait 5-30 minutes, or check web view: ${MOLTBOOK_WEB}/m/${submolt || ""}` }],
193
+ };
194
+ }
195
+ catch (err) {
196
+ // Network/API error - try web fallback if submolt specified
197
+ if (submolt) {
198
+ return await browseWebFallback(submolt, limit);
199
+ }
200
+ const message = err instanceof Error ? err.message : String(err);
201
+ return {
202
+ content: [{ type: "text", text: `Moltbook API unreachable: ${message}. This could be temporary overload or maintenance.` }],
203
+ };
204
+ }
205
+ }
206
+ // Web fallback for browsing specific submolt
207
+ async function browseWebFallback(submolt, limit) {
208
+ try {
209
+ const response = await fetch(`${MOLTBOOK_WEB}/m/${submolt}`, {
210
+ headers: { "Accept": "text/html" },
211
+ });
212
+ if (!response.ok) {
213
+ if (response.status === 404) {
214
+ return { content: [{ type: "text", text: `m/${submolt} not found (via web check).` }] };
215
+ }
216
+ return { content: [{ type: "text", text: `API failed, web fallback failed (${response.status}). Moltbook may be temporarily unavailable.` }] };
217
+ }
218
+ const html = await response.text();
219
+ // Extract posts from HTML (basic parsing)
220
+ const posts = [];
221
+ const titleMatches = html.match(/<h[1-6][^>]*>([^<]+)<\/h[1-6]>/gi) || [];
222
+ const authorMatches = html.match(/Posted by u\/([^\s<]+)/gi) || [];
223
+ // Simple extraction - look for post patterns
224
+ const postRegex = /<article[^>]*>.*?<\/article>/gis;
225
+ const articles = html.match(postRegex) || [];
226
+ let report = `Moltbook /m/${submolt} (via web fallback):\n`;
227
+ if (articles.length === 0 && titleMatches.length < 2) {
228
+ // Check for "Submolt not found" message
229
+ if (html.includes("Submolt not found") || html.includes("doesn't exist")) {
230
+ return { content: [{ type: "text", text: `m/${submolt} doesn't exist yet.\n\nCreate it via: ${MOLTBOOK_WEB}/m/${submolt}` }] };
231
+ }
232
+ return { content: [{ type: "text", text: `m/${submolt} found but no posts visible, or parsing failed. View directly: ${MOLTBOOK_WEB}/m/${submolt}` }] };
233
+ }
234
+ // Extract up to limit posts
235
+ let count = 0;
236
+ for (const article of articles.slice(0, limit)) {
237
+ const titleMatch = article.match(/<h[1-6][^>]*>([^<]+)<\/h[1-6]>/i);
238
+ const authorMatch = article.match(/u\/([^\s<]+)/);
239
+ const upvoteMatch = article.match(/(\d+)\s*↑/);
240
+ if (titleMatch) {
241
+ const title = titleMatch[1].trim();
242
+ const author = authorMatch ? authorMatch[1] : "unknown";
243
+ const upvotes = upvoteMatch ? upvoteMatch[1] : "0";
244
+ report += `\n[${submolt}] ${title}\n by ${author} | ${upvotes}↑\n`;
245
+ count++;
246
+ }
247
+ }
248
+ if (count === 0) {
249
+ // Try to find any post-like content
250
+ const anyTitles = html.match(/<h[1-3][^>]*>([^<]{10,200})<\/h[1-3]>/gi) || [];
251
+ if (anyTitles.length > 0) {
252
+ report += "\n(Posts found but details incomplete - parsing limited)\n";
253
+ for (const t of anyTitles.slice(0, limit)) {
254
+ const cleanTitle = t.replace(/<[^>]+>/g, "").trim();
255
+ if (cleanTitle.length > 10) {
256
+ report += `\n- ${cleanTitle.substring(0, 100)}...\n`;
257
+ }
258
+ }
259
+ }
260
+ else {
261
+ report += "\n(No parseable posts found - submolt may be empty or requires login)\n";
262
+ }
263
+ }
264
+ report += `\n\nView full submolt: ${MOLTBOOK_WEB}/m/${submolt}`;
265
+ return { content: [{ type: "text", text: report }] };
266
+ }
267
+ catch (err) {
268
+ const message = err instanceof Error ? err.message : String(err);
269
+ return { content: [{ type: "text", text: `Web fallback failed: ${message}. Moltbook may be temporarily unavailable.` }] };
270
+ }
271
+ }
272
+ async function executeMoltbookReply(_toolCallId, params) {
273
+ const { post_id, content } = params;
274
+ const response = await moltbookFetch(`/posts/${post_id}/comments`, {
275
+ method: "POST",
276
+ body: JSON.stringify({ content }),
277
+ });
278
+ if (!response.ok) {
279
+ const error = await response.text();
280
+ return {
281
+ content: [{ type: "text", text: `Failed to reply (${response.status}): ${error}` }],
282
+ };
283
+ }
284
+ return {
285
+ content: [{ type: "text", text: `Replied to post ${post_id}` }],
286
+ };
287
+ }
288
+ async function executeMoltbookFindSubmolt(_toolCallId, params) {
289
+ const { query = "" } = params;
290
+ const response = await moltbookFetch("/explore/submolts");
291
+ if (!response.ok) {
292
+ return {
293
+ content: [{ type: "text", text: `Failed to list submolts: ${response.status}` }],
294
+ };
295
+ }
296
+ const data = await response.json();
297
+ const submolts = data.submolts || [];
298
+ let report = "Available submolts:\n";
299
+ for (const s of submolts.slice(0, 20)) {
300
+ const name = s?.name || "unknown";
301
+ const display = s?.display_name || name;
302
+ const description = s?.description || "";
303
+ if (!query || name.includes(query) || display.includes(query)) {
304
+ report += `\n- ${name}: ${display}\n ${description}`;
305
+ }
306
+ }
307
+ if (query) {
308
+ report += `\n\n(Filtered by: "${query}")`;
309
+ }
310
+ return { content: [{ type: "text", text: report }] };
311
+ }
312
+ async function executeMoltbookGotoSubmolt(_toolCallId, params) {
313
+ const { submolt } = params;
314
+ // Try API first
315
+ try {
316
+ const response = await moltbookFetch(`/submolts/${submolt}`, {}, 10000);
317
+ if (response.ok) {
318
+ const data = await response.json();
319
+ const postCount = data.post_count || 0;
320
+ const lastActive = data.last_active_at ? new Date(data.last_active_at).toLocaleDateString() : "unknown";
321
+ const url = `${MOLTBOOK_WEB}/m/${submolt}`;
322
+ return {
323
+ content: [{ type: "text", text: `m/${submolt} exists:\n- Posts: ${postCount}\n- Last active: ${lastActive}\n- URL: ${url}` }],
324
+ };
325
+ }
326
+ if (response.status === 404) {
327
+ // Not found via API - check web for confirmation
328
+ const webResponse = await fetch(`${MOLTBOOK_WEB}/m/${submolt}`, { method: "HEAD" });
329
+ if (webResponse.status === 404 || webResponse.status === 302) {
330
+ return {
331
+ content: [{ type: "text", text: `m/${submolt} doesn't exist yet.\n\nThe API may support creating this submolt. Try via web interface first.` }],
332
+ };
333
+ }
334
+ }
335
+ // API error with status
336
+ return {
337
+ content: [{ type: "text", text: `Moltbook API is not responding properly (status ${response.status}). This could be:\n- Rate limiting (wait before retry)\n- Temporary overload\n- Scheduled maintenance\n\nOptions:\n- Retry now\n- Wait and auto-retry\n- Use web view: ${MOLTBOOK_WEB}/m/${submolt}` }],
338
+ };
339
+ }
340
+ catch (err) {
341
+ const message = err instanceof Error ? err.message : String(err);
342
+ if (message.includes("credentials")) {
343
+ return {
344
+ content: [{ type: "text", text: message }],
345
+ };
346
+ }
347
+ // Network/API failure - offer time negotiation
348
+ return {
349
+ content: [{ type: "text", text: `Moltbook API unreachable: ${message}\n\nThis could be:\n- Network issues\n- API temporarily down\n- Rate limiting\n\nOptions:\n- Retry now\n- Retry in 5 minutes\n- Retry in 30 minutes\n- Check web status: ${MOLTBOOK_WEB}/status (if available)` }],
350
+ };
351
+ }
352
+ }
353
+ const moltbookPlugin = {
354
+ id: "openclaw-moltbook",
355
+ name: "Moltbook",
356
+ description: "Moltbook collaboration space integration with submolt navigation",
357
+ register(api) {
358
+ api.registerTool({
359
+ name: "moltbook_post",
360
+ label: "Moltbook Post",
361
+ description: "Post content to moltbook collaboration space. Rate limited to once per 2.5 minutes.",
362
+ parameters: {
363
+ type: "object",
364
+ properties: {
365
+ title: { type: "string", description: "Post title (optional)" },
366
+ content: { type: "string", description: "Post body content (required)" },
367
+ submolt: { type: "string", description: "Target community (default: general)" },
368
+ },
369
+ required: ["content"],
370
+ },
371
+ execute: executeMoltbookPost,
372
+ });
373
+ api.registerTool({
374
+ name: "moltbook_check_notifications",
375
+ label: "Moltbook Check Notifications",
376
+ description: "Check karma, unread notifications, DMs, and pending requests.",
377
+ parameters: {
378
+ type: "object",
379
+ properties: {},
380
+ },
381
+ execute: executeMoltbookCheckNotifications,
382
+ });
383
+ api.registerTool({
384
+ name: "moltbook_browse",
385
+ label: "Moltbook Browse",
386
+ description: "Browse moltbook feed for posts and engagement opportunities.",
387
+ parameters: {
388
+ type: "object",
389
+ properties: {
390
+ feed_type: { type: "string", description: "Feed type: hot, new (default: hot)" },
391
+ limit: { type: "number", description: "Number of posts to fetch (default: 10)" },
392
+ submolt: { type: "string", description: "Filter to specific submolt (optional)" },
393
+ },
394
+ },
395
+ execute: executeMoltbookBrowse,
396
+ });
397
+ api.registerTool({
398
+ name: "moltbook_reply",
399
+ label: "Moltbook Reply",
400
+ description: "Reply to an existing post.",
401
+ parameters: {
402
+ type: "object",
403
+ properties: {
404
+ post_id: { type: "string", description: "ID of post to reply to (required)" },
405
+ content: { type: "string", description: "Reply content (required)" },
406
+ },
407
+ required: ["post_id", "content"],
408
+ },
409
+ execute: executeMoltbookReply,
410
+ });
411
+ api.registerTool({
412
+ name: "moltbook_find_submolt",
413
+ label: "Moltbook Find Submolt",
414
+ description: "List available submolts (communities) for posting.",
415
+ parameters: {
416
+ type: "object",
417
+ properties: {
418
+ query: { type: "string", description: "Filter by keyword (optional)" },
419
+ },
420
+ },
421
+ execute: executeMoltbookFindSubmolt,
422
+ });
423
+ api.registerTool({
424
+ name: "moltbook_goto_submolt",
425
+ label: "Moltbook Goto Submolt",
426
+ description: "Check if a submolt exists and get its stats. Provides time negotiation on API failure.",
427
+ parameters: {
428
+ type: "object",
429
+ properties: {
430
+ submolt: { type: "string", description: "Submolt name to check (required)" },
431
+ },
432
+ required: ["submolt"],
433
+ },
434
+ execute: executeMoltbookGotoSubmolt,
435
+ });
436
+ },
437
+ };
438
+ export default moltbookPlugin;
439
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ export interface MoltbookPost {
2
+ id?: string;
3
+ post?: {
4
+ id?: string;
5
+ };
6
+ message?: string;
7
+ retry_after_seconds?: number;
8
+ }
9
+ export interface MoltbookHome {
10
+ karma?: number;
11
+ notifications?: {
12
+ unread_count?: number;
13
+ };
14
+ dms?: {
15
+ unread_count?: number;
16
+ };
17
+ dm_requests?: unknown[];
18
+ }
19
+ export interface MoltbookFeed {
20
+ posts?: MoltbookPostItem[];
21
+ }
22
+ export interface MoltbookPostItem {
23
+ title?: string;
24
+ author?: {
25
+ name?: string;
26
+ };
27
+ upvotes?: number;
28
+ comment_count?: number;
29
+ submolt?: {
30
+ name?: string;
31
+ };
32
+ }
33
+ export interface MoltbookSubmoltList {
34
+ submolts?: {
35
+ name?: string;
36
+ title?: string;
37
+ description?: string;
38
+ member_count?: number;
39
+ }[];
40
+ }
41
+ export interface MoltbookSubmoltInfo {
42
+ post_count?: number;
43
+ last_active_at?: string;
44
+ }
45
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,GAAG,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7B;AACD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7F;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ {
2
+ "id": "openclaw-moltbook",
3
+ "name": "moltbook",
4
+ "version": "0.2.0",
5
+ "description": "Moltbook collaboration space integration with submolt navigation",
6
+ "tools": [
7
+ "moltbook_post",
8
+ "moltbook_check_notifications",
9
+ "moltbook_browse",
10
+ "moltbook_reply",
11
+ "moltbook_find_submolt",
12
+ "moltbook_goto_submolt"
13
+ ],
14
+ "configSchema": {
15
+ "type": "object",
16
+ "properties": {
17
+ "credentials_path": { "type": "string" },
18
+ "api_base": { "type": "string" },
19
+ "web_base": { "type": "string" },
20
+ "rate_limit_seconds": { "type": "number" }
21
+ }
22
+ },
23
+ "config": {
24
+ "credentials_path": "~/.config/moltbook/credentials.json",
25
+ "api_base": "https://www.moltbook.com/api/v1",
26
+ "web_base": "https://www.moltbook.com",
27
+ "rate_limit_seconds": 150
28
+ }
29
+ }
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "openclaw-moltbook",
3
+ "version": "0.2.1",
4
+ "description": "Moltbook collaboration space integration for OpenClaw - post, browse, and engage",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist/",
10
+ "openclaw.plugin.json",
11
+ "SKILL.md",
12
+ "README.md"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "prepublishOnly": "npm run build",
17
+ "dev": "tsc --watch"
18
+ },
19
+ "keywords": [
20
+ "openclaw",
21
+ "moltbook",
22
+ "plugin",
23
+ "skill"
24
+ ],
25
+ "author": "duncanghola",
26
+ "license": "MIT",
27
+ "peerDependencies": {
28
+ "openclaw": ">=0.25.0"
29
+ },
30
+ "devDependencies": {
31
+ "typescript": "^5.0.0",
32
+ "@types/node": "^20.0.0"
33
+ },
34
+ "openclaw": {
35
+ "plugin": "./openclaw.plugin.json"
36
+ },
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "git+https://github.com/YOUR_USERNAME/openclaw-moltbook.git"
40
+ },
41
+ "bugs": {
42
+ "url": "https://github.com/YOUR_USERNAME/openclaw-moltbook/issues"
43
+ },
44
+ "homepage": "https://github.com/YOUR_USERNAME/openclaw-moltbook#readme"
45
+ }