@zenalexa/unicli 0.210.0 → 0.211.2
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/AGENTS.md +21 -7
- package/README.md +680 -83
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/agents.d.ts +14 -3
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +369 -140
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/mcp.d.ts +3 -4
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +47 -62
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/schema.d.ts +12 -0
- package/dist/commands/schema.d.ts.map +1 -0
- package/dist/commands/schema.js +72 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/search.d.ts +12 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +47 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/discovery/aliases.d.ts +31 -0
- package/dist/discovery/aliases.d.ts.map +1 -0
- package/dist/discovery/aliases.js +477 -0
- package/dist/discovery/aliases.js.map +1 -0
- package/dist/discovery/loader.d.ts.map +1 -1
- package/dist/discovery/loader.js +25 -0
- package/dist/discovery/loader.js.map +1 -1
- package/dist/discovery/search.d.ts +73 -0
- package/dist/discovery/search.d.ts.map +1 -0
- package/dist/discovery/search.js +355 -0
- package/dist/discovery/search.js.map +1 -0
- package/dist/manifest-compact.txt +15 -0
- package/dist/manifest-search.json +1 -0
- package/dist/manifest.json +433 -244
- package/dist/mcp/oauth.d.ts +33 -0
- package/dist/mcp/oauth.d.ts.map +1 -0
- package/dist/mcp/oauth.js +220 -0
- package/dist/mcp/oauth.js.map +1 -0
- package/dist/mcp/schema.d.ts +65 -0
- package/dist/mcp/schema.d.ts.map +1 -0
- package/dist/mcp/schema.js +136 -0
- package/dist/mcp/schema.js.map +1 -0
- package/dist/mcp/server.d.ts +23 -10
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +350 -182
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/sse-transport.d.ts +34 -0
- package/dist/mcp/sse-transport.d.ts.map +1 -0
- package/dist/mcp/sse-transport.js +182 -0
- package/dist/mcp/sse-transport.js.map +1 -0
- package/dist/mcp/streamable-http.d.ts +64 -0
- package/dist/mcp/streamable-http.d.ts.map +1 -0
- package/dist/mcp/streamable-http.js +312 -0
- package/dist/mcp/streamable-http.js.map +1 -0
- package/dist/permissions/sensitive-paths.js +2 -2
- package/dist/permissions/sensitive-paths.js.map +1 -1
- package/package.json +7 -7
- package/src/adapters/1688/_site.json +9 -0
- package/src/adapters/barchart/_site.json +10 -0
- package/src/adapters/jd/_site.json +9 -0
- package/src/adapters/linkedin/_site.json +10 -0
- package/src/adapters/macos/finder-copy.yaml +40 -0
- package/src/adapters/macos/finder-move.yaml +40 -0
- package/src/adapters/macos/finder-new-folder.yaml +36 -0
- package/src/adapters/macos/safari-history.yaml +23 -0
- package/src/adapters/macos/safari-url.yaml +22 -0
- package/src/adapters/macos/screen-recording.yaml +32 -0
- package/src/adapters/macos/wallpaper.yaml +33 -0
- package/src/adapters/reuters/_site.json +9 -0
- package/src/adapters/sinablog/_site.json +9 -0
- package/src/adapters/smzdm/_site.json +9 -0
- package/src/adapters/weixin/_site.json +9 -0
- package/src/adapters/1688/manifest.yaml +0 -7
- package/src/adapters/barchart/manifest.yaml +0 -8
- package/src/adapters/jd/manifest.yaml +0 -7
- package/src/adapters/linkedin/manifest.yaml +0 -8
- package/src/adapters/reuters/manifest.yaml +0 -7
- package/src/adapters/sinablog/manifest.yaml +0 -7
- package/src/adapters/smzdm/manifest.yaml +0 -7
- package/src/adapters/weixin/manifest.yaml +0 -7
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streamable HTTP transport for the MCP server (spec 2025-03-26).
|
|
3
|
+
*
|
|
4
|
+
* Single endpoint: POST /mcp
|
|
5
|
+
* - JSON-RPC request in body
|
|
6
|
+
* - Response as application/json or text/event-stream (per Accept header)
|
|
7
|
+
* - MCP-Session-Id header for session management
|
|
8
|
+
* - MCP-Protocol-Version header enforced post-initialization
|
|
9
|
+
*
|
|
10
|
+
* DELETE /mcp — terminate session (requires MCP-Session-Id)
|
|
11
|
+
* GET /health — server status + active session count
|
|
12
|
+
*
|
|
13
|
+
* Zero external dependencies — Node.js http + crypto only.
|
|
14
|
+
*/
|
|
15
|
+
import { randomUUID } from "node:crypto";
|
|
16
|
+
import { createServer, } from "node:http";
|
|
17
|
+
import { VERSION } from "../constants.js";
|
|
18
|
+
import { handleOAuthRoute, createOAuthMiddleware } from "./oauth.js";
|
|
19
|
+
// ── Constants ──────────────────────────────────────────────────────────────
|
|
20
|
+
const MAX_BODY = 1_048_576; // 1 MB
|
|
21
|
+
const SESSION_TTL_MS = 3_600_000; // 1 hour
|
|
22
|
+
const PRUNE_INTERVAL_MS = 300_000; // 5 minutes
|
|
23
|
+
const HEARTBEAT_MS = 30_000;
|
|
24
|
+
const MCP_PROTOCOL_VERSION = "2025-03-26";
|
|
25
|
+
const ALLOWED_ORIGINS = new Set(["http://localhost", "http://127.0.0.1"]);
|
|
26
|
+
// Methods that may produce long-running responses — served as SSE when
|
|
27
|
+
// the client accepts text/event-stream.
|
|
28
|
+
const STREAMING_METHODS = new Set(["tools/call"]);
|
|
29
|
+
const sessions = new Map();
|
|
30
|
+
// ── Helpers ────────────────────────────────────────────────────────────────
|
|
31
|
+
function jsonResponse(res, status, body, extraHeaders) {
|
|
32
|
+
res.writeHead(status, {
|
|
33
|
+
"Content-Type": "application/json",
|
|
34
|
+
"Cache-Control": "no-store",
|
|
35
|
+
...extraHeaders,
|
|
36
|
+
});
|
|
37
|
+
res.end(JSON.stringify(body));
|
|
38
|
+
}
|
|
39
|
+
function readBody(req) {
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
const chunks = [];
|
|
42
|
+
let size = 0;
|
|
43
|
+
req.on("data", (chunk) => {
|
|
44
|
+
size += chunk.length;
|
|
45
|
+
if (size > MAX_BODY) {
|
|
46
|
+
req.destroy();
|
|
47
|
+
reject(new Error("Request too large"));
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
chunks.push(chunk);
|
|
51
|
+
});
|
|
52
|
+
req.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
|
|
53
|
+
req.on("error", reject);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function pruneStaleSessions() {
|
|
57
|
+
const cutoff = Date.now() - SESSION_TTL_MS;
|
|
58
|
+
for (const [id, session] of sessions) {
|
|
59
|
+
if (session.lastSeen < cutoff)
|
|
60
|
+
sessions.delete(id);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Validate Origin header for DNS rebinding protection.
|
|
65
|
+
* Allow requests with no Origin (non-browser clients) or from localhost.
|
|
66
|
+
*/
|
|
67
|
+
function isOriginAllowed(req) {
|
|
68
|
+
const origin = req.headers.origin;
|
|
69
|
+
if (!origin)
|
|
70
|
+
return true; // Non-browser clients omit Origin
|
|
71
|
+
// Accept any localhost origin regardless of port
|
|
72
|
+
try {
|
|
73
|
+
const url = new URL(origin);
|
|
74
|
+
if (url.hostname === "localhost" || url.hostname === "127.0.0.1") {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Malformed origin — reject
|
|
80
|
+
}
|
|
81
|
+
return ALLOWED_ORIGINS.has(origin);
|
|
82
|
+
}
|
|
83
|
+
function clientAcceptsSSE(req) {
|
|
84
|
+
const accept = req.headers.accept ?? "";
|
|
85
|
+
return accept.includes("text/event-stream");
|
|
86
|
+
}
|
|
87
|
+
// ── POST /mcp Handler ──────────────────────────────────────────────────────
|
|
88
|
+
async function handlePost(req, res, handler) {
|
|
89
|
+
// Origin validation
|
|
90
|
+
if (!isOriginAllowed(req)) {
|
|
91
|
+
jsonResponse(res, 403, {
|
|
92
|
+
jsonrpc: "2.0",
|
|
93
|
+
id: null,
|
|
94
|
+
error: { code: -32600, message: "Forbidden: invalid Origin" },
|
|
95
|
+
});
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
// Read and parse body
|
|
99
|
+
let body;
|
|
100
|
+
try {
|
|
101
|
+
body = await readBody(req);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
jsonResponse(res, 413, {
|
|
105
|
+
jsonrpc: "2.0",
|
|
106
|
+
id: null,
|
|
107
|
+
error: { code: -32600, message: "Request too large" },
|
|
108
|
+
});
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
let parsed;
|
|
112
|
+
try {
|
|
113
|
+
parsed = JSON.parse(body);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
jsonResponse(res, 400, {
|
|
117
|
+
jsonrpc: "2.0",
|
|
118
|
+
id: null,
|
|
119
|
+
error: { code: -32700, message: "Parse error" },
|
|
120
|
+
});
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
124
|
+
const isInitialize = parsed.method === "initialize";
|
|
125
|
+
// Session validation: post-init requests require a valid session
|
|
126
|
+
if (!isInitialize) {
|
|
127
|
+
if (!sessionId || !sessions.has(sessionId)) {
|
|
128
|
+
jsonResponse(res, 400, {
|
|
129
|
+
jsonrpc: "2.0",
|
|
130
|
+
id: parsed.id ?? null,
|
|
131
|
+
error: { code: -32600, message: "Invalid or missing MCP-Session-Id" },
|
|
132
|
+
});
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
sessions.get(sessionId).lastSeen = Date.now();
|
|
136
|
+
}
|
|
137
|
+
// Notification (no id) — respond 204 No Content
|
|
138
|
+
if (parsed.id === undefined || parsed.id === null) {
|
|
139
|
+
try {
|
|
140
|
+
await handler(parsed);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// Notifications have no response — swallow errors
|
|
144
|
+
}
|
|
145
|
+
res.writeHead(204);
|
|
146
|
+
res.end();
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
// Execute the handler
|
|
150
|
+
let response;
|
|
151
|
+
try {
|
|
152
|
+
response = await handler(parsed);
|
|
153
|
+
// Handler returns null for notifications — should not reach here due to
|
|
154
|
+
// the check above, but guard anyway.
|
|
155
|
+
if (!response) {
|
|
156
|
+
res.writeHead(204);
|
|
157
|
+
res.end();
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
163
|
+
jsonResponse(res, 500, {
|
|
164
|
+
jsonrpc: "2.0",
|
|
165
|
+
id: parsed.id ?? null,
|
|
166
|
+
error: { code: -32603, message: `Internal error: ${message}` },
|
|
167
|
+
});
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
// For initialize: create session and return MCP-Session-Id
|
|
171
|
+
if (isInitialize) {
|
|
172
|
+
const newSessionId = randomUUID();
|
|
173
|
+
sessions.set(newSessionId, {
|
|
174
|
+
created: Date.now(),
|
|
175
|
+
lastSeen: Date.now(),
|
|
176
|
+
protocolVersion: MCP_PROTOCOL_VERSION,
|
|
177
|
+
});
|
|
178
|
+
jsonResponse(res, 200, response, {
|
|
179
|
+
"MCP-Session-Id": newSessionId,
|
|
180
|
+
"MCP-Protocol-Version": MCP_PROTOCOL_VERSION,
|
|
181
|
+
});
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
// For streaming-eligible methods: respond with SSE if client accepts it
|
|
185
|
+
if (STREAMING_METHODS.has(parsed.method) && clientAcceptsSSE(req)) {
|
|
186
|
+
res.writeHead(200, {
|
|
187
|
+
"Content-Type": "text/event-stream",
|
|
188
|
+
"Cache-Control": "no-cache",
|
|
189
|
+
Connection: "keep-alive",
|
|
190
|
+
"MCP-Session-Id": sessionId,
|
|
191
|
+
});
|
|
192
|
+
// Send the response as an SSE event
|
|
193
|
+
const eventId = randomUUID();
|
|
194
|
+
res.write(`id: ${eventId}\nevent: message\ndata: ${JSON.stringify(response)}\n\n`);
|
|
195
|
+
// Close the stream after delivering the response
|
|
196
|
+
res.end();
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
// Default: respond with JSON
|
|
200
|
+
const headers = {};
|
|
201
|
+
if (sessionId)
|
|
202
|
+
headers["MCP-Session-Id"] = sessionId;
|
|
203
|
+
jsonResponse(res, 200, response, headers);
|
|
204
|
+
}
|
|
205
|
+
// ── DELETE /mcp Handler ────────────────────────────────────────────────────
|
|
206
|
+
function handleDelete(req, res) {
|
|
207
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
208
|
+
if (!sessionId || !sessions.has(sessionId)) {
|
|
209
|
+
jsonResponse(res, 400, {
|
|
210
|
+
jsonrpc: "2.0",
|
|
211
|
+
id: null,
|
|
212
|
+
error: { code: -32600, message: "Invalid or missing MCP-Session-Id" },
|
|
213
|
+
});
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
sessions.delete(sessionId);
|
|
217
|
+
res.writeHead(204);
|
|
218
|
+
res.end();
|
|
219
|
+
}
|
|
220
|
+
// ── Public API ─────────────────────────────────────────────────────────────
|
|
221
|
+
/**
|
|
222
|
+
* Start the MCP Streamable HTTP transport server (spec 2025-03-26).
|
|
223
|
+
*
|
|
224
|
+
* Single endpoint (POST /mcp) handles all JSON-RPC communication.
|
|
225
|
+
* DELETE /mcp terminates sessions. GET /health returns server info.
|
|
226
|
+
*/
|
|
227
|
+
export async function startStreamableHttp(port, handler, options) {
|
|
228
|
+
const oauthMiddleware = options?.auth ? createOAuthMiddleware() : null;
|
|
229
|
+
// Periodic session pruning
|
|
230
|
+
const pruneTimer = setInterval(pruneStaleSessions, PRUNE_INTERVAL_MS);
|
|
231
|
+
pruneTimer.unref(); // Do not keep process alive for pruning
|
|
232
|
+
const server = createServer((req, res) => {
|
|
233
|
+
const method = req.method ?? "";
|
|
234
|
+
const pathname = (req.url ?? "/").split("?")[0];
|
|
235
|
+
// CORS preflight
|
|
236
|
+
if (method === "OPTIONS") {
|
|
237
|
+
res.writeHead(204, {
|
|
238
|
+
"Access-Control-Allow-Origin": req.headers.origin ?? "*",
|
|
239
|
+
"Access-Control-Allow-Methods": "POST, DELETE, OPTIONS",
|
|
240
|
+
"Access-Control-Allow-Headers": "Content-Type, MCP-Session-Id, MCP-Protocol-Version, Authorization, Accept",
|
|
241
|
+
"Access-Control-Max-Age": "86400",
|
|
242
|
+
});
|
|
243
|
+
res.end();
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
// OAuth routes — always public when auth is enabled
|
|
247
|
+
if (options?.auth && handleOAuthRoute(req, res))
|
|
248
|
+
return;
|
|
249
|
+
// Health check
|
|
250
|
+
if (method === "GET" && (pathname === "/health" || pathname === "/")) {
|
|
251
|
+
jsonResponse(res, 200, {
|
|
252
|
+
status: "ok",
|
|
253
|
+
transport: "streamable-http",
|
|
254
|
+
version: VERSION,
|
|
255
|
+
sessions: sessions.size,
|
|
256
|
+
protocolVersion: MCP_PROTOCOL_VERSION,
|
|
257
|
+
});
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
// Main MCP endpoint
|
|
261
|
+
if (pathname === "/mcp") {
|
|
262
|
+
// OAuth middleware — block unauthenticated requests
|
|
263
|
+
if (oauthMiddleware?.(req, res))
|
|
264
|
+
return;
|
|
265
|
+
if (method === "POST") {
|
|
266
|
+
handlePost(req, res, handler).catch(() => {
|
|
267
|
+
if (!res.writableEnded) {
|
|
268
|
+
jsonResponse(res, 500, {
|
|
269
|
+
jsonrpc: "2.0",
|
|
270
|
+
id: null,
|
|
271
|
+
error: { code: -32603, message: "Unexpected server error" },
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
if (method === "DELETE") {
|
|
278
|
+
handleDelete(req, res);
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// Not found
|
|
283
|
+
res.writeHead(404, { "Content-Type": "application/json" });
|
|
284
|
+
res.end(JSON.stringify({ error: "Not found" }));
|
|
285
|
+
});
|
|
286
|
+
server.on("close", () => {
|
|
287
|
+
clearInterval(pruneTimer);
|
|
288
|
+
sessions.clear();
|
|
289
|
+
});
|
|
290
|
+
await new Promise((resolve, reject) => {
|
|
291
|
+
server.once("error", reject);
|
|
292
|
+
server.listen(port, "127.0.0.1", () => {
|
|
293
|
+
server.off("error", reject);
|
|
294
|
+
resolve();
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
process.stderr.write(`unicli MCP server v${VERSION} — Streamable HTTP transport on http://127.0.0.1:${port}\n` +
|
|
298
|
+
` MCP endpoint: POST/DELETE http://127.0.0.1:${port}/mcp\n` +
|
|
299
|
+
` Health check: GET http://127.0.0.1:${port}/health\n` +
|
|
300
|
+
` Protocol: ${MCP_PROTOCOL_VERSION}\n`);
|
|
301
|
+
}
|
|
302
|
+
// Exported for testing
|
|
303
|
+
export const _test = {
|
|
304
|
+
sessions,
|
|
305
|
+
pruneStaleSessions,
|
|
306
|
+
isOriginAllowed,
|
|
307
|
+
ALLOWED_ORIGINS,
|
|
308
|
+
SESSION_TTL_MS,
|
|
309
|
+
HEARTBEAT_MS,
|
|
310
|
+
MCP_PROTOCOL_VERSION,
|
|
311
|
+
};
|
|
312
|
+
//# sourceMappingURL=streamable-http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamable-http.js","sourceRoot":"","sources":["../../src/mcp/streamable-http.ts"],"names":[],"mappings":"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"}
|
|
@@ -61,8 +61,8 @@ export const SENSITIVE_PATH_PATTERNS = [
|
|
|
61
61
|
// GCP credentials
|
|
62
62
|
/\/\.config\/gcloud\/(application_default_credentials|legacy_credentials)/,
|
|
63
63
|
// Azure CLI session + profile
|
|
64
|
-
/\/\.azure\/accesstokens\.json
|
|
65
|
-
/\/\.azure\/azureprofile\.json
|
|
64
|
+
/\/\.azure\/accesstokens\.json$/i,
|
|
65
|
+
/\/\.azure\/azureprofile\.json$/i,
|
|
66
66
|
// GitHub CLI host config (contains OAuth token)
|
|
67
67
|
/\/\.config\/gh\/hosts\.yml$/,
|
|
68
68
|
// 1Password CLI session state
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sensitive-paths.js","sourceRoot":"","sources":["../../src/permissions/sensitive-paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AAEnD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAsB;IACxD,yCAAyC;IACzC,eAAe;IACf,kBAAkB;IAClB,uBAAuB;IACvB,kBAAkB;IAClB,iCAAiC;IACjC,iBAAiB;IACjB,oBAAoB;IACpB,mBAAmB;IACnB,qBAAqB;IACrB,2BAA2B;IAC3B,iBAAiB;IACjB,YAAY;IACZ,kCAAkC;IAClC,mCAAmC;IACnC,gCAAgC;IAChC,0CAA0C;IAC1C,qCAAqC;IACrC,sCAAsC;IACtC,kBAAkB;IAClB,0EAA0E;IAC1E,8BAA8B;IAC9B,
|
|
1
|
+
{"version":3,"file":"sensitive-paths.js","sourceRoot":"","sources":["../../src/permissions/sensitive-paths.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zenalexa/unicli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.211.2",
|
|
4
4
|
"description": "The universal interface between AI agents and the world's software",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/main.js",
|
|
@@ -69,23 +69,23 @@
|
|
|
69
69
|
"dependencies": {
|
|
70
70
|
"chalk": "^5.4.1",
|
|
71
71
|
"cli-table3": "^0.6.5",
|
|
72
|
-
"commander": "^
|
|
72
|
+
"commander": "^14.0.3",
|
|
73
73
|
"js-yaml": "^4.1.0",
|
|
74
74
|
"turndown": "^7.2.4",
|
|
75
|
-
"undici": "^
|
|
75
|
+
"undici": "^8.0.2",
|
|
76
76
|
"ws": "^8.18.0",
|
|
77
|
-
"zod": "^3.
|
|
77
|
+
"zod": "^4.3.6"
|
|
78
78
|
},
|
|
79
79
|
"devDependencies": {
|
|
80
80
|
"@types/js-yaml": "^4.0.9",
|
|
81
|
-
"@types/node": "^
|
|
81
|
+
"@types/node": "^25.6.0",
|
|
82
82
|
"@types/turndown": "^5.0.6",
|
|
83
83
|
"@types/ws": "^8.5.14",
|
|
84
84
|
"oxlint": "^1.0.0",
|
|
85
85
|
"prettier": "^3.5.0",
|
|
86
86
|
"tsx": "^4.19.0",
|
|
87
|
-
"typescript": "^
|
|
87
|
+
"typescript": "^6.0.2",
|
|
88
88
|
"vitepress": "^1.6.0",
|
|
89
|
-
"vitest": "^3.
|
|
89
|
+
"vitest": "^3.2.4"
|
|
90
90
|
}
|
|
91
91
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"site": "barchart",
|
|
3
|
+
"displayName": "Barchart",
|
|
4
|
+
"type": "web-api",
|
|
5
|
+
"domain": "barchart.com",
|
|
6
|
+
"description": "Barchart — financial data, options, and market analytics",
|
|
7
|
+
"strategy": "cookie",
|
|
8
|
+
"category": "finance",
|
|
9
|
+
"auth_cookies": ["bcFreeUserPage498", "laravel_session", "XSRF-TOKEN"]
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"site": "linkedin",
|
|
3
|
+
"displayName": "LinkedIn",
|
|
4
|
+
"type": "web-api",
|
|
5
|
+
"domain": "linkedin.com",
|
|
6
|
+
"description": "LinkedIn — professional networking and job search",
|
|
7
|
+
"strategy": "header",
|
|
8
|
+
"category": "social",
|
|
9
|
+
"auth_cookies": ["li_at", "JSESSIONID"]
|
|
10
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
site: macos
|
|
2
|
+
name: finder-copy
|
|
3
|
+
description: Copy a file or folder to a destination path
|
|
4
|
+
type: desktop
|
|
5
|
+
binary: osascript
|
|
6
|
+
detect: "test $(uname) = Darwin"
|
|
7
|
+
|
|
8
|
+
args:
|
|
9
|
+
source:
|
|
10
|
+
type: str
|
|
11
|
+
required: true
|
|
12
|
+
positional: true
|
|
13
|
+
description: Source file or folder path
|
|
14
|
+
destination:
|
|
15
|
+
type: str
|
|
16
|
+
required: true
|
|
17
|
+
positional: true
|
|
18
|
+
description: Destination path
|
|
19
|
+
|
|
20
|
+
pipeline:
|
|
21
|
+
- exec:
|
|
22
|
+
command: osascript
|
|
23
|
+
args:
|
|
24
|
+
- "-l"
|
|
25
|
+
- "JavaScript"
|
|
26
|
+
- "-e"
|
|
27
|
+
- |
|
|
28
|
+
const fm = $.NSFileManager.defaultManager;
|
|
29
|
+
const src = ${{ args.source | json }};
|
|
30
|
+
const dst = ${{ args.destination | json }};
|
|
31
|
+
const err = Ref();
|
|
32
|
+
const ok = fm.copyItemAtPathToPathError(src, dst, err);
|
|
33
|
+
if (!ok) {
|
|
34
|
+
const msg = err[0] ? ObjC.unwrap(err[0].localizedDescription) : 'unknown error';
|
|
35
|
+
throw new Error(msg);
|
|
36
|
+
}
|
|
37
|
+
JSON.stringify([{ copied: src, to: dst, status: 'ok' }]);
|
|
38
|
+
parse: json
|
|
39
|
+
|
|
40
|
+
columns: [copied, to, status]
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
site: macos
|
|
2
|
+
name: finder-move
|
|
3
|
+
description: Move or rename a file or folder
|
|
4
|
+
type: desktop
|
|
5
|
+
binary: osascript
|
|
6
|
+
detect: "test $(uname) = Darwin"
|
|
7
|
+
|
|
8
|
+
args:
|
|
9
|
+
source:
|
|
10
|
+
type: str
|
|
11
|
+
required: true
|
|
12
|
+
positional: true
|
|
13
|
+
description: Source file or folder path
|
|
14
|
+
destination:
|
|
15
|
+
type: str
|
|
16
|
+
required: true
|
|
17
|
+
positional: true
|
|
18
|
+
description: Destination path
|
|
19
|
+
|
|
20
|
+
pipeline:
|
|
21
|
+
- exec:
|
|
22
|
+
command: osascript
|
|
23
|
+
args:
|
|
24
|
+
- "-l"
|
|
25
|
+
- "JavaScript"
|
|
26
|
+
- "-e"
|
|
27
|
+
- |
|
|
28
|
+
const fm = $.NSFileManager.defaultManager;
|
|
29
|
+
const src = ${{ args.source | json }};
|
|
30
|
+
const dst = ${{ args.destination | json }};
|
|
31
|
+
const err = Ref();
|
|
32
|
+
const ok = fm.moveItemAtPathToPathError(src, dst, err);
|
|
33
|
+
if (!ok) {
|
|
34
|
+
const msg = err[0] ? ObjC.unwrap(err[0].localizedDescription) : 'unknown error';
|
|
35
|
+
throw new Error(msg);
|
|
36
|
+
}
|
|
37
|
+
JSON.stringify([{ moved: src, to: dst, status: 'ok' }]);
|
|
38
|
+
parse: json
|
|
39
|
+
|
|
40
|
+
columns: [moved, to, status]
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
site: macos
|
|
2
|
+
name: finder-new-folder
|
|
3
|
+
description: Create a new directory (with intermediate directories)
|
|
4
|
+
type: desktop
|
|
5
|
+
binary: osascript
|
|
6
|
+
detect: "test $(uname) = Darwin"
|
|
7
|
+
|
|
8
|
+
args:
|
|
9
|
+
path:
|
|
10
|
+
type: str
|
|
11
|
+
required: true
|
|
12
|
+
positional: true
|
|
13
|
+
description: Directory path to create
|
|
14
|
+
|
|
15
|
+
pipeline:
|
|
16
|
+
- exec:
|
|
17
|
+
command: osascript
|
|
18
|
+
args:
|
|
19
|
+
- "-l"
|
|
20
|
+
- "JavaScript"
|
|
21
|
+
- "-e"
|
|
22
|
+
- |
|
|
23
|
+
const fm = $.NSFileManager.defaultManager;
|
|
24
|
+
const path = ${{ args.path | json }};
|
|
25
|
+
const err = Ref();
|
|
26
|
+
const ok = fm.createDirectoryAtPathWithIntermediateDirectoriesAttributesError(
|
|
27
|
+
path, true, $(), err
|
|
28
|
+
);
|
|
29
|
+
if (!ok) {
|
|
30
|
+
const msg = err[0] ? ObjC.unwrap(err[0].localizedDescription) : 'unknown error';
|
|
31
|
+
throw new Error(msg);
|
|
32
|
+
}
|
|
33
|
+
JSON.stringify([{ created: path, status: 'ok' }]);
|
|
34
|
+
parse: json
|
|
35
|
+
|
|
36
|
+
columns: [created, status]
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
site: macos
|
|
2
|
+
name: safari-history
|
|
3
|
+
description: Get recent Safari browsing history via SQLite
|
|
4
|
+
type: desktop
|
|
5
|
+
binary: sqlite3
|
|
6
|
+
detect: "test $(uname) = Darwin"
|
|
7
|
+
|
|
8
|
+
args:
|
|
9
|
+
limit:
|
|
10
|
+
type: int
|
|
11
|
+
default: 20
|
|
12
|
+
description: Number of recent history entries to return
|
|
13
|
+
|
|
14
|
+
pipeline:
|
|
15
|
+
- exec:
|
|
16
|
+
command: sqlite3
|
|
17
|
+
args:
|
|
18
|
+
- "-json"
|
|
19
|
+
- "$HOME/Library/Safari/History.db"
|
|
20
|
+
- "SELECT hi.url, hv.title, datetime(hv.visit_time + 978307200, 'unixepoch', 'localtime') AS visited_at FROM history_visits hv JOIN history_items hi ON hv.history_item = hi.id ORDER BY hv.visit_time DESC LIMIT ${{ args.limit | int | default(20) }};"
|
|
21
|
+
parse: json
|
|
22
|
+
|
|
23
|
+
columns: [title, url, visited_at]
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
site: macos
|
|
2
|
+
name: safari-url
|
|
3
|
+
description: Get the URL and title of the active Safari tab
|
|
4
|
+
type: desktop
|
|
5
|
+
binary: osascript
|
|
6
|
+
detect: "test $(uname) = Darwin"
|
|
7
|
+
|
|
8
|
+
pipeline:
|
|
9
|
+
- exec:
|
|
10
|
+
command: osascript
|
|
11
|
+
args:
|
|
12
|
+
- "-l"
|
|
13
|
+
- "JavaScript"
|
|
14
|
+
- "-e"
|
|
15
|
+
- |
|
|
16
|
+
const app = Application('Safari');
|
|
17
|
+
const win = app.windows[0];
|
|
18
|
+
const tab = win.currentTab();
|
|
19
|
+
JSON.stringify([{ url: tab.url(), title: tab.name() }]);
|
|
20
|
+
parse: json
|
|
21
|
+
|
|
22
|
+
columns: [url, title]
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
site: macos
|
|
2
|
+
name: screen-recording
|
|
3
|
+
description: Record the screen to a video file using screencapture
|
|
4
|
+
type: desktop
|
|
5
|
+
binary: screencapture
|
|
6
|
+
detect: "test $(uname) = Darwin"
|
|
7
|
+
|
|
8
|
+
args:
|
|
9
|
+
file:
|
|
10
|
+
type: str
|
|
11
|
+
default: "/tmp/recording.mov"
|
|
12
|
+
description: Output file path for the recording (must end in .mov or .mp4)
|
|
13
|
+
duration:
|
|
14
|
+
type: int
|
|
15
|
+
default: 10
|
|
16
|
+
description: Recording duration in seconds
|
|
17
|
+
|
|
18
|
+
pipeline:
|
|
19
|
+
- exec:
|
|
20
|
+
command: screencapture
|
|
21
|
+
args:
|
|
22
|
+
- "-x"
|
|
23
|
+
- "-v"
|
|
24
|
+
- "-V"
|
|
25
|
+
- "${{ args.duration | default(10) }}"
|
|
26
|
+
- "${{ args.file | default('/tmp/recording.mov') }}"
|
|
27
|
+
parse: text
|
|
28
|
+
timeout: "${{ (args.duration + 5) * 1000 }}"
|
|
29
|
+
|
|
30
|
+
- evaluate: "JSON.stringify([{ file: ${{ args.file | json }}, duration: ${{ args.duration }}, status: 'recorded' }])"
|
|
31
|
+
|
|
32
|
+
columns: [file, duration, status]
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
site: macos
|
|
2
|
+
name: wallpaper
|
|
3
|
+
description: Get or set the desktop wallpaper
|
|
4
|
+
type: desktop
|
|
5
|
+
binary: osascript
|
|
6
|
+
detect: "test $(uname) = Darwin"
|
|
7
|
+
|
|
8
|
+
args:
|
|
9
|
+
path:
|
|
10
|
+
type: str
|
|
11
|
+
positional: true
|
|
12
|
+
description: Path to image file (omit to get the current wallpaper)
|
|
13
|
+
|
|
14
|
+
pipeline:
|
|
15
|
+
- exec:
|
|
16
|
+
command: osascript
|
|
17
|
+
args:
|
|
18
|
+
- "-l"
|
|
19
|
+
- "JavaScript"
|
|
20
|
+
- "-e"
|
|
21
|
+
- |
|
|
22
|
+
const se = Application('System Events');
|
|
23
|
+
const desktop = se.desktops[0];
|
|
24
|
+
const newPath = ${{ args.path | default("") | json }};
|
|
25
|
+
if (newPath) {
|
|
26
|
+
desktop.picture = newPath;
|
|
27
|
+
JSON.stringify([{ wallpaper: newPath, action: 'set' }]);
|
|
28
|
+
} else {
|
|
29
|
+
JSON.stringify([{ wallpaper: desktop.picture(), action: 'get' }]);
|
|
30
|
+
}
|
|
31
|
+
parse: json
|
|
32
|
+
|
|
33
|
+
columns: [wallpaper, action]
|