@jixo/cli 0.10.0 → 0.11.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.
Files changed (54) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +2 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/prompts/list.js +2 -2
  5. package/dist/commands/prompts/list.js.map +1 -1
  6. package/dist/commands/tasks/ai-tools.d.ts +280 -8
  7. package/dist/commands/tasks/ai-tools.d.ts.map +1 -1
  8. package/dist/commands/tasks/ai-tools.js +49 -14
  9. package/dist/commands/tasks/ai-tools.js.map +1 -1
  10. package/dist/commands/tasks/run-ai-task.d.ts +1 -1
  11. package/dist/commands/tasks/run-ai-task.d.ts.map +1 -1
  12. package/dist/commands/tasks/run-ai-task.js +71 -24
  13. package/dist/commands/tasks/run-ai-task.js.map +1 -1
  14. package/dist/commands/tasks/run.d.ts.map +1 -1
  15. package/dist/commands/tasks/run.js +20 -11
  16. package/dist/commands/tasks/run.js.map +1 -1
  17. package/dist/helper/ai-retry-error.d.ts +1 -1
  18. package/dist/helper/ai-retry-error.d.ts.map +1 -1
  19. package/dist/helper/ai-retry-error.js +63 -30
  20. package/dist/helper/ai-retry-error.js.map +1 -1
  21. package/dist/helper/handle-ai-error.d.ts +5 -0
  22. package/dist/helper/handle-ai-error.d.ts.map +1 -0
  23. package/dist/helper/handle-ai-error.js +122 -0
  24. package/dist/helper/handle-ai-error.js.map +1 -0
  25. package/dist/helper/prompts-loader.d.ts +9 -3
  26. package/dist/helper/prompts-loader.d.ts.map +1 -1
  27. package/dist/helper/prompts-loader.js +16 -16
  28. package/dist/helper/prompts-loader.js.map +1 -1
  29. package/dist/helper/resolve-ai-tasks.d.ts +21 -8
  30. package/dist/helper/resolve-ai-tasks.d.ts.map +1 -1
  31. package/dist/helper/resolve-ai-tasks.js +58 -19
  32. package/dist/helper/resolve-ai-tasks.js.map +1 -1
  33. package/dist/prompts.json +14 -2
  34. package/package.json +4 -3
  35. package/dist/commands/run.d.ts +0 -5
  36. package/dist/commands/run.d.ts.map +0 -1
  37. package/dist/commands/run.js +0 -36
  38. package/dist/commands/run.js.map +0 -1
  39. package/dist/commands/tasks/run-ai.d.ts +0 -278
  40. package/dist/commands/tasks/run-ai.d.ts.map +0 -1
  41. package/dist/commands/tasks/run-ai.js +0 -179
  42. package/dist/commands/tasks/run-ai.js.map +0 -1
  43. package/dist/commands/upgrade.d.ts +0 -4
  44. package/dist/commands/upgrade.d.ts.map +0 -1
  45. package/dist/commands/upgrade.js +0 -17
  46. package/dist/commands/upgrade.js.map +0 -1
  47. package/dist/helper/prompts.d.ts +0 -3
  48. package/dist/helper/prompts.d.ts.map +0 -1
  49. package/dist/helper/prompts.js +0 -28
  50. package/dist/helper/prompts.js.map +0 -1
  51. package/dist/helper/run-ai.d.ts +0 -12
  52. package/dist/helper/run-ai.d.ts.map +0 -1
  53. package/dist/helper/run-ai.js +0 -179
  54. package/dist/helper/run-ai.js.map +0 -1
