fifony 0.1.22 → 0.1.23

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 (50) hide show
  1. package/README.md +33 -9
  2. package/app/dist/assets/KeyboardShortcutsHelp-BB5jLK_E.js +1 -0
  3. package/app/dist/assets/OnboardingWizard-xyM3Okjv.js +1 -0
  4. package/app/dist/assets/analytics.lazy-CfJXsh6r.js +1 -0
  5. package/app/dist/assets/index-C1QEwHZG.js +43 -0
  6. package/app/dist/assets/index-DjmUHXd1.css +1 -0
  7. package/app/dist/dinofffaur.png +0 -0
  8. package/app/dist/index.html +2 -2
  9. package/app/dist/service-worker.js +1 -1
  10. package/app/public/dinofffaur.png +0 -0
  11. package/dist/agent/cli-wrapper.js +1 -1
  12. package/dist/agent/cli-wrapper.js.map +1 -1
  13. package/dist/agent/run-local.js +163 -33
  14. package/dist/agent/run-local.js.map +1 -1
  15. package/dist/{chunk-O665NS5E.js → chunk-DD5BE2W6.js} +40 -43
  16. package/dist/chunk-DD5BE2W6.js.map +1 -0
  17. package/dist/chunk-DVU3CXWA.js +75 -0
  18. package/dist/chunk-DVU3CXWA.js.map +1 -0
  19. package/dist/chunk-G6CQK2WH.js +2137 -0
  20. package/dist/chunk-G6CQK2WH.js.map +1 -0
  21. package/dist/{chunk-VP6TGOMT.js → chunk-KT5V7N5H.js} +5219 -7032
  22. package/dist/chunk-KT5V7N5H.js.map +1 -0
  23. package/dist/chunk-NLIVWBNV.js +91 -0
  24. package/dist/chunk-NLIVWBNV.js.map +1 -0
  25. package/dist/cli.js +6 -2
  26. package/dist/cli.js.map +1 -1
  27. package/dist/issue-runner-6VFNHYJL.js +13 -0
  28. package/dist/issue-state-machine-NSDN4MV4.js +39 -0
  29. package/dist/mcp/server.js +6 -13
  30. package/dist/mcp/server.js.map +1 -1
  31. package/dist/{queue-workers-LAYOT4E5.js → queue-workers-VHYQYYLG.js} +3 -4
  32. package/dist/queue-workers-VHYQYYLG.js.map +1 -0
  33. package/dist/store-FH7L6KR2.js +56 -0
  34. package/dist/store-FH7L6KR2.js.map +1 -0
  35. package/package.json +1 -1
  36. package/FIFONY.md +0 -173
  37. package/app/dist/assets/KeyboardShortcutsHelp-DFstgyXD.js +0 -1
  38. package/app/dist/assets/OnboardingWizard-Daehu2Uj.js +0 -1
  39. package/app/dist/assets/analytics.lazy-C1-iSRM_.js +0 -1
  40. package/app/dist/assets/index-DbIrs0MK.css +0 -1
  41. package/app/dist/assets/index-O_FDwkw6.js +0 -43
  42. package/dist/chunk-F6JEQIP2.js +0 -449
  43. package/dist/chunk-F6JEQIP2.js.map +0 -1
  44. package/dist/chunk-O665NS5E.js.map +0 -1
  45. package/dist/chunk-VP6TGOMT.js.map +0 -1
  46. package/dist/issue-runner-MDCJ4G26.js +0 -11
  47. package/src/fixtures/agent-catalog.json +0 -208
  48. package/src/fixtures/skill-catalog.json +0 -67
  49. /package/dist/{issue-runner-MDCJ4G26.js.map → issue-runner-6VFNHYJL.js.map} +0 -0
  50. /package/dist/{queue-workers-LAYOT4E5.js.map → issue-state-machine-NSDN4MV4.js.map} +0 -0
