fifony 0.1.21 → 0.1.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.
Files changed (37) hide show
  1. package/README.md +7 -0
  2. package/app/dist/assets/{KeyboardShortcutsHelp-BTjiQe_Y.js → KeyboardShortcutsHelp-DFstgyXD.js} +1 -1
  3. package/app/dist/assets/OnboardingWizard-Daehu2Uj.js +1 -0
  4. package/app/dist/assets/analytics.lazy-C1-iSRM_.js +1 -0
  5. package/app/dist/assets/{createLucideIcon-DtZs0TX0.js → createLucideIcon-BWC-guQt.js} +1 -1
  6. package/app/dist/assets/index-DbIrs0MK.css +1 -0
  7. package/app/dist/assets/index-O_FDwkw6.js +43 -0
  8. package/app/dist/assets/vendor-BTlTWMUF.js +9 -0
  9. package/app/dist/index.html +4 -5
  10. package/app/dist/service-worker.js +1 -1
  11. package/bin/fifony-wrap.js +53 -0
  12. package/dist/agent/cli-wrapper.js +78 -0
  13. package/dist/agent/cli-wrapper.js.map +1 -0
  14. package/dist/agent/run-local.js +93 -7889
  15. package/dist/agent/run-local.js.map +1 -1
  16. package/dist/chunk-F6JEQIP2.js +449 -0
  17. package/dist/chunk-F6JEQIP2.js.map +1 -0
  18. package/dist/{chunk-SMGXYOWU.js → chunk-O665NS5E.js} +411 -9
  19. package/dist/chunk-O665NS5E.js.map +1 -0
  20. package/dist/chunk-VP6TGOMT.js +8915 -0
  21. package/dist/chunk-VP6TGOMT.js.map +1 -0
  22. package/dist/cli.js +182 -0
  23. package/dist/cli.js.map +1 -1
  24. package/dist/issue-runner-MDCJ4G26.js +11 -0
  25. package/dist/issue-runner-MDCJ4G26.js.map +1 -0
  26. package/dist/mcp/server.js +589 -595
  27. package/dist/mcp/server.js.map +1 -1
  28. package/dist/queue-workers-LAYOT4E5.js +21 -0
  29. package/dist/queue-workers-LAYOT4E5.js.map +1 -0
  30. package/package.json +10 -9
  31. package/app/dist/assets/OnboardingWizard-BALlquG0.js +0 -1
  32. package/app/dist/assets/analytics.lazy-DjSzXIey.js +0 -1
  33. package/app/dist/assets/index-BV11ScVl.js +0 -42
  34. package/app/dist/assets/index-DWbxgKSd.css +0 -1
  35. package/app/dist/assets/vendor-BoGBoEwT.js +0 -9
  36. package/app/dist/assets/zap-DpjdVd1i.js +0 -1
  37. package/dist/chunk-SMGXYOWU.js.map +0 -1
@@ -13,12 +13,11 @@
13
13
  <link rel="manifest" href="/assets/manifest.webmanifest" />
14
14
  <link rel="icon" href="/assets/icon.svg" type="image/svg+xml" />
15
15
  <link rel="apple-touch-icon" href="/assets/icon.svg" />
16
- <script type="module" crossorigin src="/assets/assets/index-BV11ScVl.js"></script>
16
+ <script type="module" crossorigin src="/assets/assets/index-O_FDwkw6.js"></script>
17
17
  <link rel="modulepreload" crossorigin href="/assets/assets/rolldown-runtime-DF2fYuay.js">
18
- <link rel="modulepreload" crossorigin href="/assets/assets/vendor-BoGBoEwT.js">
19
- <link rel="modulepreload" crossorigin href="/assets/assets/createLucideIcon-DtZs0TX0.js">
20
- <link rel="modulepreload" crossorigin href="/assets/assets/zap-DpjdVd1i.js">
21
- <link rel="stylesheet" crossorigin href="/assets/assets/index-DWbxgKSd.css">
18
+ <link rel="modulepreload" crossorigin href="/assets/assets/vendor-BTlTWMUF.js">
19
+ <link rel="modulepreload" crossorigin href="/assets/assets/createLucideIcon-BWC-guQt.js">
20
+ <link rel="stylesheet" crossorigin href="/assets/assets/index-DbIrs0MK.css">
22
21
  </head>
23
22
  <body>
24
23
  <div id="root"></div>
@@ -1,4 +1,4 @@
1
- const CACHE_VERSION = "1773801135498";
1
+ const CACHE_VERSION = "1773942074704";
2
2
  const CORE_CACHE = `fifony-core-${CACHE_VERSION}`;
