paperkite 0.1.2 → 0.1.4
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/README.md +5 -0
- package/dist/src/app.js +2 -0
- package/dist/src/app.js.map +1 -1
- package/dist/src/engine/errors.d.ts +8 -0
- package/dist/src/engine/errors.js +14 -0
- package/dist/src/engine/errors.js.map +1 -0
- package/dist/src/engine/hooks.d.ts +4 -0
- package/dist/src/engine/hooks.js +20 -0
- package/dist/src/engine/hooks.js.map +1 -1
- package/dist/src/engine/runtime.js +16 -12
- package/dist/src/engine/runtime.js.map +1 -1
- package/dist/src/extensions/abi.d.ts +30 -0
- package/dist/src/extensions/abi.js +280 -0
- package/dist/src/extensions/abi.js.map +1 -0
- package/dist/src/extensions/loader.d.ts +4 -1
- package/dist/src/extensions/loader.js +26 -15
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/extensions/manager.js +5 -13
- package/dist/src/extensions/manager.js.map +1 -1
- package/dist/src/extensions/profile.d.ts +2 -0
- package/dist/src/extensions/profile.js +15 -15
- package/dist/src/extensions/profile.js.map +1 -1
- package/dist/src/telegram/failure.js +1 -1
- package/dist/src/telegram/failure.js.map +1 -1
- package/dist/src/telegram/pool.d.ts +1 -1
- package/dist/src/telegram/pool.js +1 -1
- package/dist/src/telegram/pool.js.map +1 -1
- package/package.json +19 -12
- package/dist/data/hooks/weekend-slot.d.ts +0 -12
- package/dist/data/hooks/weekend-slot.js +0 -107
- package/dist/data/hooks/weekend-slot.js.map +0 -1
- package/dist/packages/account-health/src/index.d.ts +0 -8
- package/dist/packages/account-health/src/index.js +0 -37
- package/dist/packages/account-health/src/index.js.map +0 -1
- package/dist/packages/archive/src/archiver.d.ts +0 -98
- package/dist/packages/archive/src/archiver.js +0 -399
- package/dist/packages/archive/src/archiver.js.map +0 -1
- package/dist/packages/archive/src/config.d.ts +0 -22
- package/dist/packages/archive/src/config.js +0 -62
- package/dist/packages/archive/src/config.js.map +0 -1
- package/dist/packages/archive/src/console/live.d.ts +0 -24
- package/dist/packages/archive/src/console/live.js +0 -144
- package/dist/packages/archive/src/console/live.js.map +0 -1
- package/dist/packages/archive/src/console/media.d.ts +0 -66
- package/dist/packages/archive/src/console/media.js +0 -368
- package/dist/packages/archive/src/console/media.js.map +0 -1
- package/dist/packages/archive/src/console/server.d.ts +0 -12
- package/dist/packages/archive/src/console/server.js +0 -583
- package/dist/packages/archive/src/console/server.js.map +0 -1
- package/dist/packages/archive/src/console/service.d.ts +0 -13
- package/dist/packages/archive/src/console/service.js +0 -86
- package/dist/packages/archive/src/console/service.js.map +0 -1
- package/dist/packages/archive/src/storage/index.d.ts +0 -6
- package/dist/packages/archive/src/storage/index.js +0 -23
- package/dist/packages/archive/src/storage/index.js.map +0 -1
- package/dist/packages/archive/src/storage/model.d.ts +0 -296
- package/dist/packages/archive/src/storage/model.js +0 -151
- package/dist/packages/archive/src/storage/model.js.map +0 -1
- package/dist/packages/archive/src/storage/postgres.d.ts +0 -67
- package/dist/packages/archive/src/storage/postgres.js +0 -1021
- package/dist/packages/archive/src/storage/postgres.js.map +0 -1
- package/dist/packages/archive/src/storage/sqlite.d.ts +0 -59
- package/dist/packages/archive/src/storage/sqlite.js +0 -981
- package/dist/packages/archive/src/storage/sqlite.js.map +0 -1
- package/dist/packages/messages-watch/src/index.d.ts +0 -26
- package/dist/packages/messages-watch/src/index.js +0 -255
- package/dist/packages/messages-watch/src/index.js.map +0 -1
- package/dist/packages/messages-watch/src/resolve.d.ts +0 -8
- package/dist/packages/messages-watch/src/resolve.js +0 -49
- package/dist/packages/messages-watch/src/resolve.js.map +0 -1
- package/dist/packages/notify-bark/src/index.d.ts +0 -33
- package/dist/packages/notify-bark/src/index.js +0 -96
- package/dist/packages/notify-bark/src/index.js.map +0 -1
- package/dist/packages/runtime-console/src/console/errors.d.ts +0 -5
- package/dist/packages/runtime-console/src/console/errors.js +0 -11
- package/dist/packages/runtime-console/src/console/errors.js.map +0 -1
- package/dist/packages/runtime-console/src/console/logs.d.ts +0 -1
- package/dist/packages/runtime-console/src/console/logs.js +0 -27
- package/dist/packages/runtime-console/src/console/logs.js.map +0 -1
- package/dist/packages/runtime-console/src/console/server.d.ts +0 -6
- package/dist/packages/runtime-console/src/console/server.js +0 -182
- package/dist/packages/runtime-console/src/console/server.js.map +0 -1
- package/dist/packages/runtime-console/src/index.d.ts +0 -10
- package/dist/packages/runtime-console/src/index.js +0 -83
- package/dist/packages/runtime-console/src/index.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../../../packages/runtime-console/src/console/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,MAAM,eAAe,GAAG,GAAG,GAAG,IAAI,CAAC;AACnC,MAAM,SAAS,GAAG,KAAK,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB,EAAE,cAAsB;IACrE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,GAAG,SAAS,CAAC,CAAC;QAC1D,IAAI,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,YAAY,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,IAAI,YAAY,IAAI,CAAC;YAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;YAAE,KAAK,CAAC,GAAG,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { FastifyInstance } from "fastify";
|
|
2
|
-
import type { RuntimeControl, RuntimeLogger } from "@paperkite/sdk";
|
|
3
|
-
export interface RuntimeConsoleServerOptions {
|
|
4
|
-
readonly logger: RuntimeLogger;
|
|
5
|
-
}
|
|
6
|
-
export declare function createRuntimeConsoleServer(control: RuntimeControl, options: RuntimeConsoleServerOptions): FastifyInstance;
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
import fastify from "fastify";
|
|
2
|
-
import { HttpError, isHttpError } from "./errors.js";
|
|
3
|
-
import { tailFile } from "./logs.js";
|
|
4
|
-
const MAX_BUFFERED_EVENTS = 2000;
|
|
5
|
-
export function createRuntimeConsoleServer(control, options) {
|
|
6
|
-
const server = fastify({ logger: false });
|
|
7
|
-
const liveSockets = new Set();
|
|
8
|
-
const bufferedEvents = [];
|
|
9
|
-
const unsubscribeBuffer = control.subscribe((event) => {
|
|
10
|
-
bufferedEvents.push(event);
|
|
11
|
-
if (bufferedEvents.length > MAX_BUFFERED_EVENTS) {
|
|
12
|
-
bufferedEvents.splice(0, bufferedEvents.length - MAX_BUFFERED_EVENTS);
|
|
13
|
-
}
|
|
14
|
-
});
|
|
15
|
-
server.addHook("onClose", (_instance, done) => {
|
|
16
|
-
unsubscribeBuffer();
|
|
17
|
-
for (const socket of liveSockets)
|
|
18
|
-
socket.destroy();
|
|
19
|
-
liveSockets.clear();
|
|
20
|
-
releaseIdleConnections(server);
|
|
21
|
-
done();
|
|
22
|
-
});
|
|
23
|
-
server.setErrorHandler((error, _request, reply) => {
|
|
24
|
-
const status = error instanceof Error ? error.statusCode ?? 500 : 500;
|
|
25
|
-
if (status >= 500)
|
|
26
|
-
options.logger.error("runtime console request failed", error);
|
|
27
|
-
if (!reply.sent)
|
|
28
|
-
return reply.code(status).send({ error: error instanceof Error ? error.message : String(error) });
|
|
29
|
-
});
|
|
30
|
-
registerRoutes(server, control, options.logger, liveSockets, bufferedEvents);
|
|
31
|
-
return server;
|
|
32
|
-
}
|
|
33
|
-
function registerRoutes(server, control, logger, liveSockets, bufferedEvents) {
|
|
34
|
-
server.get("/api/snapshot", async () => control.snapshot);
|
|
35
|
-
server.get("/api/plugins", async () => control.listPlugins());
|
|
36
|
-
server.get("/api/logs", async () => ({ scopes: control.snapshot.logs }));
|
|
37
|
-
server.get("/api/logs/:scope", async (request, reply) => {
|
|
38
|
-
try {
|
|
39
|
-
const entry = control.snapshot.logs.find((item) => item.scope === decodeURIComponent(request.params.scope));
|
|
40
|
-
if (!entry)
|
|
41
|
-
throw new HttpError(404, "unknown log scope");
|
|
42
|
-
const lines = await tailFile(entry.path, Number(request.query.lines ?? 200)).catch((error) => {
|
|
43
|
-
if (isNodeError(error) && error.code === "ENOENT")
|
|
44
|
-
return [];
|
|
45
|
-
throw error;
|
|
46
|
-
});
|
|
47
|
-
return { scope: entry.scope, path: entry.path, lines };
|
|
48
|
-
}
|
|
49
|
-
catch (error) {
|
|
50
|
-
return sendError(reply, error, logger);
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
server.get("/api/events", async (request, reply) => streamEvents(request, reply, control, liveSockets, bufferedEvents));
|
|
54
|
-
server.post("/api/action/run", async (request, reply) => {
|
|
55
|
-
try {
|
|
56
|
-
const spec = request.body?.spec;
|
|
57
|
-
if (!spec || !String(spec.capability ?? "").trim())
|
|
58
|
-
throw new HttpError(422, "action.run needs spec.capability");
|
|
59
|
-
await control.executeAction(spec);
|
|
60
|
-
return { ok: true };
|
|
61
|
-
}
|
|
62
|
-
catch (error) {
|
|
63
|
-
return sendError(reply, error, logger);
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
server.post("/api/flows/:id/run", async (request, reply) => {
|
|
67
|
-
try {
|
|
68
|
-
await control.runFlow(flowId(request));
|
|
69
|
-
return { ok: true };
|
|
70
|
-
}
|
|
71
|
-
catch (error) {
|
|
72
|
-
return sendError(reply, error, logger);
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
server.post("/api/flows/:id/reload", async (request, reply) => {
|
|
76
|
-
try {
|
|
77
|
-
await control.reloadFlow(flowId(request));
|
|
78
|
-
return { ok: true };
|
|
79
|
-
}
|
|
80
|
-
catch (error) {
|
|
81
|
-
return sendError(reply, error, logger);
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
server.patch("/api/flows/:id", async (request, reply) => {
|
|
85
|
-
try {
|
|
86
|
-
const changed = await control.updateFlow(flowId(request), request.body ?? {});
|
|
87
|
-
return { ok: true, changed };
|
|
88
|
-
}
|
|
89
|
-
catch (error) {
|
|
90
|
-
return sendError(reply, error, logger);
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
server.post("/api/services/:id/start", async (request, reply) => {
|
|
94
|
-
try {
|
|
95
|
-
await control.startService(flowId(request));
|
|
96
|
-
return { ok: true };
|
|
97
|
-
}
|
|
98
|
-
catch (error) {
|
|
99
|
-
return sendError(reply, error, logger);
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
server.post("/api/services/:id/stop", async (request, reply) => {
|
|
103
|
-
try {
|
|
104
|
-
await control.stopService(flowId(request));
|
|
105
|
-
return { ok: true };
|
|
106
|
-
}
|
|
107
|
-
catch (error) {
|
|
108
|
-
return sendError(reply, error, logger);
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
server.post("/api/sessions/:id/reconnect", async (request, reply) => {
|
|
112
|
-
try {
|
|
113
|
-
await control.reconnectSession(flowId(request));
|
|
114
|
-
return { ok: true };
|
|
115
|
-
}
|
|
116
|
-
catch (error) {
|
|
117
|
-
return sendError(reply, error, logger);
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
server.post("/api/runtime/reload", async (request, reply) => {
|
|
121
|
-
reply.send({ ok: true });
|
|
122
|
-
try {
|
|
123
|
-
await control.reload();
|
|
124
|
-
}
|
|
125
|
-
catch (error) {
|
|
126
|
-
logger.error("runtime reload failed", error);
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
function flowId(request) {
|
|
131
|
-
return decodeURIComponent(request.params.id);
|
|
132
|
-
}
|
|
133
|
-
function isNodeError(error) {
|
|
134
|
-
return error instanceof Error && "code" in error;
|
|
135
|
-
}
|
|
136
|
-
function sendError(reply, error, logger) {
|
|
137
|
-
if (isHttpError(error))
|
|
138
|
-
return reply.code(error.status).send({ error: error.message });
|
|
139
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
140
|
-
logger.error("runtime console request failed", error);
|
|
141
|
-
return reply.code(500).send({ error: message });
|
|
142
|
-
}
|
|
143
|
-
const EVENT_HEADERS = {
|
|
144
|
-
"content-type": "text/event-stream",
|
|
145
|
-
"cache-control": "no-cache, no-transform",
|
|
146
|
-
connection: "keep-alive",
|
|
147
|
-
"x-accel-buffering": "no"
|
|
148
|
-
};
|
|
149
|
-
async function streamEvents(request, reply, control, liveSockets, bufferedEvents) {
|
|
150
|
-
reply.hijack();
|
|
151
|
-
const raw = reply.raw;
|
|
152
|
-
const socket = raw.socket;
|
|
153
|
-
if (socket)
|
|
154
|
-
liveSockets.add(socket);
|
|
155
|
-
raw.writeHead(200, EVENT_HEADERS);
|
|
156
|
-
raw.write("retry: 3000\n\n");
|
|
157
|
-
for (const event of bufferedEvents)
|
|
158
|
-
raw.write(`data: ${JSON.stringify(event)}\n\n`);
|
|
159
|
-
const unsubscribe = control.subscribe((event) => {
|
|
160
|
-
raw.write(`data: ${JSON.stringify(event)}\n\n`);
|
|
161
|
-
});
|
|
162
|
-
const heartbeat = setInterval(() => raw.write(": keep-alive\n\n"), 15_000);
|
|
163
|
-
request.raw.once("close", () => {
|
|
164
|
-
clearInterval(heartbeat);
|
|
165
|
-
unsubscribe();
|
|
166
|
-
if (socket)
|
|
167
|
-
liveSockets.delete(socket);
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
function releaseIdleConnections(server) {
|
|
171
|
-
let attempts = 0;
|
|
172
|
-
const tick = () => {
|
|
173
|
-
server.server.closeIdleConnections();
|
|
174
|
-
attempts += 1;
|
|
175
|
-
if (attempts >= 5)
|
|
176
|
-
return;
|
|
177
|
-
const timer = setTimeout(tick, 100);
|
|
178
|
-
timer.unref();
|
|
179
|
-
};
|
|
180
|
-
tick();
|
|
181
|
-
}
|
|
182
|
-
//# sourceMappingURL=server.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../../packages/runtime-console/src/console/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { Service } from "@paperkite/sdk";
|
|
2
|
-
interface ConsoleWebConfig {
|
|
3
|
-
readonly host?: string;
|
|
4
|
-
readonly port?: number;
|
|
5
|
-
readonly publicDir?: string;
|
|
6
|
-
}
|
|
7
|
-
export declare class RuntimeConsoleWebService extends Service<ConsoleWebConfig> {
|
|
8
|
-
run(): Promise<void>;
|
|
9
|
-
}
|
|
10
|
-
export {};
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import { access } from "node:fs/promises";
|
|
2
|
-
import { resolve } from "node:path";
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
|
-
import fastifyStatic from "@fastify/static";
|
|
5
|
-
import { Service } from "@paperkite/sdk";
|
|
6
|
-
import { createRuntimeConsoleServer } from "./console/server.js";
|
|
7
|
-
export class RuntimeConsoleWebService extends Service {
|
|
8
|
-
async run() {
|
|
9
|
-
if (!this.control)
|
|
10
|
-
throw new Error("runtime console needs the runtime control contract");
|
|
11
|
-
const server = createRuntimeConsoleServer(this.control, { logger: this.context.logger });
|
|
12
|
-
try {
|
|
13
|
-
await server.register(fastifyStatic, {
|
|
14
|
-
root: await publicDirectory(this.config?.publicDir),
|
|
15
|
-
index: "index.html"
|
|
16
|
-
});
|
|
17
|
-
server.setNotFoundHandler(spaFallback);
|
|
18
|
-
const host = this.config?.host ?? "127.0.0.1";
|
|
19
|
-
const port = normalizePort(this.config?.port);
|
|
20
|
-
await listenRetrying(server, host, port, this.context.logger);
|
|
21
|
-
this.context.logger.info("runtime web console listening", { host, port });
|
|
22
|
-
await waitForAbort(this.signal);
|
|
23
|
-
}
|
|
24
|
-
finally {
|
|
25
|
-
await server.close().catch(() => undefined);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
function normalizePort(value) {
|
|
30
|
-
const port = Number(value ?? 3378);
|
|
31
|
-
if (!Number.isInteger(port) || port < 1 || port > 65_535) {
|
|
32
|
-
throw new Error("runtime console port must be an integer between 1 and 65535");
|
|
33
|
-
}
|
|
34
|
-
return port;
|
|
35
|
-
}
|
|
36
|
-
async function listenRetrying(server, host, port, logger) {
|
|
37
|
-
for (let attempt = 0;; attempt += 1) {
|
|
38
|
-
try {
|
|
39
|
-
await server.listen({ host, port });
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
catch (error) {
|
|
43
|
-
if (attempt < 6 && isEaddrinuse(error)) {
|
|
44
|
-
logger.warn("runtime web console port is still held by a stopping instance, retrying", { host, port });
|
|
45
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
46
|
-
continue;
|
|
47
|
-
}
|
|
48
|
-
throw error;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
function isEaddrinuse(error) {
|
|
53
|
-
return error instanceof Error && "code" in error && error.code === "EADDRINUSE";
|
|
54
|
-
}
|
|
55
|
-
function waitForAbort(signal) {
|
|
56
|
-
if (signal.aborted)
|
|
57
|
-
return Promise.resolve();
|
|
58
|
-
return new Promise((resolvePromise) => {
|
|
59
|
-
signal.addEventListener("abort", () => resolvePromise(), { once: true });
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
async function publicDirectory(configured) {
|
|
63
|
-
if (configured)
|
|
64
|
-
return resolve(configured);
|
|
65
|
-
const local = fileURLToPath(new URL("../public", import.meta.url));
|
|
66
|
-
try {
|
|
67
|
-
await access(local);
|
|
68
|
-
return local;
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
return resolve(process.cwd(), "packages/runtime-console/public");
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
async function spaFallback(request, reply) {
|
|
75
|
-
if (request.method !== "GET" && request.method !== "HEAD") {
|
|
76
|
-
return reply.code(405).send({ error: "method not allowed" });
|
|
77
|
-
}
|
|
78
|
-
if (request.url.startsWith("/api/")) {
|
|
79
|
-
return reply.code(404).send({ error: "not found" });
|
|
80
|
-
}
|
|
81
|
-
return reply.sendFile("index.html");
|
|
82
|
-
}
|
|
83
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/runtime-console/src/index.ts"],"names":[],"mappings":"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"}
|