@unclick/mcp-server 0.2.5 → 0.3.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/README.md +160 -139
- package/dist/abn-tool.js +1 -1
- package/dist/bgg-tool.js +1 -1
- package/dist/carboninterface-tool.js +1 -1
- package/dist/cards/card.d.ts +9 -0
- package/dist/cards/card.d.ts.map +1 -0
- package/dist/cards/card.js +4 -0
- package/dist/cards/card.js.map +1 -0
- package/dist/cards/search-memory-card.d.ts +11 -0
- package/dist/cards/search-memory-card.d.ts.map +1 -0
- package/dist/cards/search-memory-card.js +75 -0
- package/dist/cards/search-memory-card.js.map +1 -0
- package/dist/cards/search-memory-card.test.d.ts +2 -0
- package/dist/cards/search-memory-card.test.d.ts.map +1 -0
- package/dist/cards/search-memory-card.test.js +59 -0
- package/dist/cards/search-memory-card.test.js.map +1 -0
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +265 -4
- package/dist/catalog.js.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +96 -6
- package/dist/client.js.map +1 -1
- package/dist/converter-tools.js +1 -1
- package/dist/crews-tool.d.ts +12 -0
- package/dist/crews-tool.d.ts.map +1 -0
- package/dist/crews-tool.js +125 -0
- package/dist/crews-tool.js.map +1 -0
- package/dist/gdelt-tool.js +4 -4
- package/dist/hackernews-tool.js +1 -1
- package/dist/index.js +0 -0
- package/dist/keychain-secure-input.js +42 -42
- package/dist/line-tool.js +1 -1
- package/dist/linear-tool.js +73 -73
- package/dist/local-catalog-handlers.js +1 -1
- package/dist/local-catalog-handlers.js.map +1 -1
- package/dist/local-tools.js +7 -7
- package/dist/local-tools.js.map +1 -1
- package/dist/memory/__tests__/bitemporal.test.d.ts +8 -0
- package/dist/memory/__tests__/bitemporal.test.d.ts.map +1 -0
- package/dist/memory/__tests__/bitemporal.test.js +148 -0
- package/dist/memory/__tests__/bitemporal.test.js.map +1 -0
- package/dist/memory/__tests__/hybrid-search.test.d.ts +14 -0
- package/dist/memory/__tests__/hybrid-search.test.d.ts.map +1 -0
- package/dist/memory/__tests__/hybrid-search.test.js +304 -0
- package/dist/memory/__tests__/hybrid-search.test.js.map +1 -0
- package/dist/memory/agent.d.ts +34 -0
- package/dist/memory/agent.d.ts.map +1 -0
- package/dist/memory/agent.js +69 -0
- package/dist/memory/agent.js.map +1 -0
- package/dist/memory/conflicts.d.ts +48 -0
- package/dist/memory/conflicts.d.ts.map +1 -0
- package/dist/memory/conflicts.js +209 -0
- package/dist/memory/conflicts.js.map +1 -0
- package/dist/memory/db.d.ts +25 -0
- package/dist/memory/db.d.ts.map +1 -0
- package/dist/memory/db.js +144 -0
- package/dist/memory/db.js.map +1 -0
- package/dist/memory/device.d.ts +20 -0
- package/dist/memory/device.d.ts.map +1 -0
- package/dist/memory/device.js +48 -0
- package/dist/memory/device.js.map +1 -0
- package/dist/memory/embeddings.d.ts +10 -0
- package/dist/memory/embeddings.d.ts.map +1 -0
- package/dist/memory/embeddings.js +40 -0
- package/dist/memory/embeddings.js.map +1 -0
- package/dist/memory/handlers.d.ts +11 -0
- package/dist/memory/handlers.d.ts.map +1 -0
- package/dist/memory/handlers.js +219 -0
- package/dist/memory/handlers.js.map +1 -0
- package/dist/memory/instrumentation.d.ts +38 -0
- package/dist/memory/instrumentation.d.ts.map +1 -0
- package/dist/memory/instrumentation.js +97 -0
- package/dist/memory/instrumentation.js.map +1 -0
- package/dist/memory/load-events.d.ts +18 -0
- package/dist/memory/load-events.d.ts.map +1 -0
- package/dist/memory/load-events.js +61 -0
- package/dist/memory/load-events.js.map +1 -0
- package/dist/memory/local.d.ts +40 -0
- package/dist/memory/local.d.ts.map +1 -0
- package/dist/memory/local.js +400 -0
- package/dist/memory/local.js.map +1 -0
- package/dist/memory/session-state.d.ts +37 -0
- package/dist/memory/session-state.d.ts.map +1 -0
- package/dist/memory/session-state.js +82 -0
- package/dist/memory/session-state.js.map +1 -0
- package/dist/memory/supabase.d.ts +104 -0
- package/dist/memory/supabase.d.ts.map +1 -0
- package/dist/memory/supabase.js +710 -0
- package/dist/memory/supabase.js.map +1 -0
- package/dist/memory/tenant-settings.d.ts +33 -0
- package/dist/memory/tenant-settings.d.ts.map +1 -0
- package/dist/memory/tenant-settings.js +79 -0
- package/dist/memory/tenant-settings.js.map +1 -0
- package/dist/memory/tool-awareness.d.ts +66 -0
- package/dist/memory/tool-awareness.d.ts.map +1 -0
- package/dist/memory/tool-awareness.js +307 -0
- package/dist/memory/tool-awareness.js.map +1 -0
- package/dist/memory/types.d.ts +97 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +5 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/monday-tool.js +46 -46
- package/dist/musicbrainz-tool.js +1 -1
- package/dist/musicbrainz-tool.js.map +1 -1
- package/dist/numbers-tool.js +2 -2
- package/dist/openfoodfacts-tool.js +1 -1
- package/dist/openmeteo-tool.js +1 -1
- package/dist/radiobrowser-tool.js +2 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +838 -15
- package/dist/server.js.map +1 -1
- package/dist/signals/emit.d.ts +11 -0
- package/dist/signals/emit.d.ts.map +1 -0
- package/dist/signals/emit.js +26 -0
- package/dist/signals/emit.js.map +1 -0
- package/dist/testpass-tool.d.ts +12 -0
- package/dist/testpass-tool.d.ts.map +1 -0
- package/dist/testpass-tool.js +121 -0
- package/dist/testpass-tool.js.map +1 -0
- package/dist/toilets-tool.js +2 -2
- package/dist/tool-wiring.d.ts +320 -4
- package/dist/tool-wiring.d.ts.map +1 -1
- package/dist/tool-wiring.js +246 -5
- package/dist/tool-wiring.js.map +1 -1
- package/dist/trivia-tool.js +5 -5
- package/dist/usgs-tool.js +1 -1
- package/dist/uxpass-tool.d.ts +24 -0
- package/dist/uxpass-tool.d.ts.map +1 -0
- package/dist/uxpass-tool.js +165 -0
- package/dist/uxpass-tool.js.map +1 -0
- package/dist/vault-bridge.js +7 -7
- package/dist/vercel-tool.d.ts +3 -0
- package/dist/vercel-tool.d.ts.map +1 -1
- package/dist/vercel-tool.js +198 -7
- package/dist/vercel-tool.js.map +1 -1
- package/dist/web-tools.d.ts +62 -0
- package/dist/web-tools.d.ts.map +1 -0
- package/dist/web-tools.js +271 -0
- package/dist/web-tools.js.map +1 -0
- package/package.json +69 -65
- package/public/icon.svg +15 -15
- package/server.json +37 -37
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/converter-tools.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// ─── Pure-local converter tool implementations ───────────────────────────────
|
|
2
|
-
// All run entirely inside the MCP process
|
|
2
|
+
// All run entirely inside the MCP process - no API calls.
|
|
3
3
|
import { marked } from "marked";
|
|
4
4
|
import TurndownService from "turndown";
|
|
5
5
|
import * as yaml from "js-yaml";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* crews-tool - MCP handlers for the Crews Council Orchestrator Wizard.
|
|
3
|
+
*
|
|
4
|
+
* All three tools return a ConversationalCard so the calling agent can surface
|
|
5
|
+
* status in plain prose without parsing raw run JSON. LLM traffic for user
|
|
6
|
+
* facing runs flows via MCP sampling, not via server side Anthropic calls.
|
|
7
|
+
*/
|
|
8
|
+
import { type ConversationalCard } from "./cards/card.js";
|
|
9
|
+
export declare function crewsStartRun(args: Record<string, unknown>): Promise<ConversationalCard>;
|
|
10
|
+
export declare function crewsGetRun(args: Record<string, unknown>): Promise<ConversationalCard>;
|
|
11
|
+
export declare function crewsListRuns(args: Record<string, unknown>): Promise<ConversationalCard>;
|
|
12
|
+
//# sourceMappingURL=crews-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crews-tool.d.ts","sourceRoot":"","sources":["../src/crews-tool.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAa,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAsCrE,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2C9F;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAwB5F;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAe9F"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* crews-tool - MCP handlers for the Crews Council Orchestrator Wizard.
|
|
3
|
+
*
|
|
4
|
+
* All three tools return a ConversationalCard so the calling agent can surface
|
|
5
|
+
* status in plain prose without parsing raw run JSON. LLM traffic for user
|
|
6
|
+
* facing runs flows via MCP sampling, not via server side Anthropic calls.
|
|
7
|
+
*/
|
|
8
|
+
import { buildCard } from "./cards/card.js";
|
|
9
|
+
const API_BASE = (process.env.UNCLICK_API_URL ?? "https://unclick.world").replace(/\/$/, "");
|
|
10
|
+
function getApiKey() {
|
|
11
|
+
const key = process.env.UNCLICK_API_KEY?.trim();
|
|
12
|
+
if (!key) {
|
|
13
|
+
throw new Error("UNCLICK_API_KEY env var is not set. Get your install config at https://unclick.world");
|
|
14
|
+
}
|
|
15
|
+
return key;
|
|
16
|
+
}
|
|
17
|
+
async function adminCall(action, body, method, query) {
|
|
18
|
+
const apiKey = getApiKey();
|
|
19
|
+
const qs = new URLSearchParams({ action, ...(query ?? {}) }).toString();
|
|
20
|
+
const url = `${API_BASE}/api/memory-admin?${qs}`;
|
|
21
|
+
const init = {
|
|
22
|
+
method,
|
|
23
|
+
headers: {
|
|
24
|
+
"Content-Type": "application/json",
|
|
25
|
+
Authorization: `Bearer ${apiKey}`,
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
if (method === "POST" && body)
|
|
29
|
+
init.body = JSON.stringify(body);
|
|
30
|
+
const res = await fetch(url, init);
|
|
31
|
+
const text = await res.text();
|
|
32
|
+
let json = text;
|
|
33
|
+
try {
|
|
34
|
+
json = text ? JSON.parse(text) : null;
|
|
35
|
+
}
|
|
36
|
+
catch { /* keep text */ }
|
|
37
|
+
return { ok: res.ok, status: res.status, json };
|
|
38
|
+
}
|
|
39
|
+
export async function crewsStartRun(args) {
|
|
40
|
+
const crewId = String(args.crew_id ?? "").trim();
|
|
41
|
+
const taskPrompt = String(args.task_prompt ?? "").trim();
|
|
42
|
+
const tokenBudget = typeof args.token_budget === "number" ? args.token_budget : undefined;
|
|
43
|
+
if (!crewId) {
|
|
44
|
+
return buildCard({
|
|
45
|
+
headline: "start_crew_run needs a crew_id",
|
|
46
|
+
summary: "Provide the UUID of the Crew to run.",
|
|
47
|
+
keyFacts: ["missing: crew_id"],
|
|
48
|
+
nextActions: ["Call list_runs or browse /admin/crews to find a crew_id"],
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
if (!taskPrompt) {
|
|
52
|
+
return buildCard({
|
|
53
|
+
headline: "start_crew_run needs a task_prompt",
|
|
54
|
+
summary: "Describe what you want the Council to deliberate on.",
|
|
55
|
+
keyFacts: ["missing: task_prompt"],
|
|
56
|
+
nextActions: ["Retry with a task_prompt of at least one sentence"],
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
const body = { crew_id: crewId, task_prompt: taskPrompt };
|
|
60
|
+
if (tokenBudget)
|
|
61
|
+
body.token_budget = tokenBudget;
|
|
62
|
+
const { ok, status, json } = await adminCall("start_crew_run", body, "POST");
|
|
63
|
+
const payload = (json ?? {});
|
|
64
|
+
if (payload.card)
|
|
65
|
+
return payload.card;
|
|
66
|
+
if (!ok) {
|
|
67
|
+
return buildCard({
|
|
68
|
+
headline: `start_crew_run failed (HTTP ${status})`,
|
|
69
|
+
summary: payload.message ?? "The admin API rejected the request.",
|
|
70
|
+
keyFacts: [
|
|
71
|
+
`http_status: ${status}`,
|
|
72
|
+
...(payload.error ? [`error: ${payload.error}`] : []),
|
|
73
|
+
],
|
|
74
|
+
nextActions: ["Check Vercel logs", "Confirm your UNCLICK_API_KEY is valid"],
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return buildCard({
|
|
78
|
+
headline: "Crews run accepted",
|
|
79
|
+
summary: "The run row was created. Poll get_run to follow progress.",
|
|
80
|
+
keyFacts: payload.run_id ? [`run_id: ${payload.run_id}`] : [],
|
|
81
|
+
nextActions: ["Call get_run with the run_id to check status"],
|
|
82
|
+
deepLink: payload.run_id ? `/admin/crews/runs/${payload.run_id}` : undefined,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
export async function crewsGetRun(args) {
|
|
86
|
+
const runId = String(args.run_id ?? "").trim();
|
|
87
|
+
if (!runId) {
|
|
88
|
+
return buildCard({
|
|
89
|
+
headline: "get_run needs a run_id",
|
|
90
|
+
summary: "Provide the run_id returned by start_crew_run.",
|
|
91
|
+
keyFacts: ["missing: run_id"],
|
|
92
|
+
nextActions: ["Call list_runs to find recent run ids"],
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
const { ok, status, json } = await adminCall("get_run", null, "GET", { run_id: runId });
|
|
96
|
+
const payload = (json ?? {});
|
|
97
|
+
if (payload.card)
|
|
98
|
+
return payload.card;
|
|
99
|
+
return buildCard({
|
|
100
|
+
headline: `get_run failed (HTTP ${status})`,
|
|
101
|
+
summary: payload.message ?? (ok ? "No card returned." : "Admin API rejected the request."),
|
|
102
|
+
keyFacts: [`http_status: ${status}`, `run_id: ${runId}`],
|
|
103
|
+
nextActions: ["Verify the run_id belongs to your API key", "Check Vercel logs"],
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
export async function crewsListRuns(args) {
|
|
107
|
+
const crewId = args.crew_id ? String(args.crew_id).trim() : undefined;
|
|
108
|
+
const limit = typeof args.limit === "number" ? String(args.limit) : undefined;
|
|
109
|
+
const query = {};
|
|
110
|
+
if (crewId)
|
|
111
|
+
query.crew_id = crewId;
|
|
112
|
+
if (limit)
|
|
113
|
+
query.limit = limit;
|
|
114
|
+
const { ok, status, json } = await adminCall("list_runs", null, "GET", query);
|
|
115
|
+
const payload = (json ?? {});
|
|
116
|
+
if (payload.card)
|
|
117
|
+
return payload.card;
|
|
118
|
+
return buildCard({
|
|
119
|
+
headline: `list_runs failed (HTTP ${status})`,
|
|
120
|
+
summary: payload.message ?? (ok ? "No card returned." : "Admin API rejected the request."),
|
|
121
|
+
keyFacts: [`http_status: ${status}`],
|
|
122
|
+
nextActions: ["Check Vercel logs", "Confirm your UNCLICK_API_KEY is valid"],
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=crews-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crews-tool.js","sourceRoot":"","sources":["../src/crews-tool.ts"],"names":[],"mappings":"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"}
|
package/dist/gdelt-tool.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// GDELT Project integration
|
|
1
|
+
// GDELT Project integration - global news intelligence, no auth required.
|
|
2
2
|
// Docs: https://www.gdeltproject.org/
|
|
3
3
|
// DOC API: https://api.gdeltproject.org/api/v2/doc/doc
|
|
4
4
|
// GEO API: https://api.gdeltproject.org/api/v2/geo/geo
|
|
@@ -52,7 +52,7 @@ export async function gdeltNewsSearch(args) {
|
|
|
52
52
|
};
|
|
53
53
|
}
|
|
54
54
|
// ─── gdelt_tone_analysis ──────────────────────────────────────────────────────
|
|
55
|
-
// Uses timelinetone mode
|
|
55
|
+
// Uses timelinetone mode - returns average tone score over time.
|
|
56
56
|
// Negative values = negative sentiment; positive = positive sentiment.
|
|
57
57
|
export async function gdeltToneAnalysis(args) {
|
|
58
58
|
const query = String(args.query ?? "").trim();
|
|
@@ -100,7 +100,7 @@ export async function gdeltToneAnalysis(args) {
|
|
|
100
100
|
};
|
|
101
101
|
}
|
|
102
102
|
// ─── gdelt_geo_events ─────────────────────────────────────────────────────────
|
|
103
|
-
// Uses the GDELT GEO API
|
|
103
|
+
// Uses the GDELT GEO API - returns geographic event clusters with article counts and tone.
|
|
104
104
|
export async function gdeltGeoEvents(args) {
|
|
105
105
|
const query = String(args.query ?? "").trim();
|
|
106
106
|
if (!query)
|
|
@@ -132,7 +132,7 @@ export async function gdeltGeoEvents(args) {
|
|
|
132
132
|
};
|
|
133
133
|
}
|
|
134
134
|
// ─── gdelt_trending ───────────────────────────────────────────────────────────
|
|
135
|
-
// Uses timelinevol mode
|
|
135
|
+
// Uses timelinevol mode - returns article volume over time for a query.
|
|
136
136
|
// Shows whether a topic is surging, stable, or fading in the news cycle.
|
|
137
137
|
export async function gdeltTrending(args) {
|
|
138
138
|
const query = String(args.query ?? "").trim();
|
package/dist/hackernews-tool.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Hacker News Firebase API integration.
|
|
2
|
-
// No authentication required
|
|
2
|
+
// No authentication required - completely open.
|
|
3
3
|
// Base URL: https://hacker-news.firebaseio.com/v0/
|
|
4
4
|
const HN_BASE = "https://hacker-news.firebaseio.com/v0";
|
|
5
5
|
// ─── API helper ───────────────────────────────────────────────────────────────
|
package/dist/index.js
CHANGED
|
File without changes
|
|
@@ -83,48 +83,48 @@ function buildHtml(platform, nonce, setupUrl) {
|
|
|
83
83
|
const setupLink = setupUrl
|
|
84
84
|
? ` <a href="${setupUrl}" target="_blank">Get your key here</a>.`
|
|
85
85
|
: "";
|
|
86
|
-
return `<!DOCTYPE html>
|
|
87
|
-
<html><head>
|
|
88
|
-
<title>UnClick BackstagePass - Connect ${platform}</title>
|
|
89
|
-
<meta charset="utf-8">
|
|
90
|
-
<style>
|
|
91
|
-
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
92
|
-
body { background: #0a0a0a; color: #e0e0e0; font-family: -apple-system, sans-serif; display: flex; justify-content: center; align-items: center; min-height: 100vh; }
|
|
93
|
-
.card { background: #1a1a1a; border: 1px solid #333; border-radius: 12px; padding: 40px; max-width: 480px; width: 100%; }
|
|
94
|
-
h1 { font-size: 20px; margin-bottom: 8px; color: #61c1c4; }
|
|
95
|
-
p { font-size: 14px; color: #888; margin-bottom: 24px; }
|
|
96
|
-
a { color: #61c1c4; }
|
|
97
|
-
label { font-size: 13px; color: #aaa; display: block; margin-bottom: 8px; }
|
|
98
|
-
input[type="password"] { width: 100%; padding: 12px; background: #111; border: 1px solid #333; border-radius: 8px; color: #fff; font-size: 14px; font-family: monospace; }
|
|
99
|
-
input:focus { outline: none; border-color: #61c1c4; }
|
|
100
|
-
button { width: 100%; padding: 12px; background: #61c1c4; color: #0a0a0a; border: none; border-radius: 8px; font-size: 14px; font-weight: 600; cursor: pointer; margin-top: 16px; }
|
|
101
|
-
button:hover { background: #4fa8ab; }
|
|
102
|
-
.note { font-size: 12px; color: #555; margin-top: 16px; text-align: center; }
|
|
103
|
-
.success { text-align: center; }
|
|
104
|
-
.success h1 { font-size: 24px; margin-bottom: 16px; }
|
|
105
|
-
</style>
|
|
106
|
-
</head><body>
|
|
107
|
-
<div class="card" id="form">
|
|
108
|
-
<h1>Connect ${platform}</h1>
|
|
109
|
-
<p>Paste your API key below. It will be encrypted and stored securely. This page closes automatically after submission.${setupLink}</p>
|
|
110
|
-
<label>API Key</label>
|
|
111
|
-
<input type="password" id="key" placeholder="Paste your key here" autofocus>
|
|
112
|
-
<button onclick="submit()">Connect</button>
|
|
113
|
-
<div class="note">Your key goes directly to local encryption. It never appears in your AI chat.</div>
|
|
114
|
-
</div>
|
|
115
|
-
<div class="card success" id="done" style="display:none">
|
|
116
|
-
<h1>Connected</h1>
|
|
117
|
-
<p>Your ${platform} key has been encrypted and stored. You can close this tab.</p>
|
|
118
|
-
</div>
|
|
119
|
-
<script>
|
|
120
|
-
async function submit() {
|
|
121
|
-
const key = document.getElementById('key').value.trim();
|
|
122
|
-
if (!key) return;
|
|
123
|
-
const res = await fetch('/submit', { method: 'POST', headers: {'Content-Type':'application/json'}, body: JSON.stringify({key, nonce:'${nonce}'}) });
|
|
124
|
-
if (res.ok) { document.getElementById('form').style.display='none'; document.getElementById('done').style.display='block'; setTimeout(() => window.close(), 2000); }
|
|
125
|
-
}
|
|
126
|
-
document.getElementById('key').addEventListener('keydown', e => { if (e.key === 'Enter') submit(); });
|
|
127
|
-
</script>
|
|
86
|
+
return `<!DOCTYPE html>
|
|
87
|
+
<html><head>
|
|
88
|
+
<title>UnClick BackstagePass - Connect ${platform}</title>
|
|
89
|
+
<meta charset="utf-8">
|
|
90
|
+
<style>
|
|
91
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
92
|
+
body { background: #0a0a0a; color: #e0e0e0; font-family: -apple-system, sans-serif; display: flex; justify-content: center; align-items: center; min-height: 100vh; }
|
|
93
|
+
.card { background: #1a1a1a; border: 1px solid #333; border-radius: 12px; padding: 40px; max-width: 480px; width: 100%; }
|
|
94
|
+
h1 { font-size: 20px; margin-bottom: 8px; color: #61c1c4; }
|
|
95
|
+
p { font-size: 14px; color: #888; margin-bottom: 24px; }
|
|
96
|
+
a { color: #61c1c4; }
|
|
97
|
+
label { font-size: 13px; color: #aaa; display: block; margin-bottom: 8px; }
|
|
98
|
+
input[type="password"] { width: 100%; padding: 12px; background: #111; border: 1px solid #333; border-radius: 8px; color: #fff; font-size: 14px; font-family: monospace; }
|
|
99
|
+
input:focus { outline: none; border-color: #61c1c4; }
|
|
100
|
+
button { width: 100%; padding: 12px; background: #61c1c4; color: #0a0a0a; border: none; border-radius: 8px; font-size: 14px; font-weight: 600; cursor: pointer; margin-top: 16px; }
|
|
101
|
+
button:hover { background: #4fa8ab; }
|
|
102
|
+
.note { font-size: 12px; color: #555; margin-top: 16px; text-align: center; }
|
|
103
|
+
.success { text-align: center; }
|
|
104
|
+
.success h1 { font-size: 24px; margin-bottom: 16px; }
|
|
105
|
+
</style>
|
|
106
|
+
</head><body>
|
|
107
|
+
<div class="card" id="form">
|
|
108
|
+
<h1>Connect ${platform}</h1>
|
|
109
|
+
<p>Paste your API key below. It will be encrypted and stored securely. This page closes automatically after submission.${setupLink}</p>
|
|
110
|
+
<label>API Key</label>
|
|
111
|
+
<input type="password" id="key" placeholder="Paste your key here" autofocus>
|
|
112
|
+
<button onclick="submit()">Connect</button>
|
|
113
|
+
<div class="note">Your key goes directly to local encryption. It never appears in your AI chat.</div>
|
|
114
|
+
</div>
|
|
115
|
+
<div class="card success" id="done" style="display:none">
|
|
116
|
+
<h1>Connected</h1>
|
|
117
|
+
<p>Your ${platform} key has been encrypted and stored. You can close this tab.</p>
|
|
118
|
+
</div>
|
|
119
|
+
<script>
|
|
120
|
+
async function submit() {
|
|
121
|
+
const key = document.getElementById('key').value.trim();
|
|
122
|
+
if (!key) return;
|
|
123
|
+
const res = await fetch('/submit', { method: 'POST', headers: {'Content-Type':'application/json'}, body: JSON.stringify({key, nonce:'${nonce}'}) });
|
|
124
|
+
if (res.ok) { document.getElementById('form').style.display='none'; document.getElementById('done').style.display='block'; setTimeout(() => window.close(), 2000); }
|
|
125
|
+
}
|
|
126
|
+
document.getElementById('key').addEventListener('keydown', e => { if (e.key === 'Enter') submit(); });
|
|
127
|
+
</script>
|
|
128
128
|
</body></html>`;
|
|
129
129
|
}
|
|
130
130
|
// Start a localhost server for the given platform. Stores result in resolvedCredentials when submitted.
|
package/dist/line-tool.js
CHANGED
|
@@ -24,7 +24,7 @@ async function linePost(token, path, body) {
|
|
|
24
24
|
const detail = data.details
|
|
25
25
|
?.map((d) => d.message)
|
|
26
26
|
.join("; ");
|
|
27
|
-
throw new Error(`LINE API error: ${msg}${detail ? `
|
|
27
|
+
throw new Error(`LINE API error: ${msg}${detail ? ` - ${detail}` : ""}`);
|
|
28
28
|
}
|
|
29
29
|
return data;
|
|
30
30
|
}
|
package/dist/linear-tool.js
CHANGED
|
@@ -52,24 +52,24 @@ async function listIssues(apiKey, args) {
|
|
|
52
52
|
if (stateId)
|
|
53
53
|
filter.state = { id: { eq: stateId } };
|
|
54
54
|
const hasFilter = Object.keys(filter).length > 0;
|
|
55
|
-
return linearQuery(apiKey, `
|
|
56
|
-
query ListIssues($first: Int, $filter: IssueFilter) {
|
|
57
|
-
issues(first: $first, filter: $filter) {
|
|
58
|
-
nodes {
|
|
59
|
-
id
|
|
60
|
-
identifier
|
|
61
|
-
title
|
|
62
|
-
description
|
|
63
|
-
priority
|
|
64
|
-
state { name }
|
|
65
|
-
assignee { name email }
|
|
66
|
-
team { name }
|
|
67
|
-
createdAt
|
|
68
|
-
updatedAt
|
|
69
|
-
url
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
55
|
+
return linearQuery(apiKey, `
|
|
56
|
+
query ListIssues($first: Int, $filter: IssueFilter) {
|
|
57
|
+
issues(first: $first, filter: $filter) {
|
|
58
|
+
nodes {
|
|
59
|
+
id
|
|
60
|
+
identifier
|
|
61
|
+
title
|
|
62
|
+
description
|
|
63
|
+
priority
|
|
64
|
+
state { name }
|
|
65
|
+
assignee { name email }
|
|
66
|
+
team { name }
|
|
67
|
+
createdAt
|
|
68
|
+
updatedAt
|
|
69
|
+
url
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
73
|
`, { first, filter: hasFilter ? filter : undefined });
|
|
74
74
|
}
|
|
75
75
|
async function createIssue(apiKey, args) {
|
|
@@ -88,54 +88,54 @@ async function createIssue(apiKey, args) {
|
|
|
88
88
|
input.assigneeId = String(args.assignee_id);
|
|
89
89
|
if (args.state_id)
|
|
90
90
|
input.stateId = String(args.state_id);
|
|
91
|
-
return linearQuery(apiKey, `
|
|
92
|
-
mutation CreateIssue($input: IssueCreateInput!) {
|
|
93
|
-
issueCreate(input: $input) {
|
|
94
|
-
success
|
|
95
|
-
issue {
|
|
96
|
-
id
|
|
97
|
-
identifier
|
|
98
|
-
title
|
|
99
|
-
url
|
|
100
|
-
state { name }
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
91
|
+
return linearQuery(apiKey, `
|
|
92
|
+
mutation CreateIssue($input: IssueCreateInput!) {
|
|
93
|
+
issueCreate(input: $input) {
|
|
94
|
+
success
|
|
95
|
+
issue {
|
|
96
|
+
id
|
|
97
|
+
identifier
|
|
98
|
+
title
|
|
99
|
+
url
|
|
100
|
+
state { name }
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
104
|
`, { input });
|
|
105
105
|
}
|
|
106
106
|
async function getProject(apiKey, args) {
|
|
107
107
|
const id = String(args.project_id ?? "").trim();
|
|
108
108
|
if (!id)
|
|
109
109
|
return { error: "project_id is required." };
|
|
110
|
-
return linearQuery(apiKey, `
|
|
111
|
-
query GetProject($id: String!) {
|
|
112
|
-
project(id: $id) {
|
|
113
|
-
id
|
|
114
|
-
name
|
|
115
|
-
description
|
|
116
|
-
state
|
|
117
|
-
progress
|
|
118
|
-
startDate
|
|
119
|
-
targetDate
|
|
120
|
-
url
|
|
121
|
-
teams { nodes { id name } }
|
|
122
|
-
}
|
|
123
|
-
}
|
|
110
|
+
return linearQuery(apiKey, `
|
|
111
|
+
query GetProject($id: String!) {
|
|
112
|
+
project(id: $id) {
|
|
113
|
+
id
|
|
114
|
+
name
|
|
115
|
+
description
|
|
116
|
+
state
|
|
117
|
+
progress
|
|
118
|
+
startDate
|
|
119
|
+
targetDate
|
|
120
|
+
url
|
|
121
|
+
teams { nodes { id name } }
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
124
|
`, { id });
|
|
125
125
|
}
|
|
126
126
|
async function listTeams(apiKey) {
|
|
127
|
-
return linearQuery(apiKey, `
|
|
128
|
-
query ListTeams {
|
|
129
|
-
teams {
|
|
130
|
-
nodes {
|
|
131
|
-
id
|
|
132
|
-
name
|
|
133
|
-
description
|
|
134
|
-
key
|
|
135
|
-
timezone
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
127
|
+
return linearQuery(apiKey, `
|
|
128
|
+
query ListTeams {
|
|
129
|
+
teams {
|
|
130
|
+
nodes {
|
|
131
|
+
id
|
|
132
|
+
name
|
|
133
|
+
description
|
|
134
|
+
key
|
|
135
|
+
timezone
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
139
|
`);
|
|
140
140
|
}
|
|
141
141
|
async function searchIssues(apiKey, args) {
|
|
@@ -143,22 +143,22 @@ async function searchIssues(apiKey, args) {
|
|
|
143
143
|
const first = args.first ? Number(args.first) : 25;
|
|
144
144
|
if (!term)
|
|
145
145
|
return { error: "query is required." };
|
|
146
|
-
return linearQuery(apiKey, `
|
|
147
|
-
query SearchIssues($term: String!, $first: Int) {
|
|
148
|
-
issueSearch(term: $term, first: $first) {
|
|
149
|
-
nodes {
|
|
150
|
-
id
|
|
151
|
-
identifier
|
|
152
|
-
title
|
|
153
|
-
description
|
|
154
|
-
priority
|
|
155
|
-
state { name }
|
|
156
|
-
assignee { name }
|
|
157
|
-
team { name }
|
|
158
|
-
url
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
146
|
+
return linearQuery(apiKey, `
|
|
147
|
+
query SearchIssues($term: String!, $first: Int) {
|
|
148
|
+
issueSearch(term: $term, first: $first) {
|
|
149
|
+
nodes {
|
|
150
|
+
id
|
|
151
|
+
identifier
|
|
152
|
+
title
|
|
153
|
+
description
|
|
154
|
+
priority
|
|
155
|
+
state { name }
|
|
156
|
+
assignee { name }
|
|
157
|
+
team { name }
|
|
158
|
+
url
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
162
|
`, { term, first });
|
|
163
163
|
}
|
|
164
164
|
// ── Public dispatcher ──────────────────────────────────────────────────────────
|
|
@@ -1043,7 +1043,7 @@ export const LOCAL_CATALOG_HANDLERS = {
|
|
|
1043
1043
|
if (isNaN(d.getTime()))
|
|
1044
1044
|
return { error: `Cannot parse timestamp: ${ts}` };
|
|
1045
1045
|
const dur = (args.duration ?? {});
|
|
1046
|
-
|
|
1046
|
+
const ms = d.getTime() + (dur.seconds ?? 0) * 1000 + (dur.minutes ?? 0) * 60000 + (dur.hours ?? 0) * 3600000 + (dur.days ?? 0) * 86400000 + (dur.weeks ?? 0) * 604800000;
|
|
1047
1047
|
const result = new Date(ms);
|
|
1048
1048
|
if (dur.months)
|
|
1049
1049
|
result.setMonth(result.getMonth() + dur.months);
|