3
3
  const ASSET_CACHE = `fifony-assets-${CACHE_VERSION}`;
4
4
  const APP_SHELL_ROUTES = ["/kanban", "/issues", "/agents", "/settings", "/onboarding"];
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env node
2
+ import { dirname, resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { existsSync } from "node:fs";
5
+ import { env, exit, argv } from "node:process";
6
+
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = dirname(__filename);
9
+ const packageRoot = resolve(__dirname, "..");
10
+
11
+ const distEntry = resolve(packageRoot, "dist", "agent", "cli-wrapper.js");
12
+ const srcEntry = resolve(packageRoot, "src", "agent", "cli-wrapper.ts");
13
+ const forceSource = argv.includes("--dev") || env.NODE_ENV === "development";
14
+ const hasCompiled = existsSync(distEntry);
15
+ const hasSrc = existsSync(srcEntry);
16
+
17
+ if (hasCompiled && !forceSource) {
18
+ import(new URL(`file://${distEntry}`).href).catch((error) => {
19
+ console.error(`Failed to start fifony-wrap: ${String(error)}`);
20
+ exit(1);
21
+ });
22
+ } else if (hasSrc) {
23
+ const { spawn } = await import("node:child_process");
24
+ const { createRequire } = await import("node:module");
25
+ const { execPath } = await import("node:process");
26
+ const require = createRequire(import.meta.url);
27
+
28
+ let tsxCli;
29
+ try {
30
+ tsxCli = require.resolve("tsx/cli");
31
+ } catch {
32
+ console.error("Source found but tsx is not installed. Run 'pnpm install' or 'pnpm build' first.");
33
+ exit(1);
34
+ }
35
+
36
+ const child = spawn(execPath, [tsxCli, srcEntry, ...argv.slice(2)], {
37
+ stdio: "inherit",
38
+ env: { ...env },
39
+ });
40
+
41
+ child.on("exit", (code, signal) => {
42
+ if (signal) { process.kill(process.pid, signal); return; }
43
+ exit(code ?? 1);
44
+ });
45
+
46
+ child.on("error", (error) => {
47
+ console.error(`Failed to start fifony-wrap: ${String(error)}`);
48
+ exit(1);
49
+ });
50
+ } else {
51
+ console.error("fifony-wrap entry point not found. Try: pnpm build");
52
+ exit(1);
53
+ }
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/agent/cli-wrapper.ts
4
+ import { readFileSync, writeFileSync, rmSync } from "fs";
5
+ import { join } from "path";
6
+ import { env, exit } from "process";
7
+ import { spawn } from "child_process";
8
+ function runShell(command, extraEnv = {}) {
9
+ return new Promise((resolve) => {
10
+ const child = spawn(command, {
11
+ shell: true,
12
+ stdio: "inherit",
13
+ env: { ...env, ...extraEnv }
14
+ });
15
+ child.on("close", (code) => resolve({ code: code ?? 1 }));
16
+ child.on("error", () => resolve({ code: 1 }));
17
+ });
18
+ }
19
+ function runAndCapture(command) {
20
+ return new Promise((resolve) => {
21
+ const child = spawn(command, { shell: true, stdio: ["inherit", "pipe", "pipe"] });
22
+ let output = "";
23
+ child.stdout?.on("data", (chunk) => {
24
+ output += String(chunk);
25
+ });
26
+ child.stderr?.on("data", (chunk) => {
27
+ output += String(chunk);
28
+ });
29
+ child.on("close", (code) => resolve({ code, output }));
30
+ child.on("error", () => resolve({ code: null, output: `Command execution error: ${command}` }));
31
+ });
32
+ }
33
+ async function main() {
34
+ const wrapCommand = env.FIFONY_WRAP_COMMAND?.trim();
35
+ if (!wrapCommand) {
36
+ process.stderr.write("fifony-wrap: FIFONY_WRAP_COMMAND is required\n");
37
+ exit(1);
38
+ }
39
+ const workspacePath = env.FIFONY_WORKSPACE_PATH ?? process.cwd();
40
+ const beforeHook = env.FIFONY_WRAP_BEFORE_HOOK?.trim();
41
+ const afterHook = env.FIFONY_WRAP_AFTER_HOOK?.trim();
42
+ const outputFile = join(workspacePath, ".wrap-output.txt");
43
+ if (beforeHook) {
44
+ const { code: code2 } = await runShell(beforeHook);
45
+ if (code2 !== 0) {
46
+ process.stderr.write(`fifony-wrap: before hook exited ${code2}
47
+ `);
48
+ exit(code2);
49
+ }
50
+ }
51
+ const { code, output } = await runAndCapture(wrapCommand);
52
+ writeFileSync(outputFile, output, "utf8");
53
+ if (afterHook) {
54
+ const { code: hookCode } = await runShell(afterHook, { FIFONY_WRAP_OUTPUT_FILE: outputFile });
55
+ if (hookCode !== 0) {
56
+ process.stderr.write(`fifony-wrap: after hook exited ${hookCode} \u2014 using original output
57
+ `);
58
+ writeFileSync(outputFile, output, "utf8");
59
+ }
60
+ }
61
+ let finalOutput = output;
62
+ try {
63
+ finalOutput = readFileSync(outputFile, "utf8");
64
+ } catch {
65
+ }
66
+ try {
67
+ rmSync(outputFile, { force: true });
68
+ } catch {
69
+ }
70
+ process.stdout.write(finalOutput);
71
+ exit(code ?? 1);
72
+ }
73
+ main().catch((err) => {
74
+ process.stderr.write(`fifony-wrap: fatal: ${String(err)}
75
+ `);
76
+ exit(1);
77
+ });
78
+ //# sourceMappingURL=cli-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/agent/cli-wrapper.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * fifony-wrap — man-in-the-middle wrapper for CLI agents\n *\n * Protocol:\n * FIFONY_WRAP_COMMAND (required) real CLI command to run, e.g. \"claude -p $FIFONY_TURN_PROMPT_FILE\"\n * FIFONY_WRAP_BEFORE_HOOK (optional) shell script run before the CLI; can modify $FIFONY_TURN_PROMPT_FILE in place\n * FIFONY_WRAP_AFTER_HOOK (optional) shell script run after the CLI; receives FIFONY_WRAP_OUTPUT_FILE pointing\n * to a temp file with the captured output — modify it in place to change what fifony sees\n *\n * Configure via the API, MCP, or s3db — set agentCommand on the workflow config to:\n * FIFONY_WRAP_COMMAND=\"claude -p $FIFONY_TURN_PROMPT_FILE\" FIFONY_WRAP_BEFORE_HOOK=./hooks/before.sh fifony-wrap\n */\nimport { readFileSync, writeFileSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { env, exit } from \"node:process\";\nimport { spawn } from \"node:child_process\";\n\nfunction runShell(command: string, extraEnv: Record<string, string> = {}): Promise<{ code: number }> {\n return new Promise((resolve) => {\n const child = spawn(command, {\n shell: true,\n stdio: \"inherit\",\n env: { ...env, ...extraEnv },\n });\n child.on(\"close\", (code) => resolve({ code: code ?? 1 }));\n child.on(\"error\", () => resolve({ code: 1 }));\n });\n}\n\nfunction runAndCapture(command: string): Promise<{ code: number | null; output: string }> {\n return new Promise((resolve) => {\n const child = spawn(command, { shell: true, stdio: [\"inherit\", \"pipe\", \"pipe\"] });\n let output = \"\";\n child.stdout?.on(\"data\", (chunk: Buffer) => { output += String(chunk); });\n child.stderr?.on(\"data\", (chunk: Buffer) => { output += String(chunk); });\n child.on(\"close\", (code) => resolve({ code, output }));\n child.on(\"error\", () => resolve({ code: null, output: `Command execution error: ${command}` }));\n });\n}\n\nasync function main() {\n const wrapCommand = env.FIFONY_WRAP_COMMAND?.trim();\n if (!wrapCommand) {\n process.stderr.write(\"fifony-wrap: FIFONY_WRAP_COMMAND is required\\n\");\n exit(1);\n }\n\n const workspacePath = env.FIFONY_WORKSPACE_PATH ?? process.cwd();\n const beforeHook = env.FIFONY_WRAP_BEFORE_HOOK?.trim();\n const afterHook = env.FIFONY_WRAP_AFTER_HOOK?.trim();\n const outputFile = join(workspacePath, \".wrap-output.txt\");\n\n if (beforeHook) {\n const { code } = await runShell(beforeHook);\n if (code !== 0) {\n process.stderr.write(`fifony-wrap: before hook exited ${code}\\n`);\n exit(code);\n }\n }\n\n const { code, output } = await runAndCapture(wrapCommand);\n\n writeFileSync(outputFile, output, \"utf8\");\n\n if (afterHook) {\n const { code: hookCode } = await runShell(afterHook, { FIFONY_WRAP_OUTPUT_FILE: outputFile });\n if (hookCode !== 0) {\n process.stderr.write(`fifony-wrap: after hook exited ${hookCode} — using original output\\n`);\n writeFileSync(outputFile, output, \"utf8\");\n }\n }\n\n let finalOutput = output;\n try {\n finalOutput = readFileSync(outputFile, \"utf8\");\n } catch {}\n try { rmSync(outputFile, { force: true }); } catch {}\n\n process.stdout.write(finalOutput);\n exit(code ?? 1);\n}\n\nmain().catch((err) => {\n process.stderr.write(`fifony-wrap: fatal: ${String(err)}\\n`);\n exit(1);\n});\n"],"mappings":";;;AAaA,SAAS,cAAc,eAAe,cAAc;AACpD,SAAS,YAAY;AACrB,SAAS,KAAK,YAAY;AAC1B,SAAS,aAAa;AAEtB,SAAS,SAAS,SAAiB,WAAmC,CAAC,GAA8B;AACnG,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,QAAQ,MAAM,SAAS;AAAA,MAC3B,OAAO;AAAA,MACP,OAAO;AAAA,MACP,KAAK,EAAE,GAAG,KAAK,GAAG,SAAS;AAAA,IAC7B,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,SAAS,QAAQ,EAAE,MAAM,QAAQ,EAAE,CAAC,CAAC;AACxD,UAAM,GAAG,SAAS,MAAM,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;AAAA,EAC9C,CAAC;AACH;AAEA,SAAS,cAAc,SAAmE;AACxF,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,QAAQ,MAAM,SAAS,EAAE,OAAO,MAAM,OAAO,CAAC,WAAW,QAAQ,MAAM,EAAE,CAAC;AAChF,QAAI,SAAS;AACb,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAAE,gBAAU,OAAO,KAAK;AAAA,IAAG,CAAC;AACxE,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAAE,gBAAU,OAAO,KAAK;AAAA,IAAG,CAAC;AACxE,UAAM,GAAG,SAAS,CAAC,SAAS,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC;AACrD,UAAM,GAAG,SAAS,MAAM,QAAQ,EAAE,MAAM,MAAM,QAAQ,4BAA4B,OAAO,GAAG,CAAC,CAAC;AAAA,EAChG,CAAC;AACH;AAEA,eAAe,OAAO;AACpB,QAAM,cAAc,IAAI,qBAAqB,KAAK;AAClD,MAAI,CAAC,aAAa;AAChB,YAAQ,OAAO,MAAM,gDAAgD;AACrE,SAAK,CAAC;AAAA,EACR;AAEA,QAAM,gBAAgB,IAAI,yBAAyB,QAAQ,IAAI;AAC/D,QAAM,aAAa,IAAI,yBAAyB,KAAK;AACrD,QAAM,YAAY,IAAI,wBAAwB,KAAK;AACnD,QAAM,aAAa,KAAK,eAAe,kBAAkB;AAEzD,MAAI,YAAY;AACd,UAAM,EAAE,MAAAA,MAAK,IAAI,MAAM,SAAS,UAAU;AAC1C,QAAIA,UAAS,GAAG;AACd,cAAQ,OAAO,MAAM,mCAAmCA,KAAI;AAAA,CAAI;AAChE,WAAKA,KAAI;AAAA,IACX;AAAA,EACF;AAEA,QAAM,EAAE,MAAM,OAAO,IAAI,MAAM,cAAc,WAAW;AAExD,gBAAc,YAAY,QAAQ,MAAM;AAExC,MAAI,WAAW;AACb,UAAM,EAAE,MAAM,SAAS,IAAI,MAAM,SAAS,WAAW,EAAE,yBAAyB,WAAW,CAAC;AAC5F,QAAI,aAAa,GAAG;AAClB,cAAQ,OAAO,MAAM,kCAAkC,QAAQ;AAAA,CAA4B;AAC3F,oBAAc,YAAY,QAAQ,MAAM;AAAA,IAC1C;AAAA,EACF;AAEA,MAAI,cAAc;AAClB,MAAI;AACF,kBAAc,aAAa,YAAY,MAAM;AAAA,EAC/C,QAAQ;AAAA,EAAC;AACT,MAAI;AAAE,WAAO,YAAY,EAAE,OAAO,KAAK,CAAC;AAAA,EAAG,QAAQ;AAAA,EAAC;AAEpD,UAAQ,OAAO,MAAM,WAAW;AAChC,OAAK,QAAQ,CAAC;AAChB;AAEA,KAAK,EAAE,MAAM,CAAC,QAAQ;AACpB,UAAQ,OAAO,MAAM,uBAAuB,OAAO,GAAG,CAAC;AAAA,CAAI;AAC3D,OAAK,CAAC;AACR,CAAC;","names":["code"]}