@jixo/cli 0.9.0 → 0.10.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.
Files changed (45) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +35 -3
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/tasks/run-ai-task.d.ts.map +1 -1
  5. package/dist/commands/tasks/run-ai-task.js +70 -33
  6. package/dist/commands/tasks/run-ai-task.js.map +1 -1
  7. package/dist/commands/tasks/run.d.ts +2 -0
  8. package/dist/commands/tasks/run.d.ts.map +1 -1
  9. package/dist/commands/tasks/run.js +66 -35
  10. package/dist/commands/tasks/run.js.map +1 -1
  11. package/dist/config.d.ts +14 -14
  12. package/dist/helper/ai-retry-error.d.ts +1 -3
  13. package/dist/helper/ai-retry-error.d.ts.map +1 -1
  14. package/dist/helper/ai-retry-error.js +3 -3
  15. package/dist/helper/ai-retry-error.js.map +1 -1
  16. package/dist/helper/parse-progress.d.ts +2 -0
  17. package/dist/helper/parse-progress.d.ts.map +1 -0
  18. package/dist/helper/parse-progress.js +28 -0
  19. package/dist/helper/parse-progress.js.map +1 -0
  20. package/dist/helper/resolve-ai-tasks.d.ts +3 -0
  21. package/dist/helper/resolve-ai-tasks.d.ts.map +1 -1
  22. package/dist/helper/resolve-ai-tasks.js +9 -3
  23. package/dist/helper/resolve-ai-tasks.js.map +1 -1
  24. package/dist/prompts.json +1 -1
  25. package/package.json +2 -2
  26. package/dist/commands/run.d.ts +0 -5
  27. package/dist/commands/run.d.ts.map +0 -1
  28. package/dist/commands/run.js +0 -36
  29. package/dist/commands/run.js.map +0 -1
  30. package/dist/commands/tasks/run-ai.d.ts +0 -278
  31. package/dist/commands/tasks/run-ai.d.ts.map +0 -1
  32. package/dist/commands/tasks/run-ai.js +0 -179
  33. package/dist/commands/tasks/run-ai.js.map +0 -1
  34. package/dist/commands/upgrade.d.ts +0 -4
  35. package/dist/commands/upgrade.d.ts.map +0 -1
  36. package/dist/commands/upgrade.js +0 -17
  37. package/dist/commands/upgrade.js.map +0 -1
  38. package/dist/helper/prompts.d.ts +0 -3
  39. package/dist/helper/prompts.d.ts.map +0 -1
  40. package/dist/helper/prompts.js +0 -28
  41. package/dist/helper/prompts.js.map +0 -1
  42. package/dist/helper/run-ai.d.ts +0 -12
  43. package/dist/helper/run-ai.d.ts.map +0 -1
  44. package/dist/helper/run-ai.js +0 -179
  45. 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 "./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"]}