@swmansion/argent 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +195 -0
- package/README.md +103 -0
- package/agents/argent-environment-inspector.md +106 -0
- package/agents/references/quality-control-checklist.md +45 -0
- package/bin/ax-service +0 -0
- package/bin/simulator-server +0 -0
- package/dist/Argent.tracetemplate +0 -0
- package/dist/auto-screenshot.d.ts +22 -0
- package/dist/auto-screenshot.js +79 -0
- package/dist/auto-screenshot.js.map +1 -0
- package/dist/cli/constants.d.ts +6 -0
- package/dist/cli/constants.js +12 -0
- package/dist/cli/constants.js.map +1 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.js +466 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/mcp-configs.d.ts +38 -0
- package/dist/cli/mcp-configs.js +724 -0
- package/dist/cli/mcp-configs.js.map +1 -0
- package/dist/cli/uninstall.d.ts +13 -0
- package/dist/cli/uninstall.js +389 -0
- package/dist/cli/uninstall.js.map +1 -0
- package/dist/cli/update.d.ts +1 -0
- package/dist/cli/update.js +126 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/cli/utils.d.ts +27 -0
- package/dist/cli/utils.js +158 -0
- package/dist/cli/utils.js.map +1 -0
- package/dist/cli.d.ts +13 -0
- package/dist/cli.js +80 -0
- package/dist/cli.js.map +1 -0
- package/dist/content.d.ts +31 -0
- package/dist/content.js +59 -0
- package/dist/content.js.map +1 -0
- package/dist/launcher.d.ts +8 -0
- package/dist/launcher.js +183 -0
- package/dist/launcher.js.map +1 -0
- package/dist/mcp-server.d.ts +1 -0
- package/dist/mcp-server.js +228 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/tool-server.cjs +51288 -0
- package/dylibs/libArgentInjectionBootstrap.dylib +0 -0
- package/dylibs/libKeyboardPatch.dylib +0 -0
- package/dylibs/libNativeDevtoolsIos.dylib +0 -0
- package/package.json +53 -0
- package/rules/argent.md +121 -0
- package/scripts/postinstall.cjs +34 -0
- package/skills/argent-create-flow/SKILL.md +213 -0
- package/skills/argent-ios-profiler/SKILL.md +103 -0
- package/skills/argent-metro-debugger/SKILL.md +117 -0
- package/skills/argent-metro-debugger/references/failure-scenarios.md +10 -0
- package/skills/argent-metro-debugger/references/source-maps.md +27 -0
- package/skills/argent-react-native-app-workflow/SKILL.md +237 -0
- package/skills/argent-react-native-optimization/SKILL.md +64 -0
- package/skills/argent-react-native-optimization/references/fix-reference.md +14 -0
- package/skills/argent-react-native-optimization/references/lint-rules.md +55 -0
- package/skills/argent-react-native-optimization/references/semantic-checklist.md +34 -0
- package/skills/argent-react-native-profiler/SKILL.md +160 -0
- package/skills/argent-react-native-profiler/references/diagnostic-tools.md +94 -0
- package/skills/argent-simulator-interact/SKILL.md +272 -0
- package/skills/argent-simulator-interact/references/gesture-examples.md +114 -0
- package/skills/argent-simulator-setup/SKILL.md +19 -0
- package/skills/argent-test-ui-flow/SKILL.md +84 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { execSync } from "node:child_process";
|
|
4
|
+
import { PACKAGE_NAME, NPM_REGISTRY } from "./constants.js";
|
|
5
|
+
import { parse as parseToml, stringify as stringifyToml } from "smol-toml";
|
|
6
|
+
// ── Package root resolution ───────────────────────────────────────────────────
|
|
7
|
+
// tsc compiles src/cli/utils.ts -> dist/cli/utils.js.
|
|
8
|
+
// The package root (containing skills/, rules/, agents/) is two levels up.
|
|
9
|
+
// This is deterministic — tsc preserves directory structure, and npm packages
|
|
10
|
+
// keep their internal layout regardless of hoisting or monorepo setup.
|
|
11
|
+
/**
|
|
12
|
+
* Given the __dirname of a file inside dist/cli/, return the package root.
|
|
13
|
+
* Exported so it can be tested against simulated directory structures.
|
|
14
|
+
*/
|
|
15
|
+
export function resolvePackageRoot(dirname) {
|
|
16
|
+
return path.resolve(dirname, "..", "..");
|
|
17
|
+
}
|
|
18
|
+
export const PACKAGE_ROOT = resolvePackageRoot(import.meta.dirname);
|
|
19
|
+
function resolveBundledDir(dirName) {
|
|
20
|
+
const packagedDir = path.join(PACKAGE_ROOT, dirName);
|
|
21
|
+
if (fs.existsSync(packagedDir))
|
|
22
|
+
return packagedDir;
|
|
23
|
+
// In the monorepo source tree, these assets live under packages/skills/.
|
|
24
|
+
return path.resolve(PACKAGE_ROOT, "..", "skills", dirName);
|
|
25
|
+
}
|
|
26
|
+
export const SKILLS_DIR = resolveBundledDir("skills");
|
|
27
|
+
export const RULES_DIR = resolveBundledDir("rules");
|
|
28
|
+
export const AGENTS_DIR = resolveBundledDir("agents");
|
|
29
|
+
const PROJECT_ROOT_MARKERS = [
|
|
30
|
+
".mcp.json",
|
|
31
|
+
".claude",
|
|
32
|
+
".cursor",
|
|
33
|
+
".vscode",
|
|
34
|
+
".gemini",
|
|
35
|
+
".codex",
|
|
36
|
+
".agents",
|
|
37
|
+
".zed",
|
|
38
|
+
"skills-lock.json",
|
|
39
|
+
];
|
|
40
|
+
export function resolveProjectRoot(startDir) {
|
|
41
|
+
const initialDir = path.resolve(startDir);
|
|
42
|
+
let currentDir = initialDir;
|
|
43
|
+
while (true) {
|
|
44
|
+
if (PROJECT_ROOT_MARKERS.some((marker) => fs.existsSync(path.join(currentDir, marker)))) {
|
|
45
|
+
return currentDir;
|
|
46
|
+
}
|
|
47
|
+
if (fs.existsSync(path.join(currentDir, ".git"))) {
|
|
48
|
+
return currentDir;
|
|
49
|
+
}
|
|
50
|
+
const parentDir = path.dirname(currentDir);
|
|
51
|
+
if (parentDir === currentDir) {
|
|
52
|
+
return initialDir;
|
|
53
|
+
}
|
|
54
|
+
currentDir = parentDir;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// ── TOML helpers ─────────────────────────────────────────────────────────────
|
|
58
|
+
export function readToml(filePath) {
|
|
59
|
+
if (!fs.existsSync(filePath))
|
|
60
|
+
return {};
|
|
61
|
+
try {
|
|
62
|
+
return parseToml(fs.readFileSync(filePath, "utf8"));
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return {};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function writeToml(filePath, data) {
|
|
69
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
70
|
+
fs.writeFileSync(filePath, stringifyToml(data) + "\n");
|
|
71
|
+
}
|
|
72
|
+
// ── JSON helpers ──────────────────────────────────────────────────────────────
|
|
73
|
+
export function readJson(filePath) {
|
|
74
|
+
if (!fs.existsSync(filePath))
|
|
75
|
+
return {};
|
|
76
|
+
try {
|
|
77
|
+
return JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return {};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export function writeJson(filePath, data) {
|
|
84
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
85
|
+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + "\n");
|
|
86
|
+
}
|
|
87
|
+
// ── Directory helpers ─────────────────────────────────────────────────────────
|
|
88
|
+
export function copyDir(src, dest) {
|
|
89
|
+
if (!fs.existsSync(src))
|
|
90
|
+
return false;
|
|
91
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
92
|
+
fs.cpSync(src, dest, { recursive: true });
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
export function dirExists(p) {
|
|
96
|
+
try {
|
|
97
|
+
return fs.statSync(p).isDirectory();
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// ── Version helpers ───────────────────────────────────────────────────────────
|
|
104
|
+
export function getInstalledVersion() {
|
|
105
|
+
try {
|
|
106
|
+
const pkgPath = path.join(PACKAGE_ROOT, "package.json");
|
|
107
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
|
|
108
|
+
return pkg.version ?? null;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
export function getLatestVersion() {
|
|
115
|
+
const result = execSync(`npm view ${PACKAGE_NAME} version --registry ${NPM_REGISTRY}`, {
|
|
116
|
+
encoding: "utf8",
|
|
117
|
+
});
|
|
118
|
+
return result.trim();
|
|
119
|
+
}
|
|
120
|
+
export function formatShellCommand(cmd) {
|
|
121
|
+
const parts = [cmd.bin, ...cmd.args.map((a) => (a.includes(" ") ? `"${a}"` : a))];
|
|
122
|
+
return parts.join(" ");
|
|
123
|
+
}
|
|
124
|
+
export function detectPackageManager() {
|
|
125
|
+
const agent = process.env.npm_config_user_agent ?? "";
|
|
126
|
+
if (agent.startsWith("yarn"))
|
|
127
|
+
return "yarn";
|
|
128
|
+
if (agent.startsWith("pnpm"))
|
|
129
|
+
return "pnpm";
|
|
130
|
+
if (agent.startsWith("bun"))
|
|
131
|
+
return "bun";
|
|
132
|
+
return "npm";
|
|
133
|
+
}
|
|
134
|
+
export function globalInstallCommand(pm, pkg) {
|
|
135
|
+
switch (pm) {
|
|
136
|
+
case "yarn":
|
|
137
|
+
return { bin: "yarn", args: ["global", "add", pkg] };
|
|
138
|
+
case "pnpm":
|
|
139
|
+
return { bin: "pnpm", args: ["add", "-g", pkg] };
|
|
140
|
+
case "bun":
|
|
141
|
+
return { bin: "bun", args: ["add", "-g", pkg] };
|
|
142
|
+
default:
|
|
143
|
+
return { bin: "npm", args: ["install", "-g", pkg] };
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
export function globalUninstallCommand(pm, pkg) {
|
|
147
|
+
switch (pm) {
|
|
148
|
+
case "yarn":
|
|
149
|
+
return { bin: "yarn", args: ["global", "remove", pkg] };
|
|
150
|
+
case "pnpm":
|
|
151
|
+
return { bin: "pnpm", args: ["remove", "-g", pkg] };
|
|
152
|
+
case "bun":
|
|
153
|
+
return { bin: "bun", args: ["remove", "-g", pkg] };
|
|
154
|
+
default:
|
|
155
|
+
return { bin: "npm", args: ["uninstall", "-g", pkg] };
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/cli/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* argent CLI — globally-installed entry point.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* argent mcp Start the MCP stdio server (used by editors)
|
|
7
|
+
* argent init Set up argent in a workspace (MCP + skills + rules)
|
|
8
|
+
* argent install Alias for init
|
|
9
|
+
* argent update Check for updates, refresh configuration
|
|
10
|
+
* argent uninstall Remove argent from a workspace
|
|
11
|
+
* argent remove Alias for uninstall
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* argent CLI — globally-installed entry point.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* argent mcp Start the MCP stdio server (used by editors)
|
|
7
|
+
* argent init Set up argent in a workspace (MCP + skills + rules)
|
|
8
|
+
* argent install Alias for init
|
|
9
|
+
* argent update Check for updates, refresh configuration
|
|
10
|
+
* argent uninstall Remove argent from a workspace
|
|
11
|
+
* argent remove Alias for uninstall
|
|
12
|
+
*/
|
|
13
|
+
import { PACKAGE_NAME } from "./cli/constants.js";
|
|
14
|
+
import { getInstalledVersion } from "./cli/utils.js";
|
|
15
|
+
const [, , command, ...rest] = process.argv;
|
|
16
|
+
const isMcpServer = command === "mcp";
|
|
17
|
+
process.on("uncaughtException", (err) => {
|
|
18
|
+
process.stderr.write(`[argent] Uncaught exception: ${err.stack ?? err}\n`);
|
|
19
|
+
if (!isMcpServer)
|
|
20
|
+
process.exit(1);
|
|
21
|
+
});
|
|
22
|
+
process.on("unhandledRejection", (reason) => {
|
|
23
|
+
process.stderr.write(`[argent] Unhandled rejection: ${reason instanceof Error ? (reason.stack ?? reason.message) : reason}\n`);
|
|
24
|
+
if (!isMcpServer)
|
|
25
|
+
process.exit(1);
|
|
26
|
+
});
|
|
27
|
+
function printHelp() {
|
|
28
|
+
const version = getInstalledVersion() ?? "unknown";
|
|
29
|
+
console.log(`
|
|
30
|
+
argent v${version}
|
|
31
|
+
|
|
32
|
+
Usage: argent <command> [options]
|
|
33
|
+
|
|
34
|
+
Commands:
|
|
35
|
+
mcp Start the MCP stdio server (used by editors)
|
|
36
|
+
init Initialize argent in the current workspace (MCP server + skills)
|
|
37
|
+
install Alias for init
|
|
38
|
+
update Check for updates and refresh configuration
|
|
39
|
+
uninstall Remove argent configuration from the workspace
|
|
40
|
+
remove Alias for uninstall
|
|
41
|
+
|
|
42
|
+
Options:
|
|
43
|
+
--help, -h Show this help message
|
|
44
|
+
--version, -v Show version
|
|
45
|
+
|
|
46
|
+
Run \`argent <command> --help\` for command-specific help.
|
|
47
|
+
|
|
48
|
+
Package: ${PACKAGE_NAME}
|
|
49
|
+
`);
|
|
50
|
+
}
|
|
51
|
+
async function main() {
|
|
52
|
+
switch (command) {
|
|
53
|
+
case "mcp":
|
|
54
|
+
return (await import("./mcp-server.js")).startMcpServer();
|
|
55
|
+
case "init":
|
|
56
|
+
case "install":
|
|
57
|
+
return (await import("./cli/init.js")).init(rest);
|
|
58
|
+
case "update":
|
|
59
|
+
return (await import("./cli/update.js")).update(rest);
|
|
60
|
+
case "uninstall":
|
|
61
|
+
case "remove":
|
|
62
|
+
return (await import("./cli/uninstall.js")).uninstall(rest);
|
|
63
|
+
case "--version":
|
|
64
|
+
case "-v":
|
|
65
|
+
console.log(getInstalledVersion() ?? "unknown");
|
|
66
|
+
return;
|
|
67
|
+
case "--help":
|
|
68
|
+
case "-h":
|
|
69
|
+
default:
|
|
70
|
+
printHelp();
|
|
71
|
+
if (command && command !== "--help" && command !== "-h") {
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
main().catch((err) => {
|
|
77
|
+
console.error(err);
|
|
78
|
+
process.exit(1);
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,CAAC,EAAE,AAAD,EAAG,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;AAC5C,MAAM,WAAW,GAAG,OAAO,KAAK,KAAK,CAAC;AAEtC,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;IACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,GAAG,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;IAC3E,IAAI,CAAC,WAAW;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC;AACH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;IAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,iCAAiC,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CACzG,CAAC;IACF,IAAI,CAAC,WAAW;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC;AAEH,SAAS,SAAS;IAChB,MAAM,OAAO,GAAG,mBAAmB,EAAE,IAAI,SAAS,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC;UACJ,OAAO;;;;;;;;;;;;;;;;;;WAkBN,YAAY;CACtB,CAAC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,KAAK;YACR,OAAO,CAAC,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;QAC5D,KAAK,MAAM,CAAC;QACZ,KAAK,SAAS;YACZ,OAAO,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,KAAK,QAAQ;YACX,OAAO,CAAC,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxD,KAAK,WAAW,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,CAAC,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9D,KAAK,WAAW,CAAC;QACjB,KAAK,IAAI;YACP,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,SAAS,CAAC,CAAC;YAChD,OAAO;QACT,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV;YACE,SAAS,EAAE,CAAC;YACZ,IAAI,OAAO,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;IACL,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert raw tool results into MCP content blocks (text / image).
|
|
3
|
+
*
|
|
4
|
+
* Extracted so it can be tested independently of the MCP server wiring.
|
|
5
|
+
*/
|
|
6
|
+
export type ContentBlock = {
|
|
7
|
+
type: "text";
|
|
8
|
+
text: string;
|
|
9
|
+
} | {
|
|
10
|
+
type: "image";
|
|
11
|
+
data: string;
|
|
12
|
+
mimeType: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function toMcpContent(result: unknown, outputHint?: string): Promise<ContentBlock[]>;
|
|
15
|
+
export type FlowExecuteResult = {
|
|
16
|
+
flow: string;
|
|
17
|
+
executionPrerequisite?: string;
|
|
18
|
+
steps: {
|
|
19
|
+
kind: string;
|
|
20
|
+
tool?: string;
|
|
21
|
+
message?: string;
|
|
22
|
+
result?: unknown;
|
|
23
|
+
outputHint?: string;
|
|
24
|
+
error?: string;
|
|
25
|
+
}[];
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Unpack flow-execute's structured step results into MCP content blocks.
|
|
29
|
+
* Each step carries its own outputHint so toMcpContent handles images correctly.
|
|
30
|
+
*/
|
|
31
|
+
export declare function flowRunToMcpContent(result: FlowExecuteResult): Promise<ContentBlock[]>;
|
package/dist/content.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert raw tool results into MCP content blocks (text / image).
|
|
3
|
+
*
|
|
4
|
+
* Extracted so it can be tested independently of the MCP server wiring.
|
|
5
|
+
*/
|
|
6
|
+
export async function toMcpContent(result, outputHint) {
|
|
7
|
+
if (outputHint === "image" && result && typeof result === "object" && "url" in result) {
|
|
8
|
+
const imgRes = await fetch(result.url);
|
|
9
|
+
const buf = Buffer.from(await imgRes.arrayBuffer());
|
|
10
|
+
const filePath = result.path ?? "";
|
|
11
|
+
return [
|
|
12
|
+
{
|
|
13
|
+
type: "image",
|
|
14
|
+
data: buf.toString("base64"),
|
|
15
|
+
mimeType: "image/png",
|
|
16
|
+
},
|
|
17
|
+
{ type: "text", text: `Saved: ${filePath}` },
|
|
18
|
+
];
|
|
19
|
+
}
|
|
20
|
+
return [{ type: "text", text: JSON.stringify(result, null, 2) }];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Unpack flow-execute's structured step results into MCP content blocks.
|
|
24
|
+
* Each step carries its own outputHint so toMcpContent handles images correctly.
|
|
25
|
+
*/
|
|
26
|
+
export async function flowRunToMcpContent(result) {
|
|
27
|
+
const blocks = [];
|
|
28
|
+
if (result.executionPrerequisite) {
|
|
29
|
+
blocks.push({
|
|
30
|
+
type: "text",
|
|
31
|
+
text: `Prerequisite: ${result.executionPrerequisite}`,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
blocks.push({
|
|
35
|
+
type: "text",
|
|
36
|
+
text: `Running flow "${result.flow}" (${result.steps.length} steps)`,
|
|
37
|
+
});
|
|
38
|
+
for (let i = 0; i < result.steps.length; i++) {
|
|
39
|
+
const step = result.steps[i];
|
|
40
|
+
const num = i + 1;
|
|
41
|
+
if (step.kind === "echo") {
|
|
42
|
+
blocks.push({ type: "text", text: `[${num}] ${step.message}` });
|
|
43
|
+
}
|
|
44
|
+
else if ("error" in step && step.error) {
|
|
45
|
+
blocks.push({
|
|
46
|
+
type: "text",
|
|
47
|
+
text: `[${num}] ${step.tool} ERROR: ${step.error}`,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
blocks.push({ type: "text", text: `[${num}] ${step.tool}` });
|
|
52
|
+
const stepContent = await toMcpContent(step.result, step.outputHint);
|
|
53
|
+
blocks.push(...stepContent);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
blocks.push({ type: "text", text: `Flow "${result.flow}" complete.` });
|
|
57
|
+
return blocks;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../src/content.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAe,EAAE,UAAmB;IACrE,IAAI,UAAU,KAAK,OAAO,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;QACtF,MAAM,MAAM,GAAG,MAAM,KAAK,CAAE,MAA0B,CAAC,GAAG,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAI,MAA4B,CAAC,IAAI,IAAI,EAAE,CAAC;QAC1D,OAAO;YACL;gBACE,IAAI,EAAE,OAAgB;gBACtB,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAC5B,QAAQ,EAAE,WAAoB;aAC/B;YACD,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,QAAQ,EAAE,EAAE;SACtD,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AAC5E,CAAC;AAeD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAyB;IACjE,MAAM,MAAM,GAAmB,EAAE,CAAC;IAElC,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,iBAAiB,MAAM,CAAC,qBAAqB,EAAE;SACtD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,iBAAiB,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,SAAS;KACrE,CAAC,CAAC;IAEH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QAElB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,KAAK,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAClE,CAAC;aAAM,IAAI,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,GAAG,KAAK,IAAI,CAAC,IAAI,WAAW,IAAI,CAAC,KAAK,EAAE;aACnD,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC7D,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACrE,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IACvE,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const BUNDLED_RUNTIME_PATHS: {
|
|
2
|
+
bundlePath: string;
|
|
3
|
+
simulatorServerDir: string;
|
|
4
|
+
nativeDevtoolsDir: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function buildToolsServerEnv(port: number, baseEnv?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
7
|
+
export declare function killToolServer(): Promise<void>;
|
|
8
|
+
export declare function ensureToolsServer(): Promise<string>;
|
package/dist/launcher.js
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import * as net from "node:net";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import * as readline from "node:readline";
|
|
5
|
+
import { homedir } from "node:os";
|
|
6
|
+
import { spawn } from "node:child_process";
|
|
7
|
+
import { mkdir, writeFile, readFile, unlink } from "node:fs/promises";
|
|
8
|
+
const STATE_DIR = path.join(homedir(), ".argent");
|
|
9
|
+
const STATE_FILE = path.join(STATE_DIR, "tool-server.json");
|
|
10
|
+
const LOG_FILE = path.join(STATE_DIR, "tool-server.log");
|
|
11
|
+
// __dirname in ESM (compiled from TS) will be dist/
|
|
12
|
+
export const BUNDLED_RUNTIME_PATHS = {
|
|
13
|
+
bundlePath: path.join(import.meta.dirname, "tool-server.cjs"),
|
|
14
|
+
simulatorServerDir: path.join(import.meta.dirname, "..", "bin"),
|
|
15
|
+
nativeDevtoolsDir: path.join(import.meta.dirname, "..", "dylibs"),
|
|
16
|
+
};
|
|
17
|
+
const BUNDLE_PATH = BUNDLED_RUNTIME_PATHS.bundlePath;
|
|
18
|
+
export function buildToolsServerEnv(port, baseEnv = process.env) {
|
|
19
|
+
return {
|
|
20
|
+
...baseEnv,
|
|
21
|
+
PORT: String(port),
|
|
22
|
+
ARGENT_SIMULATOR_SERVER_DIR: BUNDLED_RUNTIME_PATHS.simulatorServerDir,
|
|
23
|
+
ARGENT_NATIVE_DEVTOOLS_DIR: BUNDLED_RUNTIME_PATHS.nativeDevtoolsDir,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function findFreePort() {
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
const srv = net.createServer();
|
|
29
|
+
srv.listen(0, "127.0.0.1", () => {
|
|
30
|
+
const addr = srv.address();
|
|
31
|
+
if (!addr || typeof addr !== "object") {
|
|
32
|
+
srv.close(() => reject(new Error("Could not bind to find free port")));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const port = addr.port;
|
|
36
|
+
srv.close((err) => {
|
|
37
|
+
if (err)
|
|
38
|
+
reject(err);
|
|
39
|
+
else
|
|
40
|
+
resolve(port);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
srv.on("error", reject);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function isProcessAlive(pid) {
|
|
47
|
+
try {
|
|
48
|
+
process.kill(pid, 0);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async function isHealthy(port) {
|
|
56
|
+
const controller = new AbortController();
|
|
57
|
+
const timer = setTimeout(() => controller.abort(), 2000);
|
|
58
|
+
try {
|
|
59
|
+
const res = await fetch(`http://127.0.0.1:${port}/tools`, {
|
|
60
|
+
signal: controller.signal,
|
|
61
|
+
});
|
|
62
|
+
return res.ok;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
clearTimeout(timer);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function spawnToolsServer(port) {
|
|
72
|
+
return new Promise((resolve, reject) => {
|
|
73
|
+
let logFd;
|
|
74
|
+
try {
|
|
75
|
+
fs.mkdirSync(STATE_DIR, { recursive: true });
|
|
76
|
+
logFd = fs.openSync(LOG_FILE, "a");
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
logFd = fs.openSync("/dev/null", "w");
|
|
80
|
+
}
|
|
81
|
+
const child = spawn("node", [BUNDLE_PATH, "start"], {
|
|
82
|
+
detached: true,
|
|
83
|
+
stdio: ["ignore", "pipe", logFd],
|
|
84
|
+
env: buildToolsServerEnv(port),
|
|
85
|
+
});
|
|
86
|
+
child.unref();
|
|
87
|
+
const pid = child.pid;
|
|
88
|
+
if (!pid) {
|
|
89
|
+
reject(new Error("Failed to get PID of spawned tools server"));
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
let settled = false;
|
|
93
|
+
const settle = (fn) => {
|
|
94
|
+
if (settled)
|
|
95
|
+
return;
|
|
96
|
+
settled = true;
|
|
97
|
+
fn();
|
|
98
|
+
};
|
|
99
|
+
const rl = readline.createInterface({ input: child.stdout });
|
|
100
|
+
rl.on("line", (line) => {
|
|
101
|
+
// Match: "Tools server listening on http://127.0.0.1:<port>"
|
|
102
|
+
const match = line.match(/Tools server listening on http:\/\/127\.0\.0\.1:(\d+)/);
|
|
103
|
+
if (match) {
|
|
104
|
+
const actualPort = parseInt(match[1], 10);
|
|
105
|
+
rl.close();
|
|
106
|
+
// Resume stdout so the pipe stays open and the child's console.log calls
|
|
107
|
+
// don't fail with EPIPE once the readline interface stops consuming it.
|
|
108
|
+
child.stdout?.resume();
|
|
109
|
+
settle(() => resolve({ port: actualPort, pid }));
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
child.on("error", (err) => {
|
|
113
|
+
rl.close();
|
|
114
|
+
settle(() => reject(err));
|
|
115
|
+
});
|
|
116
|
+
child.on("exit", (code) => {
|
|
117
|
+
rl.close();
|
|
118
|
+
settle(() => reject(new Error(`tool-server exited with code ${code} before becoming ready`)));
|
|
119
|
+
});
|
|
120
|
+
const timer = setTimeout(() => {
|
|
121
|
+
rl.close();
|
|
122
|
+
settle(() => reject(new Error("Timed out waiting for tools server to become ready")));
|
|
123
|
+
}, 15_000);
|
|
124
|
+
rl.on("close", () => clearTimeout(timer));
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
async function readState() {
|
|
128
|
+
try {
|
|
129
|
+
const raw = await readFile(STATE_FILE, "utf8");
|
|
130
|
+
return JSON.parse(raw);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async function writeState(state) {
|
|
137
|
+
await mkdir(STATE_DIR, { recursive: true });
|
|
138
|
+
await writeFile(STATE_FILE, JSON.stringify(state, null, 2) + "\n", "utf8");
|
|
139
|
+
}
|
|
140
|
+
async function clearState() {
|
|
141
|
+
try {
|
|
142
|
+
await unlink(STATE_FILE);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// already gone
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
export async function killToolServer() {
|
|
149
|
+
const state = await readState();
|
|
150
|
+
if (!state)
|
|
151
|
+
return;
|
|
152
|
+
try {
|
|
153
|
+
process.kill(state.pid, "SIGTERM");
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// already gone
|
|
157
|
+
}
|
|
158
|
+
await clearState();
|
|
159
|
+
}
|
|
160
|
+
export async function ensureToolsServer() {
|
|
161
|
+
const state = await readState();
|
|
162
|
+
if (state) {
|
|
163
|
+
const alive = isProcessAlive(state.pid);
|
|
164
|
+
if (alive) {
|
|
165
|
+
const healthy = await isHealthy(state.port);
|
|
166
|
+
if (healthy) {
|
|
167
|
+
return `http://127.0.0.1:${state.port}`;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
await clearState();
|
|
171
|
+
}
|
|
172
|
+
// Spawn a new server
|
|
173
|
+
const port = await findFreePort();
|
|
174
|
+
const { port: actualPort, pid } = await spawnToolsServer(port);
|
|
175
|
+
await writeState({
|
|
176
|
+
port: actualPort,
|
|
177
|
+
pid,
|
|
178
|
+
startedAt: new Date().toISOString(),
|
|
179
|
+
bundlePath: BUNDLE_PATH,
|
|
180
|
+
});
|
|
181
|
+
return `http://127.0.0.1:${actualPort}`;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../src/launcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function startMcpServer(): Promise<void>;
|