@buildlog/openclaw-skill 1.0.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.
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UploadError = exports.BuildlogUploader = void 0;
4
+ exports.uploadBuildlog = uploadBuildlog;
5
+ const DEFAULT_BASE_URL = 'https://api.buildlog.ai';
6
+ const DEFAULT_TIMEOUT = 30000;
7
+ /**
8
+ * BuildlogUploader - Upload buildlogs to buildlog.ai
9
+ */
10
+ class BuildlogUploader {
11
+ config;
12
+ constructor(config = {}) {
13
+ this.config = {
14
+ apiKey: config.apiKey ?? '',
15
+ baseUrl: config.baseUrl ?? DEFAULT_BASE_URL,
16
+ timeout: config.timeout ?? DEFAULT_TIMEOUT,
17
+ };
18
+ }
19
+ /**
20
+ * Set API key (can be updated after construction)
21
+ */
22
+ setApiKey(apiKey) {
23
+ this.config.apiKey = apiKey;
24
+ }
25
+ /**
26
+ * Upload a buildlog
27
+ */
28
+ async upload(buildlog, options = {}) {
29
+ try {
30
+ const response = await this.request('/v1/buildlogs', {
31
+ method: 'POST',
32
+ body: JSON.stringify({
33
+ buildlog,
34
+ options: {
35
+ isPublic: options.isPublic ?? true,
36
+ allowComments: options.allowComments ?? true,
37
+ allowForks: options.allowForks ?? true,
38
+ expiresIn: options.expiresIn,
39
+ },
40
+ }),
41
+ });
42
+ return {
43
+ success: true,
44
+ id: response.id,
45
+ url: response.url ?? `https://buildlog.ai/b/${response.id}`,
46
+ shortUrl: response.shortUrl ?? `https://bldlg.ai/${response.id}`,
47
+ embedUrl: response.embedUrl ?? `https://buildlog.ai/embed/${response.id}`,
48
+ };
49
+ }
50
+ catch (error) {
51
+ return this.handleError(error);
52
+ }
53
+ }
54
+ /**
55
+ * Update an existing buildlog
56
+ */
57
+ async update(id, buildlog) {
58
+ try {
59
+ const response = await this.request(`/v1/buildlogs/${id}`, {
60
+ method: 'PATCH',
61
+ body: JSON.stringify({ buildlog }),
62
+ });
63
+ return {
64
+ success: true,
65
+ id: response.id,
66
+ url: response.url,
67
+ };
68
+ }
69
+ catch (error) {
70
+ return this.handleError(error);
71
+ }
72
+ }
73
+ /**
74
+ * Delete a buildlog
75
+ */
76
+ async delete(id) {
77
+ try {
78
+ await this.request(`/v1/buildlogs/${id}`, {
79
+ method: 'DELETE',
80
+ });
81
+ return { success: true };
82
+ }
83
+ catch (error) {
84
+ return this.handleError(error);
85
+ }
86
+ }
87
+ /**
88
+ * Get buildlog info
89
+ */
90
+ async getInfo(id) {
91
+ try {
92
+ return await this.request(`/v1/buildlogs/${id}`, {
93
+ method: 'GET',
94
+ });
95
+ }
96
+ catch {
97
+ return null;
98
+ }
99
+ }
100
+ /**
101
+ * List user's buildlogs
102
+ */
103
+ async list(options = {}) {
104
+ const params = new URLSearchParams();
105
+ if (options.limit)
106
+ params.set('limit', options.limit.toString());
107
+ if (options.offset)
108
+ params.set('offset', options.offset.toString());
109
+ if (options.sort)
110
+ params.set('sort', options.sort);
111
+ try {
112
+ return await this.request(`/v1/buildlogs?${params.toString()}`, { method: 'GET' });
113
+ }
114
+ catch {
115
+ return { buildlogs: [], total: 0 };
116
+ }
117
+ }
118
+ /**
119
+ * Generate a shareable link (for anonymous uploads)
120
+ */
121
+ async createShareLink(buildlog) {
122
+ return this.upload(buildlog, {
123
+ isPublic: true,
124
+ allowComments: false,
125
+ allowForks: true,
126
+ });
127
+ }
128
+ /**
129
+ * Validate API key
130
+ */
131
+ async validateApiKey() {
132
+ if (!this.config.apiKey) {
133
+ return false;
134
+ }
135
+ try {
136
+ await this.request('/v1/auth/validate', { method: 'GET' });
137
+ return true;
138
+ }
139
+ catch {
140
+ return false;
141
+ }
142
+ }
143
+ /**
144
+ * Check if connected to buildlog.ai
145
+ */
146
+ async ping() {
147
+ try {
148
+ await this.request('/v1/health', { method: 'GET' });
149
+ return true;
150
+ }
151
+ catch {
152
+ return false;
153
+ }
154
+ }
155
+ // Private methods
156
+ async request(path, options) {
157
+ const url = `${this.config.baseUrl}${path}`;
158
+ const headers = {
159
+ 'Content-Type': 'application/json',
160
+ 'User-Agent': 'buildlog-openclaw-skill/1.0.0',
161
+ };
162
+ if (this.config.apiKey) {
163
+ headers['Authorization'] = `Bearer ${this.config.apiKey}`;
164
+ }
165
+ const controller = new AbortController();
166
+ const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
167
+ try {
168
+ const response = await fetch(url, {
169
+ ...options,
170
+ headers: {
171
+ ...headers,
172
+ ...options.headers,
173
+ },
174
+ signal: controller.signal,
175
+ });
176
+ clearTimeout(timeoutId);
177
+ if (!response.ok) {
178
+ const errorData = await response.json().catch(() => ({}));
179
+ throw new UploadError(errorData.message || `HTTP ${response.status}`, response.status.toString(), response.status);
180
+ }
181
+ // Handle empty responses
182
+ const text = await response.text();
183
+ if (!text) {
184
+ return {};
185
+ }
186
+ return JSON.parse(text);
187
+ }
188
+ catch (error) {
189
+ clearTimeout(timeoutId);
190
+ if (error instanceof UploadError) {
191
+ throw error;
192
+ }
193
+ if (error instanceof Error) {
194
+ if (error.name === 'AbortError') {
195
+ throw new UploadError('Request timeout', 'TIMEOUT', 408);
196
+ }
197
+ throw new UploadError(error.message, 'NETWORK_ERROR', 0);
198
+ }
199
+ throw new UploadError('Unknown error', 'UNKNOWN', 0);
200
+ }
201
+ }
202
+ handleError(error) {
203
+ if (error instanceof UploadError) {
204
+ return {
205
+ success: false,
206
+ error: error.message,
207
+ errorCode: error.code,
208
+ };
209
+ }
210
+ return {
211
+ success: false,
212
+ error: error instanceof Error ? error.message : 'Unknown error',
213
+ errorCode: 'UNKNOWN',
214
+ };
215
+ }
216
+ }
217
+ exports.BuildlogUploader = BuildlogUploader;
218
+ /**
219
+ * Custom error class for upload errors
220
+ */
221
+ class UploadError extends Error {
222
+ code;
223
+ status;
224
+ constructor(message, code, status) {
225
+ super(message);
226
+ this.code = code;
227
+ this.status = status;
228
+ this.name = 'UploadError';
229
+ }
230
+ }
231
+ exports.UploadError = UploadError;
232
+ /**
233
+ * Convenience function to upload a buildlog
234
+ */
235
+ async function uploadBuildlog(buildlog, config = {}, options = {}) {
236
+ const uploader = new BuildlogUploader(config);
237
+ return uploader.upload(buildlog, options);
238
+ }
239
+ //# sourceMappingURL=uploader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploader.js","sourceRoot":"","sources":["../src/uploader.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@buildlog/openclaw-skill",
3
+ "version": "1.0.0",
4
+ "description": "Record, export, and share your AI coding sessions as replayable buildlogs",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist",
9
+ "SKILL.md"
10
+ ],
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "dev": "tsc --watch",
14
+ "prepublishOnly": "npm run build",
15
+ "lint": "eslint src --ext .ts",
16
+ "test": "vitest"
17
+ },
18
+ "keywords": [
19
+ "openclaw",
20
+ "skill",
21
+ "buildlog",
22
+ "ai",
23
+ "coding",
24
+ "recording",
25
+ "session"
26
+ ],
27
+ "author": "buildlog.ai",
28
+ "license": "MIT",
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "https://github.com/buildlog/openclaw-skill.git"
32
+ },
33
+ "homepage": "https://buildlog.ai",
34
+ "bugs": {
35
+ "url": "https://github.com/buildlog/openclaw-skill/issues"
36
+ },
37
+ "devDependencies": {
38
+ "@types/node": "^20.10.0",
39
+ "typescript": "^5.3.0",
40
+ "vitest": "^1.0.0"
41
+ },
42
+ "peerDependencies": {
43
+ "@openclaw/sdk": "^1.0.0"
44
+ },
45
+ "peerDependenciesMeta": {
46
+ "@openclaw/sdk": {
47
+ "optional": true
48
+ }
49
+ },
50
+ "engines": {
51
+ "node": ">=18.0.0"
52
+ }
53
+ }