@fml-inc/fml 0.0.22
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/.claude-plugin/plugin.json +11 -0
- package/bin/fml +3 -0
- package/bin/mcp-server +3 -0
- package/bin/sync-daemon +3 -0
- package/dist/chunk-4YEAQJPF.js +47 -0
- package/dist/chunk-4YEAQJPF.js.map +1 -0
- package/dist/chunk-DP2ILCME.js +282 -0
- package/dist/chunk-DP2ILCME.js.map +1 -0
- package/dist/chunk-EL2WSQBR.js +88 -0
- package/dist/chunk-EL2WSQBR.js.map +1 -0
- package/dist/chunk-MYCITM37.js +179 -0
- package/dist/chunk-MYCITM37.js.map +1 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-PZ5AY32C.js.map +1 -0
- package/dist/cli.js +1720 -0
- package/dist/cli.js.map +1 -0
- package/dist/daemon-J4WSZXVY.js +15 -0
- package/dist/daemon-J4WSZXVY.js.map +1 -0
- package/dist/esm-JQB7UAJD.js +14618 -0
- package/dist/esm-JQB7UAJD.js.map +1 -0
- package/dist/mcp/server.js +13033 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/postinstall.js +81 -0
- package/dist/postinstall.js.map +1 -0
- package/dist/token-store-67FJZTYS.js +17 -0
- package/dist/token-store-67FJZTYS.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CONVEX_URL,
|
|
3
|
+
getSelectedOrg,
|
|
4
|
+
getValidToken
|
|
5
|
+
} from "./chunk-DP2ILCME.js";
|
|
6
|
+
|
|
7
|
+
// src/native-check.ts
|
|
8
|
+
import { createRequire } from "module";
|
|
9
|
+
import { execSync } from "child_process";
|
|
10
|
+
import { rmSync } from "fs";
|
|
11
|
+
import { dirname, join } from "path";
|
|
12
|
+
import { fileURLToPath } from "url";
|
|
13
|
+
function ensureNativeModules() {
|
|
14
|
+
const require2 = createRequire(import.meta.url);
|
|
15
|
+
try {
|
|
16
|
+
require2("better-sqlite3");
|
|
17
|
+
} catch (err) {
|
|
18
|
+
const msg = err instanceof Error ? err.message : "";
|
|
19
|
+
if (!msg.includes("NODE_MODULE_VERSION")) {
|
|
20
|
+
throw err;
|
|
21
|
+
}
|
|
22
|
+
console.error(
|
|
23
|
+
"[fml] better-sqlite3 was compiled for a different Node.js version, rebuilding..."
|
|
24
|
+
);
|
|
25
|
+
const pkgRoot = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
26
|
+
const sqlitePath = dirname(require2.resolve("better-sqlite3/package.json"));
|
|
27
|
+
rmSync(join(sqlitePath, "build"), { recursive: true, force: true });
|
|
28
|
+
try {
|
|
29
|
+
execSync("npm rebuild better-sqlite3", {
|
|
30
|
+
cwd: pkgRoot,
|
|
31
|
+
stdio: "inherit",
|
|
32
|
+
timeout: 6e4
|
|
33
|
+
});
|
|
34
|
+
console.error("[fml] Rebuild complete.");
|
|
35
|
+
} catch {
|
|
36
|
+
console.error(
|
|
37
|
+
`[fml] Automatic rebuild failed. Please run manually:
|
|
38
|
+
cd ${pkgRoot} && rm -rf node_modules/better-sqlite3/build && npm rebuild better-sqlite3`
|
|
39
|
+
);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// src/convex-client.ts
|
|
46
|
+
import { resolveRepoFromCwd } from "@fml-inc/panopticon/repo";
|
|
47
|
+
function ref(path) {
|
|
48
|
+
return path;
|
|
49
|
+
}
|
|
50
|
+
function createApiClient(token) {
|
|
51
|
+
const isServiceToken = token.startsWith("fml_st_");
|
|
52
|
+
let clientPromise = null;
|
|
53
|
+
function getClient() {
|
|
54
|
+
if (!clientPromise) {
|
|
55
|
+
clientPromise = import("convex/browser").then(({ ConvexHttpClient }) => {
|
|
56
|
+
const client = new ConvexHttpClient(CONVEX_URL);
|
|
57
|
+
client.setAuth(token);
|
|
58
|
+
return client;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return clientPromise;
|
|
62
|
+
}
|
|
63
|
+
function getSiteUrl() {
|
|
64
|
+
return CONVEX_URL.replace(".convex.cloud", ".convex.site").replace(
|
|
65
|
+
/\/$/,
|
|
66
|
+
""
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
// ── Orgs ──────────────────────────────────────────────────────────────
|
|
71
|
+
async queryOrgs() {
|
|
72
|
+
if (isServiceToken) {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
const client = await getClient();
|
|
76
|
+
return await client.query(ref("user/plugin:getMyOrgsAndRepos"), {});
|
|
77
|
+
},
|
|
78
|
+
// ── Tool gateway ─────────────────────────────────────────────────────
|
|
79
|
+
async callBackend(toolName, args, opts) {
|
|
80
|
+
try {
|
|
81
|
+
if (isServiceToken) {
|
|
82
|
+
const res = await fetch(`${getSiteUrl()}/api/tools/execute`, {
|
|
83
|
+
method: "POST",
|
|
84
|
+
headers: {
|
|
85
|
+
"Content-Type": "application/json",
|
|
86
|
+
Authorization: `Bearer ${token}`
|
|
87
|
+
},
|
|
88
|
+
body: JSON.stringify({ toolName, args })
|
|
89
|
+
});
|
|
90
|
+
const text = await res.text();
|
|
91
|
+
let data;
|
|
92
|
+
try {
|
|
93
|
+
data = JSON.parse(text);
|
|
94
|
+
} catch {
|
|
95
|
+
return {
|
|
96
|
+
ok: false,
|
|
97
|
+
error: `HTTP ${res.status}: ${text.slice(0, 200)}`
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
if (!res.ok && !data.error) {
|
|
101
|
+
return { ok: false, error: `HTTP ${res.status}` };
|
|
102
|
+
}
|
|
103
|
+
return data;
|
|
104
|
+
}
|
|
105
|
+
const client = await getClient();
|
|
106
|
+
const actionArgs = { toolName, args };
|
|
107
|
+
const org = opts?.org ?? getSelectedOrg();
|
|
108
|
+
if (org) actionArgs.org = org;
|
|
109
|
+
const repo = resolveRepoFromCwd(process.cwd());
|
|
110
|
+
if (repo) actionArgs.repo = repo.repo;
|
|
111
|
+
const result = await client.action(
|
|
112
|
+
ref("user/tool_gateway:executeTool"),
|
|
113
|
+
actionArgs
|
|
114
|
+
);
|
|
115
|
+
return { ok: true, result };
|
|
116
|
+
} catch (err) {
|
|
117
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
118
|
+
if (msg.includes("Unauthorized") || msg.includes("not authenticated")) {
|
|
119
|
+
return {
|
|
120
|
+
ok: false,
|
|
121
|
+
error: "Authentication expired. Run `fml login` to sign in again, then restart Claude Code."
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
return { ok: false, error: msg };
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
// ── Repo resolution ──────────────────────────────────────────────────
|
|
128
|
+
async resolveRepo(orgSlug, repoFullName) {
|
|
129
|
+
const client = await getClient();
|
|
130
|
+
return await client.query(ref("user/cli:resolveRepo"), {
|
|
131
|
+
orgSlug,
|
|
132
|
+
repoFullName
|
|
133
|
+
});
|
|
134
|
+
},
|
|
135
|
+
// ── Config snapshots ─────────────────────────────────────────────────
|
|
136
|
+
async listUserConfigSnapshots(orgSlug) {
|
|
137
|
+
const client = await getClient();
|
|
138
|
+
const result = await client.query(
|
|
139
|
+
ref("user/config_snapshots:listUserSnapshots"),
|
|
140
|
+
{ orgSlug }
|
|
141
|
+
);
|
|
142
|
+
return result ?? [];
|
|
143
|
+
},
|
|
144
|
+
async getUserConfigDetail(orgSlug, githubUsername) {
|
|
145
|
+
const client = await getClient();
|
|
146
|
+
return await client.query(ref("user/config_snapshots:getUserDetail"), {
|
|
147
|
+
orgSlug,
|
|
148
|
+
githubUsername
|
|
149
|
+
});
|
|
150
|
+
},
|
|
151
|
+
async listRepoConfigSnapshots(orgSlug, repository) {
|
|
152
|
+
const client = await getClient();
|
|
153
|
+
const result = await client.query(
|
|
154
|
+
ref("user/config_snapshots:listRepoSnapshots"),
|
|
155
|
+
{ orgSlug, repository }
|
|
156
|
+
);
|
|
157
|
+
return result ?? [];
|
|
158
|
+
},
|
|
159
|
+
async getRepoConfigDetail(orgSlug, repository) {
|
|
160
|
+
const client = await getClient();
|
|
161
|
+
return await client.query(ref("user/config_snapshots:getRepoDetail"), {
|
|
162
|
+
orgSlug,
|
|
163
|
+
repository
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
async function getAuthenticatedClient() {
|
|
169
|
+
const token = await getValidToken();
|
|
170
|
+
if (!token) return null;
|
|
171
|
+
return createApiClient(token);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export {
|
|
175
|
+
ensureNativeModules,
|
|
176
|
+
createApiClient,
|
|
177
|
+
getAuthenticatedClient
|
|
178
|
+
};
|
|
179
|
+
//# sourceMappingURL=chunk-MYCITM37.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/native-check.ts","../src/convex-client.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { execSync } from \"node:child_process\";\nimport { rmSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Verify that better-sqlite3's native addon matches the running Node version.\n * If mismatched (e.g. user upgraded Node), attempt an automatic rebuild.\n * Call this before any code that imports better-sqlite3.\n */\nexport function ensureNativeModules(): void {\n const require = createRequire(import.meta.url);\n try {\n require(\"better-sqlite3\");\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"\";\n if (!msg.includes(\"NODE_MODULE_VERSION\")) {\n throw err;\n }\n\n console.error(\n \"[fml] better-sqlite3 was compiled for a different Node.js version, rebuilding...\",\n );\n\n const pkgRoot = join(dirname(fileURLToPath(import.meta.url)), \"..\");\n\n // Remove stale build directory to avoid EEXIST errors from node-gyp\n const sqlitePath = dirname(require.resolve(\"better-sqlite3/package.json\"));\n rmSync(join(sqlitePath, \"build\"), { recursive: true, force: true });\n\n try {\n execSync(\"npm rebuild better-sqlite3\", {\n cwd: pkgRoot,\n stdio: \"inherit\",\n timeout: 60_000,\n });\n console.error(\"[fml] Rebuild complete.\");\n } catch {\n console.error(\n \"[fml] Automatic rebuild failed. Please run manually:\\n\" +\n ` cd ${pkgRoot} && rm -rf node_modules/better-sqlite3/build && npm rebuild better-sqlite3`,\n );\n process.exit(1);\n }\n }\n}\n","import type { FunctionReference } from \"convex/server\";\nimport { resolveRepoFromCwd } from \"@fml-inc/panopticon/repo\";\nimport { getSelectedOrg, getValidToken } from \"./auth/token-store.js\";\nimport { CONVEX_URL } from \"./config.js\";\nimport type {\n RepoConfigSnapshotDetail,\n RepoConfigSnapshotSummary,\n ResolvedRepo,\n UserConfigSnapshotDetail,\n UserConfigSnapshotSummary,\n} from \"./types.js\";\n\n// ── Shared plumbing ─────────────────────────────────────────────────────────\n\nexport interface ToolResult {\n ok: boolean;\n result?: unknown;\n error?: string;\n}\n\nexport interface OrgInfo {\n _id: string;\n name: string;\n slug?: string;\n repos?: Array<{\n _id: string;\n fullName: string;\n owner: string;\n name: string;\n private: boolean;\n }>;\n}\n\nfunction ref<T extends \"query\" | \"mutation\" | \"action\">(\n path: string,\n): FunctionReference<T> {\n return path as unknown as FunctionReference<T>;\n}\n\n// ── API client factory ──────────────────────────────────────────────────────\n\nexport function createApiClient(token: string) {\n const isServiceToken = token.startsWith(\"fml_st_\");\n\n let clientPromise: Promise<{\n query: <T>(\n ref: FunctionReference<\"query\">,\n args: Record<string, unknown>,\n ) => Promise<T>;\n mutation: <T>(\n ref: FunctionReference<\"mutation\">,\n args: Record<string, unknown>,\n ) => Promise<T>;\n action: <T>(\n ref: FunctionReference<\"action\">,\n args: Record<string, unknown>,\n ) => Promise<T>;\n }> | null = null;\n\n function getClient() {\n if (!clientPromise) {\n clientPromise = import(\"convex/browser\").then(({ ConvexHttpClient }) => {\n const client = new ConvexHttpClient(CONVEX_URL);\n client.setAuth(token);\n return client;\n });\n }\n return clientPromise;\n }\n\n /**\n * Derive the Convex site URL (HTTP actions) from the cloud URL.\n * Convex uses paired domains: *.convex.cloud for client APIs,\n * *.convex.site for HTTP actions. This is a stable Convex convention.\n */\n function getSiteUrl(): string {\n return CONVEX_URL.replace(\".convex.cloud\", \".convex.site\").replace(\n /\\/$/,\n \"\",\n );\n }\n\n return {\n // ── Orgs ──────────────────────────────────────────────────────────────\n\n async queryOrgs(): Promise<OrgInfo[]> {\n if (isServiceToken) {\n // Service tokens can't call Convex actions directly — org is embedded in the token\n return [];\n }\n const client = await getClient();\n return await client.query(ref(\"user/plugin:getMyOrgsAndRepos\"), {});\n },\n\n // ── Tool gateway ─────────────────────────────────────────────────────\n\n async callBackend(\n toolName: string,\n args: Record<string, unknown>,\n opts?: { org?: string },\n ): Promise<ToolResult> {\n try {\n if (isServiceToken) {\n // Service token path: POST to HTTP endpoint (Convex can't validate non-JWT tokens)\n const res = await fetch(`${getSiteUrl()}/api/tools/execute`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({ toolName, args }),\n });\n const text = await res.text();\n let data: ToolResult;\n try {\n data = JSON.parse(text) as ToolResult;\n } catch {\n return {\n ok: false,\n error: `HTTP ${res.status}: ${text.slice(0, 200)}`,\n };\n }\n if (!res.ok && !data.error) {\n return { ok: false, error: `HTTP ${res.status}` };\n }\n return data;\n }\n\n // JWT path: standard Convex action\n const client = await getClient();\n const actionArgs: Record<string, unknown> = { toolName, args };\n // Explicit org > stored org selection > repo-based inference\n const org = opts?.org ?? getSelectedOrg();\n if (org) actionArgs.org = org;\n const repo = resolveRepoFromCwd(process.cwd());\n if (repo) actionArgs.repo = repo.repo;\n\n const result = await client.action(\n ref<\"action\">(\"user/tool_gateway:executeTool\"),\n actionArgs,\n );\n return { ok: true, result };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes(\"Unauthorized\") || msg.includes(\"not authenticated\")) {\n return {\n ok: false,\n error:\n \"Authentication expired. Run `fml login` to sign in again, then restart Claude Code.\",\n };\n }\n return { ok: false, error: msg };\n }\n },\n\n // ── Repo resolution ──────────────────────────────────────────────────\n\n async resolveRepo(\n orgSlug: string,\n repoFullName: string,\n ): Promise<ResolvedRepo | null> {\n const client = await getClient();\n return await client.query(ref(\"user/cli:resolveRepo\"), {\n orgSlug,\n repoFullName,\n });\n },\n\n // ── Config snapshots ─────────────────────────────────────────────────\n\n async listUserConfigSnapshots(\n orgSlug: string,\n ): Promise<UserConfigSnapshotSummary[]> {\n const client = await getClient();\n const result = await client.query<UserConfigSnapshotSummary[] | null>(\n ref(\"user/config_snapshots:listUserSnapshots\"),\n { orgSlug },\n );\n return result ?? [];\n },\n\n async getUserConfigDetail(\n orgSlug: string,\n githubUsername: string,\n ): Promise<UserConfigSnapshotDetail | null> {\n const client = await getClient();\n return await client.query(ref(\"user/config_snapshots:getUserDetail\"), {\n orgSlug,\n githubUsername,\n });\n },\n\n async listRepoConfigSnapshots(\n orgSlug: string,\n repository?: string,\n ): Promise<RepoConfigSnapshotSummary[]> {\n const client = await getClient();\n const result = await client.query<RepoConfigSnapshotSummary[] | null>(\n ref(\"user/config_snapshots:listRepoSnapshots\"),\n { orgSlug, repository },\n );\n return result ?? [];\n },\n\n async getRepoConfigDetail(\n orgSlug: string,\n repository: string,\n ): Promise<RepoConfigSnapshotDetail | null> {\n const client = await getClient();\n return await client.query(ref(\"user/config_snapshots:getRepoDetail\"), {\n orgSlug,\n repository,\n });\n },\n };\n}\n\n// ── Convenience: auto-authenticated client ──────────────────────────────────\n\n/**\n * Create an API client using the stored auth token.\n * Returns null if not authenticated.\n */\nexport async function getAuthenticatedClient() {\n const token = await getValidToken();\n if (!token) return null;\n return createApiClient(token);\n}\n"],"mappings":"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","names":["require"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|