@@ -0,0 +1,91 @@
1
+ import {
2
+ logger
3
+ } from "./chunk-DVU3CXWA.js";
4
+
5
+ // src/persistence/plugins/queue-workers.ts
6
+ var runtimeState = null;
7
+ var active = false;
8
+ async function initQueueWorkers(state) {
9
+ runtimeState = state;
10
+ active = true;
11
+ logger.info("[QueueWorkers] Workers ready (direct dispatch)");
12
+ }
13
+ async function stopQueueWorkers() {
14
+ active = false;
15
+ runtimeState = null;
16
+ logger.info("[QueueWorkers] Workers stopped");
17
+ }
18
+ function areQueueWorkersActive() {
19
+ return active;
20
+ }
21
+ function getCurrentIssue(id) {
22
+ return runtimeState?.issues.find((i) => i.id === id);
23
+ }
24
+ async function enqueueForPlanning(issue) {
25
+ if (!active || !runtimeState) return;
26
+ const current = getCurrentIssue(issue.id);
27
+ if (!current || current.state !== "Planning") {
28
+ logger.debug({ issueId: issue.id, state: current?.state }, "[QueueWorkers:plan] Skipping \u2014 not in Planning state");
29
+ return;
30
+ }
31
+ if (current.planningStatus === "planning") {
32
+ logger.debug({ issueId: issue.id }, "[QueueWorkers:plan] Already planning, skipping");
33
+ return;
34
+ }
35
+ logger.info({ issueId: issue.id, identifier: current.identifier }, "[QueueWorkers:plan] Dispatching planning job");
36
+ try {
37
+ const { runPlanningJob } = await import("./issue-runner-6VFNHYJL.js");
38
+ await runPlanningJob(runtimeState, current);
39
+ } catch (error) {
40
+ logger.error({ err: error, issueId: issue.id }, "[QueueWorkers:plan] Planning job failed");
41
+ }
42
+ }
43
+ async function enqueueForExecution(issue) {
44
+ if (!active || !runtimeState) return;
45
+ const running = /* @__PURE__ */ new Set();
46
+ const { runIssueOnce } = await import("./issue-runner-6VFNHYJL.js");
47
+ while (active && runtimeState) {
48
+ const current = getCurrentIssue(issue.id);
49
+ if (!current || current.state !== "Queued" && current.state !== "Running") {
50
+ logger.debug({ issueId: issue.id, state: current?.state }, "[QueueWorkers:execute] Issue no longer in Queued/Running \u2014 stopping dispatch loop");
51
+ break;
52
+ }
53
+ logger.info({ issueId: issue.id, identifier: current.identifier, state: current.state }, "[QueueWorkers:execute] Dispatching execution job");
54
+ try {
55
+ await runIssueOnce(runtimeState, current, running);
56
+ } catch (error) {
57
+ logger.error({ err: error, issueId: issue.id }, "[QueueWorkers:execute] Execution job failed");
58
+ break;
59
+ }
60
+ }
61
+ }
62
+ async function enqueueForReview(issue) {
63
+ if (!active || !runtimeState) return;
64
+ const current = getCurrentIssue(issue.id);
65
+ if (!current || current.state !== "Reviewing") {
66
+ logger.debug({ issueId: issue.id, state: current?.state }, "[QueueWorkers:review] Skipping \u2014 not in Reviewing state");
67
+ return;
68
+ }
69
+ logger.info({ issueId: issue.id, identifier: current.identifier }, "[QueueWorkers:review] Dispatching review job");
70
+ const running = /* @__PURE__ */ new Set();
71
+ try {
72
+ const { runIssueOnce } = await import("./issue-runner-6VFNHYJL.js");
73
+ await runIssueOnce(runtimeState, current, running);
74
+ } catch (error) {
75
+ logger.error({ err: error, issueId: issue.id }, "[QueueWorkers:review] Review job failed");
76
+ }
77
+ }
78
+ async function getQueueStats() {
79
+ return { plan: null, execute: null, review: null };
80
+ }
81
+
82
+ export {
83
+ initQueueWorkers,
84
+ stopQueueWorkers,
85
+ areQueueWorkersActive,
86
+ enqueueForPlanning,
87
+ enqueueForExecution,
88
+ enqueueForReview,
89
+ getQueueStats
90
+ };
91
+ //# sourceMappingURL=chunk-NLIVWBNV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/persistence/plugins/queue-workers.ts"],"sourcesContent":["import type { IssueEntry, RuntimeState } from \"../../types.ts\";\nimport { logger } from \"../../concerns/logger.ts\";\n\nlet runtimeState: RuntimeState | null = null;\nlet active = false;\n\nexport async function initQueueWorkers(state: RuntimeState): Promise<void> {\n runtimeState = state;\n active = true;\n logger.info(\"[QueueWorkers] Workers ready (direct dispatch)\");\n}\n\nexport async function stopQueueWorkers(): Promise<void> {\n active = false;\n runtimeState = null;\n logger.info(\"[QueueWorkers] Workers stopped\");\n}\n\nexport function areQueueWorkersActive(): boolean {\n return active;\n}\n\nfunction getCurrentIssue(id: string): IssueEntry | undefined {\n return runtimeState?.issues.find((i) => i.id === id);\n}\n\n// ── Dispatch: call handlers directly, no queue middleware ─────────────────\n\nexport async function enqueueForPlanning(issue: IssueEntry): Promise<void> {\n if (!active || !runtimeState) return;\n const current = getCurrentIssue(issue.id);\n if (!current || current.state !== \"Planning\") {\n logger.debug({ issueId: issue.id, state: current?.state }, \"[QueueWorkers:plan] Skipping — not in Planning state\");\n return;\n }\n if (current.planningStatus === \"planning\") {\n logger.debug({ issueId: issue.id }, \"[QueueWorkers:plan] Already planning, skipping\");\n return;\n }\n logger.info({ issueId: issue.id, identifier: current.identifier }, \"[QueueWorkers:plan] Dispatching planning job\");\n try {\n const { runPlanningJob } = await import(\"../../agents/issue-runner.ts\");\n await runPlanningJob(runtimeState, current);\n } catch (error) {\n logger.error({ err: error, issueId: issue.id }, \"[QueueWorkers:plan] Planning job failed\");\n }\n}\n\nexport async function enqueueForExecution(issue: IssueEntry): Promise<void> {\n if (!active || !runtimeState) return;\n const running = new Set<string>();\n const { runIssueOnce } = await import(\"../../agents/issue-runner.ts\");\n\n // Loop: keep running until the issue leaves Running/Queued state (e.g., moves to Reviewing/Done/Blocked)\n while (active && runtimeState) {\n const current = getCurrentIssue(issue.id);\n if (!current || (current.state !== \"Queued\" && current.state !== \"Running\")) {\n logger.debug({ issueId: issue.id, state: current?.state }, \"[QueueWorkers:execute] Issue no longer in Queued/Running — stopping dispatch loop\");\n break;\n }\n logger.info({ issueId: issue.id, identifier: current.identifier, state: current.state }, \"[QueueWorkers:execute] Dispatching execution job\");\n try {\n await runIssueOnce(runtimeState, current, running);\n } catch (error) {\n logger.error({ err: error, issueId: issue.id }, \"[QueueWorkers:execute] Execution job failed\");\n break;\n }\n }\n}\n\nexport async function enqueueForReview(issue: IssueEntry): Promise<void> {\n if (!active || !runtimeState) return;\n const current = getCurrentIssue(issue.id);\n if (!current || current.state !== \"Reviewing\") {\n logger.debug({ issueId: issue.id, state: current?.state }, \"[QueueWorkers:review] Skipping — not in Reviewing state\");\n return;\n }\n logger.info({ issueId: issue.id, identifier: current.identifier }, \"[QueueWorkers:review] Dispatching review job\");\n const running = new Set<string>();\n try {\n const { runIssueOnce } = await import(\"../../agents/issue-runner.ts\");\n await runIssueOnce(runtimeState, current, running);\n } catch (error) {\n logger.error({ err: error, issueId: issue.id }, \"[QueueWorkers:review] Review job failed\");\n }\n}\n\nexport async function getQueueStats(): Promise<Record<string, unknown>> {\n return { plan: null, execute: null, review: null };\n}\n"],"mappings":";;;;;AAGA,IAAI,eAAoC;AACxC,IAAI,SAAS;AAEb,eAAsB,iBAAiB,OAAoC;AACzE,iBAAe;AACf,WAAS;AACT,SAAO,KAAK,gDAAgD;AAC9D;AAEA,eAAsB,mBAAkC;AACtD,WAAS;AACT,iBAAe;AACf,SAAO,KAAK,gCAAgC;AAC9C;AAEO,SAAS,wBAAiC;AAC/C,SAAO;AACT;AAEA,SAAS,gBAAgB,IAAoC;AAC3D,SAAO,cAAc,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACrD;AAIA,eAAsB,mBAAmB,OAAkC;AACzE,MAAI,CAAC,UAAU,CAAC,aAAc;AAC9B,QAAM,UAAU,gBAAgB,MAAM,EAAE;AACxC,MAAI,CAAC,WAAW,QAAQ,UAAU,YAAY;AAC5C,WAAO,MAAM,EAAE,SAAS,MAAM,IAAI,OAAO,SAAS,MAAM,GAAG,2DAAsD;AACjH;AAAA,EACF;AACA,MAAI,QAAQ,mBAAmB,YAAY;AACzC,WAAO,MAAM,EAAE,SAAS,MAAM,GAAG,GAAG,gDAAgD;AACpF;AAAA,EACF;AACA,SAAO,KAAK,EAAE,SAAS,MAAM,IAAI,YAAY,QAAQ,WAAW,GAAG,8CAA8C;AACjH,MAAI;AACF,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,4BAA8B;AACtE,UAAM,eAAe,cAAc,OAAO;AAAA,EAC5C,SAAS,OAAO;AACd,WAAO,MAAM,EAAE,KAAK,OAAO,SAAS,MAAM,GAAG,GAAG,yCAAyC;AAAA,EAC3F;AACF;AAEA,eAAsB,oBAAoB,OAAkC;AAC1E,MAAI,CAAC,UAAU,CAAC,aAAc;AAC9B,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,EAAE,aAAa,IAAI,MAAM,OAAO,4BAA8B;AAGpE,SAAO,UAAU,cAAc;AAC7B,UAAM,UAAU,gBAAgB,MAAM,EAAE;AACxC,QAAI,CAAC,WAAY,QAAQ,UAAU,YAAY,QAAQ,UAAU,WAAY;AAC3E,aAAO,MAAM,EAAE,SAAS,MAAM,IAAI,OAAO,SAAS,MAAM,GAAG,wFAAmF;AAC9I;AAAA,IACF;AACA,WAAO,KAAK,EAAE,SAAS,MAAM,IAAI,YAAY,QAAQ,YAAY,OAAO,QAAQ,MAAM,GAAG,kDAAkD;AAC3I,QAAI;AACF,YAAM,aAAa,cAAc,SAAS,OAAO;AAAA,IACnD,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,OAAO,SAAS,MAAM,GAAG,GAAG,6CAA6C;AAC7F;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,iBAAiB,OAAkC;AACvE,MAAI,CAAC,UAAU,CAAC,aAAc;AAC9B,QAAM,UAAU,gBAAgB,MAAM,EAAE;AACxC,MAAI,CAAC,WAAW,QAAQ,UAAU,aAAa;AAC7C,WAAO,MAAM,EAAE,SAAS,MAAM,IAAI,OAAO,SAAS,MAAM,GAAG,8DAAyD;AACpH;AAAA,EACF;AACA,SAAO,KAAK,EAAE,SAAS,MAAM,IAAI,YAAY,QAAQ,WAAW,GAAG,8CAA8C;AACjH,QAAM,UAAU,oBAAI,IAAY;AAChC,MAAI;AACF,UAAM,EAAE,aAAa,IAAI,MAAM,OAAO,4BAA8B;AACpE,UAAM,aAAa,cAAc,SAAS,OAAO;AAAA,EACnD,SAAS,OAAO;AACd,WAAO,MAAM,EAAE,KAAK,OAAO,SAAS,MAAM,GAAG,GAAG,yCAAyC;AAAA,EAC3F;AACF;AAEA,eAAsB,gBAAkD;AACtE,SAAO,EAAE,MAAM,MAAM,SAAS,MAAM,QAAQ,KAAK;AACnD;","names":[]}
package/dist/cli.js CHANGED
@@ -3,7 +3,11 @@ import {
3
3
  importReferenceArtifacts,
4
4
  listReferenceRepositories,
5
5
  syncReferenceRepositories
6
- } from "./chunk-F6JEQIP2.js";
6
+ } from "./chunk-KT5V7N5H.js";
7
+ import "./chunk-NLIVWBNV.js";
8
+ import "./chunk-G6CQK2WH.js";
9
+ import "./chunk-DD5BE2W6.js";
10
+ import "./chunk-DVU3CXWA.js";
7
11
 