@@ -1,179 +0,0 @@
1
- import { createAnthropic } from "@ai-sdk/anthropic";
2
- import { createDeepInfra } from "@ai-sdk/deepinfra";
3
- import { createDeepSeek } from "@ai-sdk/deepseek";
4
- import { createGoogleGenerativeAI } from "@ai-sdk/google";
5
- import { createOpenAI } from "@ai-sdk/openai";
6
- import { createXai } from "@ai-sdk/xai";
7
- import { cyan, FileEntry, gray, green, spinner } from "@gaubee/nodekit";
8
- import { func_lazy, func_remember, map_get_or_put_async, obj_lazify } from "@gaubee/util";
9
- import { experimental_createMCPClient as createMCPClient, streamText } from "ai";
10
- import { Experimental_StdioMCPTransport } from "ai/mcp-stdio";
11
- import { match, P } from "ts-pattern";
12
- import { safeEnv } from "../../env.js";
13
- import { getModelMessage, getPromptConfigs } from "../../helper/prompts-loader.js";
14
- // const wrapper = (provider:)
15
- export const providers = obj_lazify({
16
- get deepseek() {
17
- return createDeepSeek({
18
- baseURL: safeEnv.JIXO_DEEPSEEK_BASE_URL || undefined,
19
- apiKey: safeEnv.JIXO_DEEPSEEK_API_KEY,
20
- });
21
- },
22
- get anthropic() {
23
- // const bashTool = anthropic.tools.bash_20250124({
24
- // execute: async ({command, restart}) => execSync(command).toString(),
25
- // });
26
- const provider = createAnthropic({
27
- baseURL: safeEnv.JIXO_ANTHROPIC_BASE_URL || undefined,
28
- apiKey: safeEnv.JIXO_ANTHROPIC_API_KEY,
29
- });
30
- return provider;
31
- },
32
- get google() {
33
- return createGoogleGenerativeAI({
34
- baseURL: safeEnv.JIXO_GOOGLE_BASE_URL || undefined,
35
- apiKey: safeEnv.JIXO_GOOGLE_API_KEY,
36
- });
37
- },
38
- get openai() {
39
- return createOpenAI({
40
- baseURL: safeEnv.JIXO_OPENAI_BASE_URL || undefined,
41
- apiKey: safeEnv.JIXO_OPENAI_API_KEY,
42
- organization: safeEnv.JIXO_OPENAI_ORGANIZATION || undefined,
43
- });
44
- },
45
- get xai() {
46
- return createXai({
47
- baseURL: safeEnv.JIXO_XAI_BASE_URL || undefined,
48
- apiKey: safeEnv.JIXO_XAI_API_KEY,
49
- });
50
- },
51
- get deepinfra() {
52
- return createDeepInfra({
53
- baseURL: safeEnv.JIXO_DEEPINFRA_BASE_URL || undefined,
54
- apiKey: safeEnv.JIXO_DEEPINFRA_API_KEY,
55
- });
56
- },
57
- });
58
- const getModel = (model) => {
59
- return match(model)
60
- .with(P.string.startsWith("deepseek-"), (model) => providers.deepseek(model))
61
- .otherwise(() => {
62
- if (safeEnv.JIXO_DEEPSEEK_API_KEY) {
63
- return providers.deepseek("deepseek-chat");
64
- }
65
- if (safeEnv.JIXO_GOOGLE_API_KEY) {
66
- return providers.google("gemini-2.5-pro-preview-05-06");
67
- }
68
- if (safeEnv.JIXO_OPENAI_API_KEY) {
69
- return providers.openai("o3-mini");
70
- }
71
- if (safeEnv.JIXO_ANTHROPIC_API_KEY) {
72
- return providers.anthropic("claude-4-sonnet-20250514");
73
- }
74
- if (safeEnv.JIXO_XAI_API_KEY) {
75
- return providers.xai("grok-3-beta");
76
- }
77
- if (safeEnv.JIXO_DEEPINFRA_API_KEY) {
78
- return providers.deepinfra("meta-llama/Meta-Llama-3.1-405B-Instruct");
79
- }
80
- return providers.deepseek("deepseek-reasoner");
81
- });
82
- };
83
- export const tools = {
84
- fileSystem: func_lazy(() => {
85
- const map = new Map();
86
- return (cwd) => {
87
- return map_get_or_put_async(map, cwd, async () => {
88
- const mcpClient = await createMCPClient({
89
- transport: new Experimental_StdioMCPTransport({
90
- command: "pnpx",
91
- args: ["@modelcontextprotocol/server-filesystem", cwd],
92
- }),
93
- });
94
- const tools = await mcpClient.tools();
95
- return tools;
96
- });
97
- };
98
- }),
99
- fetch: func_remember(async () => {
100
- const mcpClient = await createMCPClient({
101
- transport: new Experimental_StdioMCPTransport({
102
- command: "uvx",
103
- args: ["mcp-server-fetch"],
104
- }),
105
- });
106
- const tools = await mcpClient.tools();
107
- return tools;
108
- }),
109
- git: func_lazy(() => {
110
- const map = new Map();
111
- return (repo) => {
112
- return map_get_or_put_async(map, repo, async () => {
113
- const mcpClient = await createMCPClient({
114
- transport: new Experimental_StdioMCPTransport({
115
- command: "uvx",
116
- args: ["mcp-server-git", "--repository", repo],
117
- }),
118
- });
119
- const tools = await mcpClient.tools();
120
- return tools;
121
- });
122
- };
123
- }),
124
- };
125
- export const runAiTask = async (ai_task, allFiles, changedFiles) => {
126
- const model = getModel(ai_task.model);
127
- const modelMessage = getModelMessage(ai_task.agents);
128
- modelMessage.push(
129
- //
130
- {
131
- role: "system",
132
- content: getPromptConfigs()
133
- .base.content //
134
- .replaceAll("{{task.name}}", ai_task.name)
135
- .replaceAll("{{task.memory}}", ai_task.memory)
136
- .replaceAll("{{task.content}}", ai_task.content)
137
- .replaceAll("{{allFiles}}", allFiles.map((file) => `- ${file.path}`).join("\n"))
138
- .replaceAll("{{changedFiles}}", changedFiles.map((file) => `- ${file.path}`).join("\n")),
139
- });
140
- // console.log("QAQ modelMessage", modelMessage);
141
- // return;
142
- const result = streamText({
143
- model: model,
144
- prompt: modelMessage,
145
- tools: {
146
- ...(await tools.fileSystem(ai_task.cwd)),
147
- // ...(await tools.fetch()),
148
- // ...(await tools.git(ai_task.cwd)),
149
- },
150
- onChunk: ({ chunk }) => {
151
- if (chunk.type === "reasoning") {
152
- if (reasoning === "") {
153
- loading.prefixText = "šŸ¤” ";
154
- loading.text = "";
155
- }
156
- reasoning += chunk.text;
157
- loading.text = gray(reasoning.split("\n").slice(-3).join("\n"));
158
- }
159
- },
160
- });
161
- const loading = spinner.default(`Connecting To ${model.provider}...`);
162
- loading.prefixText = "ā³ ";
163
- loading.start();
164
- let reasoning = "";
165
- let fulltext = "";
166
- for await (const text of result.textStream) {
167
- if (fulltext === "") {
168
- loading.prefixText = "šŸ¤– ";
169
- loading.text = "";
170
- }
171
- fulltext += text;
172
- loading.text = fulltext;
173
- }
174
- loading.stopAndPersist({
175
- suffixText: green(`\nāœ… ${cyan(`[${ai_task.name}]`)} Completed\n`),
176
- });
177
- console.log("QAQ done", result.text);
178
- };
179
- //# sourceMappingURL=run-ai.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"run-ai.js","sourceRoot":"","sources":["../../../src/commands/tasks/run-ai.ts"],"names":[],"mappings":"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","sourcesContent":["import {createAnthropic} from \"@ai-sdk/anthropic\";\nimport {createDeepInfra} from \"@ai-sdk/deepinfra\";\nimport {createDeepSeek} from \"@ai-sdk/deepseek\";\nimport {createGoogleGenerativeAI} from \"@ai-sdk/google\";\nimport {createOpenAI} from \"@ai-sdk/openai\";\nimport {createXai} from \"@ai-sdk/xai\";\nimport {cyan, FileEntry, gray, green, spinner} from \"@gaubee/nodekit\";\nimport {func_lazy, func_remember, map_get_or_put_async, obj_lazify} from \"@gaubee/util\";\nimport {experimental_createMCPClient as createMCPClient, streamText, type ModelMessage, type ToolSet} from \"ai\";\nimport {Experimental_StdioMCPTransport} from \"ai/mcp-stdio\";\nimport {match, P} from \"ts-pattern\";\nimport {safeEnv} from \"../../env.js\";\nimport {getModelMessage, getPromptConfigs} from \"../../helper/prompts-loader.js\";\nimport type {AiTask} from \"../../helper/resolve-ai-tasks.js\";\n\n// const wrapper = (provider:)\nexport const providers = obj_lazify({\n get deepseek() {\n return createDeepSeek({\n baseURL: safeEnv.JIXO_DEEPSEEK_BASE_URL || undefined,\n apiKey: safeEnv.JIXO_DEEPSEEK_API_KEY,\n });\n },\n get anthropic() {\n // const bashTool = anthropic.tools.bash_20250124({\n // execute: async ({command, restart}) => execSync(command).toString(),\n // });\n\n const provider = createAnthropic({\n baseURL: safeEnv.JIXO_ANTHROPIC_BASE_URL || undefined,\n apiKey: safeEnv.JIXO_ANTHROPIC_API_KEY,\n });\n return provider;\n },\n get google() {\n return createGoogleGenerativeAI({\n baseURL: safeEnv.JIXO_GOOGLE_BASE_URL || undefined,\n apiKey: safeEnv.JIXO_GOOGLE_API_KEY,\n });\n },\n get openai() {\n return createOpenAI({\n baseURL: safeEnv.JIXO_OPENAI_BASE_URL || undefined,\n apiKey: safeEnv.JIXO_OPENAI_API_KEY,\n organization: safeEnv.JIXO_OPENAI_ORGANIZATION || undefined,\n });\n },\n get xai() {\n return createXai({\n baseURL: safeEnv.JIXO_XAI_BASE_URL || undefined,\n apiKey: safeEnv.JIXO_XAI_API_KEY,\n });\n },\n get deepinfra() {\n return createDeepInfra({\n baseURL: safeEnv.JIXO_DEEPINFRA_BASE_URL || undefined,\n apiKey: safeEnv.JIXO_DEEPINFRA_API_KEY,\n });\n },\n});\nconst getModel = (model?: string) => {\n return match(model)\n .with(P.string.startsWith(\"deepseek-\"), (model) => providers.deepseek(model))\n .otherwise(() => {\n if (safeEnv.JIXO_DEEPSEEK_API_KEY) {\n return providers.deepseek(\"deepseek-chat\");\n }\n if (safeEnv.JIXO_GOOGLE_API_KEY) {\n return providers.google(\"gemini-2.5-pro-preview-05-06\");\n }\n if (safeEnv.JIXO_OPENAI_API_KEY) {\n return providers.openai(\"o3-mini\");\n }\n if (safeEnv.JIXO_ANTHROPIC_API_KEY) {\n return providers.anthropic(\"claude-4-sonnet-20250514\");\n }\n if (safeEnv.JIXO_XAI_API_KEY) {\n return providers.xai(\"grok-3-beta\");\n }\n if (safeEnv.JIXO_DEEPINFRA_API_KEY) {\n return providers.deepinfra(\"meta-llama/Meta-Llama-3.1-405B-Instruct\");\n }\n return providers.deepseek(\"deepseek-reasoner\");\n });\n};\n\nexport const tools = {\n fileSystem: func_lazy(() => {\n const map = new Map<string, ToolSet>();\n return (cwd: string) => {\n return map_get_or_put_async(map, cwd, async () => {\n const mcpClient = await createMCPClient({\n transport: new Experimental_StdioMCPTransport({\n command: \"pnpx\",\n args: [\"@modelcontextprotocol/server-filesystem\", cwd],\n }),\n });\n const tools = await mcpClient.tools();\n return tools;\n });\n };\n }),\n fetch: func_remember(async () => {\n const mcpClient = await createMCPClient({\n transport: new Experimental_StdioMCPTransport({\n command: \"uvx\",\n args: [\"mcp-server-fetch\"],\n }),\n });\n const tools = await mcpClient.tools();\n return tools;\n }),\n git: func_lazy(() => {\n const map = new Map<string, ToolSet>();\n\n return (repo: string) => {\n return map_get_or_put_async(map, repo, async () => {\n const mcpClient = await createMCPClient({\n transport: new Experimental_StdioMCPTransport({\n command: \"uvx\",\n args: [\"mcp-server-git\", \"--repository\", repo],\n }),\n });\n const tools = await mcpClient.tools();\n return tools;\n });\n };\n }),\n};\nexport const runAiTask = async (ai_task: AiTask, allFiles: FileEntry[], changedFiles: FileEntry[]) => {\n const model = getModel(ai_task.model);\n\n const modelMessage: ModelMessage[] = getModelMessage(ai_task.agents);\n modelMessage.push(\n //\n {\n role: \"system\",\n content: getPromptConfigs()\n .base.content //\n .replaceAll(\"{{task.name}}\", ai_task.name)\n .replaceAll(\"{{task.memory}}\", ai_task.memory)\n .replaceAll(\"{{task.content}}\", ai_task.content)\n .replaceAll(\"{{allFiles}}\", allFiles.map((file) => `- ${file.path}`).join(\"\\n\"))\n .replaceAll(\"{{changedFiles}}\", changedFiles.map((file) => `- ${file.path}`).join(\"\\n\")),\n },\n );\n // console.log(\"QAQ modelMessage\", modelMessage);\n // return;\n const result = streamText({\n model: model,\n prompt: modelMessage,\n tools: {\n ...(await tools.fileSystem(ai_task.cwd)),\n // ...(await tools.fetch()),\n // ...(await tools.git(ai_task.cwd)),\n },\n onChunk: ({chunk}) => {\n if (chunk.type === \"reasoning\") {\n if (reasoning === \"\") {\n loading.prefixText = \"šŸ¤” \";\n loading.text = \"\";\n }\n reasoning += chunk.text;\n loading.text = gray(reasoning.split(\"\\n\").slice(-3).join(\"\\n\"));\n }\n },\n });\n const loading = spinner.default(`Connecting To ${model.provider}...`);\n loading.prefixText = \"ā³ \";\n loading.start();\n let reasoning = \"\";\n let fulltext = \"\";\n for await (const text of result.textStream) {\n if (fulltext === \"\") {\n loading.prefixText = \"šŸ¤– \";\n loading.text = \"\";\n }\n fulltext += text;\n loading.text = fulltext;\n }\n\n loading.stopAndPersist({\n suffixText: green(`\\nāœ… ${cyan(`[${ai_task.name}]`)} Completed\\n`),\n });\n\n console.log(\"QAQ done\", result.text);\n};\n"]}
@@ -1,4 +0,0 @@
1
- export declare const upgrade: (dir: string, options: {
2
- mirrorUrl?: string;
3
- }) => Promise<void>;
4
- //# sourceMappingURL=upgrade.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO,GAAU,KAAK,MAAM,EAAE,SAAS;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,kBAavE,CAAC"}
@@ -1,17 +0,0 @@
1
- import { spinner, writeJson } from "@gaubee/nodekit";
2
- export const upgrade = async (dir, options) => {
3
- // TODO äø‹č½½ęœ€ę–°ēš„ęē¤ŗčÆé›†åˆ
4
- const mirrorUrl = options.mirrorUrl || "https://jixo.ai/jixo-prompts.json";
5
- const loading = spinner.default("Upgrading prompts");
6
- loading.start("Downloading...");
7
- // await delay(1000);
8
- try {
9
- const prompts = await fetch(mirrorUrl).then((res) => res.json());
10
- loading.stopAndPersist({ symbol: "āœ…", text: "Download completed" });
11
- writeJson(import.meta.resolve("jixo-prompts.json"), prompts);
12
- }
13
- catch (e) {
14
- loading.stopAndPersist({ symbol: "āŒ", text: "Download failed" });
15
- }
16
- };
17
- //# sourceMappingURL=upgrade.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAEnD,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,GAAW,EAAE,OAA6B,EAAE,EAAE;IAC1E,kBAAkB;IAClB,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,mCAAmC,CAAC;IAC3E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACrD,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAChC,uBAAuB;IACvB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,cAAc,CAAC,EAAC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,oBAAoB,EAAC,CAAC,CAAC;QAClE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,cAAc,CAAC,EAAC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,iBAAiB,EAAC,CAAC,CAAC;IACjE,CAAC;AACH,CAAC,CAAC","sourcesContent":["import {spinner, writeJson} from \"@gaubee/nodekit\";\n\nexport const upgrade = async (dir: string, options: {mirrorUrl?: string}) => {\n // TODO äø‹č½½ęœ€ę–°ēš„ęē¤ŗčÆé›†åˆ\n const mirrorUrl = options.mirrorUrl || \"https://jixo.ai/jixo-prompts.json\";\n const loading = spinner.default(\"Upgrading prompts\");\n loading.start(\"Downloading...\");\n // await delay(1000);\n try {\n const prompts = await fetch(mirrorUrl).then((res) => res.json());\n loading.stopAndPersist({symbol: \"āœ…\", text: \"Download completed\"});\n writeJson(import.meta.resolve(\"jixo-prompts.json\"), prompts);\n } catch (e) {\n loading.stopAndPersist({symbol: \"āŒ\", text: \"Download failed\"});\n }\n};\n"]}
@@ -1,3 +0,0 @@
1
- import type { ModelMessage } from "ai";
2
- export declare const getModelMessage: (agents: string[]) => ModelMessage[];
3
- //# sourceMappingURL=prompts.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/helper/prompts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,IAAI,CAAC;AAerC,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,EAAE,mBAc/C,CAAC"}
@@ -1,28 +0,0 @@
1
- import { createResolverByRootFile } from "@gaubee/node";
2
- import { readJson } from "@gaubee/nodekit";
3
- import { func_remember } from "@gaubee/util";
4
- import fs from "node:fs";
5
- import defaultPrompts from "../prompts.json" with { type: "json" };
6
- const rootResolver = createResolverByRootFile(import.meta.url);
7
- const getPromptConfigs = func_remember(() => {
8
- const download_prompts_json_filepath = rootResolver("prompts.json");
9
- if (fs.existsSync(download_prompts_json_filepath)) {
10
- return readJson(download_prompts_json_filepath);
11
- }
12
- return defaultPrompts;
13
- });
14
- export const getModelMessage = (agents) => {
15
- const promptConfigs = getPromptConfigs();
16
- const modelMessage = [];
17
- const names = agents.slice();
18
- for (const name of names) {
19
- const promptConfig = name in promptConfigs ? Reflect.get(promptConfigs, name) : null;
20
- if (!promptConfig) {
21
- continue;
22
- }
23
- modelMessage.unshift({ role: "system", content: promptConfig.content });
24
- names.push(...promptConfig.data.parent);
25
- }
26
- return modelMessage;
27
- };
28
- //# sourceMappingURL=prompts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/helper/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,wBAAwB,EAAC,MAAM,cAAc,CAAC;AACtD,OAAO,EAAC,QAAQ,EAAC,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,cAAc,MAAM,iBAAiB,CAAC,OAAM,IAAI,EAAE,MAAM,EAAC,CAAC;AACjE,MAAM,YAAY,GAAG,wBAAwB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/D,MAAM,gBAAgB,GAAG,aAAa,CAAC,GAA0B,EAAE;IACjE,MAAM,8BAA8B,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;IACpE,IAAI,EAAE,CAAC,UAAU,CAAC,8BAA8B,CAAC,EAAE,CAAC;QAClD,OAAO,QAAQ,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAgB,EAAE,EAAE;IAClD,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,YAAY,GAAmB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,IAAI,IAAI,aAAa,CAAC,CAAC,CAAE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAsB,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3G,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,SAAS;QACX,CAAC;QACD,YAAY,CAAC,OAAO,CAAC,EAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,EAAC,CAAC,CAAC;QACtE,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC","sourcesContent":["import {createResolverByRootFile} from \"@gaubee/node\";\nimport {readJson} from \"@gaubee/nodekit\";\nimport {func_remember} from \"@gaubee/util\";\nimport type {ModelMessage} from \"ai\";\nimport fs from \"node:fs\";\nimport defaultPrompts from \"../prompts.json\" with {type: \"json\"};\nconst rootResolver = createResolverByRootFile(import.meta.url);\n\nconst getPromptConfigs = func_remember((): typeof defaultPrompts => {\n const download_prompts_json_filepath = rootResolver(\"prompts.json\");\n if (fs.existsSync(download_prompts_json_filepath)) {\n return readJson(download_prompts_json_filepath);\n }\n return defaultPrompts;\n});\ntype PromptConfigs = typeof defaultPrompts;\ntype PromptItemConfig = PromptConfigs[keyof PromptConfigs];\n\nexport const getModelMessage = (agents: string[]) => {\n const promptConfigs = getPromptConfigs();\n const modelMessage: ModelMessage[] = [];\n const names = agents.slice();\n for (const name of names) {\n const promptConfig = name in promptConfigs ? (Reflect.get(promptConfigs, name) as PromptItemConfig) : null;\n if (!promptConfig) {\n continue;\n }\n modelMessage.unshift({role: \"system\", content: promptConfig.content});\n names.push(...promptConfig.data.parent);\n }\n\n return modelMessage;\n};\n"]}
@@ -1,12 +0,0 @@
1
- import { FileEntry } from "@gaubee/nodekit";
2
- import type { AiTask } from "./resolve-ai-tasks.js";
3
- export declare const providers: {
4
- readonly deepseek: import("@ai-sdk/deepseek").DeepSeekProvider;
5
- readonly anthropic: import("@ai-sdk/anthropic").AnthropicProvider;
6
- readonly google: import("@ai-sdk/google").GoogleGenerativeAIProvider;
7
- readonly openai: import("@ai-sdk/openai").OpenAIProvider;
8
- readonly xai: import("@ai-sdk/xai").XaiProvider;
9
- readonly deepinfra: import("@ai-sdk/deepinfra").DeepInfraProvider;
10
- };
11
- export declare const runAiTask: (ai_task: AiTask, allFiles: FileEntry[], changedFiles: FileEntry[]) => Promise<void>;
12
- //# sourceMappingURL=run-ai.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"run-ai.d.ts","sourceRoot":"","sources":["../../src/helper/run-ai.ts"],"names":[],"mappings":"AAMA,OAAO,EAAO,SAAS,EAAuB,MAAM,iBAAiB,CAAC;AAOtE,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,uBAAuB,CAAC;AAGlD,eAAO,MAAM,SAAS;;;;;;;CA2CpB,CAAC;AAsEH,eAAO,MAAM,SAAS,GAAU,SAAS,MAAM,EAAE,UAAU,SAAS,EAAE,EAAE,cAAc,SAAS,EAAE,kBAyDhG,CAAC"}
@@ -1,179 +0,0 @@
1
- import { createAnthropic } from "@ai-sdk/anthropic";
2
- import { createDeepInfra } from "@ai-sdk/deepinfra";
3
- import { createDeepSeek } from "@ai-sdk/deepseek";
4
- import { createGoogleGenerativeAI } from "@ai-sdk/google";
5
- import { createOpenAI } from "@ai-sdk/openai";
6
- import { createXai } from "@ai-sdk/xai";
7
- import { cyan, FileEntry, gray, green, spinner } from "@gaubee/nodekit";
8
- import { func_lazy, func_remember, map_get_or_put_async, obj_lazify } from "@gaubee/util";
9
- import { experimental_createMCPClient as createMCPClient, streamText } from "ai";
10
- import { Experimental_StdioMCPTransport } from "ai/mcp-stdio";
11
- import { match, P } from "ts-pattern";
12
- import { safeEnv } from "../env.js";
13
- import { getModelMessage, getPromptConfigs } from "./prompts-loader.js";
14
- // const wrapper = (provider:)
15
- export const providers = obj_lazify({
16
- get deepseek() {
17
- return createDeepSeek({
18
- baseURL: safeEnv.JIXO_DEEPSEEK_BASE_URL || undefined,
19
- apiKey: safeEnv.JIXO_DEEPSEEK_API_KEY,
20
- });
21
- },
22
- get anthropic() {
23
- // const bashTool = anthropic.tools.bash_20250124({
24
- // execute: async ({command, restart}) => execSync(command).toString(),
25
- // });
26
- const provider = createAnthropic({
27
- baseURL: safeEnv.JIXO_ANTHROPIC_BASE_URL || undefined,
28
- apiKey: safeEnv.JIXO_ANTHROPIC_API_KEY,
29
- });
30
- return provider;
31
- },
32
- get google() {
33
- return createGoogleGenerativeAI({
34
- baseURL: safeEnv.JIXO_GOOGLE_BASE_URL || undefined,
35
- apiKey: safeEnv.JIXO_GOOGLE_API_KEY,
36
- });
37
- },
38
- get openai() {
39
- return createOpenAI({
40
- baseURL: safeEnv.JIXO_OPENAI_BASE_URL || undefined,
41
- apiKey: safeEnv.JIXO_OPENAI_API_KEY,
42
- organization: safeEnv.JIXO_OPENAI_ORGANIZATION || undefined,
43
- });
44
- },
45
- get xai() {
46
- return createXai({
47
- baseURL: safeEnv.JIXO_XAI_BASE_URL || undefined,
48
- apiKey: safeEnv.JIXO_XAI_API_KEY,
49
- });
50
- },
51
- get deepinfra() {
52
- return createDeepInfra({
53
- baseURL: safeEnv.JIXO_DEEPINFRA_BASE_URL || undefined,
54
- apiKey: safeEnv.JIXO_DEEPINFRA_API_KEY,
55
- });
56
- },
57
- });
58
- const getModel = (model) => {
59
- return match(model)
60
- .with(P.string.startsWith("deepseek-"), (model) => providers.deepseek(model))
61
- .otherwise(() => {
62
- if (safeEnv.JIXO_DEEPSEEK_API_KEY) {
63
- return providers.deepseek("deepseek-chat");
64
- }
65
- if (safeEnv.JIXO_GOOGLE_API_KEY) {
66
- return providers.google("gemini-2.5-pro-preview-05-06");
67
- }
68
- if (safeEnv.JIXO_OPENAI_API_KEY) {
69
- return providers.openai("o3-mini");
70
- }
71
- if (safeEnv.JIXO_ANTHROPIC_API_KEY) {
72
- return providers.anthropic("claude-4-sonnet-20250514");
73
- }
74
- if (safeEnv.JIXO_XAI_API_KEY) {
75
- return providers.xai("grok-3-beta");
76
- }
77
- if (safeEnv.JIXO_DEEPINFRA_API_KEY) {
78
- return providers.deepinfra("meta-llama/Meta-Llama-3.1-405B-Instruct");
79
- }
80
- return providers.deepseek("deepseek-reasoner");
81
- });
82
- };
83
- const tools = {
84
- fileSystem: func_lazy(() => {
85
- const map = new Map();
86
- return (cwd) => {
87
- return map_get_or_put_async(map, cwd, async () => {
88
- const mcpClient = await createMCPClient({
89
- transport: new Experimental_StdioMCPTransport({
90
- command: "pnpx",
91
- args: ["@modelcontextprotocol/server-filesystem", cwd],
92
- }),
93
- });
94
- const tools = await mcpClient.tools();
95
- return tools;
96
- });
97
- };
98
- }),
99
- fetch: func_remember(async () => {
100
- const mcpClient = await createMCPClient({
101
- transport: new Experimental_StdioMCPTransport({
102
- command: "uvx",
103
- args: ["mcp-server-fetch"],
104
- }),
105
- });
106
- const tools = await mcpClient.tools();
107
- return tools;
108
- }),
109
- git: func_lazy(() => {
110
- const map = new Map();
111
- return (repo) => {
112
- return map_get_or_put_async(map, repo, async () => {
113
- const mcpClient = await createMCPClient({
114
- transport: new Experimental_StdioMCPTransport({
115
- command: "uvx",
116
- args: ["mcp-server-git", "--repository", repo],
117
- }),
118
- });
119
- const tools = await mcpClient.tools();
120
- return tools;
121
- });
122
- };
123
- }),
124
- };
125
- export const runAiTask = async (ai_task, allFiles, changedFiles) => {
126
- const model = getModel(ai_task.model);
127
- const modelMessage = getModelMessage(ai_task.agents);
128
- modelMessage.push(
129
- //
130
- {
131
- role: "system",
132
- content: getPromptConfigs()
133
- .base.content //
134
- .replaceAll("{{task.name}}", ai_task.name)
135
- .replaceAll("{{task.memory}}", ai_task.memory)
136
- .replaceAll("{{task.content}}", ai_task.content)
137
- .replaceAll("{{allFiles}}", allFiles.map((file) => `- ${file.path}`).join("\n"))
138
- .replaceAll("{{changedFiles}}", changedFiles.map((file) => `- ${file.path}`).join("\n")),
139
- });
140
- // console.log("QAQ modelMessage", modelMessage);
141
- // return;
142
- const result = streamText({
143
- model: model,
144
- prompt: modelMessage,
145
- tools: {
146
- ...(await tools.fileSystem(ai_task.cwd)),
147
- // ...(await tools.fetch()),
148
- // ...(await tools.git(ai_task.cwd)),
149
- },
150
- onChunk: ({ chunk }) => {
151
- if (chunk.type === "reasoning") {
152
- if (reasoning === "") {
153
- loading.prefixText = "šŸ¤” ";
154
- loading.text = "";
155
- }
156
- reasoning += chunk.text;
157
- loading.text = gray(reasoning.split("\n").slice(-3).join("\n"));
158
- }
159
- },
160
- });
161
- const loading = spinner(`Connecting To ${model.provider}...`);
162
- loading.prefixText = "ā³ ";
163
- loading.start();
164
- let reasoning = "";
165
- let fulltext = "";
166
- for await (const text of result.textStream) {
167
- if (fulltext === "") {
168
- loading.prefixText = "šŸ¤– ";
169
- loading.text = "";
170
- }
171
- fulltext += text;
172
- loading.text = fulltext;
173
- }
174
- loading.stopAndPersist({
175
- suffixText: green(`\nāœ… ${cyan(`[${ai_task.name}]`)} Completed\n`),
176
- });
177
- console.log("QAQ done", result.text);
178
- };
179
- //# sourceMappingURL=run-ai.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"run-ai.js","sourceRoot":"","sources":["../../src/helper/run-ai.ts"],"names":[],"mappings":"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","sourcesContent":["import {createAnthropic} from \"@ai-sdk/anthropic\";\nimport {createDeepInfra} from \"@ai-sdk/deepinfra\";\nimport {createDeepSeek} from \"@ai-sdk/deepseek\";\nimport {createGoogleGenerativeAI} from \"@ai-sdk/google\";\nimport {createOpenAI} from \"@ai-sdk/openai\";\nimport {createXai} from \"@ai-sdk/xai\";\nimport {cyan, FileEntry, gray, green, spinner} from \"@gaubee/nodekit\";\nimport {func_lazy, func_remember, map_get_or_put_async, obj_lazify} from \"@gaubee/util\";\nimport {experimental_createMCPClient as createMCPClient, streamText, type ModelMessage, type ToolSet} from \"ai\";\nimport {Experimental_StdioMCPTransport} from \"ai/mcp-stdio\";\nimport {match, P} from \"ts-pattern\";\nimport {safeEnv} from \"../env.js\";\nimport {getModelMessage, getPromptConfigs} from \"./prompts-loader.js\";\nimport type {AiTask} from \"./resolve-ai-tasks.js\";\n\n// const wrapper = (provider:)\nexport const providers = obj_lazify({\n get deepseek() {\n return createDeepSeek({\n baseURL: safeEnv.JIXO_DEEPSEEK_BASE_URL || undefined,\n apiKey: safeEnv.JIXO_DEEPSEEK_API_KEY,\n });\n },\n get anthropic() {\n // const bashTool = anthropic.tools.bash_20250124({\n // execute: async ({command, restart}) => execSync(command).toString(),\n // });\n\n const provider = createAnthropic({\n baseURL: safeEnv.JIXO_ANTHROPIC_BASE_URL || undefined,\n apiKey: safeEnv.JIXO_ANTHROPIC_API_KEY,\n });\n return provider;\n },\n get google() {\n return createGoogleGenerativeAI({\n baseURL: safeEnv.JIXO_GOOGLE_BASE_URL || undefined,\n apiKey: safeEnv.JIXO_GOOGLE_API_KEY,\n });\n },\n get openai() {\n return createOpenAI({\n baseURL: safeEnv.JIXO_OPENAI_BASE_URL || undefined,\n apiKey: safeEnv.JIXO_OPENAI_API_KEY,\n organization: safeEnv.JIXO_OPENAI_ORGANIZATION || undefined,\n });\n },\n get xai() {\n return createXai({\n baseURL: safeEnv.JIXO_XAI_BASE_URL || undefined,\n apiKey: safeEnv.JIXO_XAI_API_KEY,\n });\n },\n get deepinfra() {\n return createDeepInfra({\n baseURL: safeEnv.JIXO_DEEPINFRA_BASE_URL || undefined,\n apiKey: safeEnv.JIXO_DEEPINFRA_API_KEY,\n });\n },\n});\nconst getModel = (model?: string) => {\n return match(model)\n .with(P.string.startsWith(\"deepseek-\"), (model) => providers.deepseek(model))\n .otherwise(() => {\n if (safeEnv.JIXO_DEEPSEEK_API_KEY) {\n return providers.deepseek(\"deepseek-chat\");\n }\n if (safeEnv.JIXO_GOOGLE_API_KEY) {\n return providers.google(\"gemini-2.5-pro-preview-05-06\");\n }\n if (safeEnv.JIXO_OPENAI_API_KEY) {\n return providers.openai(\"o3-mini\");\n }\n if (safeEnv.JIXO_ANTHROPIC_API_KEY) {\n return providers.anthropic(\"claude-4-sonnet-20250514\");\n }\n if (safeEnv.JIXO_XAI_API_KEY) {\n return providers.xai(\"grok-3-beta\");\n }\n if (safeEnv.JIXO_DEEPINFRA_API_KEY) {\n return providers.deepinfra(\"meta-llama/Meta-Llama-3.1-405B-Instruct\");\n }\n return providers.deepseek(\"deepseek-reasoner\");\n });\n};\n\nconst tools = {\n fileSystem: func_lazy(() => {\n const map = new Map<string, ToolSet>();\n return (cwd: string) => {\n return map_get_or_put_async(map, cwd, async () => {\n const mcpClient = await createMCPClient({\n transport: new Experimental_StdioMCPTransport({\n command: \"pnpx\",\n args: [\"@modelcontextprotocol/server-filesystem\", cwd],\n }),\n });\n const tools = await mcpClient.tools();\n return tools;\n });\n };\n }),\n fetch: func_remember(async () => {\n const mcpClient = await createMCPClient({\n transport: new Experimental_StdioMCPTransport({\n command: \"uvx\",\n args: [\"mcp-server-fetch\"],\n }),\n });\n const tools = await mcpClient.tools();\n return tools;\n }),\n git: func_lazy(() => {\n const map = new Map<string, ToolSet>();\n\n return (repo: string) => {\n return map_get_or_put_async(map, repo, async () => {\n const mcpClient = await createMCPClient({\n transport: new Experimental_StdioMCPTransport({\n command: \"uvx\",\n args: [\"mcp-server-git\", \"--repository\", repo],\n }),\n });\n const tools = await mcpClient.tools();\n return tools;\n });\n };\n }),\n};\nexport const runAiTask = async (ai_task: AiTask, allFiles: FileEntry[], changedFiles: FileEntry[]) => {\n const model = getModel(ai_task.model);\n\n const modelMessage: ModelMessage[] = getModelMessage(ai_task.agents);\n modelMessage.push(\n //\n {\n role: \"system\",\n content: getPromptConfigs()\n .base.content //\n .replaceAll(\"{{task.name}}\", ai_task.name)\n .replaceAll(\"{{task.memory}}\", ai_task.memory)\n .replaceAll(\"{{task.content}}\", ai_task.content)\n .replaceAll(\"{{allFiles}}\", allFiles.map((file) => `- ${file.path}`).join(\"\\n\"))\n .replaceAll(\"{{changedFiles}}\", changedFiles.map((file) => `- ${file.path}`).join(\"\\n\")),\n },\n );\n // console.log(\"QAQ modelMessage\", modelMessage);\n // return;\n const result = streamText({\n model: model,\n prompt: modelMessage,\n tools: {\n ...(await tools.fileSystem(ai_task.cwd)),\n // ...(await tools.fetch()),\n // ...(await tools.git(ai_task.cwd)),\n },\n onChunk: ({chunk}) => {\n if (chunk.type === \"reasoning\") {\n if (reasoning === \"\") {\n loading.prefixText = \"šŸ¤” \";\n loading.text = \"\";\n }\n reasoning += chunk.text;\n loading.text = gray(reasoning.split(\"\\n\").slice(-3).join(\"\\n\"));\n }\n },\n });\n const loading = spinner.default(`Connecting To ${model.provider}...`);\n loading.prefixText = \"ā³ \";\n loading.start();\n let reasoning = \"\";\n let fulltext = \"\";\n for await (const text of result.textStream) {\n if (fulltext === \"\") {\n loading.prefixText = \"šŸ¤– \";\n loading.text = \"\";\n }\n fulltext += text;\n loading.text = fulltext;\n }\n\n loading.stopAndPersist({\n suffixText: green(`\\nāœ… ${cyan(`[${ai_task.name}]`)} Completed\\n`),\n });\n\n console.log(\"QAQ done\", result.text);\n};\n"]}