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 +21 -0
- package/README.md +75 -0
- package/SKILL.md +96 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +439 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +45 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/openclaw.plugin.json +29 -0
- package/package.json +45 -0
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
|
package/dist/index.d.ts
ADDED
|
@@ -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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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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
|
+
}
|