8
12
  // src/cli.ts
9
13
  import { spawn } from "child_process";
@@ -21,7 +25,7 @@ var require2 = createRequire(import.meta.url);
21
25
  var packageJson = JSON.parse(readFileSync(resolve(packageRoot, "package.json"), "utf8"));
22
26
  var distRuntime = resolve(packageRoot, "dist", "agent", "run-local.js");
23
27
  var distMcp = resolve(packageRoot, "dist", "mcp", "server.js");
24
- var srcRuntime = resolve(packageRoot, "src", "agent", "run-local.ts");
28
+ var srcRuntime = resolve(packageRoot, "src", "boot.ts");
25
29
  var srcMcp = resolve(packageRoot, "src", "mcp", "server.ts");
26
30
  var forceSource = process.argv.includes("--dev") || env.NODE_ENV === "development";
27
31
  var useCompiled = !forceSource && existsSync(distRuntime);
package/dist/cli.js.map CHANGED
@@ -1 +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\";\nimport {\n getReferenceRepositoriesRoot,\n importReferenceArtifacts,\n listReferenceRepositories,\n syncReferenceRepositories,\n type ReferenceImportSummary,\n type ReferenceImportKind,\n type ReferenceSyncResult,\n} from \"./reference-repositories.ts\";\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\", \"agent\", \"run-local.js\");\nconst distMcp = resolve(packageRoot, \"dist\", \"mcp\", \"server.js\");\nconst srcRuntime = resolve(packageRoot, \"src\", \"agent\", \"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 aliases: [\"-p\"],\n description: \"Start the local API/dashboard on the provided port.\",\n default: 4000,\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: string): string | undefined {\n const value = result.options[key];\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction getNumberOption(result: CommandParseResult, key: string): 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: string): boolean {\n return result.options[key] === true;\n}\n\nfunction parseReferenceKind(value: unknown): ReferenceImportKind {\n const normalized = typeof value === \"string\" ? value.trim().toLowerCase() : \"all\";\n if (normalized === \"all\") return \"all\";\n if (normalized === \"agents\" || normalized === \"agent\") return \"agents\";\n if (normalized === \"skills\" || normalized === \"skill\") return \"skills\";\n throw new Error(`Invalid kind: ${normalized}. Expected all, agents, or skills.`);\n}\n\nfunction getWorkspaceRoot(result: CommandParseResult): string {\n const workspace = getStringOption(result, \"workspace\");\n return resolve(workspace ?? env.FIFONY_WORKSPACE_ROOT ?? cwd());\n}\n\nasync function runOnboardingList(): Promise<void> {\n const root = getReferenceRepositoriesRoot();\n const repositories = listReferenceRepositories();\n\n console.log(\"Reference repositories:\");\n console.log(`Storage: ${root}`);\n console.log(\"\");\n\n for (const repository of repositories) {\n const status = repository.synced\n ? repository.branch\n ? `synced (${repository.branch})`\n : \"synced\"\n : repository.present\n ? `present — ${repository.error ?? \"not synced\"}`\n : \"not found\";\n\n console.log(`- ${repository.id}`);\n console.log(` name: ${repository.name}`);\n console.log(` url: ${repository.url}`);\n console.log(` path: ${repository.path}`);\n console.log(` status: ${status}`);\n if (repository.remote) {\n console.log(` remote: ${repository.remote}`);\n }\n console.log(\"\");\n }\n}\n\nasync function runOnboardingSync(result: CommandParseResult): Promise<void> {\n const repositoryFilter = getStringOption(result, \"repository\");\n let syncTarget: ReferenceSyncResult[];\n try {\n syncTarget = repositoryFilter\n ? syncReferenceRepositories(repositoryFilter)\n : syncReferenceRepositories();\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n exit(1);\n return;\n }\n\n const succeeded: ReferenceSyncResult[] = [];\n const failed: ReferenceSyncResult[] = [];\n\n for (const item of syncTarget) {\n if (item.action === \"failed\") {\n failed.push(item);\n } else {\n succeeded.push(item);\n }\n\n if (item.action === \"failed\") {\n console.log(`✗ ${item.id}: ${item.message}`);\n } else if (item.action === \"cloned\") {\n console.log(`+ ${item.id}: ${item.message}`);\n } else {\n console.log(`↻ ${item.id}: ${item.message}`);\n }\n }\n\n if (failed.length > 0) {\n console.log(\"\");\n console.log(`${succeeded.length} repository(ies) synced, ${failed.length} failed.`);\n console.log(\"Run onboarding sync with a direct repository to retry failed items.\");\n exit(1);\n }\n\n console.log(\"\");\n console.log(`Done: ${succeeded.length} repository(ies) synced.`);\n}\n\nasync function runOnboardingImport(result: CommandParseResult): Promise<void> {\n const repository = typeof result.positional?.repository === \"string\" ? result.positional.repository : \"\";\n let kind: ReferenceImportKind;\n try {\n kind = parseReferenceKind(result.options.kind);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n exit(1);\n return;\n }\n const overwrite = getBooleanOption(result, \"overwrite\");\n const dryRun = getBooleanOption(result, \"dryRun\");\n const importToGlobal = getBooleanOption(result, \"global\");\n const workspaceRoot = getWorkspaceRoot(result);\n\n if (!repository) {\n console.error(\"Repository argument is required.\");\n exit(1);\n }\n\n let summary: ReferenceImportSummary;\n try {\n summary = importReferenceArtifacts(repository, workspaceRoot, {\n kind,\n overwrite,\n dryRun,\n importToGlobal,\n });\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n exit(1);\n return;\n }\n\n const targetLabel = importToGlobal ? \"global ~/.codex\" : `${workspaceRoot}/.codex`;\n\n if (dryRun) {\n console.log(`Dry run active. No files were written.`);\n }\n console.log(`Reference repository: ${summary.repositoryId}`);\n console.log(`Source: ${summary.localPath}`);\n console.log(`Target: ${targetLabel}`);\n console.log(`Kind: ${summary.requestedKind}`);\n console.log(`Imported agents: ${summary.importedAgents.length}`);\n console.log(`Imported skills: ${summary.importedSkills.length}`);\n console.log(`Skipped agents: ${summary.skippedAgents.length}`);\n console.log(`Skipped skills: ${summary.skippedSkills.length}`);\n\n if (summary.errors.length > 0) {\n console.log(\"\");\n console.log(\"Errors:\");\n for (const item of summary.errors) {\n console.log(`- ${item.kind}/${item.targetName}: ${item.error}`);\n }\n exit(1);\n }\n\n if (summary.importedAgents.length + summary.importedSkills.length === 0) {\n console.log(\"Nothing to import. Run onboarding sync first if the repository was not downloaded.\");\n return;\n }\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 dashboard/API (default port 4000).\",\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 onboarding: {\n description: \"Manage reference repositories and import agents/skills from them.\",\n aliases: [\"onboard\"],\n commands: {\n list: {\n description: \"List reference repositories and local sync status.\",\n handler: () => runOnboardingList(),\n },\n sync: {\n description: \"Clone/update reference repositories into ~/.fifony/repositories.\",\n options: {\n repository: {\n short: \"r\",\n type: \"string\",\n description: \"Sync only this repository by id or URL.\",\n },\n },\n handler: (result) => runOnboardingSync(result),\n },\n import: {\n description: \"Import agents/skills from a synced reference repository.\",\n aliases: [\"integrate\"],\n positional: [\n {\n name: \"repository\",\n type: \"string\",\n required: true,\n description: \"Repository id or URL\",\n },\n ],\n options: {\n kind: {\n short: \"k\",\n type: \"string\",\n default: \"all\",\n description: \"What to import: agents, skills, or all (default: all).\",\n },\n overwrite: {\n type: \"boolean\",\n description: \"Overwrite existing local files.\",\n },\n dryRun: {\n type: \"boolean\",\n description: \"Show what would be imported without writing files.\",\n },\n global: {\n type: \"boolean\",\n description: \"Import into ~/.codex instead of workspace .codex.\",\n },\n },\n handler: (result) => runOnboardingImport(result),\n },\n },\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\n// Handle help explicitly since cli-args-parser doesn't auto-detect it\nconst firstArg = args[0];\nif (firstArg === \"help\" || firstArg === \"--help\" || firstArg === \"-h\") {\n console.log(cli.help());\n} else {\n cli.run(args).catch((error) => {\n console.error(`Failed to start fifony CLI: ${String(error)}`);\n exit(1);\n });\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,aAAa;AACtB,SAAS,KAAK,KAAK,UAAU,MAAM,MAAM,WAAW;AACpD,SAAS,SAAS,eAAe;AACjC,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,oBAAoB;AAC7B,SAAS,iBAA0C;AA0BnD,SAAS,kBAAkB;AAf3B,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAY,QAAQ,UAAU;AACpC,IAAM,cAAc,QAAQ,WAAW,IAAI;AAC3C,IAAMA,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,cAAc,KAAK,MAAM,aAAa,QAAQ,aAAa,cAAc,GAAG,MAAM,CAAC;AAMzF,IAAM,cAAc,QAAQ,aAAa,QAAQ,SAAS,cAAc;AACxE,IAAM,UAAU,QAAQ,aAAa,QAAQ,OAAO,WAAW;AAC/D,IAAM,aAAa,QAAQ,aAAa,OAAO,SAAS,cAAc;AACtE,IAAM,SAAS,QAAQ,aAAa,OAAO,OAAO,WAAW;AAG7D,IAAM,cAAc,QAAQ,KAAK,SAAS,OAAO,KAAK,IAAI,aAAa;AACvE,IAAM,cAAc,CAAC,eAAe,WAAW,WAAW;AAE1D,IAAI,SAAwB;AAC5B,IAAI,CAAC,aAAa;AAChB,MAAI;AAAE,aAASA,SAAQ,QAAQ,SAAS;AAAA,EAAG,QAAQ;AACjD,YAAQ,MAAM,2EAA2E;AACzF,SAAK,CAAC;AAAA,EACR;AACF;AAEA,IAAM,gBAAgB,cAAc,cAAc;AAClD,IAAM,YAAY,cAAc,UAAU;AAE1C,IAAM,gBAAgB;AAAA,EACpB,WAAW;AAAA,IACT,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS,CAAC,IAAI;AAAA,IACd,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AACF;AAEA,SAAS,gBAAgB,QAA4B,KAAiC;AACpF,QAAM,QAAQ,OAAO,QAAQ,GAAG;AAChC,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,QAAQ;AAC7D;AAEA,SAAS,gBAAgB,QAA4B,KAAiC;AACpF,QAAM,QAAQ,OAAO,QAAQ,GAAG;AAChC,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ;AACvE;AAEA,SAAS,iBAAiB,QAA4B,KAAsB;AAC1E,SAAO,OAAO,QAAQ,GAAG,MAAM;AACjC;AAEA,SAAS,mBAAmB,OAAqC;AAC/D,QAAM,aAAa,OAAO,UAAU,WAAW,MAAM,KAAK,EAAE,YAAY,IAAI;AAC5E,MAAI,eAAe,MAAO,QAAO;AACjC,MAAI,eAAe,YAAY,eAAe,QAAS,QAAO;AAC9D,MAAI,eAAe,YAAY,eAAe,QAAS,QAAO;AAC9D,QAAM,IAAI,MAAM,iBAAiB,UAAU,oCAAoC;AACjF;AAEA,SAAS,iBAAiB,QAAoC;AAC5D,QAAM,YAAY,gBAAgB,QAAQ,WAAW;AACrD,SAAO,QAAQ,aAAa,IAAI,yBAAyB,IAAI,CAAC;AAChE;AAEA,eAAe,oBAAmC;AAChD,QAAM,OAAO,6BAA6B;AAC1C,QAAM,eAAe,0BAA0B;AAE/C,UAAQ,IAAI,yBAAyB;AACrC,UAAQ,IAAI,YAAY,IAAI,EAAE;AAC9B,UAAQ,IAAI,EAAE;AAEd,aAAW,cAAc,cAAc;AACrC,UAAM,SAAS,WAAW,SACtB,WAAW,SACT,WAAW,WAAW,MAAM,MAC5B,WACF,WAAW,UACT,kBAAa,WAAW,SAAS,YAAY,KAC7C;AAEN,YAAQ,IAAI,KAAK,WAAW,EAAE,EAAE;AAChC,YAAQ,IAAI,WAAW,WAAW,IAAI,EAAE;AACxC,YAAQ,IAAI,WAAW,WAAW,GAAG,EAAE;AACvC,YAAQ,IAAI,WAAW,WAAW,IAAI,EAAE;AACxC,YAAQ,IAAI,aAAa,MAAM,EAAE;AACjC,QAAI,WAAW,QAAQ;AACrB,cAAQ,IAAI,aAAa,WAAW,MAAM,EAAE;AAAA,IAC9C;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AACF;AAEA,eAAe,kBAAkB,QAA2C;AAC1E,QAAM,mBAAmB,gBAAgB,QAAQ,YAAY;AAC7D,MAAI;AACJ,MAAI;AACF,iBAAa,mBACT,0BAA0B,gBAAgB,IAC1C,0BAA0B;AAAA,EAChC,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,SAAK,CAAC;AACN;AAAA,EACF;AAEA,QAAM,YAAmC,CAAC;AAC1C,QAAM,SAAgC,CAAC;AAEvC,aAAW,QAAQ,YAAY;AAC7B,QAAI,KAAK,WAAW,UAAU;AAC5B,aAAO,KAAK,IAAI;AAAA,IAClB,OAAO;AACL,gBAAU,KAAK,IAAI;AAAA,IACrB;AAEA,QAAI,KAAK,WAAW,UAAU;AAC5B,cAAQ,IAAI,UAAK,KAAK,EAAE,KAAK,KAAK,OAAO,EAAE;AAAA,IAC7C,WAAW,KAAK,WAAW,UAAU;AACnC,cAAQ,IAAI,KAAK,KAAK,EAAE,KAAK,KAAK,OAAO,EAAE;AAAA,IAC7C,OAAO;AACL,cAAQ,IAAI,UAAK,KAAK,EAAE,KAAK,KAAK,OAAO,EAAE;AAAA,IAC7C;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,GAAG,UAAU,MAAM,4BAA4B,OAAO,MAAM,UAAU;AAClF,YAAQ,IAAI,qEAAqE;AACjF,SAAK,CAAC;AAAA,EACR;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,SAAS,UAAU,MAAM,0BAA0B;AACjE;AAEA,eAAe,oBAAoB,QAA2C;AAC5E,QAAM,aAAa,OAAO,OAAO,YAAY,eAAe,WAAW,OAAO,WAAW,aAAa;AACtG,MAAI;AACJ,MAAI;AACF,WAAO,mBAAmB,OAAO,QAAQ,IAAI;AAAA,EAC/C,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,SAAK,CAAC;AACN;AAAA,EACF;AACA,QAAM,YAAY,iBAAiB,QAAQ,WAAW;AACtD,QAAM,SAAS,iBAAiB,QAAQ,QAAQ;AAChD,QAAM,iBAAiB,iBAAiB,QAAQ,QAAQ;AACxD,QAAM,gBAAgB,iBAAiB,MAAM;AAE7C,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,kCAAkC;AAChD,SAAK,CAAC;AAAA,EACR;AAEA,MAAI;AACJ,MAAI;AACF,cAAU,yBAAyB,YAAY,eAAe;AAAA,MAC5D;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,SAAK,CAAC;AACN;AAAA,EACF;AAEA,QAAM,cAAc,iBAAiB,oBAAoB,GAAG,aAAa;AAEzE,MAAI,QAAQ;AACV,YAAQ,IAAI,wCAAwC;AAAA,EACtD;AACA,UAAQ,IAAI,yBAAyB,QAAQ,YAAY,EAAE;AAC3D,UAAQ,IAAI,WAAW,QAAQ,SAAS,EAAE;AAC1C,UAAQ,IAAI,WAAW,WAAW,EAAE;AACpC,UAAQ,IAAI,SAAS,QAAQ,aAAa,EAAE;AAC5C,UAAQ,IAAI,oBAAoB,QAAQ,eAAe,MAAM,EAAE;AAC/D,UAAQ,IAAI,oBAAoB,QAAQ,eAAe,MAAM,EAAE;AAC/D,UAAQ,IAAI,mBAAmB,QAAQ,cAAc,MAAM,EAAE;AAC7D,UAAQ,IAAI,mBAAmB,QAAQ,cAAc,MAAM,EAAE;AAE7D,MAAI,QAAQ,OAAO,SAAS,GAAG;AAC7B,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,SAAS;AACrB,eAAW,QAAQ,QAAQ,QAAQ;AACjC,cAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,UAAU,KAAK,KAAK,KAAK,EAAE;AAAA,IAChE;AACA,SAAK,CAAC;AAAA,EACR;AAEA,MAAI,QAAQ,eAAe,SAAS,QAAQ,eAAe,WAAW,GAAG;AACvE,YAAQ,IAAI,oFAAoF;AAChG;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,QAAsC;AAC9D,QAAM,cAAwB,CAAC;AAC/B,QAAM,YAAY,gBAAgB,QAAQ,WAAW;AACrD,QAAM,cAAc,gBAAgB,QAAQ,aAAa;AACzD,QAAM,OAAO,gBAAgB,QAAQ,MAAM;AAC3C,QAAM,cAAc,gBAAgB,QAAQ,aAAa;AACzD,QAAM,WAAW,gBAAgB,QAAQ,UAAU;AACnD,QAAM,OAAO,gBAAgB,QAAQ,MAAM;AAE3C,MAAI,WAAW;AACb,gBAAY,KAAK,eAAe,SAAS;AAAA,EAC3C;AACA,MAAI,aAAa;AACf,gBAAY,KAAK,iBAAiB,WAAW;AAAA,EAC/C;AACA,MAAI,OAAO,SAAS,UAAU;AAC5B,gBAAY,KAAK,UAAU,OAAO,IAAI,CAAC;AAAA,EACzC;AACA,MAAI,OAAO,gBAAgB,UAAU;AACnC,gBAAY,KAAK,iBAAiB,OAAO,WAAW,CAAC;AAAA,EACvD;AACA,MAAI,OAAO,aAAa,UAAU;AAChC,gBAAY,KAAK,cAAc,OAAO,QAAQ,CAAC;AAAA,EACjD;AACA,MAAI,OAAO,SAAS,UAAU;AAC5B,gBAAY,KAAK,UAAU,OAAO,IAAI,CAAC;AAAA,EACzC;AACA,MAAI,iBAAiB,QAAQ,MAAM,GAAG;AACpC,gBAAY,KAAK,QAAQ;AAAA,EAC3B;AACA,MAAI,aAAa;AACf,gBAAY,KAAK,OAAO;AAAA,EAC1B;AAEA,SAAO;AACT;AAEA,eAAe,WAAW,MAAqB,QAA2C;AACxF,QAAM,YAAY,gBAAgB,QAAQ,WAAW;AACrD,QAAM,gBAAgB,QAAQ,aAAa,IAAI,yBAAyB,IAAI,CAAC;AAC7E,QAAM,cAAc,iBAAiB,MAAM;AAE3C,QAAM,UAAU,MAAM,IAAI,QAAkE,CAAC,gBAAgB,kBAAkB;AAC7H,UAAMC,QAAO,cAAc,CAAC,eAAe,GAAG,WAAW,IAAI,CAAC,QAAS,eAAe,GAAG,WAAW;AACpG,UAAM,QAAQ,MAAM,UAAUA,OAAM;AAAA,MAClC,KAAK;AAAA,MACL,OAAO;AAAA,MACP,KAAK;AAAA,QACH,GAAG;AAAA,QACH,kBAAkB;AAAA,QAClB,uBAAuB;AAAA,MACzB;AAAA,IACF,CAAC;AAED,UAAM,GAAG,QAAQ,CAAC,MAAM,WAAW;AACjC,qBAAe,EAAE,MAAM,OAAO,CAAC;AAAA,IACjC,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,UAAU;AAC3B,oBAAc,KAAK;AAAA,IACrB,CAAC;AAAA,EACH,CAAC;AAED,MAAI,QAAQ,QAAQ;AAClB,SAAK,KAAK,QAAQ,MAAM;AACxB;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ,SAAS,YAAY,QAAQ,SAAS,GAAG;AAC1D,SAAK,QAAQ,IAAI;AAAA,EACnB;AACF;AAEA,eAAe,aAAa,QAA2C;AACrE,QAAM,YAAY,gBAAgB,QAAQ,WAAW;AACrD,QAAM,cAAc,gBAAgB,QAAQ,aAAa;AACzD,QAAM,gBAAgB,QAAQ,aAAa,IAAI,yBAAyB,IAAI,CAAC;AAC7E,QAAM,kBAAkB,QAAQ,eAAe,IAAI,sBAAsB,aAAa;AAEtF,QAAM,UAAU,MAAM,IAAI,QAAkE,CAAC,gBAAgB,kBAAkB;AAC7H,UAAM,UAAU,cAAc,CAAC,SAAS,IAAI,CAAC,QAAS,SAAS;AAC/D,UAAM,QAAQ,MAAM,UAAU,SAAS;AAAA,MACrC,KAAK;AAAA,MACL,OAAO;AAAA,MACP,KAAK;AAAA,QACH,GAAG;AAAA,QACH,uBAAuB;AAAA,QACvB,oBAAoB;AAAA,MACtB;AAAA,IACF,CAAC;AAED,UAAM,GAAG,QAAQ,CAAC,MAAM,WAAW;AACjC,qBAAe,EAAE,MAAM,OAAO,CAAC;AAAA,IACjC,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,UAAU;AAC3B,oBAAc,KAAK;AAAA,IACrB,CAAC;AAAA,EACH,CAAC;AAED,MAAI,QAAQ,QAAQ;AAClB,SAAK,KAAK,QAAQ,MAAM;AACxB;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ,SAAS,YAAY,QAAQ,SAAS,GAAG;AAC1D,SAAK,QAAQ,IAAI;AAAA,EACnB;AACF;AAEA,IAAM,MAAM,UAAU;AAAA,EACpB,MAAM,YAAY,QAAQ;AAAA,EAC1B,SAAS,YAAY,WAAW;AAAA,EAChC,aAAa,YAAY,eAAe;AAAA,EACxC,UAAU;AAAA,IACR,KAAK;AAAA,MACH,aAAa;AAAA,MACb,SAAS;AAAA,MACT,SAAS,CAAC,WAAW,WAAW,OAAO,MAAM;AAAA,IAC/C;AAAA,IACA,KAAK;AAAA,MACH,aAAa;AAAA,MACb,SAAS;AAAA,MACT,SAAS,CAAC,WAAW,aAAa,MAAM;AAAA,IAC1C;AAAA,IACA,YAAY;AAAA,MACV,aAAa;AAAA,MACb,SAAS,CAAC,SAAS;AAAA,MACnB,UAAU;AAAA,QACR,MAAM;AAAA,UACJ,aAAa;AAAA,UACb,SAAS,MAAM,kBAAkB;AAAA,QACnC;AAAA,QACA,MAAM;AAAA,UACJ,aAAa;AAAA,UACb,SAAS;AAAA,YACP,YAAY;AAAA,cACV,OAAO;AAAA,cACP,MAAM;AAAA,cACN,aAAa;AAAA,YACf;AAAA,UACF;AAAA,UACA,SAAS,CAAC,WAAW,kBAAkB,MAAM;AAAA,QAC/C;AAAA,QACA,QAAQ;AAAA,UACN,aAAa;AAAA,UACb,SAAS,CAAC,WAAW;AAAA,UACrB,YAAY;AAAA,YACV;AAAA,cACE,MAAM;AAAA,cACN,MAAM;AAAA,cACN,UAAU;AAAA,cACV,aAAa;AAAA,YACf;AAAA,UACF;AAAA,UACA,SAAS;AAAA,YACP,MAAM;AAAA,cACJ,OAAO;AAAA,cACP,MAAM;AAAA,cACN,SAAS;AAAA,cACT,aAAa;AAAA,YACf;AAAA,YACA,WAAW;AAAA,cACT,MAAM;AAAA,cACN,aAAa;AAAA,YACf;AAAA,YACA,QAAQ;AAAA,cACN,MAAM;AAAA,cACN,aAAa;AAAA,YACf;AAAA,YACA,QAAQ;AAAA,cACN,MAAM;AAAA,cACN,aAAa;AAAA,YACf;AAAA,UACF;AAAA,UACA,SAAS,CAAC,WAAW,oBAAoB,MAAM;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,SAAS,cAAc,SAA6B;AAClD,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,CAAC,KAAK;AAAA,EACf;AAEA,QAAM,QAAQ,QAAQ,CAAC;AACvB,MAAI,CAAC,UAAU,MAAM,QAAQ,aAAa,MAAM,SAAS,EAAE,SAAS,KAAK,GAAG;AAC1E,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,WAAW,GAAG,GAAG;AACzB,WAAO,CAAC,OAAO,GAAG,OAAO;AAAA,EAC3B;AAEA,SAAO;AACT;AAEA,IAAM,OAAO,cAAc,QAAQ,KAAK,MAAM,CAAC,CAAC;AAGhD,IAAM,WAAW,KAAK,CAAC;AACvB,IAAI,aAAa,UAAU,aAAa,YAAY,aAAa,MAAM;AACrE,UAAQ,IAAI,IAAI,KAAK,CAAC;AACxB,OAAO;AACL,MAAI,IAAI,IAAI,EAAE,MAAM,CAAC,UAAU;AAC7B,YAAQ,MAAM,+BAA+B,OAAO,KAAK,CAAC,EAAE;AAC5D,SAAK,CAAC;AAAA,EACR,CAAC;AACH;","names":["require","args"]}
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\";\nimport {\n getReferenceRepositoriesRoot,\n importReferenceArtifacts,\n listReferenceRepositories,\n syncReferenceRepositories,\n type ReferenceImportSummary,\n type ReferenceImportKind,\n type ReferenceSyncResult,\n} from \"./domains/project.ts\";\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\", \"agent\", \"run-local.js\");\nconst distMcp = resolve(packageRoot, \"dist\", \"mcp\", \"server.js\");\nconst srcRuntime = resolve(packageRoot, \"src\", \"boot.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 aliases: [\"-p\"],\n description: \"Start the local API/dashboard on the provided port.\",\n default: 4000,\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: string): string | undefined {\n const value = result.options[key];\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction getNumberOption(result: CommandParseResult, key: string): 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: string): boolean {\n return result.options[key] === true;\n}\n\nfunction parseReferenceKind(value: unknown): ReferenceImportKind {\n const normalized = typeof value === \"string\" ? value.trim().toLowerCase() : \"all\";\n if (normalized === \"all\") return \"all\";\n if (normalized === \"agents\" || normalized === \"agent\") return \"agents\";\n if (normalized === \"skills\" || normalized === \"skill\") return \"skills\";\n throw new Error(`Invalid kind: ${normalized}. Expected all, agents, or skills.`);\n}\n\nfunction getWorkspaceRoot(result: CommandParseResult): string {\n const workspace = getStringOption(result, \"workspace\");\n return resolve(workspace ?? env.FIFONY_WORKSPACE_ROOT ?? cwd());\n}\n\nasync function runOnboardingList(): Promise<void> {\n const root = getReferenceRepositoriesRoot();\n const repositories = listReferenceRepositories();\n\n console.log(\"Reference repositories:\");\n console.log(`Storage: ${root}`);\n console.log(\"\");\n\n for (const repository of repositories) {\n const status = repository.synced\n ? repository.branch\n ? `synced (${repository.branch})`\n : \"synced\"\n : repository.present\n ? `present — ${repository.error ?? \"not synced\"}`\n : \"not found\";\n\n console.log(`- ${repository.id}`);\n console.log(` name: ${repository.name}`);\n console.log(` url: ${repository.url}`);\n console.log(` path: ${repository.path}`);\n console.log(` status: ${status}`);\n if (repository.remote) {\n console.log(` remote: ${repository.remote}`);\n }\n console.log(\"\");\n }\n}\n\nasync function runOnboardingSync(result: CommandParseResult): Promise<void> {\n const repositoryFilter = getStringOption(result, \"repository\");\n let syncTarget: ReferenceSyncResult[];\n try {\n syncTarget = repositoryFilter\n ? syncReferenceRepositories(repositoryFilter)\n : syncReferenceRepositories();\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n exit(1);\n return;\n }\n\n const succeeded: ReferenceSyncResult[] = [];\n const failed: ReferenceSyncResult[] = [];\n\n for (const item of syncTarget) {\n if (item.action === \"failed\") {\n failed.push(item);\n } else {\n succeeded.push(item);\n }\n\n if (item.action === \"failed\") {\n console.log(`✗ ${item.id}: ${item.message}`);\n } else if (item.action === \"cloned\") {\n console.log(`+ ${item.id}: ${item.message}`);\n } else {\n console.log(`↻ ${item.id}: ${item.message}`);\n }\n }\n\n if (failed.length > 0) {\n console.log(\"\");\n console.log(`${succeeded.length} repository(ies) synced, ${failed.length} failed.`);\n console.log(\"Run onboarding sync with a direct repository to retry failed items.\");\n exit(1);\n }\n\n console.log(\"\");\n console.log(`Done: ${succeeded.length} repository(ies) synced.`);\n}\n\nasync function runOnboardingImport(result: CommandParseResult): Promise<void> {\n const repository = typeof result.positional?.repository === \"string\" ? result.positional.repository : \"\";\n let kind: ReferenceImportKind;\n try {\n kind = parseReferenceKind(result.options.kind);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n exit(1);\n return;\n }\n const overwrite = getBooleanOption(result, \"overwrite\");\n const dryRun = getBooleanOption(result, \"dryRun\");\n const importToGlobal = getBooleanOption(result, \"global\");\n const workspaceRoot = getWorkspaceRoot(result);\n\n if (!repository) {\n console.error(\"Repository argument is required.\");\n exit(1);\n }\n\n let summary: ReferenceImportSummary;\n try {\n summary = importReferenceArtifacts(repository, workspaceRoot, {\n kind,\n overwrite,\n dryRun,\n importToGlobal,\n });\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n exit(1);\n return;\n }\n\n const targetLabel = importToGlobal ? \"global ~/.codex\" : `${workspaceRoot}/.codex`;\n\n if (dryRun) {\n console.log(`Dry run active. No files were written.`);\n }\n console.log(`Reference repository: ${summary.repositoryId}`);\n console.log(`Source: ${summary.localPath}`);\n console.log(`Target: ${targetLabel}`);\n console.log(`Kind: ${summary.requestedKind}`);\n console.log(`Imported agents: ${summary.importedAgents.length}`);\n console.log(`Imported skills: ${summary.importedSkills.length}`);\n console.log(`Skipped agents: ${summary.skippedAgents.length}`);\n console.log(`Skipped skills: ${summary.skippedSkills.length}`);\n\n if (summary.errors.length > 0) {\n console.log(\"\");\n console.log(\"Errors:\");\n for (const item of summary.errors) {\n console.log(`- ${item.kind}/${item.targetName}: ${item.error}`);\n }\n exit(1);\n }\n\n if (summary.importedAgents.length + summary.importedSkills.length === 0) {\n console.log(\"Nothing to import. Run onboarding sync first if the repository was not downloaded.\");\n return;\n }\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 dashboard/API (default port 4000).\",\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 onboarding: {\n description: \"Manage reference repositories and import agents/skills from them.\",\n aliases: [\"onboard\"],\n commands: {\n list: {\n description: \"List reference repositories and local sync status.\",\n handler: () => runOnboardingList(),\n },\n sync: {\n description: \"Clone/update reference repositories into ~/.fifony/repositories.\",\n options: {\n repository: {\n short: \"r\",\n type: \"string\",\n description: \"Sync only this repository by id or URL.\",\n },\n },\n handler: (result) => runOnboardingSync(result),\n },\n import: {\n description: \"Import agents/skills from a synced reference repository.\",\n aliases: [\"integrate\"],\n positional: [\n {\n name: \"repository\",\n type: \"string\",\n required: true,\n description: \"Repository id or URL\",\n },\n ],\n options: {\n kind: {\n short: \"k\",\n type: \"string\",\n default: \"all\",\n description: \"What to import: agents, skills, or all (default: all).\",\n },\n overwrite: {\n type: \"boolean\",\n description: \"Overwrite existing local files.\",\n },\n dryRun: {\n type: \"boolean\",\n description: \"Show what would be imported without writing files.\",\n },\n global: {\n type: \"boolean\",\n description: \"Import into ~/.codex instead of workspace .codex.\",\n },\n },\n handler: (result) => runOnboardingImport(result),\n },\n },\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\n// Handle help explicitly since cli-args-parser doesn't auto-detect it\nconst firstArg = args[0];\nif (firstArg === \"help\" || firstArg === \"--help\" || firstArg === \"-h\") {\n console.log(cli.help());\n} else {\n cli.run(args).catch((error) => {\n console.error(`Failed to start fifony CLI: ${String(error)}`);\n exit(1);\n });\n}\n"],"mappings":"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","names":["require","args"]}
@@ -0,0 +1,13 @@
1
+ import {
2
+ runIssueOnce,
3
+ runPlanningJob
4
+ } from "./chunk-KT5V7N5H.js";
5
+ import "./chunk-NLIVWBNV.js";
6
+ import "./chunk-G6CQK2WH.js";
7
+ import "./chunk-DD5BE2W6.js";
8
+ import "./chunk-DVU3CXWA.js";
9
+ export {
10
+ runIssueOnce,
11
+ runPlanningJob
12
+ };
13
+ //# sourceMappingURL=issue-runner-6VFNHYJL.js.map
@@ -0,0 +1,39 @@
1
+ import {
2
+ ISSUE_STATE_MACHINE_ID,
3
+ canTransitionIssue,
4
+ eventToTargetState,
5
+ executeTransition,
6
+ findIssueStateMachineTransitionPath,
7
+ getIssueResourceStateApi,
8
+ getIssueStateMachineDefinition,
9
+ getIssueStateMachineInitialState,
10
+ getIssueStateMachinePlugin,
11
+ getIssueTransitionHistory,
12
+ getStateMachineTransitions,
13
+ issueStateMachineConfig,
14
+ setFsmEventEmitter,
15
+ setIssueResourceStateApi,
16
+ setIssueStateMachinePlugin,
17
+ visualizeStateMachine
18
+ } from "./chunk-G6CQK2WH.js";
19
+ import "./chunk-DD5BE2W6.js";
20
+ import "./chunk-DVU3CXWA.js";
21
+ export {
22
+ ISSUE_STATE_MACHINE_ID,
23
+ canTransitionIssue,
24
+ eventToTargetState,
25
+ executeTransition,
26
+ findIssueStateMachineTransitionPath,
27
+ getIssueResourceStateApi,
28
+ getIssueStateMachineDefinition,
29
+ getIssueStateMachineInitialState,
30
+ getIssueStateMachinePlugin,
31
+ getIssueTransitionHistory,
32
+ getStateMachineTransitions,
33
+ issueStateMachineConfig,
34
+ setFsmEventEmitter,
35
+ setIssueResourceStateApi,
36
+ setIssueStateMachinePlugin,
37
+ visualizeStateMachine
38
+ };
39
+ //# sourceMappingURL=issue-state-machine-NSDN4MV4.js.map
@@ -3,7 +3,7 @@ import {
3
3
  parseIssueState,
4
4
  renderPrompt,
5
5
  resolveTaskCapabilities
6
- } from "../chunk-O665NS5E.js";
6
+ } from "../chunk-DD5BE2W6.js";
7
7
 
