buildpartner 0.14.0 → 0.15.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/dist/bin/cli.js +0 -0
- package/dist/src/mcp/build-pad.d.ts +42 -0
- package/dist/src/mcp/build-pad.js +416 -0
- package/dist/src/mcp/build-pad.js.map +1 -0
- package/dist/src/mcp/server.d.ts +2 -0
- package/dist/src/mcp/server.js +111 -1
- package/dist/src/mcp/server.js.map +1 -1
- package/package.json +2 -2
- package/dist/src/commands/reset.d.ts +0 -1
- package/dist/src/commands/reset.js +0 -130
- package/dist/src/commands/reset.js.map +0 -1
- package/dist/src/commands/setup.d.ts +0 -1
- package/dist/src/commands/setup.js +0 -358
- package/dist/src/commands/setup.js.map +0 -1
- package/dist/src/constants.d.ts +0 -9
- package/dist/src/constants.js +0 -12
- package/dist/src/constants.js.map +0 -1
- package/dist/src/mcp/subscription-gate.d.ts +0 -19
- package/dist/src/mcp/subscription-gate.js +0 -69
- package/dist/src/mcp/subscription-gate.js.map +0 -1
- package/dist/src/store/quest-store.d.ts +0 -14
- package/dist/src/store/quest-store.js +0 -41
- package/dist/src/store/quest-store.js.map +0 -1
- package/dist/src/store/status-store.d.ts +0 -10
- package/dist/src/store/status-store.js +0 -99
- package/dist/src/store/status-store.js.map +0 -1
- package/dist/src/suggestions/rules.d.ts +0 -1
- package/dist/src/suggestions/rules.js +0 -2
- package/dist/src/suggestions/rules.js.map +0 -1
- package/dist/src/suggestions/video-links.d.ts +0 -1
- package/dist/src/suggestions/video-links.js +0 -2
- package/dist/src/suggestions/video-links.js.map +0 -1
package/dist/bin/cli.js
CHANGED
|
File without changes
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The build_pad tool: BuildPad, the hosted review pages on BuildPartner.ai
|
|
3
|
+
* (Executive AI Program, behind the build_pad flag). Publishes a local HTML
|
|
4
|
+
* file or folder as a pad, reads the reviewer's feedback, and posts versions
|
|
5
|
+
* and replies, through the /api/buildpartner/pads routes with this machine's
|
|
6
|
+
* token. The routes are the real gate (lib/pad-auth.ts in apps/web).
|
|
7
|
+
*
|
|
8
|
+
* Ported from the standalone /build-pad skill's client
|
|
9
|
+
* (apps/web/public/skills/build-pad/scripts/build-pad.mjs), itself adapted
|
|
10
|
+
* from Lavish Editor (MIT, Kun Chen; see plugin/skills/build-pad/NOTICE.md).
|
|
11
|
+
* The one shape change: `poll` checks for up to `wait_seconds` (default 45)
|
|
12
|
+
* and returns, instead of blocking for 9 minutes, and the skill calls it again.
|
|
13
|
+
* Each polled item carries `from_owner` (the feedback route's word that the
|
|
14
|
+
* signed-in owner wrote it on a private pad); the skill acts on those like the
|
|
15
|
+
* member's own chat, and on everything else only by changing the page.
|
|
16
|
+
*
|
|
17
|
+
* Local state per pad (~/.buildpartner/pads/<id>.json) keeps the feedback
|
|
18
|
+
* cursor and the last delivered batch, the same file the standalone script
|
|
19
|
+
* wrote, so a pad started there can be picked up here.
|
|
20
|
+
*/
|
|
21
|
+
export declare const MAX_WAIT_SECONDS = 55;
|
|
22
|
+
export type PadArgs = {
|
|
23
|
+
action: "create" | "update" | "poll" | "ack" | "reply" | "share" | "unshare" | "end" | "delete" | "list" | "open";
|
|
24
|
+
pad_id?: string;
|
|
25
|
+
path?: string;
|
|
26
|
+
title?: string;
|
|
27
|
+
summary?: string;
|
|
28
|
+
changes?: {
|
|
29
|
+
kind: "added" | "modified" | "removed";
|
|
30
|
+
target: string;
|
|
31
|
+
label: string;
|
|
32
|
+
answers?: number[];
|
|
33
|
+
}[];
|
|
34
|
+
wait_seconds?: number;
|
|
35
|
+
note?: string;
|
|
36
|
+
text?: string;
|
|
37
|
+
url?: string;
|
|
38
|
+
};
|
|
39
|
+
/** A plain result or a message for the user. Either way the tool returns it as JSON text. */
|
|
40
|
+
type Result = Record<string, unknown>;
|
|
41
|
+
export declare function runBuildPad(args: PadArgs): Promise<Result>;
|
|
42
|
+
export {};
|
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The build_pad tool: BuildPad, the hosted review pages on BuildPartner.ai
|
|
3
|
+
* (Executive AI Program, behind the build_pad flag). Publishes a local HTML
|
|
4
|
+
* file or folder as a pad, reads the reviewer's feedback, and posts versions
|
|
5
|
+
* and replies, through the /api/buildpartner/pads routes with this machine's
|
|
6
|
+
* token. The routes are the real gate (lib/pad-auth.ts in apps/web).
|
|
7
|
+
*
|
|
8
|
+
* Ported from the standalone /build-pad skill's client
|
|
9
|
+
* (apps/web/public/skills/build-pad/scripts/build-pad.mjs), itself adapted
|
|
10
|
+
* from Lavish Editor (MIT, Kun Chen; see plugin/skills/build-pad/NOTICE.md).
|
|
11
|
+
* The one shape change: `poll` checks for up to `wait_seconds` (default 45)
|
|
12
|
+
* and returns, instead of blocking for 9 minutes, and the skill calls it again.
|
|
13
|
+
* Each polled item carries `from_owner` (the feedback route's word that the
|
|
14
|
+
* signed-in owner wrote it on a private pad); the skill acts on those like the
|
|
15
|
+
* member's own chat, and on everything else only by changing the page.
|
|
16
|
+
*
|
|
17
|
+
* Local state per pad (~/.buildpartner/pads/<id>.json) keeps the feedback
|
|
18
|
+
* cursor and the last delivered batch, the same file the standalone script
|
|
19
|
+
* wrote, so a pad started there can be picked up here.
|
|
20
|
+
*/
|
|
21
|
+
import { spawnSync } from "child_process";
|
|
22
|
+
import { lstatSync, readFileSync, readdirSync, renameSync, rmSync, mkdirSync, writeFileSync } from "fs";
|
|
23
|
+
import { homedir } from "os";
|
|
24
|
+
import { basename, extname, join, relative, resolve, sep } from "path";
|
|
25
|
+
import { apiFetch, API_BASE } from "../api-client.js";
|
|
26
|
+
const PADS_DIR = join(homedir(), ".buildpartner", "pads");
|
|
27
|
+
const CONNECT_URL = `${API_BASE}/dashboard/login?connect=1`;
|
|
28
|
+
const NOT_CONNECTED = `This machine isn't connected to a BuildPartner.ai account. Reconnect it here: ${CONNECT_URL}`;
|
|
29
|
+
/** Publishing uploads up to 2 MB a version; give it room on a slow connection. */
|
|
30
|
+
const WRITE_TIMEOUT_MS = 60_000;
|
|
31
|
+
const READ_TIMEOUT_MS = 20_000;
|
|
32
|
+
/** One feedback check: short, so a hung server cannot outlive wait_seconds. */
|
|
33
|
+
const CHECK_TIMEOUT_MS = 15_000;
|
|
34
|
+
const CHECK_EVERY_MS = 10_000;
|
|
35
|
+
export const MAX_WAIT_SECONDS = 55;
|
|
36
|
+
const DEFAULT_WAIT_SECONDS = 45;
|
|
37
|
+
class PadError extends Error {
|
|
38
|
+
extra;
|
|
39
|
+
constructor(message, extra = {}) {
|
|
40
|
+
super(message);
|
|
41
|
+
this.extra = extra;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** A failure worth checking again: the network dropped, a timeout, or a 5xx/429. */
|
|
45
|
+
class TransientError extends Error {
|
|
46
|
+
}
|
|
47
|
+
export async function runBuildPad(args) {
|
|
48
|
+
try {
|
|
49
|
+
return await dispatch(args);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
if (err instanceof PadError)
|
|
53
|
+
return { error: err.message, ...err.extra };
|
|
54
|
+
return { error: `BuildPad hit a problem: ${err instanceof Error ? err.message : String(err)}` };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function dispatch(a) {
|
|
58
|
+
const id = () => {
|
|
59
|
+
if (!a.pad_id)
|
|
60
|
+
throw new PadError(`${a.action} needs pad_id (from create or list).`);
|
|
61
|
+
return a.pad_id;
|
|
62
|
+
};
|
|
63
|
+
const padPath = (padId, tail = "") => `/api/buildpartner/pads/${encodeURIComponent(padId)}${tail}`;
|
|
64
|
+
switch (a.action) {
|
|
65
|
+
case "create": {
|
|
66
|
+
const body = padPayload(a.path, a.title);
|
|
67
|
+
const r = await api("POST", "/api/buildpartner/pads", { body, timeoutMs: WRITE_TIMEOUT_MS });
|
|
68
|
+
if (!r.url || !r.id)
|
|
69
|
+
throw new PadError("BuildPartner.ai didn't confirm the new page. Try again.");
|
|
70
|
+
saveState(String(r.id), { title: body.title, url: r.url, revision: r.revision ?? 1, cursor: null, last_batch_ids: [], last_acked_ids: [] });
|
|
71
|
+
return { url: r.url, pad_id: r.id, revision: r.revision ?? 1, shared: r.shared === true };
|
|
72
|
+
}
|
|
73
|
+
case "update": {
|
|
74
|
+
const padId = id();
|
|
75
|
+
const notes = revisionNotes(a);
|
|
76
|
+
const saved = readState(padId);
|
|
77
|
+
const body = { ...padPayload(a.path, a.title || saved.title), ...notes };
|
|
78
|
+
const r = await api("PUT", padPath(padId, "/revisions"), { body, timeoutMs: WRITE_TIMEOUT_MS });
|
|
79
|
+
if (r.revision == null)
|
|
80
|
+
throw new PadError("BuildPartner.ai didn't confirm the new version. Check the page before publishing again.");
|
|
81
|
+
saveState(padId, { title: body.title, revision: r.revision, ...(r.url ? { url: r.url } : {}) });
|
|
82
|
+
return { revision: r.revision, ...(r.url ? { url: r.url } : {}) };
|
|
83
|
+
}
|
|
84
|
+
case "poll":
|
|
85
|
+
return poll(id(), a.wait_seconds);
|
|
86
|
+
case "ack": {
|
|
87
|
+
const padId = id();
|
|
88
|
+
const state = readState(padId);
|
|
89
|
+
const batch = ids(state.last_batch_ids);
|
|
90
|
+
const acked = ids(state.last_acked_ids);
|
|
91
|
+
const itemIds = sameIds(batch, acked) ? [] : batch;
|
|
92
|
+
if (!itemIds.length)
|
|
93
|
+
throw new PadError("Nothing to acknowledge: poll first, and ack only a batch that has items.");
|
|
94
|
+
if (a.note != null && [...a.note].length > 200)
|
|
95
|
+
throw new PadError("note must be at most 200 characters.");
|
|
96
|
+
const r = await api("POST", padPath(padId, "/ack"), { body: { item_ids: itemIds, ...(a.note != null ? { note: a.note } : {}) } });
|
|
97
|
+
if (!Array.isArray(r.acked) || !sameIds(ids(r.acked), itemIds)) {
|
|
98
|
+
throw new PadError("BuildPartner.ai didn't confirm the acknowledgment. Try ack again before editing the page.");
|
|
99
|
+
}
|
|
100
|
+
saveState(padId, { last_acked_ids: itemIds });
|
|
101
|
+
return { acked: itemIds };
|
|
102
|
+
}
|
|
103
|
+
case "reply": {
|
|
104
|
+
const padId = id();
|
|
105
|
+
const text = (a.text ?? "").trim();
|
|
106
|
+
if (!text)
|
|
107
|
+
throw new PadError("reply needs text.");
|
|
108
|
+
const r = await api("POST", padPath(padId, "/replies"), { body: { text } });
|
|
109
|
+
if (r.id == null)
|
|
110
|
+
throw new PadError("BuildPartner.ai didn't confirm the reply. Try again.");
|
|
111
|
+
return { reply_id: r.id };
|
|
112
|
+
}
|
|
113
|
+
case "share":
|
|
114
|
+
case "unshare": {
|
|
115
|
+
const r = await api("POST", padPath(id(), "/share"), { body: { shared: a.action === "share" } });
|
|
116
|
+
if (typeof r.shared !== "boolean")
|
|
117
|
+
throw new PadError("BuildPartner.ai didn't confirm the change. Check the page's Share button.");
|
|
118
|
+
return { shared: r.shared, ...(r.url ? { url: r.url } : {}) };
|
|
119
|
+
}
|
|
120
|
+
case "end": {
|
|
121
|
+
const padId = id();
|
|
122
|
+
const r = await api("POST", padPath(padId, "/end"));
|
|
123
|
+
if (r.ended !== true)
|
|
124
|
+
throw new PadError("BuildPartner.ai didn't confirm the review ended. Try again.");
|
|
125
|
+
saveState(padId, { ended: true });
|
|
126
|
+
return { ended: true };
|
|
127
|
+
}
|
|
128
|
+
case "delete": {
|
|
129
|
+
const padId = id();
|
|
130
|
+
const r = await api("DELETE", padPath(padId));
|
|
131
|
+
if (r.deleted !== true)
|
|
132
|
+
throw new PadError("BuildPartner.ai didn't confirm the delete. Check the pad list.");
|
|
133
|
+
try {
|
|
134
|
+
rmSync(statePath(padId), { force: true });
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// the server copy is gone, which is what matters
|
|
138
|
+
}
|
|
139
|
+
return { deleted: true };
|
|
140
|
+
}
|
|
141
|
+
case "list": {
|
|
142
|
+
const items = [];
|
|
143
|
+
let cursor = null;
|
|
144
|
+
do {
|
|
145
|
+
const q = cursor ? `&cursor=${encodeURIComponent(cursor)}` : "";
|
|
146
|
+
const page = await api("GET", `/api/buildpartner/pads?limit=100${q}`, { timeoutMs: READ_TIMEOUT_MS });
|
|
147
|
+
for (const p of page.items ?? []) {
|
|
148
|
+
items.push({ pad_id: p.id, title: p.title, url: p.url, revision: p.revision, ended: p.ended, shared: p.shared, expires_at: p.expires_at });
|
|
149
|
+
}
|
|
150
|
+
cursor = typeof page.next_cursor === "string" ? page.next_cursor : null;
|
|
151
|
+
} while (cursor);
|
|
152
|
+
return { pads: items };
|
|
153
|
+
}
|
|
154
|
+
case "open":
|
|
155
|
+
return openUrl(a.url);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// ---------- feedback ----------
|
|
159
|
+
/**
|
|
160
|
+
* Check for feedback, every 10 seconds, for up to wait_seconds. Returns the
|
|
161
|
+
* first non-empty batch (or the review ending) at once. A dropped connection or
|
|
162
|
+
* a server hiccup is checked again inside the wait, never reported as a broken
|
|
163
|
+
* pad: the cursor only moves when a batch is read, so nothing is lost.
|
|
164
|
+
*/
|
|
165
|
+
async function poll(padId, waitSeconds = DEFAULT_WAIT_SECONDS) {
|
|
166
|
+
const wait = Math.max(0, Math.min(MAX_WAIT_SECONDS, waitSeconds));
|
|
167
|
+
const state = readState(padId);
|
|
168
|
+
let cursor = state.cursor ?? null;
|
|
169
|
+
const deadline = Date.now() + wait * 1000;
|
|
170
|
+
let lastProblem = null;
|
|
171
|
+
for (let first = true;; first = false) {
|
|
172
|
+
if (!first) {
|
|
173
|
+
if (Date.now() + CHECK_EVERY_MS > deadline)
|
|
174
|
+
break;
|
|
175
|
+
await sleep(CHECK_EVERY_MS);
|
|
176
|
+
}
|
|
177
|
+
let r;
|
|
178
|
+
try {
|
|
179
|
+
const q = cursor ? `?after=${encodeURIComponent(cursor)}` : "";
|
|
180
|
+
r = await api("GET", `/api/buildpartner/pads/${encodeURIComponent(padId)}/feedback${q}`, { timeoutMs: CHECK_TIMEOUT_MS, transient: true });
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
if (!(err instanceof TransientError))
|
|
184
|
+
throw err;
|
|
185
|
+
lastProblem = err.message;
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
lastProblem = null;
|
|
189
|
+
// A malformed batch must not move the cursor, or its feedback is skipped for good.
|
|
190
|
+
if (!Array.isArray(r.items))
|
|
191
|
+
throw new PadError("BuildPartner.ai sent feedback in a shape this tool can't read. Poll again.");
|
|
192
|
+
if (r.cursor != null && typeof r.cursor !== "string")
|
|
193
|
+
throw new PadError("BuildPartner.ai sent a bad feedback cursor. Poll again.");
|
|
194
|
+
// from_owner is the server's word that the signed-in owner wrote an item on a
|
|
195
|
+
// private pad. A server that doesn't send it vouches for nothing.
|
|
196
|
+
const items = r.items.map((i) => ({ ...i, from_owner: i.from_owner === true }));
|
|
197
|
+
const ended = r.ended === true;
|
|
198
|
+
cursor = r.cursor ?? cursor;
|
|
199
|
+
if (items.length || ended) {
|
|
200
|
+
const batchIds = items.map((i) => normalizeId(i.id));
|
|
201
|
+
saveState(padId, { cursor, ...(items.length ? { last_batch_ids: batchIds } : {}), ...(ended ? { ended: true } : {}) });
|
|
202
|
+
return { items, shared: r.shared !== false, ...(ended ? { ended: true } : {}) };
|
|
203
|
+
}
|
|
204
|
+
if (cursor !== (state.cursor ?? null))
|
|
205
|
+
saveState(padId, { cursor });
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
items: [],
|
|
209
|
+
next: "Nothing new yet. Call poll again to keep watching.",
|
|
210
|
+
...(lastProblem ? { note: `Couldn't reach BuildPartner.ai on the last check (${lastProblem}). Nothing was lost; poll again.` } : {}),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
// ---------- HTTP ----------
|
|
214
|
+
async function api(method, path, opts = {}) {
|
|
215
|
+
const res = await apiFetch(path, { method, headers: { "X-BuildPad-Agent": "Claude Code" }, ...(opts.body !== undefined ? { body: JSON.stringify(opts.body) } : {}) }, opts.timeoutMs ?? READ_TIMEOUT_MS);
|
|
216
|
+
if (!res) {
|
|
217
|
+
if (opts.transient)
|
|
218
|
+
throw new TransientError("no connection");
|
|
219
|
+
throw new PadError("Couldn't reach BuildPartner.ai. Check the internet connection and try again.");
|
|
220
|
+
}
|
|
221
|
+
if (opts.transient && (res.status >= 500 || res.status === 429))
|
|
222
|
+
throw new TransientError(`server error ${res.status}`);
|
|
223
|
+
const json = ((await res.json().catch(() => null)) ?? {});
|
|
224
|
+
if (res.ok && json.ok !== false)
|
|
225
|
+
return json;
|
|
226
|
+
if (res.status === 401 || json.error === "User not found")
|
|
227
|
+
throw new PadError(NOT_CONNECTED);
|
|
228
|
+
if (json.reason === "not-a-member") {
|
|
229
|
+
throw new PadError(String(json.error ?? "BuildPad is part of the Executive AI Program."), {
|
|
230
|
+
limit_reached: true,
|
|
231
|
+
action: `Share this with the user: BuildPad is part of the BuildPartner.ai Executive AI Program, so nothing was published.${json.program_url ? ` They can read about the program at ${json.program_url}.` : ""}`,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
if (json.coming_soon)
|
|
235
|
+
throw new PadError(String(json.error ?? "BuildPad isn't available on this account yet."));
|
|
236
|
+
if (json.reason === "account-storage-full") {
|
|
237
|
+
throw new PadError("Your pads are using all the storage your account has. Delete one you no longer need (list, then delete) and try again.");
|
|
238
|
+
}
|
|
239
|
+
if (res.status === 404)
|
|
240
|
+
throw new PadError("That pad wasn't found on this account. It may have been deleted, or made by someone else.");
|
|
241
|
+
const detail = json.detail ?? json.message ?? json.error;
|
|
242
|
+
throw new PadError(`BuildPartner.ai refused that (${res.status}${json.reason ? `, ${json.reason}` : ""})${detail ? `: ${detail}` : ""}.`);
|
|
243
|
+
}
|
|
244
|
+
// ---------- files ----------
|
|
245
|
+
const CONTENT_TYPES = {
|
|
246
|
+
".html": "text/html", ".htm": "text/html", ".css": "text/css", ".js": "text/javascript",
|
|
247
|
+
".mjs": "text/javascript", ".json": "application/json", ".svg": "image/svg+xml",
|
|
248
|
+
".png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg", ".gif": "image/gif",
|
|
249
|
+
".webp": "image/webp", ".ico": "image/x-icon", ".woff": "font/woff", ".woff2": "font/woff2",
|
|
250
|
+
".ttf": "font/ttf", ".otf": "font/otf", ".txt": "text/plain", ".md": "text/markdown",
|
|
251
|
+
".csv": "text/csv", ".mp4": "video/mp4", ".webm": "video/webm", ".mp3": "audio/mpeg",
|
|
252
|
+
".wav": "audio/wav", ".pdf": "application/pdf", ".wasm": "application/wasm", ".map": "application/json",
|
|
253
|
+
};
|
|
254
|
+
const contentTypeFor = (p) => CONTENT_TYPES[extname(p).toLowerCase()] ?? "application/octet-stream";
|
|
255
|
+
// Symlinks are skipped, not followed: a link could point outside the page's
|
|
256
|
+
// folder and publish a private file under an innocent-looking path, or loop.
|
|
257
|
+
function walkFiles(dir, root = dir, acc = []) {
|
|
258
|
+
for (const name of readdirSync(dir).sort()) {
|
|
259
|
+
if (name.startsWith(".") || name === "node_modules")
|
|
260
|
+
continue;
|
|
261
|
+
const full = join(dir, name);
|
|
262
|
+
const st = lstatSync(full);
|
|
263
|
+
if (st.isSymbolicLink())
|
|
264
|
+
continue;
|
|
265
|
+
if (st.isDirectory())
|
|
266
|
+
walkFiles(full, root, acc);
|
|
267
|
+
else if (st.isFile())
|
|
268
|
+
acc.push(relative(root, full));
|
|
269
|
+
}
|
|
270
|
+
return acc;
|
|
271
|
+
}
|
|
272
|
+
function htmlTitle(html) {
|
|
273
|
+
const m = /<title[^>]*>([\s\S]*?)<\/title>/i.exec(html);
|
|
274
|
+
return m ? m[1].replace(/\s+/g, " ").trim() : "";
|
|
275
|
+
}
|
|
276
|
+
/** A single .html file uploads as index.html; a folder uploads its index.html plus every non-hidden file. */
|
|
277
|
+
function padPayload(input, title) {
|
|
278
|
+
if (!input)
|
|
279
|
+
throw new PadError("create and update need path: the page's .html file, or a folder with index.html.");
|
|
280
|
+
const path = resolve(input.replace(/^~(?=$|\/)/, homedir()));
|
|
281
|
+
let rootStat;
|
|
282
|
+
try {
|
|
283
|
+
rootStat = lstatSync(path);
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
throw new PadError(`No such file or folder: ${input}`);
|
|
287
|
+
}
|
|
288
|
+
if (rootStat.isSymbolicLink())
|
|
289
|
+
throw new PadError(`${input} is a link. Pass the real path of the file or folder.`);
|
|
290
|
+
const files = [];
|
|
291
|
+
let html = "";
|
|
292
|
+
if (rootStat.isDirectory()) {
|
|
293
|
+
let entry;
|
|
294
|
+
try {
|
|
295
|
+
entry = lstatSync(join(path, "index.html"));
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
throw new PadError(`${input} has no index.html at its top level. A pad folder needs one.`);
|
|
299
|
+
}
|
|
300
|
+
if (!entry.isFile())
|
|
301
|
+
throw new PadError(`${input}/index.html must be a regular file.`);
|
|
302
|
+
for (const rel of walkFiles(path)) {
|
|
303
|
+
// Only what a web page is made of: a folder with index.html might also hold
|
|
304
|
+
// keys or credentials, and a shared pad's files are public.
|
|
305
|
+
if (!(extname(rel).toLowerCase() in CONTENT_TYPES) || /\.(env|pem|key)$|credentials|secret/i.test(rel))
|
|
306
|
+
continue;
|
|
307
|
+
const buf = readFileSync(join(path, rel));
|
|
308
|
+
const payloadPath = rel.split(sep).join("/");
|
|
309
|
+
if (payloadPath === "index.html")
|
|
310
|
+
html = buf.toString("utf8");
|
|
311
|
+
files.push({ path: payloadPath, content_base64: buf.toString("base64"), content_type: contentTypeFor(rel) });
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
const ext = extname(path).toLowerCase();
|
|
316
|
+
if (ext !== ".html" && ext !== ".htm")
|
|
317
|
+
throw new PadError(`${input} isn't an .html file. Pass an HTML file or a folder with index.html.`);
|
|
318
|
+
const buf = readFileSync(path);
|
|
319
|
+
html = buf.toString("utf8");
|
|
320
|
+
files.push({ path: "index.html", content_base64: buf.toString("base64"), content_type: "text/html" });
|
|
321
|
+
}
|
|
322
|
+
return { title: title || htmlTitle(html) || basename(path, extname(path)), entry: "index.html", files };
|
|
323
|
+
}
|
|
324
|
+
const MAX_CHANGES = 50;
|
|
325
|
+
const MAX_TEXT = 200;
|
|
326
|
+
const MAX_TARGET = 512;
|
|
327
|
+
/** summary and changes for a new version, checked here so a bad list fails before anything uploads. */
|
|
328
|
+
function revisionNotes(a) {
|
|
329
|
+
const notes = {};
|
|
330
|
+
if (a.summary != null) {
|
|
331
|
+
const summary = a.summary.trim();
|
|
332
|
+
if (!summary || summary.length > MAX_TEXT)
|
|
333
|
+
throw new PadError(`summary must be one line of at most ${MAX_TEXT} characters.`);
|
|
334
|
+
notes.summary = summary;
|
|
335
|
+
}
|
|
336
|
+
if (a.changes != null) {
|
|
337
|
+
if (a.changes.length > MAX_CHANGES)
|
|
338
|
+
throw new PadError(`changes lists ${a.changes.length}; at most ${MAX_CHANGES} are allowed.`);
|
|
339
|
+
notes.changes = a.changes.map((c, i) => {
|
|
340
|
+
if (!c.target?.trim() || c.target.length > MAX_TARGET)
|
|
341
|
+
throw new PadError(`changes[${i}].target must be the block's #id.`);
|
|
342
|
+
if (!c.label?.trim() || c.label.length > MAX_TEXT)
|
|
343
|
+
throw new PadError(`changes[${i}].label must be one line of at most ${MAX_TEXT} characters.`);
|
|
344
|
+
if (c.answers && new Set(c.answers).size !== c.answers.length)
|
|
345
|
+
throw new PadError(`changes[${i}].answers must list each comment id once.`);
|
|
346
|
+
return { kind: c.kind, target: c.target, label: c.label, ...(c.answers ? { answers: c.answers } : {}) };
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
return notes;
|
|
350
|
+
}
|
|
351
|
+
// ---------- local state ----------
|
|
352
|
+
const statePath = (padId) => join(PADS_DIR, `${encodeURIComponent(padId)}.json`);
|
|
353
|
+
/** A missing file is no state. A corrupt one is reported, so it can't silently rewind the cursor. */
|
|
354
|
+
function readState(padId) {
|
|
355
|
+
let raw;
|
|
356
|
+
try {
|
|
357
|
+
raw = readFileSync(statePath(padId), "utf8");
|
|
358
|
+
}
|
|
359
|
+
catch (err) {
|
|
360
|
+
if (err?.code === "ENOENT")
|
|
361
|
+
return {};
|
|
362
|
+
throw new PadError(`Can't read this pad's saved state (${statePath(padId)}).`);
|
|
363
|
+
}
|
|
364
|
+
try {
|
|
365
|
+
const s = JSON.parse(raw);
|
|
366
|
+
if (s && typeof s === "object" && !Array.isArray(s))
|
|
367
|
+
return s;
|
|
368
|
+
}
|
|
369
|
+
catch {
|
|
370
|
+
// fall through
|
|
371
|
+
}
|
|
372
|
+
throw new PadError(`This pad's saved state is corrupt: delete ${statePath(padId)} and poll again (feedback is re-sent from the start).`);
|
|
373
|
+
}
|
|
374
|
+
/** Atomic write (temp file + rename), so an interrupted write never leaves half a file. */
|
|
375
|
+
function saveState(padId, patch) {
|
|
376
|
+
try {
|
|
377
|
+
mkdirSync(PADS_DIR, { recursive: true });
|
|
378
|
+
const next = { ...readState(padId), ...patch, updated_at: new Date().toISOString() };
|
|
379
|
+
const tmp = `${statePath(padId)}.${process.pid}.tmp`;
|
|
380
|
+
writeFileSync(tmp, JSON.stringify(next, null, 2));
|
|
381
|
+
renameSync(tmp, statePath(padId));
|
|
382
|
+
}
|
|
383
|
+
catch {
|
|
384
|
+
// The server already took the request; a bookkeeping failure must not look
|
|
385
|
+
// like a failed publish (a retry would publish twice).
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
function normalizeId(v) {
|
|
389
|
+
if (typeof v === "string" && /^(0|[1-9]\d*)$/.test(v) && Number.isSafeInteger(Number(v)))
|
|
390
|
+
return Number(v);
|
|
391
|
+
return v;
|
|
392
|
+
}
|
|
393
|
+
const ids = (v) => (Array.isArray(v) ? v.map(normalizeId) : []);
|
|
394
|
+
const sameIds = (a, b) => a.length === b.length && a.every((x) => b.some((y) => String(x) === String(y)));
|
|
395
|
+
// ---------- misc ----------
|
|
396
|
+
function openUrl(url) {
|
|
397
|
+
let parsed;
|
|
398
|
+
try {
|
|
399
|
+
parsed = new URL(url ?? "");
|
|
400
|
+
}
|
|
401
|
+
catch {
|
|
402
|
+
throw new PadError("open needs url: the pad's link.");
|
|
403
|
+
}
|
|
404
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:")
|
|
405
|
+
throw new PadError("open only opens web links.");
|
|
406
|
+
const [cmd, cmdArgs] = process.platform === "darwin" ? ["open", [parsed.href]]
|
|
407
|
+
// Not `cmd /c start`: cmd.exe would treat & | ^ in the URL as commands.
|
|
408
|
+
: process.platform === "win32" ? ["rundll32", ["url.dll,FileProtocolHandler", parsed.href]]
|
|
409
|
+
: ["xdg-open", [parsed.href]];
|
|
410
|
+
const r = spawnSync(cmd, cmdArgs, { stdio: "ignore" });
|
|
411
|
+
if (r.status !== 0)
|
|
412
|
+
return { opened: false, message: `Couldn't open a browser here. Give the user the link: ${parsed.href}` };
|
|
413
|
+
return { opened: true };
|
|
414
|
+
}
|
|
415
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
416
|
+
//# sourceMappingURL=build-pad.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-pad.js","sourceRoot":"","sources":["../../../src/mcp/build-pad.ts"],"names":[],"mappings":"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"}
|
package/dist/src/mcp/server.d.ts
CHANGED
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
* get_founder_knowledge - search a team's founder/leadership knowledge base
|
|
11
11
|
* request_founder_knowledge - flag a missing topic to a team's leadership
|
|
12
12
|
* social_intel - public creator data on X, Instagram and YouTube
|
|
13
|
+
* web_research - Web Research: read, map, crawl and search the open web
|
|
14
|
+
* build_pad - BuildPad: publish a page for review, read feedback, post versions (mcp/build-pad.ts)
|
|
13
15
|
* feed_run - open and close one self-improving run (start, finish)
|
|
14
16
|
* publish_command_center - publish a member's Command Center layout
|
|
15
17
|
* run_plan - the one routine: what to run today (start), one job done (finish)
|