fifony 0.1.11

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/cli.js ADDED
@@ -0,0 +1,204 @@
1
+ // src/cli.ts
2
+ import { spawn } from "child_process";
3
+ import { cwd, env, execPath, exit, kill, pid } from "process";
4
+ import { dirname, resolve } from "path";
5
+ import { fileURLToPath } from "url";
6
+ import { createRequire } from "module";
7
+ import { readFileSync } from "fs";
8
+ import { createCLI } from "cli-args-parser";
9
+ import { existsSync } from "fs";
10
+ var __filename = fileURLToPath(import.meta.url);
11
+ var __dirname = dirname(__filename);
12
+ var packageRoot = resolve(__dirname, "..");
13
+ var require2 = createRequire(import.meta.url);
14
+ var packageJson = JSON.parse(readFileSync(resolve(packageRoot, "package.json"), "utf8"));
15
+ var distRuntime = resolve(packageRoot, "dist", "runtime", "run-local.js");
16
+ var distMcp = resolve(packageRoot, "dist", "mcp", "server.js");
17
+ var srcRuntime = resolve(packageRoot, "src", "runtime", "run-local.ts");
18
+ var srcMcp = resolve(packageRoot, "src", "mcp", "server.ts");
19
+ var forceSource = process.argv.includes("--dev") || env.NODE_ENV === "development";
20
+ var useCompiled = !forceSource && existsSync(distRuntime);
21
+ var tsxCli = null;
22
+ if (!useCompiled) {
23
+ try {
24
+ tsxCli = require2.resolve("tsx/cli");
25
+ } catch {
26
+ console.error("No compiled dist/ found and tsx is not installed. Run 'pnpm build' first.");
27
+ exit(1);
28
+ }
29
+ }
30
+ var runtimeScript = useCompiled ? distRuntime : srcRuntime;
31
+ var mcpScript = useCompiled ? distMcp : srcMcp;
32
+ var commonOptions = {
33
+ workspace: {
34
+ type: "string",
35
+ description: "Target workspace root. Defaults to the current directory."
36
+ },
37
+ persistence: {
38
+ type: "string",
39
+ description: "Persistence root. Defaults to the current directory."
40
+ },
41
+ port: {
42
+ type: "number",
43
+ description: "Start the local API/dashboard on the provided port."
44
+ },
45
+ concurrency: {
46
+ type: "number",
47
+ description: "Maximum number of concurrent workers."
48
+ },
49
+ attempts: {
50
+ type: "number",
51
+ description: "Maximum attempts per issue."
52
+ },
53
+ poll: {
54
+ type: "number",
55
+ description: "Scheduler interval in milliseconds."
56
+ },
57
+ once: {
58
+ type: "boolean",
59
+ description: "Process one scheduler cycle and exit.",
60
+ default: false
61
+ }
62
+ };
63
+ function getStringOption(result, key) {
64
+ const value = result.options[key];
65
+ return typeof value === "string" && value.trim() ? value : void 0;
66
+ }
67
+ function getNumberOption(result, key) {
68
+ const value = result.options[key];
69
+ return typeof value === "number" && Number.isFinite(value) ? value : void 0;
70
+ }
71
+ function getBooleanOption(result, key) {
72
+ return result.options[key] === true;
73
+ }
74
+ function buildRuntimeArgs(result) {
75
+ const runtimeArgs = [];
76
+ const workspace = getStringOption(result, "workspace");
77
+ const persistence = getStringOption(result, "persistence");
78
+ const port = getNumberOption(result, "port");
79
+ const concurrency = getNumberOption(result, "concurrency");
80
+ const attempts = getNumberOption(result, "attempts");
81
+ const poll = getNumberOption(result, "poll");
82
+ if (workspace) {
83
+ runtimeArgs.push("--workspace", workspace);
84
+ }
85
+ if (persistence) {
86
+ runtimeArgs.push("--persistence", persistence);
87
+ }
88
+ if (typeof port === "number") {
89
+ runtimeArgs.push("--port", String(port));
90
+ }
91
+ if (typeof concurrency === "number") {
92
+ runtimeArgs.push("--concurrency", String(concurrency));
93
+ }
94
+ if (typeof attempts === "number") {
95
+ runtimeArgs.push("--attempts", String(attempts));
96
+ }
97
+ if (typeof poll === "number") {
98
+ runtimeArgs.push("--poll", String(poll));
99
+ }
100
+ if (getBooleanOption(result, "once")) {
101
+ runtimeArgs.push("--once");
102
+ }
103
+ if (forceSource) {
104
+ runtimeArgs.push("--dev");
105
+ }
106
+ return runtimeArgs;
107
+ }
108
+ async function runRuntime(mode, result) {
109
+ const workspace = getStringOption(result, "workspace");
110
+ const workspaceRoot = resolve(workspace ?? env.FIFONY_WORKSPACE_ROOT ?? cwd());
111
+ const runtimeArgs = buildRuntimeArgs(result);
112
+ const outcome = await new Promise((resolvePromise, rejectPromise) => {
113
+ const args2 = useCompiled ? [runtimeScript, ...runtimeArgs] : [tsxCli, runtimeScript, ...runtimeArgs];
114
+ const child = spawn(execPath, args2, {
115
+ cwd: workspaceRoot,
116
+ stdio: "inherit",
117
+ env: {
118
+ ...env,
119
+ FIFONY_INTERFACE: mode,
120
+ FIFONY_WORKSPACE_ROOT: workspaceRoot
121
+ }
122
+ });
123
+ child.on("exit", (code, signal) => {
124
+ resolvePromise({ code, signal });
125
+ });
126
+ child.on("error", (error) => {
127
+ rejectPromise(error);
128
+ });
129
+ });
130
+ if (outcome.signal) {
131
+ kill(pid, outcome.signal);
132
+ return;
133
+ }
134
+ if (typeof outcome.code === "number" && outcome.code !== 0) {
135
+ exit(outcome.code);
136
+ }
137
+ }
138
+ async function runMcpServer(result) {
139
+ const workspace = getStringOption(result, "workspace");
140
+ const persistence = getStringOption(result, "persistence");
141
+ const workspaceRoot = resolve(workspace ?? env.FIFONY_WORKSPACE_ROOT ?? cwd());
142
+ const persistenceRoot = resolve(persistence ?? env.FIFONY_PERSISTENCE ?? workspaceRoot);
143
+ const outcome = await new Promise((resolvePromise, rejectPromise) => {
144
+ const mcpArgs = useCompiled ? [mcpScript] : [tsxCli, mcpScript];
145
+ const child = spawn(execPath, mcpArgs, {
146
+ cwd: workspaceRoot,
147
+ stdio: "inherit",
148
+ env: {
149
+ ...env,
150
+ FIFONY_WORKSPACE_ROOT: workspaceRoot,
151
+ FIFONY_PERSISTENCE: persistenceRoot
152
+ }
153
+ });
154
+ child.on("exit", (code, signal) => {
155
+ resolvePromise({ code, signal });
156
+ });
157
+ child.on("error", (error) => {
158
+ rejectPromise(error);
159
+ });
160
+ });
161
+ if (outcome.signal) {
162
+ kill(pid, outcome.signal);
163
+ return;
164
+ }
165
+ if (typeof outcome.code === "number" && outcome.code !== 0) {
166
+ exit(outcome.code);
167
+ }
168
+ }
169
+ var cli = createCLI({
170
+ name: packageJson.name ?? "fifony",
171
+ version: packageJson.version ?? "0.0.0",
172
+ description: packageJson.description ?? "Filesystem-backed local multi-agent orchestrator.",
173
+ commands: {
174
+ run: {
175
+ description: "Run the local Fifony runtime with the dashboard/API enabled when --port is provided.",
176
+ options: commonOptions,
177
+ handler: (result) => runRuntime("cli", result)
178
+ },
179
+ mcp: {
180
+ description: "Run a Fifony MCP server over stdio with resources, tools, and prompts backed by the local durable store.",
181
+ options: commonOptions,
182
+ handler: (result) => runMcpServer(result)
183
+ }
184
+ }
185
+ });
186
+ function normalizeArgs(rawArgs) {
187
+ if (rawArgs.length === 0) {
188
+ return ["run"];
189
+ }
190
+ const first = rawArgs[0];
191
+ if (["--help", "-h", "help", "--version", "-v", "version"].includes(first)) {
192
+ return rawArgs;
193
+ }
194
+ if (first.startsWith("-")) {
195
+ return ["run", ...rawArgs];
196
+ }
197
+ return rawArgs;
198
+ }
199
+ var args = normalizeArgs(process.argv.slice(2));
200
+ cli.run(args).catch((error) => {
201
+ console.error(`Failed to start fifony CLI: ${String(error)}`);
202
+ exit(1);
203
+ });
204
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { cwd, env, execPath, exit, kill, pid } from \"node:process\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createRequire } from \"node:module\";\nimport { readFileSync } from \"node:fs\";\nimport { createCLI, type CommandParseResult } from \"cli-args-parser\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst packageRoot = resolve(__dirname, \"..\");\nconst require = createRequire(import.meta.url);\nconst packageJson = JSON.parse(readFileSync(resolve(packageRoot, \"package.json\"), \"utf8\")) as {\n name?: string;\n version?: string;\n description?: string;\n};\n// Prefer compiled dist/ if available, fallback to tsx + source\nconst distRuntime = resolve(packageRoot, \"dist\", \"runtime\", \"run-local.js\");\nconst distMcp = resolve(packageRoot, \"dist\", \"mcp\", \"server.js\");\nconst srcRuntime = resolve(packageRoot, \"src\", \"runtime\", \"run-local.ts\");\nconst srcMcp = resolve(packageRoot, \"src\", \"mcp\", \"server.ts\");\n\nimport { existsSync } from \"node:fs\";\nconst forceSource = process.argv.includes(\"--dev\") || env.NODE_ENV === \"development\";\nconst useCompiled = !forceSource && existsSync(distRuntime);\n\nlet tsxCli: string | null = null;\nif (!useCompiled) {\n try { tsxCli = require.resolve(\"tsx/cli\"); } catch {\n console.error(\"No compiled dist/ found and tsx is not installed. Run 'pnpm build' first.\");\n exit(1);\n }\n}\n\nconst runtimeScript = useCompiled ? distRuntime : srcRuntime;\nconst mcpScript = useCompiled ? distMcp : srcMcp;\n\nconst commonOptions = {\n workspace: {\n type: \"string\",\n description: \"Target workspace root. Defaults to the current directory.\",\n },\n persistence: {\n type: \"string\",\n description: \"Persistence root. Defaults to the current directory.\",\n },\n port: {\n type: \"number\",\n description: \"Start the local API/dashboard on the provided port.\",\n },\n concurrency: {\n type: \"number\",\n description: \"Maximum number of concurrent workers.\",\n },\n attempts: {\n type: \"number\",\n description: \"Maximum attempts per issue.\",\n },\n poll: {\n type: \"number\",\n description: \"Scheduler interval in milliseconds.\",\n },\n once: {\n type: \"boolean\",\n description: \"Process one scheduler cycle and exit.\",\n default: false,\n },\n} as const;\n\nfunction getStringOption(result: CommandParseResult, key: keyof typeof commonOptions): string | undefined {\n const value = result.options[key];\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction getNumberOption(result: CommandParseResult, key: keyof typeof commonOptions): number | undefined {\n const value = result.options[key];\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction getBooleanOption(result: CommandParseResult, key: keyof typeof commonOptions): boolean {\n return result.options[key] === true;\n}\n\nfunction buildRuntimeArgs(result: CommandParseResult): string[] {\n const runtimeArgs: string[] = [];\n const workspace = getStringOption(result, \"workspace\");\n const persistence = getStringOption(result, \"persistence\");\n const port = getNumberOption(result, \"port\");\n const concurrency = getNumberOption(result, \"concurrency\");\n const attempts = getNumberOption(result, \"attempts\");\n const poll = getNumberOption(result, \"poll\");\n\n if (workspace) {\n runtimeArgs.push(\"--workspace\", workspace);\n }\n if (persistence) {\n runtimeArgs.push(\"--persistence\", persistence);\n }\n if (typeof port === \"number\") {\n runtimeArgs.push(\"--port\", String(port));\n }\n if (typeof concurrency === \"number\") {\n runtimeArgs.push(\"--concurrency\", String(concurrency));\n }\n if (typeof attempts === \"number\") {\n runtimeArgs.push(\"--attempts\", String(attempts));\n }\n if (typeof poll === \"number\") {\n runtimeArgs.push(\"--poll\", String(poll));\n }\n if (getBooleanOption(result, \"once\")) {\n runtimeArgs.push(\"--once\");\n }\n if (forceSource) {\n runtimeArgs.push(\"--dev\");\n }\n\n return runtimeArgs;\n}\n\nasync function runRuntime(mode: \"cli\" | \"mcp\", result: CommandParseResult): Promise<void> {\n const workspace = getStringOption(result, \"workspace\");\n const workspaceRoot = resolve(workspace ?? env.FIFONY_WORKSPACE_ROOT ?? cwd());\n const runtimeArgs = buildRuntimeArgs(result);\n\n const outcome = await new Promise<{ code?: number | null; signal?: NodeJS.Signals | null }>((resolvePromise, rejectPromise) => {\n const args = useCompiled ? [runtimeScript, ...runtimeArgs] : [tsxCli!, runtimeScript, ...runtimeArgs];\n const child = spawn(execPath, args, {\n cwd: workspaceRoot,\n stdio: \"inherit\",\n env: {\n ...env,\n FIFONY_INTERFACE: mode,\n FIFONY_WORKSPACE_ROOT: workspaceRoot,\n },\n });\n\n child.on(\"exit\", (code, signal) => {\n resolvePromise({ code, signal });\n });\n\n child.on(\"error\", (error) => {\n rejectPromise(error);\n });\n });\n\n if (outcome.signal) {\n kill(pid, outcome.signal);\n return;\n }\n\n if (typeof outcome.code === \"number\" && outcome.code !== 0) {\n exit(outcome.code);\n }\n}\n\nasync function runMcpServer(result: CommandParseResult): Promise<void> {\n const workspace = getStringOption(result, \"workspace\");\n const persistence = getStringOption(result, \"persistence\");\n const workspaceRoot = resolve(workspace ?? env.FIFONY_WORKSPACE_ROOT ?? cwd());\n const persistenceRoot = resolve(persistence ?? env.FIFONY_PERSISTENCE ?? workspaceRoot);\n\n const outcome = await new Promise<{ code?: number | null; signal?: NodeJS.Signals | null }>((resolvePromise, rejectPromise) => {\n const mcpArgs = useCompiled ? [mcpScript] : [tsxCli!, mcpScript];\n const child = spawn(execPath, mcpArgs, {\n cwd: workspaceRoot,\n stdio: \"inherit\",\n env: {\n ...env,\n FIFONY_WORKSPACE_ROOT: workspaceRoot,\n FIFONY_PERSISTENCE: persistenceRoot,\n },\n });\n\n child.on(\"exit\", (code, signal) => {\n resolvePromise({ code, signal });\n });\n\n child.on(\"error\", (error) => {\n rejectPromise(error);\n });\n });\n\n if (outcome.signal) {\n kill(pid, outcome.signal);\n return;\n }\n\n if (typeof outcome.code === \"number\" && outcome.code !== 0) {\n exit(outcome.code);\n }\n}\n\nconst cli = createCLI({\n name: packageJson.name ?? \"fifony\",\n version: packageJson.version ?? \"0.0.0\",\n description: packageJson.description ?? \"Filesystem-backed local multi-agent orchestrator.\",\n commands: {\n run: {\n description: \"Run the local Fifony runtime with the dashboard/API enabled when --port is provided.\",\n options: commonOptions,\n handler: (result) => runRuntime(\"cli\", result),\n },\n mcp: {\n description: \"Run a Fifony MCP server over stdio with resources, tools, and prompts backed by the local durable store.\",\n options: commonOptions,\n handler: (result) => runMcpServer(result),\n },\n },\n});\n\nfunction normalizeArgs(rawArgs: string[]): string[] {\n if (rawArgs.length === 0) {\n return [\"run\"];\n }\n\n const first = rawArgs[0];\n if ([\"--help\", \"-h\", \"help\", \"--version\", \"-v\", \"version\"].includes(first)) {\n return rawArgs;\n }\n\n if (first.startsWith(\"-\")) {\n return [\"run\", ...rawArgs];\n }\n\n return rawArgs;\n}\n\nconst args = normalizeArgs(process.argv.slice(2));\n\ncli.run(args).catch((error) => {\n console.error(`Failed to start fifony CLI: ${String(error)}`);\n exit(1);\n});\n"],"mappings":"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","names":["require","args"]}