8
8
  // src/mcp/server.ts
9
9
  import { env as env3, stdin } from "process";
@@ -17,9 +17,7 @@ import { fileURLToPath } from "url";
17
17
  var WORKSPACE_ROOT = env.FIFONY_WORKSPACE_ROOT ?? process.cwd();
18
18
  var PERSISTENCE_ROOT = env.FIFONY_PERSISTENCE ?? WORKSPACE_ROOT;
19
19
  var STATE_ROOT = resolvePersistenceRoot(PERSISTENCE_ROOT);
20
- var DATABASE_PATH = join(STATE_ROOT, "s3db");
21
- var STORAGE_BUCKET = env.FIFONY_STORAGE_BUCKET ?? "fifony";
22
- var STORAGE_KEY_PREFIX = env.FIFONY_STORAGE_KEY_PREFIX ?? "state";
20
+ var DATABASE_PATH = join(STATE_ROOT, "fifony.sqlite");
23
21
  var DEBUG_BOOT = env.FIFONY_DEBUG_BOOT === "1";
24
22
  function resolvePersistenceRoot(value) {
25
23
  const resolved = value.startsWith("file://") ? fileURLToPath(value) : value.startsWith("~/") ? resolve(homedir(), value.slice(2)) : resolve(value);
@@ -56,10 +54,10 @@ function safeRead(path) {
56
54
  }
57
55
  async function loadS3dbModule() {
58
56
  try {
59
- const imported = await import("s3db.js/lite");
57
+ const imported = await import("s3db.js");
60
58
  return {
61
59
  default: imported.default,
62
- FileSystemClient: imported.FileSystemClient
60
+ SqliteClient: imported.SqliteClient
63
61
  };
64
62
  } catch (error) {
65
63
  throw new Error(`Unable to load s3db.js: ${String(error)}`);
@@ -70,12 +68,7 @@ async function initDatabase() {
70
68
  debugBoot("mcp:getDatabase:start");
71
69
  const s3db = await loadS3dbModule();
72
70
  debugBoot("mcp:getDatabase:module-loaded");
73
- const client = new s3db.FileSystemClient({
74
- basePath: DATABASE_PATH,
75
- bucket: STORAGE_BUCKET,
76
- keyPrefix: STORAGE_KEY_PREFIX,
77
- verbose: false
78
- });
71
+ const client = new s3db.SqliteClient({ basePath: DATABASE_PATH });
79
72
  database = new s3db.default({ client, verbose: false });
80
73
  await database.connect();
81
74
  debugBoot("mcp:getDatabase:connected");
@@ -242,7 +235,7 @@ async function appendEvent(level, message, payload = {}, issueId) {
242
235
  // src/mcp/jsonrpc-transport.ts
243
236
  import { stdout } from "process";
244
237
 
245
- // src/integrations/catalog.ts
238
+ // src/agents/integrations/catalog.ts
246
239
  import { existsSync as existsSync2, readdirSync, readFileSync as readFileSync2 } from "fs";
247
240
  import { homedir as homedir2 } from "os";
248
241
  import { join as join2, resolve as resolve2 } from "path";