@jixo/cli 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +39 -64
- package/dist/cli.js.map +1 -1
- package/dist/commands/daemon.d.ts +5 -0
- package/dist/commands/daemon.d.ts.map +1 -0
- package/dist/commands/daemon.js +20 -0
- package/dist/commands/daemon.js.map +1 -0
- package/dist/commands/doctor/config.d.ts.map +1 -1
- package/dist/commands/doctor/config.js +5 -18
- package/dist/commands/doctor/config.js.map +1 -1
- package/dist/commands/doctor/doctor.d.ts +1 -16
- package/dist/commands/doctor/doctor.d.ts.map +1 -1
- package/dist/commands/doctor/doctor.js +85 -52
- package/dist/commands/doctor/doctor.js.map +1 -1
- package/dist/commands/doctor/index.d.ts +1 -1
- package/dist/commands/doctor/index.d.ts.map +1 -1
- package/dist/commands/doctor/index.js +0 -11
- package/dist/commands/doctor/index.js.map +1 -1
- package/dist/commands/doctor/types.d.ts +17 -2
- package/dist/commands/doctor/types.d.ts.map +1 -1
- package/dist/commands/doctor/types.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +29 -52
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/tasks/ai-tools.d.ts +4 -11
- package/dist/commands/tasks/ai-tools.d.ts.map +1 -1
- package/dist/commands/tasks/run-ai-task.d.ts.map +1 -1
- package/dist/commands/tasks/run-ai-task.js +8 -3
- package/dist/commands/tasks/run-ai-task.js.map +1 -1
- package/dist/commands/tasks/run.d.ts +9 -6
- package/dist/commands/tasks/run.d.ts.map +1 -1
- package/dist/commands/tasks/run.js +38 -85
- package/dist/commands/tasks/run.js.map +1 -1
- package/dist/config.d.ts +5 -196
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -21
- package/dist/config.js.map +1 -1
- package/dist/env.d.ts +2 -13
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +3 -13
- package/dist/env.js.map +1 -1
- package/package.json +11 -11
|
@@ -4,13 +4,13 @@ export interface ToolCheckConfig {
|
|
|
4
4
|
/** User-friendly name for display purposes (e.g., "PNPM Package Manager") */
|
|
5
5
|
displayName: string;
|
|
6
6
|
/** The command to execute to get the version (e.g., "pnpm --version") */
|
|
7
|
-
versionCommand
|
|
7
|
+
versionCommand?: string;
|
|
8
8
|
/**
|
|
9
9
|
* A regular expression to parse the version string from the command's output.
|
|
10
10
|
* It MUST have at least one capturing group, which should capture the version string.
|
|
11
11
|
* Example: For "pnpm 10.11.0", regex could be /pnpm\s+([\d.]+)/ or simply /([\d.]+)/
|
|
12
12
|
*/
|
|
13
|
-
versionParseRegex
|
|
13
|
+
versionParseRegex?: RegExp;
|
|
14
14
|
/**
|
|
15
15
|
* The minimum required version (Semantic Versioning string).
|
|
16
16
|
* If undefined, only existence is checked.
|
|
@@ -27,4 +27,19 @@ export interface ToolCheckConfig {
|
|
|
27
27
|
optional?: boolean;
|
|
28
28
|
}
|
|
29
29
|
export type DoctorConfig = ToolCheckConfig[];
|
|
30
|
+
export interface ToolCheckResult {
|
|
31
|
+
id: string;
|
|
32
|
+
displayName: string;
|
|
33
|
+
exists: boolean;
|
|
34
|
+
version?: string;
|
|
35
|
+
requiredVersion?: string;
|
|
36
|
+
meetsVersionRequirement: boolean;
|
|
37
|
+
isOptional: boolean;
|
|
38
|
+
message: string;
|
|
39
|
+
installationHint?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface DoctorReport {
|
|
42
|
+
overallSuccess: boolean;
|
|
43
|
+
results: ToolCheckResult[];
|
|
44
|
+
}
|
|
30
45
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,EAAE,EAAE,MAAM,CAAC;IAEX,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;IAEpB,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;AAE7C,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uBAAuB,EAAE,OAAO,CAAC;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/commands/doctor/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/commands/doctor/types.ts"],"names":[],"mappings":"AAAA,2CAA2C","sourcesContent":["// types.ts (or directly in your doctor.ts)\n\nexport interface ToolCheckConfig {\n /** A unique identifier for this check (e.g., 'pnpm', 'uvx-cli') */\n id: string;\n\n /** User-friendly name for display purposes (e.g., \"PNPM Package Manager\") */\n displayName: string;\n\n /** The command to execute to get the version (e.g., \"pnpm --version\") */\n versionCommand?: string;\n\n /**\n * A regular expression to parse the version string from the command's output.\n * It MUST have at least one capturing group, which should capture the version string.\n * Example: For \"pnpm 10.11.0\", regex could be /pnpm\\s+([\\d.]+)/ or simply /([\\d.]+)/\n */\n versionParseRegex?: RegExp;\n\n /**\n * The minimum required version (Semantic Versioning string).\n * If undefined, only existence is checked.\n */\n minVersion?: string;\n\n /**\n * Optional: A hint or URL for installation if the tool is missing or version is too low.\n */\n installationHint?: string;\n\n /**\n * Optional: If true, a failure for this tool won't cause the overall doctor check to fail.\n * It will still be reported. Defaults to false.\n */\n optional?: boolean;\n}\n\nexport type DoctorConfig = ToolCheckConfig[];\n\nexport interface ToolCheckResult {\n id: string;\n displayName: string;\n exists: boolean;\n version?: string; // Actual version found\n requiredVersion?: string; // From config\n meetsVersionRequirement: boolean; // True if version >= minVersion or if minVersion not set & exists\n isOptional: boolean;\n message: string;\n installationHint?: string;\n}\n\nexport interface DoctorReport {\n overallSuccess: boolean;\n results: ToolCheckResult[];\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,IAAI,GAAI,KAAK,MAAM,SA8B/B,CAAC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,63 +1,40 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { writeText } from "@gaubee/nodekit";
|
|
2
2
|
import { str_trim_indent } from "@gaubee/util";
|
|
3
3
|
import fs from "node:fs";
|
|
4
4
|
import path from "node:path";
|
|
5
|
-
import { safeEnv } from "../env.js";
|
|
6
5
|
export const init = (dir) => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
/// jixo.config.json
|
|
26
|
-
{
|
|
27
|
-
const jixoConfigFilepath = path.join(dir, "jixo.config.json");
|
|
28
|
-
if (!fs.existsSync(jixoConfigFilepath)) {
|
|
29
|
-
writeJson(jixoConfigFilepath, {
|
|
30
|
-
tasks: { type: "dir", dirname: ".jixo" },
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
/// .jixo.env
|
|
35
|
-
{
|
|
36
|
-
const jixoEnvFilepath = path.join(dir, ".jixo.env");
|
|
37
|
-
if (!fs.existsSync(jixoEnvFilepath)) {
|
|
38
|
-
writeText(jixoEnvFilepath, Object.keys(safeEnv)
|
|
39
|
-
.filter((key) => key.startsWith("JIXO_"))
|
|
40
|
-
.map((key) => `${key}=""`)
|
|
41
|
-
.join("\n"));
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
/// .gitignore
|
|
45
|
-
{
|
|
46
|
-
const gitignoreFilepath = path.join(dir, ".gitignore");
|
|
47
|
-
addRulesToGitIgnore(gitignoreFilepath, ["*.memory.json", "memory.json", ".jixo.env"]);
|
|
6
|
+
// Create .jixo directory
|
|
7
|
+
const jixoDir = path.join(dir, ".jixo");
|
|
8
|
+
fs.mkdirSync(jixoDir, { recursive: true });
|
|
9
|
+
// Create .jixo.env file
|
|
10
|
+
const jixoEnvFilepath = path.join(dir, ".jixo.env");
|
|
11
|
+
if (!fs.existsSync(jixoEnvFilepath)) {
|
|
12
|
+
writeText(jixoEnvFilepath, str_trim_indent(`
|
|
13
|
+
# JIXO Core Service Configuration
|
|
14
|
+
JIXO_CORE_URL=http://localhost:4111
|
|
15
|
+
JIXO_API_KEY=
|
|
16
|
+
|
|
17
|
+
# LLM Provider API Keys (to be used by jixo-core)
|
|
18
|
+
# ANTHROPIC_API_KEY=
|
|
19
|
+
# GOOGLE_API_KEY=
|
|
20
|
+
# OPENAI_API_KEY=
|
|
21
|
+
`));
|
|
22
|
+
console.log(`✅ Created configuration template at: ${jixoEnvFilepath}`);
|
|
48
23
|
}
|
|
24
|
+
// Update root .gitignore
|
|
25
|
+
const gitignoreFilepath = path.join(dir, ".gitignore");
|
|
26
|
+
addRulesToGitIgnore(gitignoreFilepath, [".jixo.env", ".jixo/memory/"]);
|
|
27
|
+
console.log(`✅ Updated .gitignore`);
|
|
28
|
+
console.log("\nJIXO initialized successfully!");
|
|
49
29
|
};
|
|
50
30
|
const addRulesToGitIgnore = (gitignoreFilepath, rules) => {
|
|
51
|
-
const
|
|
31
|
+
const existingRules = fs.existsSync(gitignoreFilepath) ? fs.readFileSync(gitignoreFilepath, "utf-8").split("\n") : [];
|
|
52
32
|
let changed = false;
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
if (changed) {
|
|
60
|
-
fs.writeFileSync(gitignoreFilepath, gitignoreLines.join("\n"));
|
|
33
|
+
const newRules = rules.filter((rule) => !existingRules.includes(rule));
|
|
34
|
+
if (newRules.length > 0) {
|
|
35
|
+
fs.appendFileSync(gitignoreFilepath, "\n# JIXO\n" + newRules.join("\n") + "\n");
|
|
36
|
+
changed = true;
|
|
61
37
|
}
|
|
38
|
+
return changed;
|
|
62
39
|
};
|
|
63
40
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAC,eAAe,EAAC,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;IAClC,yBAAyB;IACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACxC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IAEzC,wBAAwB;IACxB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,SAAS,CACP,eAAe,EACf,eAAe,CAAC;;;;;;;;;OASf,CAAC,CACH,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,wCAAwC,eAAe,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,yBAAyB;IACzB,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACvD,mBAAmB,CAAC,iBAAiB,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAEpC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;AAClD,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,iBAAyB,EAAE,KAAe,EAAE,EAAE;IACzE,MAAM,aAAa,GAAG,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtH,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAEvE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,cAAc,CAAC,iBAAiB,EAAE,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAChF,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC","sourcesContent":["import {writeText} from \"@gaubee/nodekit\";\nimport {str_trim_indent} from \"@gaubee/util\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport const init = (dir: string) => {\n // Create .jixo directory\n const jixoDir = path.join(dir, \".jixo\");\n fs.mkdirSync(jixoDir, {recursive: true});\n\n // Create .jixo.env file\n const jixoEnvFilepath = path.join(dir, \".jixo.env\");\n if (!fs.existsSync(jixoEnvFilepath)) {\n writeText(\n jixoEnvFilepath,\n str_trim_indent(`\n # JIXO Core Service Configuration\n JIXO_CORE_URL=http://localhost:4111\n JIXO_API_KEY=\n\n # LLM Provider API Keys (to be used by jixo-core)\n # ANTHROPIC_API_KEY=\n # GOOGLE_API_KEY=\n # OPENAI_API_KEY=\n `),\n );\n console.log(`✅ Created configuration template at: ${jixoEnvFilepath}`);\n }\n\n // Update root .gitignore\n const gitignoreFilepath = path.join(dir, \".gitignore\");\n addRulesToGitIgnore(gitignoreFilepath, [\".jixo.env\", \".jixo/memory/\"]);\n console.log(`✅ Updated .gitignore`);\n\n console.log(\"\\nJIXO initialized successfully!\");\n};\n\nconst addRulesToGitIgnore = (gitignoreFilepath: string, rules: string[]) => {\n const existingRules = fs.existsSync(gitignoreFilepath) ? fs.readFileSync(gitignoreFilepath, \"utf-8\").split(\"\\n\") : [];\n let changed = false;\n const newRules = rules.filter((rule) => !existingRules.includes(rule));\n\n if (newRules.length > 0) {\n fs.appendFileSync(gitignoreFilepath, \"\\n# JIXO\\n\" + newRules.join(\"\\n\") + \"\\n\");\n changed = true;\n }\n return changed;\n};\n"]}
|
|
@@ -789,23 +789,16 @@ export declare const tools: {
|
|
|
789
789
|
}>, void | ((this: unknown) => any)>;
|
|
790
790
|
git: (repo: string) => Promise<ToolSet>;
|
|
791
791
|
jixo: (ai_task: AiTask) => {
|
|
792
|
-
jixo_log_lock: import("ai").Tool<
|
|
792
|
+
jixo_log_lock: import("ai").Tool<unknown, {
|
|
793
793
|
type: string;
|
|
794
794
|
filepath: string;
|
|
795
795
|
content: string;
|
|
796
796
|
}>;
|
|
797
|
-
jixo_log_unlock: import("ai").Tool<
|
|
797
|
+
jixo_log_unlock: import("ai").Tool<unknown, {
|
|
798
798
|
type: string;
|
|
799
799
|
}>;
|
|
800
|
-
jixo_tasks_exit: import("ai").Tool<
|
|
801
|
-
|
|
802
|
-
reason: string;
|
|
803
|
-
}, {
|
|
804
|
-
type: string;
|
|
805
|
-
}>;
|
|
806
|
-
get_jixo_skill: import("ai").Tool<{
|
|
807
|
-
name: string;
|
|
808
|
-
}, any>;
|
|
800
|
+
jixo_tasks_exit: import("ai").Tool<unknown, unknown>;
|
|
801
|
+
get_jixo_skill: any;
|
|
809
802
|
};
|
|
810
803
|
};
|
|
811
804
|
//# sourceMappingURL=ai-tools.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-tools.d.ts","sourceRoot":"","sources":["../../../src/commands/tasks/ai-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAwD,KAAK,OAAO,EAAC,MAAM,IAAI,CAAC;AAEvF,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,kCAAkC,CAAC;AAE7D,eAAO,MAAM,KAAK;sBAGD,MAAM;8BAeM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAmDjB,MAAM;oBAkBH,MAAM
|
|
1
|
+
{"version":3,"file":"ai-tools.d.ts","sourceRoot":"","sources":["../../../src/commands/tasks/ai-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAwD,KAAK,OAAO,EAAC,MAAM,IAAI,CAAC;AAEvF,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,kCAAkC,CAAC;AAE7D,eAAO,MAAM,KAAK;sBAGD,MAAM;8BAeM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAmDjB,MAAM;oBAkBH,MAAM;;;;;;;;;;;;CAgD1B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-ai-task.d.ts","sourceRoot":"","sources":["../../../src/commands/tasks/run-ai-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,SAAS,EAA0C,MAAM,iBAAiB,CAAC;AAW/F,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,kCAAkC,CAAC;AAO7D,eAAO,MAAM,SAAS,GAAU,SAAS,MAAM,EAAE,WAAW,MAAM,EAAE,UAAU,SAAS,EAAE,EAAE,iBAAiB,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"run-ai-task.d.ts","sourceRoot":"","sources":["../../../src/commands/tasks/run-ai-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,SAAS,EAA0C,MAAM,iBAAiB,CAAC;AAW/F,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,kCAAkC,CAAC;AAO7D,eAAO,MAAM,SAAS,GAAU,SAAS,MAAM,EAAE,WAAW,MAAM,EAAE,UAAU,SAAS,EAAE,EAAE,iBAAiB,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,kBAwCtI,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { blue, cyan, FileEntry, gray, green, red, spinner, YAML, yellow } from "@gaubee/nodekit";
|
|
2
|
-
import { func_catch } from "@gaubee/util";
|
|
2
|
+
import { func_catch, obj_omit } from "@gaubee/util";
|
|
3
3
|
import { streamText } from "ai";
|
|
4
4
|
import ms from "ms";
|
|
5
5
|
import { open } from "node:fs/promises";
|
|
@@ -31,7 +31,8 @@ export const runAiTask = async (ai_task, loopTimes, allFiles, changedFilesSet) =
|
|
|
31
31
|
const __writeJsonLineLog = (...lineDatas) => {
|
|
32
32
|
for (const lineData of lineDatas) {
|
|
33
33
|
try {
|
|
34
|
-
|
|
34
|
+
const log = typeof lineData === "function" ? lineData() : lineData;
|
|
35
|
+
json_line_log_file_handle.appendFile(JSON.stringify(log) + "\n");
|
|
35
36
|
}
|
|
36
37
|
catch { }
|
|
37
38
|
}
|
|
@@ -143,7 +144,11 @@ const _runAiTask = async (ai_task, availableTools, allFiles, changedFilesSet, tu
|
|
|
143
144
|
ERROR: "ERROR",
|
|
144
145
|
};
|
|
145
146
|
for await (const part of result.fullStream) {
|
|
146
|
-
__writeJsonLineLog(part)
|
|
147
|
+
__writeJsonLineLog(() => match(part)
|
|
148
|
+
.with({ type: "start-step" }, (p) => {
|
|
149
|
+
obj_omit(p, "request");
|
|
150
|
+
})
|
|
151
|
+
.otherwise((p) => p));
|
|
147
152
|
if (firstStreamPart) {
|
|
148
153
|
firstStreamPart = false;
|
|
149
154
|
tui.text = ""; // Clear initial connecting/processing message
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-ai-task.js","sourceRoot":"","sources":["../../../src/commands/tasks/run-ai-task.ts"],"names":[],"mappings":"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","sourcesContent":["import {blue, cyan, FileEntry, gray, green, red, spinner, YAML, yellow} from \"@gaubee/nodekit\";\nimport {func_catch} from \"@gaubee/util\";\nimport {streamText, type AssistantModelMessage, type ModelMessage, type ToolCallPart, type ToolSet} from \"ai\";\nimport ms from \"ms\";\nimport {open} from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport {match, P} from \"ts-pattern\";\nimport {handleError} from \"../../helper/handle-ai-error.js\";\nimport {createDebug} from \"../../helper/logger.js\";\nimport {getAllPromptConfigs, getAllSkillMap as getAllSkillNavMap} from \"../../helper/prompts-loader.js\";\nimport type {AiTask} from \"../../helper/resolve-ai-tasks.js\";\nimport {AiTaskTui} from \"./ai-tasl-tui.js\";\nimport {tools} from \"./ai-tools.js\";\nimport {getModel} from \"./model-providers.js\";\n\nconst log = createDebug(\"jixo:run-ai-task\");\n\nexport const runAiTask = async (ai_task: AiTask, loopTimes: number, allFiles: FileEntry[], changedFilesSet: Record<string, FileEntry[]>) => {\n const tool_spinner = spinner({\n prefixText: \"🧰\",\n text: \"Preparing AI tools...\",\n });\n tool_spinner.start();\n const availableTools: ToolSet = {\n ...(await tools.fileSystem(ai_task.cwd)),\n ...(await tools.pnpm()),\n ...(await tools.jixo(ai_task)),\n ...(await tools.git(ai_task.cwd)),\n };\n tool_spinner.clear();\n tool_spinner.stop();\n\n const json_line_log_file_handle = await open(path.join(ai_task.cwd, \".jixo\", `${ai_task.runner}.log.jsonl`), \"a\");\n const __writeJsonLineLog = (...lineDatas: any[]) => {\n for (const lineData of lineDatas) {\n try {\n json_line_log_file_handle.appendFile(JSON.stringify(lineData) + \"\\n\");\n } catch {}\n }\n };\n\n const tui = new AiTaskTui(ai_task, spinner({text: `Initializing AI task: ${cyan(ai_task.jobName)}...`, prefixText: \"⏳ \"}));\n tui.spinner.start();\n const updateTuiState = () => {\n tui.setStatus(\"loop and time\", `${green(`[${loopTimes}]`)} ${cyan(`+${ms(Date.now() - new Date(ai_task.startTime).getTime())}`)}`);\n };\n const ti = setInterval(updateTuiState, 1000);\n updateTuiState();\n try {\n await _runAiTask(ai_task, availableTools, allFiles, changedFilesSet, tui, __writeJsonLineLog);\n } finally {\n // Fallback spinner stop if loop exits unexpectedly\n clearInterval(ti);\n tui.stop();\n json_line_log_file_handle.close();\n }\n};\n\nconst _runAiTask = async (\n ai_task: AiTask,\n availableTools: ToolSet,\n allFiles: FileEntry[],\n changedFilesSet: Record<string, FileEntry[]>,\n tui: AiTaskTui,\n __writeJsonLineLog: (...lineDatas: any[]) => void,\n) => {\n const model = getModel(ai_task.model);\n\n const initialMessages: ModelMessage[] = [];\n const maxTurns = 40; // Safeguard against infinite loops\n\n const promptConfigs = getAllPromptConfigs();\n\n for (const role of [\"system\", \"user\"] as const) {\n const promptConfig = promptConfigs[role];\n\n const promptContent = promptConfig.content //\n .replace(/\\{\\{task.([\\.\\w]+)\\}\\}/g, (_, key) => {\n if (key.includes(\".\")) {\n const paths = key.split(\".\");\n let res: any = ai_task;\n for (const p of paths) {\n res = Reflect.get(res, p);\n if (!res) {\n break;\n }\n }\n return res;\n } else {\n return Reflect.get(ai_task, key);\n }\n })\n .replace(/\\{\\{env.(\\w+)\\}\\}/g, (_, key) => {\n const envKey = key.toUpperCase();\n const envValue =\n Reflect.get(process.env, envKey) ??\n match(envKey)\n .with(\"USER\", () => os.userInfo().username)\n .otherwise(() => \"\");\n return envValue;\n })\n .replaceAll(\"{{allSkills}}\", (_, key) => {\n return YAML.stringify(getAllSkillNavMap());\n })\n .replaceAll(\n \"{{allFiles}}\",\n YAML.stringify({\n [ai_task.cwd]: {\n count: allFiles.length,\n file: allFiles.map((e) => e.relativePath),\n },\n }),\n )\n .replaceAll(\"{{maxTurns}}\", () => `${maxTurns}`)\n .replaceAll(\n \"{{changedFiles}}\",\n YAML.stringify(\n Object.entries(changedFilesSet).reduce(\n (tree, [dir, changedFiles]) => {\n tree[dir] = {\n count: changedFiles.length,\n files: changedFiles.map((e) => e.relativePath),\n };\n return tree;\n },\n {} as Record<string, {count: number; files: string[]}>,\n ),\n ),\n );\n log(`PROMPT ${role}:`, promptContent);\n initialMessages.push({\n role: role,\n content: promptContent,\n });\n }\n\n const currentMessages: ModelMessage[] = [...initialMessages];\n\n __writeJsonLineLog(...currentMessages);\n\n loop: for (let turn = 0; turn < maxTurns; turn++) {\n if (turn === 0) {\n tui.setStatus(\"turns\", `Connecting To ${model.provider}...`);\n } else {\n tui.setStatus(\"turns\", `Processing step ${turn + 1}/${maxTurns}...`);\n const userTurnMessage: ModelMessage = {\n role: \"user\",\n content: `Turns: ${turn}/${maxTurns}`,\n };\n currentMessages.push(userTurnMessage);\n __writeJsonLineLog(userTurnMessage);\n }\n const result = await streamText({\n model: model,\n messages: currentMessages,\n tools: availableTools,\n toolChoice: \"auto\", // Changed to auto for more flexibility\n onError: () => {},\n });\n\n let fullReasoningText = \"\";\n let fullText = \"\";\n let firstStreamPart = true;\n const requestedToolCalls: ToolCallPart[] = []; // Using any for now, should be ToolCallPart from 'ai'\n\n const assistantMessageContent: AssistantModelMessage[\"content\"] & unknown[] = [];\n const _currentAssistantMessage: AssistantModelMessage = {role: \"assistant\", content: assistantMessageContent};\n\n const LOOP_SIGNALS = {\n RETURN: \"RETURN\",\n BREAK: \"BREAK\",\n CONTINUE: \"CONTINUE\",\n ERROR: \"ERROR\",\n } as const;\n for await (const part of result.fullStream) {\n __writeJsonLineLog(part);\n\n if (firstStreamPart) {\n firstStreamPart = false;\n tui.text = \"\"; // Clear initial connecting/processing message\n }\n\n const LOOP_SIGNAL = await match(part)\n .with({type: \"text\"}, (textPart) => {\n tui.prefixText = \"🤖 \";\n let assistantTextPart = assistantMessageContent.findLast((part) => part.type === \"text\");\n if (assistantTextPart == null) {\n assistantTextPart = {type: \"text\", text: \"\"};\n assistantMessageContent.push(assistantTextPart);\n }\n assistantTextPart.text += textPart.text;\n if (fullText === \"\") tui.text = \"\";\n fullText += textPart.text;\n tui.text = \"\\n\" + fullText.split(\"\\n\").slice(-10).join(\"\\n\");\n })\n .with({type: \"tool-call\"}, (callPart) => {\n tui.prefixText = \"🛠️ \";\n tui.text = \"Requesting tool: \" + blue(callPart.toolName);\n log(\"\\nQAQ tool-call: %y\", callPart);\n requestedToolCalls.push(callPart);\n // Update assistant message to include tool calls\n assistantMessageContent.push({\n type: \"tool-call\",\n toolCallId: callPart.toolCallId,\n toolName: callPart.toolName,\n args: callPart.args,\n });\n })\n .with({type: \"error\"}, async (errorPart) => {\n tui.prefixText = tui.endInfo.prefixText = \"❌ \";\n tui.text = tui.endInfo.text = red(`${errorPart.error}`);\n const handled = await handleError(errorPart.error, tui);\n if (!handled) {\n return LOOP_SIGNALS.BREAK; // Stop processing on error\n }\n })\n .with({type: \"reasoning\"}, (reasoningPart) => {\n tui.prefixText = \"🤔 \";\n if (fullReasoningText === \"\") tui.text = \"\";\n fullReasoningText += reasoningPart.text;\n tui.text = \"\\n\" + gray(fullReasoningText.split(\"\\n\").slice(-3).join(\"\\n\"));\n })\n // Add other console logs for debugging if needed, but keep them minimal for production\n .with({type: \"file\"}, (p) => {\n tui.prefixText = \"📃 \";\n tui.text = p.file.mediaType;\n\n log(\"\\nQAQ file: %y\", p.file);\n })\n .with({type: \"source\"}, (p) => {\n tui.prefixText = \"🔗 \";\n if (p.sourceType === \"url\") {\n if (p.title) {\n tui.text = `[${p.title}](${p.url})`;\n } else {\n tui.text = p.url;\n }\n } else {\n if (p.filename) {\n tui.text = `[${p.title}](${p.filename})`;\n } else {\n tui.text = p.title;\n }\n }\n\n log(\"\\nQAQ source: %y\", p);\n })\n .with({type: \"tool-result\"}, (p) => log(\"\\nQAQ tool-result: %y\", p))\n .with({type: \"tool-call-streaming-start\"}, (p) => log(\"\\nQAQ tool-call-streaming-start: %y\", p))\n .with({type: \"tool-call-delta\"}, (p) => log(\"\\nQAQ tool-call-delta: %y\", p))\n .with({type: \"reasoning-part-finish\"}, (p) => log(\"\\nQAQ reasoning-part-finish: %y\", p))\n .with({type: \"start-step\"}, (p) => log(\"\\nQAQ start-step: %y\", p))\n .with({type: \"finish-step\"}, (p) => {\n log(\"\\nQAQ finish-step: %y\", p);\n /**\n * This event marks the end of an intermediate step, not the entire turn.\n * We handle potential issues here, but the main logic for continuing or\n * stopping the loop is in the final 'finish' event handler.\n */\n return match(p)\n .with({finishReason: P.union(\"content-filter\", \"error\")}, (part) => {\n // A step finishing due to an error or content filter is a serious issue.\n // Update the TUI to reflect this problem immediately.\n const reasonText = part.finishReason === \"content-filter\" ? \"Content filter violation\" : \"Model error\";\n tui.prefixText = tui.endInfo.prefixText = \"⚠️ \";\n tui.text = tui.endInfo.text = red(`Step failed due to ${reasonText}. Will be retry.`);\n log(red(`Step finished with critical reason: ${part.finishReason}`));\n return LOOP_SIGNALS.RETURN;\n })\n .with({finishReason: P.union(\"other\", \"unknown\")}, (part) => {\n // Log unusual finish reasons for debugging purposes.\n log(yellow(`Step finished with an unusual reason: ${part.finishReason}`));\n })\n .otherwise(() => {\n // This covers 'stop', 'length', and 'tool-calls'. These are normal\n // reasons for a step to finish. The final 'finish' event will\n // determine the overall outcome of the turn. No special action is needed here.\n log(`Step finished with normal reason: ${p.finishReason}. Awaiting end of turn.`);\n });\n })\n .with({type: \"start\"}, (p) => log(\"\\nQAQ start: %y\", p))\n .with({type: \"finish\"}, async (finishPart) => {\n log(\"\\nQAQ finish: %y\", finishPart);\n // Add the assistant's message from this step to the history\n currentMessages.push(_currentAssistantMessage);\n __writeJsonLineLog(_currentAssistantMessage);\n\n if (finishPart.finishReason === \"stop\" || finishPart.finishReason === \"length\") {\n tui.prefixText = tui.endInfo.prefixText = \"✅ \";\n tui.text = tui.endInfo.text = green(`${cyan(`[${ai_task.jobName}]`)} Completed`);\n // Task finished without tool calls or after tool calls that didn't lead to more calls.\n return LOOP_SIGNALS.RETURN; // Exit the outer loop and function\n }\n\n if (finishPart.finishReason === \"tool-calls\") {\n if (requestedToolCalls.length === 0) {\n tui.prefixText = tui.endInfo.prefixText = \"🚧 \";\n tui.text = tui.endInfo.text = yellow(`${cyan(`[${ai_task.jobName}]`)} finished with 'tool-calls' but no tools were requested.`);\n return LOOP_SIGNALS.RETURN; // Exit, something is off\n }\n\n const toolResultMessages: ModelMessage[] = [];\n for (const toolCall of requestedToolCalls) {\n const toolToExecute = availableTools[toolCall.toolName];\n if (!toolToExecute || typeof toolToExecute.execute !== \"function\") {\n console.error(`Tool ${toolCall.toolName} not found or not executable.`);\n toolResultMessages.push({\n role: \"tool\",\n content: [\n {\n type: \"tool-result\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n result: JSON.stringify({error: `Tool ${toolCall.toolName} not found or not executable.`}),\n isError: true,\n },\n ],\n });\n continue;\n }\n tui.text = `Executing tool: ${toolCall.toolName}...`;\n const executionResult = await func_catch(() =>\n toolToExecute.execute!(toolCall.args, {\n toolCallId: toolCall.toolCallId,\n messages: currentMessages,\n }),\n )();\n toolResultMessages.push({\n role: \"tool\",\n content: [\n {\n type: \"tool-result\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n isError: !executionResult.success,\n result: JSON.stringify(executionResult.success ? executionResult.result : executionResult.error),\n },\n ],\n });\n if (executionResult.success) {\n tui.text = `Tool ${toolCall.toolName} executed.`;\n } else {\n tui.text = `Error executing tool ${toolCall.toolName}.`;\n }\n }\n currentMessages.push(...toolResultMessages);\n __writeJsonLineLog(...toolResultMessages);\n // Loop continues for the next step\n } else {\n // Other finish reasons, potentially an error or unexpected state\n tui.prefixText = tui.endInfo.prefixText = \"🛑 \";\n tui.text = tui.endInfo.text = red(`${cyan(`[${ai_task.jobName}]`)} task finished with unhandled reason: ${finishPart.finishReason}`);\n return LOOP_SIGNALS.ERROR;\n }\n })\n .otherwise(() => {}); // Handle any other part types if necessary\n\n if (LOOP_SIGNAL === LOOP_SIGNALS.ERROR) {\n throw LOOP_SIGNAL;\n }\n if (LOOP_SIGNAL === LOOP_SIGNALS.RETURN) {\n break loop;\n } else if (LOOP_SIGNAL === LOOP_SIGNALS.BREAK) {\n break;\n }\n }\n // If the stream finishes without a 'finish' part (e.g. error thrown inside), this loop might exit. Ensure spinner stops.\n if (turn === maxTurns - 1) {\n tui.prefixText = tui.endInfo.prefixText = \"🚧 \";\n tui.text = tui.endInfo.text = yellow(`${cyan(`[${ai_task.jobName}]`)} Max interaction turns reached.`);\n break;\n }\n }\n};\n"]}
|
|
1
|
+
{"version":3,"file":"run-ai-task.js","sourceRoot":"","sources":["../../../src/commands/tasks/run-ai-task.ts"],"names":[],"mappings":"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","sourcesContent":["import {blue, cyan, FileEntry, gray, green, red, spinner, YAML, yellow} from \"@gaubee/nodekit\";\nimport {func_catch, obj_omit} from \"@gaubee/util\";\nimport {streamText, type AssistantModelMessage, type ModelMessage, type ToolCallPart, type ToolSet} from \"ai\";\nimport ms from \"ms\";\nimport {open} from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport {match, P} from \"ts-pattern\";\nimport {handleError} from \"../../helper/handle-ai-error.js\";\nimport {createDebug} from \"../../helper/logger.js\";\nimport {getAllPromptConfigs, getAllSkillMap as getAllSkillNavMap} from \"../../helper/prompts-loader.js\";\nimport type {AiTask} from \"../../helper/resolve-ai-tasks.js\";\nimport {AiTaskTui} from \"./ai-tasl-tui.js\";\nimport {tools} from \"./ai-tools.js\";\nimport {getModel} from \"./model-providers.js\";\n\nconst log = createDebug(\"jixo:run-ai-task\");\n\nexport const runAiTask = async (ai_task: AiTask, loopTimes: number, allFiles: FileEntry[], changedFilesSet: Record<string, FileEntry[]>) => {\n const tool_spinner = spinner({\n prefixText: \"🧰\",\n text: \"Preparing AI tools...\",\n });\n tool_spinner.start();\n const availableTools: ToolSet = {\n ...(await tools.fileSystem(ai_task.cwd)),\n ...(await tools.pnpm()),\n ...(await tools.jixo(ai_task)),\n ...(await tools.git(ai_task.cwd)),\n };\n tool_spinner.clear();\n tool_spinner.stop();\n\n const json_line_log_file_handle = await open(path.join(ai_task.cwd, \".jixo\", `${ai_task.runner}.log.jsonl`), \"a\");\n const __writeJsonLineLog = (...lineDatas: any[]) => {\n for (const lineData of lineDatas) {\n try {\n const log = typeof lineData === \"function\" ? lineData() : lineData;\n json_line_log_file_handle.appendFile(JSON.stringify(log) + \"\\n\");\n } catch {}\n }\n };\n\n const tui = new AiTaskTui(ai_task, spinner({text: `Initializing AI task: ${cyan(ai_task.jobName)}...`, prefixText: \"⏳ \"}));\n tui.spinner.start();\n const updateTuiState = () => {\n tui.setStatus(\"loop and time\", `${green(`[${loopTimes}]`)} ${cyan(`+${ms(Date.now() - new Date(ai_task.startTime).getTime())}`)}`);\n };\n const ti = setInterval(updateTuiState, 1000);\n updateTuiState();\n try {\n await _runAiTask(ai_task, availableTools, allFiles, changedFilesSet, tui, __writeJsonLineLog);\n } finally {\n // Fallback spinner stop if loop exits unexpectedly\n clearInterval(ti);\n tui.stop();\n json_line_log_file_handle.close();\n }\n};\n\nconst _runAiTask = async (\n ai_task: AiTask,\n availableTools: ToolSet,\n allFiles: FileEntry[],\n changedFilesSet: Record<string, FileEntry[]>,\n tui: AiTaskTui,\n __writeJsonLineLog: (...lineDatas: any[]) => void,\n) => {\n const model = getModel(ai_task.model);\n\n const initialMessages: ModelMessage[] = [];\n const maxTurns = 40; // Safeguard against infinite loops\n\n const promptConfigs = getAllPromptConfigs();\n\n for (const role of [\"system\", \"user\"] as const) {\n const promptConfig = promptConfigs[role];\n\n const promptContent = promptConfig.content //\n .replace(/\\{\\{task.([\\.\\w]+)\\}\\}/g, (_, key) => {\n if (key.includes(\".\")) {\n const paths = key.split(\".\");\n let res: any = ai_task;\n for (const p of paths) {\n res = Reflect.get(res, p);\n if (!res) {\n break;\n }\n }\n return res;\n } else {\n return Reflect.get(ai_task, key);\n }\n })\n .replace(/\\{\\{env.(\\w+)\\}\\}/g, (_, key) => {\n const envKey = key.toUpperCase();\n const envValue =\n Reflect.get(process.env, envKey) ??\n match(envKey)\n .with(\"USER\", () => os.userInfo().username)\n .otherwise(() => \"\");\n return envValue;\n })\n .replaceAll(\"{{allSkills}}\", (_, key) => {\n return YAML.stringify(getAllSkillNavMap());\n })\n .replaceAll(\n \"{{allFiles}}\",\n YAML.stringify({\n [ai_task.cwd]: {\n count: allFiles.length,\n file: allFiles.map((e) => e.relativePath),\n },\n }),\n )\n .replaceAll(\"{{maxTurns}}\", () => `${maxTurns}`)\n .replaceAll(\n \"{{changedFiles}}\",\n YAML.stringify(\n Object.entries(changedFilesSet).reduce(\n (tree, [dir, changedFiles]) => {\n tree[dir] = {\n count: changedFiles.length,\n files: changedFiles.map((e) => e.relativePath),\n };\n return tree;\n },\n {} as Record<string, {count: number; files: string[]}>,\n ),\n ),\n );\n log(`PROMPT ${role}:`, promptContent);\n initialMessages.push({\n role: role,\n content: promptContent,\n });\n }\n\n const currentMessages: ModelMessage[] = [...initialMessages];\n\n __writeJsonLineLog(...currentMessages);\n\n loop: for (let turn = 0; turn < maxTurns; turn++) {\n if (turn === 0) {\n tui.setStatus(\"turns\", `Connecting To ${model.provider}...`);\n } else {\n tui.setStatus(\"turns\", `Processing step ${turn + 1}/${maxTurns}...`);\n const userTurnMessage: ModelMessage = {\n role: \"user\",\n content: `Turns: ${turn}/${maxTurns}`,\n };\n currentMessages.push(userTurnMessage);\n __writeJsonLineLog(userTurnMessage);\n }\n const result = await streamText({\n model: model,\n messages: currentMessages,\n tools: availableTools,\n toolChoice: \"auto\", // Changed to auto for more flexibility\n onError: () => {},\n });\n\n let fullReasoningText = \"\";\n let fullText = \"\";\n let firstStreamPart = true;\n const requestedToolCalls: ToolCallPart[] = []; // Using any for now, should be ToolCallPart from 'ai'\n\n const assistantMessageContent: AssistantModelMessage[\"content\"] & unknown[] = [];\n const _currentAssistantMessage: AssistantModelMessage = {role: \"assistant\", content: assistantMessageContent};\n\n const LOOP_SIGNALS = {\n RETURN: \"RETURN\",\n BREAK: \"BREAK\",\n CONTINUE: \"CONTINUE\",\n ERROR: \"ERROR\",\n } as const;\n for await (const part of result.fullStream) {\n __writeJsonLineLog(() =>\n match(part)\n .with({type: \"start-step\"}, (p) => {\n obj_omit(p, \"request\");\n })\n .otherwise((p) => p),\n );\n\n if (firstStreamPart) {\n firstStreamPart = false;\n tui.text = \"\"; // Clear initial connecting/processing message\n }\n\n const LOOP_SIGNAL = await match(part)\n .with({type: \"text\"}, (textPart) => {\n tui.prefixText = \"🤖 \";\n let assistantTextPart = assistantMessageContent.findLast((part) => part.type === \"text\");\n if (assistantTextPart == null) {\n assistantTextPart = {type: \"text\", text: \"\"};\n assistantMessageContent.push(assistantTextPart);\n }\n assistantTextPart.text += textPart.text;\n if (fullText === \"\") tui.text = \"\";\n fullText += textPart.text;\n tui.text = \"\\n\" + fullText.split(\"\\n\").slice(-10).join(\"\\n\");\n })\n .with({type: \"tool-call\"}, (callPart) => {\n tui.prefixText = \"🛠️ \";\n tui.text = \"Requesting tool: \" + blue(callPart.toolName);\n log(\"\\nQAQ tool-call: %y\", callPart);\n requestedToolCalls.push(callPart);\n // Update assistant message to include tool calls\n assistantMessageContent.push({\n type: \"tool-call\",\n toolCallId: callPart.toolCallId,\n toolName: callPart.toolName,\n args: callPart.args,\n });\n })\n .with({type: \"error\"}, async (errorPart) => {\n tui.prefixText = tui.endInfo.prefixText = \"❌ \";\n tui.text = tui.endInfo.text = red(`${errorPart.error}`);\n const handled = await handleError(errorPart.error, tui);\n if (!handled) {\n return LOOP_SIGNALS.BREAK; // Stop processing on error\n }\n })\n .with({type: \"reasoning\"}, (reasoningPart) => {\n tui.prefixText = \"🤔 \";\n if (fullReasoningText === \"\") tui.text = \"\";\n fullReasoningText += reasoningPart.text;\n tui.text = \"\\n\" + gray(fullReasoningText.split(\"\\n\").slice(-3).join(\"\\n\"));\n })\n // Add other console logs for debugging if needed, but keep them minimal for production\n .with({type: \"file\"}, (p) => {\n tui.prefixText = \"📃 \";\n tui.text = p.file.mediaType;\n\n log(\"\\nQAQ file: %y\", p.file);\n })\n .with({type: \"source\"}, (p) => {\n tui.prefixText = \"🔗 \";\n if (p.sourceType === \"url\") {\n if (p.title) {\n tui.text = `[${p.title}](${p.url})`;\n } else {\n tui.text = p.url;\n }\n } else {\n if (p.filename) {\n tui.text = `[${p.title}](${p.filename})`;\n } else {\n tui.text = p.title;\n }\n }\n\n log(\"\\nQAQ source: %y\", p);\n })\n .with({type: \"tool-result\"}, (p) => log(\"\\nQAQ tool-result: %y\", p))\n .with({type: \"tool-call-streaming-start\"}, (p) => log(\"\\nQAQ tool-call-streaming-start: %y\", p))\n .with({type: \"tool-call-delta\"}, (p) => log(\"\\nQAQ tool-call-delta: %y\", p))\n .with({type: \"reasoning-part-finish\"}, (p) => log(\"\\nQAQ reasoning-part-finish: %y\", p))\n .with({type: \"start-step\"}, (p) => log(\"\\nQAQ start-step: %y\", p))\n .with({type: \"finish-step\"}, (p) => {\n log(\"\\nQAQ finish-step: %y\", p);\n /**\n * This event marks the end of an intermediate step, not the entire turn.\n * We handle potential issues here, but the main logic for continuing or\n * stopping the loop is in the final 'finish' event handler.\n */\n return match(p)\n .with({finishReason: P.union(\"content-filter\", \"error\")}, (part) => {\n // A step finishing due to an error or content filter is a serious issue.\n // Update the TUI to reflect this problem immediately.\n const reasonText = part.finishReason === \"content-filter\" ? \"Content filter violation\" : \"Model error\";\n tui.prefixText = tui.endInfo.prefixText = \"⚠️ \";\n tui.text = tui.endInfo.text = red(`Step failed due to ${reasonText}. Will be retry.`);\n log(red(`Step finished with critical reason: ${part.finishReason}`));\n return LOOP_SIGNALS.RETURN;\n })\n .with({finishReason: P.union(\"other\", \"unknown\")}, (part) => {\n // Log unusual finish reasons for debugging purposes.\n log(yellow(`Step finished with an unusual reason: ${part.finishReason}`));\n })\n .otherwise(() => {\n // This covers 'stop', 'length', and 'tool-calls'. These are normal\n // reasons for a step to finish. The final 'finish' event will\n // determine the overall outcome of the turn. No special action is needed here.\n log(`Step finished with normal reason: ${p.finishReason}. Awaiting end of turn.`);\n });\n })\n .with({type: \"start\"}, (p) => log(\"\\nQAQ start: %y\", p))\n .with({type: \"finish\"}, async (finishPart) => {\n log(\"\\nQAQ finish: %y\", finishPart);\n // Add the assistant's message from this step to the history\n currentMessages.push(_currentAssistantMessage);\n __writeJsonLineLog(_currentAssistantMessage);\n\n if (finishPart.finishReason === \"stop\" || finishPart.finishReason === \"length\") {\n tui.prefixText = tui.endInfo.prefixText = \"✅ \";\n tui.text = tui.endInfo.text = green(`${cyan(`[${ai_task.jobName}]`)} Completed`);\n // Task finished without tool calls or after tool calls that didn't lead to more calls.\n return LOOP_SIGNALS.RETURN; // Exit the outer loop and function\n }\n\n if (finishPart.finishReason === \"tool-calls\") {\n if (requestedToolCalls.length === 0) {\n tui.prefixText = tui.endInfo.prefixText = \"🚧 \";\n tui.text = tui.endInfo.text = yellow(`${cyan(`[${ai_task.jobName}]`)} finished with 'tool-calls' but no tools were requested.`);\n return LOOP_SIGNALS.RETURN; // Exit, something is off\n }\n\n const toolResultMessages: ModelMessage[] = [];\n for (const toolCall of requestedToolCalls) {\n const toolToExecute = availableTools[toolCall.toolName];\n if (!toolToExecute || typeof toolToExecute.execute !== \"function\") {\n console.error(`Tool ${toolCall.toolName} not found or not executable.`);\n toolResultMessages.push({\n role: \"tool\",\n content: [\n {\n type: \"tool-result\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n result: JSON.stringify({error: `Tool ${toolCall.toolName} not found or not executable.`}),\n isError: true,\n },\n ],\n });\n continue;\n }\n tui.text = `Executing tool: ${toolCall.toolName}...`;\n const executionResult = await func_catch(() =>\n toolToExecute.execute!(toolCall.args, {\n toolCallId: toolCall.toolCallId,\n messages: currentMessages,\n }),\n )();\n toolResultMessages.push({\n role: \"tool\",\n content: [\n {\n type: \"tool-result\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n isError: !executionResult.success,\n result: JSON.stringify(executionResult.success ? executionResult.result : executionResult.error),\n },\n ],\n });\n if (executionResult.success) {\n tui.text = `Tool ${toolCall.toolName} executed.`;\n } else {\n tui.text = `Error executing tool ${toolCall.toolName}.`;\n }\n }\n currentMessages.push(...toolResultMessages);\n __writeJsonLineLog(...toolResultMessages);\n // Loop continues for the next step\n } else {\n // Other finish reasons, potentially an error or unexpected state\n tui.prefixText = tui.endInfo.prefixText = \"🛑 \";\n tui.text = tui.endInfo.text = red(`${cyan(`[${ai_task.jobName}]`)} task finished with unhandled reason: ${finishPart.finishReason}`);\n return LOOP_SIGNALS.ERROR;\n }\n })\n .otherwise(() => {}); // Handle any other part types if necessary\n\n if (LOOP_SIGNAL === LOOP_SIGNALS.ERROR) {\n throw LOOP_SIGNAL;\n }\n if (LOOP_SIGNAL === LOOP_SIGNALS.RETURN) {\n break loop;\n } else if (LOOP_SIGNAL === LOOP_SIGNALS.BREAK) {\n break;\n }\n }\n // If the stream finishes without a 'finish' part (e.g. error thrown inside), this loop might exit. Ensure spinner stops.\n if (turn === maxTurns - 1) {\n tui.prefixText = tui.endInfo.prefixText = \"🚧 \";\n tui.text = tui.endInfo.text = yellow(`${cyan(`[${ai_task.jobName}]`)} Max interaction turns reached.`);\n break;\n }\n }\n};\n"]}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
interface RunOptions {
|
|
2
|
+
jobGoal: string;
|
|
3
|
+
workDir: string;
|
|
4
|
+
maxLoops: number;
|
|
5
|
+
jobName?: string;
|
|
6
|
+
gitCommit?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare const run: (options: RunOptions) => Promise<void>;
|
|
9
|
+
export {};
|
|
7
10
|
//# sourceMappingURL=run.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/tasks/run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/tasks/run.ts"],"names":[],"mappings":"AAGA,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,eAAO,MAAM,GAAG,GAAU,SAAS,UAAU,kBA0C5C,CAAC"}
|
|
@@ -1,91 +1,44 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
let allDone = true;
|
|
29
|
-
try {
|
|
30
|
-
for (const ai_task of ai_tasks) {
|
|
31
|
-
// 如果进度已经满了,并且没有任何依赖文件的变更,那么跳过这个任务
|
|
32
|
-
if (!force) {
|
|
33
|
-
if (ai_task.log.preProgress >= 1) {
|
|
34
|
-
continue;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
if (exitedJobs.has(ai_task.jobName)) {
|
|
38
|
-
continue;
|
|
39
|
-
}
|
|
40
|
-
const { dirs: task_dirs } = ai_task;
|
|
41
|
-
if (!task_dirs.some((dir) => dirMatcher.isMatch(dir))) {
|
|
42
|
-
continue;
|
|
43
|
-
}
|
|
44
|
-
if (!nameMatcher.isMatch(ai_task.jobName)) {
|
|
45
|
-
continue;
|
|
46
|
-
}
|
|
47
|
-
const isCwdTask = cwd === task_dirs[0] && task_dirs.length === 1;
|
|
48
|
-
const changedFiles = (await findChangedFilesSinceTime(ai_task.log.preUpdateTime, cwd)) ?? allFiles;
|
|
49
|
-
const task_changedFiles = isCwdTask
|
|
50
|
-
? { [cwd]: changedFiles }
|
|
51
|
-
: task_dirs.reduce((tree, task_dir) => {
|
|
52
|
-
tree[task_dir] = iter_map_not_null(changedFiles, (file) => {
|
|
53
|
-
if (file.path.startsWith(task_dirs + "/")) {
|
|
54
|
-
return new FileEntry(file.path, { cwd: task_dir, state: file.stats });
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
return tree;
|
|
58
|
-
}, {});
|
|
59
|
-
const task_allFiles = isCwdTask ? allFiles : task_dirs.map((task_dir) => [...walkFiles(task_dir, { ignore })]).flat();
|
|
60
|
-
loadJixoEnv(cwd);
|
|
61
|
-
/// 只要有一个任务执行了,那么allDone就要标记成false,进入下一次循环来判断
|
|
62
|
-
allDone = false;
|
|
63
|
-
await runAiTask(ai_task, currentTimes, task_allFiles, task_changedFiles);
|
|
64
|
-
if (ai_task.exitCode != null) {
|
|
65
|
-
exitedJobs.add(ai_task.jobName);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
1
|
+
import { cyan, green, red, yellow } from "@gaubee/nodekit";
|
|
2
|
+
import { safeEnv } from "../../env.js";
|
|
3
|
+
export const run = async (options) => {
|
|
4
|
+
const { jobGoal, workDir, maxLoops, jobName, gitCommit } = options;
|
|
5
|
+
const coreUrl = safeEnv.JIXO_CORE_URL;
|
|
6
|
+
const apiKey = safeEnv.JIXO_API_KEY;
|
|
7
|
+
console.log(cyan(`🚀 Starting JIXO job...`));
|
|
8
|
+
console.log(` - Goal: ${jobGoal}`);
|
|
9
|
+
console.log(` - Target: ${coreUrl}`);
|
|
10
|
+
try {
|
|
11
|
+
const response = await fetch(`${coreUrl}/jixo/v1/jobs`, {
|
|
12
|
+
method: "POST",
|
|
13
|
+
headers: {
|
|
14
|
+
"Content-Type": "application/json",
|
|
15
|
+
Authorization: `Bearer ${apiKey}`,
|
|
16
|
+
},
|
|
17
|
+
body: JSON.stringify({
|
|
18
|
+
jobGoal,
|
|
19
|
+
workspaceDir: workDir, // Updated field name
|
|
20
|
+
maxLoops,
|
|
21
|
+
jobName,
|
|
22
|
+
gitCommit,
|
|
23
|
+
}),
|
|
24
|
+
});
|
|
25
|
+
if (!response.ok) {
|
|
26
|
+
const errorBody = await response.text();
|
|
27
|
+
throw new Error(`Failed to start job. Server responded with ${response.status}: ${errorBody}`);
|
|
68
28
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
break;
|
|
78
|
-
}
|
|
29
|
+
const result = await response.json();
|
|
30
|
+
console.log(green(`✅ Job successfully started with Run ID: ${result.runId}`));
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (error instanceof TypeError && error.message.includes("fetch failed")) {
|
|
34
|
+
console.error(red("\n❌ Error: Could not connect to the JIXO Core service."));
|
|
35
|
+
console.error(yellow(` Please ensure the core service is running at ${coreUrl}.`));
|
|
36
|
+
console.error(yellow(` You can start it by running 'jixo daemon start' or running the core package directly.`));
|
|
79
37
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
currentTimes += 1;
|
|
83
|
-
/// 成功一次后,retry计数就重制
|
|
84
|
-
retryTimes = 0;
|
|
85
|
-
/// 如果没有任务执行了,那么退出循环
|
|
86
|
-
if (allDone) {
|
|
87
|
-
break;
|
|
38
|
+
else {
|
|
39
|
+
console.error(red("\n❌ An unexpected error occurred:"), error);
|
|
88
40
|
}
|
|
41
|
+
process.exit(1);
|
|
89
42
|
}
|
|
90
43
|
};
|
|
91
44
|
//# sourceMappingURL=run.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/tasks/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/tasks/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAC,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAC,OAAO,EAAC,MAAM,cAAc,CAAC;AAUrC,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,OAAmB,EAAE,EAAE;IAC/C,MAAM,EAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAC,GAAG,OAAO,CAAC;IACjE,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAEpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC;IAEvC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,eAAe,EAAE;YACtD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,MAAM,EAAE;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,OAAO;gBACP,YAAY,EAAE,OAAO,EAAE,qBAAqB;gBAC5C,QAAQ;gBACR,OAAO;gBACP,SAAS;aACV,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,8CAA8C,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC,CAAC;QACjG,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,2CAA2C,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACzE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC,CAAC;YAC7E,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,mDAAmD,OAAO,GAAG,CAAC,CAAC,CAAC;YACrF,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,0FAA0F,CAAC,CAAC,CAAC;QACpH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC","sourcesContent":["import {cyan, green, red, yellow} from \"@gaubee/nodekit\";\nimport {safeEnv} from \"../../env.js\";\n\ninterface RunOptions {\n jobGoal: string;\n workDir: string;\n maxLoops: number;\n jobName?: string;\n gitCommit?: boolean;\n}\n\nexport const run = async (options: RunOptions) => {\n const {jobGoal, workDir, maxLoops, jobName, gitCommit} = options;\n const coreUrl = safeEnv.JIXO_CORE_URL;\n const apiKey = safeEnv.JIXO_API_KEY;\n\n console.log(cyan(`🚀 Starting JIXO job...`));\n console.log(` - Goal: ${jobGoal}`);\n console.log(` - Target: ${coreUrl}`);\n\n try {\n const response = await fetch(`${coreUrl}/jixo/v1/jobs`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n jobGoal,\n workspaceDir: workDir, // Updated field name\n maxLoops,\n jobName,\n gitCommit,\n }),\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(`Failed to start job. Server responded with ${response.status}: ${errorBody}`);\n }\n\n const result = await response.json();\n console.log(green(`✅ Job successfully started with Run ID: ${result.runId}`));\n } catch (error) {\n if (error instanceof TypeError && error.message.includes(\"fetch failed\")) {\n console.error(red(\"\\n❌ Error: Could not connect to the JIXO Core service.\"));\n console.error(yellow(` Please ensure the core service is running at ${coreUrl}.`));\n console.error(yellow(` You can start it by running 'jixo daemon start' or running the core package directly.`));\n } else {\n console.error(red(\"\\n❌ An unexpected error occurred:\"), error);\n }\n process.exit(1);\n }\n};\n"]}
|