@x-code-cli/core 0.1.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 (125) hide show
  1. package/dist/agent/loop.d.ts +19 -0
  2. package/dist/agent/loop.d.ts.map +1 -0
  3. package/dist/agent/loop.js +443 -0
  4. package/dist/agent/loop.js.map +1 -0
  5. package/dist/agent/messages.d.ts +8 -0
  6. package/dist/agent/messages.d.ts.map +1 -0
  7. package/dist/agent/messages.js +51 -0
  8. package/dist/agent/messages.js.map +1 -0
  9. package/dist/agent/plan-mode.d.ts +11 -0
  10. package/dist/agent/plan-mode.d.ts.map +1 -0
  11. package/dist/agent/plan-mode.js +37 -0
  12. package/dist/agent/plan-mode.js.map +1 -0
  13. package/dist/agent/pricing.d.ts +9 -0
  14. package/dist/agent/pricing.d.ts.map +1 -0
  15. package/dist/agent/pricing.js +47 -0
  16. package/dist/agent/pricing.js.map +1 -0
  17. package/dist/agent/system-prompt.d.ts +9 -0
  18. package/dist/agent/system-prompt.d.ts.map +1 -0
  19. package/dist/agent/system-prompt.js +93 -0
  20. package/dist/agent/system-prompt.js.map +1 -0
  21. package/dist/config/index.d.ts +28 -0
  22. package/dist/config/index.d.ts.map +1 -0
  23. package/dist/config/index.js +88 -0
  24. package/dist/config/index.js.map +1 -0
  25. package/dist/index.d.ts +20 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +24 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/knowledge/auto-memory.d.ts +36 -0
  30. package/dist/knowledge/auto-memory.d.ts.map +1 -0
  31. package/dist/knowledge/auto-memory.js +151 -0
  32. package/dist/knowledge/auto-memory.js.map +1 -0
  33. package/dist/knowledge/hooks.d.ts +3 -0
  34. package/dist/knowledge/hooks.d.ts.map +1 -0
  35. package/dist/knowledge/hooks.js +59 -0
  36. package/dist/knowledge/hooks.js.map +1 -0
  37. package/dist/knowledge/init.d.ts +8 -0
  38. package/dist/knowledge/init.d.ts.map +1 -0
  39. package/dist/knowledge/init.js +98 -0
  40. package/dist/knowledge/init.js.map +1 -0
  41. package/dist/knowledge/loader.d.ts +14 -0
  42. package/dist/knowledge/loader.d.ts.map +1 -0
  43. package/dist/knowledge/loader.js +130 -0
  44. package/dist/knowledge/loader.js.map +1 -0
  45. package/dist/knowledge/session.d.ts +11 -0
  46. package/dist/knowledge/session.d.ts.map +1 -0
  47. package/dist/knowledge/session.js +108 -0
  48. package/dist/knowledge/session.js.map +1 -0
  49. package/dist/permissions/index.d.ts +14 -0
  50. package/dist/permissions/index.d.ts.map +1 -0
  51. package/dist/permissions/index.js +46 -0
  52. package/dist/permissions/index.js.map +1 -0
  53. package/dist/providers/registry.d.ts +2 -0
  54. package/dist/providers/registry.d.ts.map +1 -0
  55. package/dist/providers/registry.js +46 -0
  56. package/dist/providers/registry.js.map +1 -0
  57. package/dist/tools/ask-user.d.ts +8 -0
  58. package/dist/tools/ask-user.d.ts.map +1 -0
  59. package/dist/tools/ask-user.js +19 -0
  60. package/dist/tools/ask-user.js.map +1 -0
  61. package/dist/tools/edit.d.ts +7 -0
  62. package/dist/tools/edit.d.ts.map +1 -0
  63. package/dist/tools/edit.js +14 -0
  64. package/dist/tools/edit.js.map +1 -0
  65. package/dist/tools/enter-plan-mode.d.ts +2 -0
  66. package/dist/tools/enter-plan-mode.d.ts.map +1 -0
  67. package/dist/tools/enter-plan-mode.js +11 -0
  68. package/dist/tools/enter-plan-mode.js.map +1 -0
  69. package/dist/tools/exit-plan-mode.d.ts +2 -0
  70. package/dist/tools/exit-plan-mode.d.ts.map +1 -0
  71. package/dist/tools/exit-plan-mode.js +9 -0
  72. package/dist/tools/exit-plan-mode.js.map +1 -0
  73. package/dist/tools/glob.d.ts +5 -0
  74. package/dist/tools/glob.d.ts.map +1 -0
  75. package/dist/tools/glob.js +28 -0
  76. package/dist/tools/glob.js.map +1 -0
  77. package/dist/tools/grep.d.ts +7 -0
  78. package/dist/tools/grep.d.ts.map +1 -0
  79. package/dist/tools/grep.js +54 -0
  80. package/dist/tools/grep.js.map +1 -0
  81. package/dist/tools/index.d.ts +77 -0
  82. package/dist/tools/index.d.ts.map +1 -0
  83. package/dist/tools/index.js +41 -0
  84. package/dist/tools/index.js.map +1 -0
  85. package/dist/tools/list-dir.d.ts +4 -0
  86. package/dist/tools/list-dir.d.ts.map +1 -0
  87. package/dist/tools/list-dir.js +25 -0
  88. package/dist/tools/list-dir.js.map +1 -0
  89. package/dist/tools/read-file.d.ts +6 -0
  90. package/dist/tools/read-file.d.ts.map +1 -0
  91. package/dist/tools/read-file.js +28 -0
  92. package/dist/tools/read-file.js.map +1 -0
  93. package/dist/tools/save-knowledge.d.ts +8 -0
  94. package/dist/tools/save-knowledge.d.ts.map +1 -0
  95. package/dist/tools/save-knowledge.js +36 -0
  96. package/dist/tools/save-knowledge.js.map +1 -0
  97. package/dist/tools/shell-utils.d.ts +14 -0
  98. package/dist/tools/shell-utils.d.ts.map +1 -0
  99. package/dist/tools/shell-utils.js +111 -0
  100. package/dist/tools/shell-utils.js.map +1 -0
  101. package/dist/tools/shell.d.ts +5 -0
  102. package/dist/tools/shell.d.ts.map +1 -0
  103. package/dist/tools/shell.js +12 -0
  104. package/dist/tools/shell.js.map +1 -0
  105. package/dist/tools/web-fetch.d.ts +5 -0
  106. package/dist/tools/web-fetch.d.ts.map +1 -0
  107. package/dist/tools/web-fetch.js +59 -0
  108. package/dist/tools/web-fetch.js.map +1 -0
  109. package/dist/tools/web-search.d.ts +5 -0
  110. package/dist/tools/web-search.d.ts.map +1 -0
  111. package/dist/tools/web-search.js +27 -0
  112. package/dist/tools/web-search.js.map +1 -0
  113. package/dist/tools/write-file.d.ts +5 -0
  114. package/dist/tools/write-file.d.ts.map +1 -0
  115. package/dist/tools/write-file.js +12 -0
  116. package/dist/tools/write-file.js.map +1 -0
  117. package/dist/types/index.d.ts +108 -0
  118. package/dist/types/index.d.ts.map +1 -0
  119. package/dist/types/index.js +36 -0
  120. package/dist/types/index.js.map +1 -0
  121. package/dist/utils.d.ts +9 -0
  122. package/dist/utils.d.ts.map +1 -0
  123. package/dist/utils.js +34 -0
  124. package/dist/utils.js.map +1 -0
  125. package/package.json +42 -0
@@ -0,0 +1,59 @@
1
+ // @x-code/core — webFetch tool (HTTP fetch + HTML→Markdown)
2
+ import * as cheerio from 'cheerio';
3
+ // @ts-expect-error turndown has no types
4
+ import TurndownService from 'turndown';
5
+ import { tool } from 'ai';
6
+ import { z } from 'zod';
7
+ const FETCH_TIMEOUT_MS = 15000;
8
+ const MAX_CONTENT_CHARS = 30000;
9
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
10
+ const turndown = new TurndownService({
11
+ headingStyle: 'atx',
12
+ codeBlockStyle: 'fenced',
13
+ });
14
+ export const webFetch = tool({
15
+ description: 'Fetch a web page and extract its content as markdown. No API key needed.',
16
+ inputSchema: z.object({
17
+ url: z.string().url().describe('The URL to fetch'),
18
+ prompt: z.string().optional().describe('What information to extract from the page'),
19
+ }),
20
+ execute: async ({ url, prompt }) => {
21
+ try {
22
+ const response = await fetch(url, {
23
+ headers: {
24
+ 'User-Agent': 'Mozilla/5.0 (compatible; X-Code-CLI/0.1)',
25
+ Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
26
+ },
27
+ signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
28
+ });
29
+ if (!response.ok) {
30
+ return `Error: HTTP ${response.status} ${response.statusText}`;
31
+ }
32
+ const contentType = response.headers.get('content-type') ?? '';
33
+ const body = await response.text();
34
+ if (contentType.includes('application/json')) {
35
+ return body.slice(0, MAX_CONTENT_CHARS);
36
+ }
37
+ // HTML → Markdown
38
+ const $ = cheerio.load(body);
39
+ $('script, style, nav, footer, header, aside, .sidebar, .nav, .menu, .ads, .advertisement').remove();
40
+ const mainContent = $('main, article, .content, .post, #content').first();
41
+ const html = mainContent.length ? mainContent.html() : $('body').html();
42
+ if (!html)
43
+ return 'Error: Could not extract content from page.';
44
+ let markdown = turndown.turndown(html);
45
+ if (markdown.length > MAX_CONTENT_CHARS) {
46
+ markdown = markdown.slice(0, MAX_CONTENT_CHARS) + '\n\n... [content truncated]';
47
+ }
48
+ if (prompt) {
49
+ return `# Content from ${url}\n\n${markdown}\n\n---\nExtract instruction: ${prompt}`;
50
+ }
51
+ return markdown;
52
+ }
53
+ catch (err) {
54
+ const msg = err instanceof Error ? err.message : String(err);
55
+ return `Error fetching URL: ${msg}`;
56
+ }
57
+ },
58
+ });
59
+ //# sourceMappingURL=web-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-fetch.js","sourceRoot":"","sources":["../../src/tools/web-fetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare const webSearch: import("ai").Tool<{
2
+ query: string;
3
+ maxResults?: number | undefined;
4
+ }, string>;
5
+ //# sourceMappingURL=web-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,SAAS;;;UAwBpB,CAAA"}
@@ -0,0 +1,27 @@
1
+ // @x-code/core — webSearch tool (Tavily API)
2
+ import { tool } from 'ai';
3
+ import { z } from 'zod';
4
+ export const webSearch = tool({
5
+ description: 'Search the web for information. Useful for looking up documentation, error messages, or current information.',
6
+ inputSchema: z.object({
7
+ query: z.string().describe('The search query'),
8
+ maxResults: z.number().optional().describe('Max results (default: 5)'),
9
+ }),
10
+ execute: async ({ query, maxResults }) => {
11
+ if (!process.env.TAVILY_API_KEY) {
12
+ return 'Error: TAVILY_API_KEY is not configured. Get a free API key (1000 searches/month) at https://tavily.com';
13
+ }
14
+ try {
15
+ const { tavily } = await import('@tavily/core');
16
+ const client = tavily({ apiKey: process.env.TAVILY_API_KEY });
17
+ const response = await client.search(query, { maxResults: maxResults ?? 5 });
18
+ const results = response.results.map((r) => `### ${r.title}\n${r.url}\n${r.content}`);
19
+ return results.join('\n\n') || 'No results found.';
20
+ }
21
+ catch (err) {
22
+ const msg = err instanceof Error ? err.message : String(err);
23
+ return `Error searching: ${msg}`;
24
+ }
25
+ },
26
+ });
27
+ //# sourceMappingURL=web-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC;IAC5B,WAAW,EACT,8GAA8G;IAChH,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAC9C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;KACvE,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE;QACvC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;YAChC,OAAO,yGAAyG,CAAA;QAClH,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;YAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAA;YAC7D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,IAAI,CAAC,EAAE,CAAC,CAAA;YAC5E,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAClC,CAAC,CAAkD,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CACjG,CAAA;YACD,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,mBAAmB,CAAA;QACpD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC5D,OAAO,oBAAoB,GAAG,EAAE,CAAA;QAClC,CAAC;IACH,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ export declare const writeFile: import("ai").Tool<{
2
+ filePath: string;
3
+ content: string;
4
+ }, never>;
5
+ //# sourceMappingURL=write-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-file.d.ts","sourceRoot":"","sources":["../../src/tools/write-file.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,SAAS;;;SAQpB,CAAA"}
@@ -0,0 +1,12 @@
1
+ // @x-code/core — writeFile tool (no execute — needs permission check in agent loop)
2
+ import { tool } from 'ai';
3
+ import { z } from 'zod';
4
+ export const writeFile = tool({
5
+ description: 'Create or overwrite a file at the given path. Always prefer edit (string replacement) over writeFile for modifying existing files.',
6
+ inputSchema: z.object({
7
+ filePath: z.string().describe('Absolute path to the file'),
8
+ content: z.string().describe('The full content to write'),
9
+ }),
10
+ // No execute — handled manually in agent loop for permission check
11
+ });
12
+ //# sourceMappingURL=write-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-file.js","sourceRoot":"","sources":["../../src/tools/write-file.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC;IAC5B,WAAW,EACT,oIAAoI;IACtI,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAC1D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KAC1D,CAAC;IACF,mEAAmE;CACpE,CAAC,CAAA"}
@@ -0,0 +1,108 @@
1
+ import type { LanguageModel, ModelMessage } from 'ai';
2
+ export type PermissionLevel = 'always-allow' | 'ask' | 'deny';
3
+ export interface TokenUsage {
4
+ inputTokens: number;
5
+ outputTokens: number;
6
+ totalTokens: number;
7
+ estimatedCost: number;
8
+ costCurrency: 'USD' | 'CNY';
9
+ }
10
+ export interface DisplayMessage {
11
+ id: string;
12
+ role: 'user' | 'assistant' | 'tool';
13
+ content: string;
14
+ toolCalls?: DisplayToolCall[];
15
+ timestamp: number;
16
+ }
17
+ export interface DisplayToolCall {
18
+ id: string;
19
+ toolName: string;
20
+ input: Record<string, unknown>;
21
+ output?: string;
22
+ status: 'pending' | 'running' | 'completed' | 'denied';
23
+ }
24
+ export interface AgentCallbacks {
25
+ onTextDelta: (text: string) => void;
26
+ onToolCall: (toolName: string, input: Record<string, unknown>) => void;
27
+ onToolResult: (toolCallId: string, result: string) => void;
28
+ onAskPermission: (toolCall: {
29
+ toolName: string;
30
+ input: Record<string, unknown>;
31
+ }) => Promise<boolean>;
32
+ onAskUser: (question: string, options: {
33
+ label: string;
34
+ description: string;
35
+ }[]) => Promise<string>;
36
+ onShellOutput: (chunk: string) => void;
37
+ onUsageUpdate: (usage: TokenUsage) => void;
38
+ onContextCompressed: (summary: string) => void;
39
+ onError: (error: Error) => void;
40
+ }
41
+ export interface AgentOptions {
42
+ modelId: string;
43
+ trustMode: boolean;
44
+ maxTurns: number;
45
+ printMode: boolean;
46
+ systemPromptExtra?: string;
47
+ abortSignal?: AbortSignal;
48
+ }
49
+ export interface AppConfig {
50
+ model?: string;
51
+ }
52
+ export interface KnowledgeFact {
53
+ key: string;
54
+ fact: string;
55
+ category: 'tech-stack' | 'commands' | 'conventions' | 'preferences' | 'context';
56
+ date: string;
57
+ }
58
+ export interface SessionSummary {
59
+ id: string;
60
+ title: string;
61
+ startedAt: string;
62
+ endedAt: string;
63
+ status: 'completed' | 'in_progress' | 'abandoned';
64
+ summary: string;
65
+ keyResults: string[];
66
+ pendingWork: string[];
67
+ filesModified: string[];
68
+ decisions: string[];
69
+ }
70
+ export interface RuleFrontmatter {
71
+ alwaysApply?: boolean;
72
+ paths?: string[];
73
+ description?: string;
74
+ }
75
+ export interface RuleFile {
76
+ filename: string;
77
+ frontmatter: RuleFrontmatter;
78
+ content: string;
79
+ }
80
+ export declare const MODEL_ALIASES: Record<string, string>;
81
+ export declare const PROVIDER_DETECTION_ORDER: readonly [{
82
+ readonly envKey: "ANTHROPIC_API_KEY";
83
+ readonly defaultModel: "anthropic:claude-sonnet-4-5";
84
+ }, {
85
+ readonly envKey: "OPENAI_API_KEY";
86
+ readonly defaultModel: "openai:gpt-4.1";
87
+ }, {
88
+ readonly envKey: "DEEPSEEK_API_KEY";
89
+ readonly defaultModel: "deepseek:deepseek-chat";
90
+ }, {
91
+ readonly envKey: "ALIBABA_API_KEY";
92
+ readonly defaultModel: "alibaba:qwen-max";
93
+ }, {
94
+ readonly envKey: "GOOGLE_GENERATIVE_AI_API_KEY";
95
+ readonly defaultModel: "google:gemini-2.5-pro";
96
+ }, {
97
+ readonly envKey: "XAI_API_KEY";
98
+ readonly defaultModel: "xai:grok-3";
99
+ }, {
100
+ readonly envKey: "ZHIPU_API_KEY";
101
+ readonly defaultModel: "zhipu:glm-4-plus";
102
+ }, {
103
+ readonly envKey: "MOONSHOT_API_KEY";
104
+ readonly defaultModel: "moonshotai:kimi-k2.5";
105
+ }];
106
+ export declare const PROVIDER_KEY_URLS: Record<string, string>;
107
+ export type { ModelMessage, LanguageModel };
108
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ // ─── Model aliases ───
2
+ export const MODEL_ALIASES = {
3
+ sonnet: 'anthropic:claude-sonnet-4-5',
4
+ opus: 'anthropic:claude-opus-4-6',
5
+ haiku: 'anthropic:claude-haiku-4-5',
6
+ gpt4: 'openai:gpt-4.1',
7
+ gemini: 'google:gemini-2.5-pro',
8
+ deepseek: 'deepseek:deepseek-chat',
9
+ r1: 'deepseek:deepseek-reasoner',
10
+ qwen: 'alibaba:qwen-max',
11
+ glm: 'zhipu:glm-4-plus',
12
+ kimi: 'moonshotai:kimi-k2.5',
13
+ };
14
+ // ─── Provider detection order (for smart defaults) ───
15
+ export const PROVIDER_DETECTION_ORDER = [
16
+ { envKey: 'ANTHROPIC_API_KEY', defaultModel: 'anthropic:claude-sonnet-4-5' },
17
+ { envKey: 'OPENAI_API_KEY', defaultModel: 'openai:gpt-4.1' },
18
+ { envKey: 'DEEPSEEK_API_KEY', defaultModel: 'deepseek:deepseek-chat' },
19
+ { envKey: 'ALIBABA_API_KEY', defaultModel: 'alibaba:qwen-max' },
20
+ { envKey: 'GOOGLE_GENERATIVE_AI_API_KEY', defaultModel: 'google:gemini-2.5-pro' },
21
+ { envKey: 'XAI_API_KEY', defaultModel: 'xai:grok-3' },
22
+ { envKey: 'ZHIPU_API_KEY', defaultModel: 'zhipu:glm-4-plus' },
23
+ { envKey: 'MOONSHOT_API_KEY', defaultModel: 'moonshotai:kimi-k2.5' },
24
+ ];
25
+ // ─── Provider API key URLs ───
26
+ export const PROVIDER_KEY_URLS = {
27
+ anthropic: 'https://console.anthropic.com/',
28
+ openai: 'https://platform.openai.com/api-keys',
29
+ google: 'https://aistudio.google.com/apikey',
30
+ xai: 'https://console.x.ai/',
31
+ deepseek: 'https://platform.deepseek.com/api_keys',
32
+ alibaba: 'https://dashscope.console.aliyun.com/apiKey',
33
+ zhipu: 'https://open.bigmodel.cn/usercenter/apikeys',
34
+ moonshotai: 'https://platform.moonshot.ai/console/api-keys',
35
+ };
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAsGA,wBAAwB;AAExB,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,MAAM,EAAE,6BAA6B;IACrC,IAAI,EAAE,2BAA2B;IACjC,KAAK,EAAE,4BAA4B;IACnC,IAAI,EAAE,gBAAgB;IACtB,MAAM,EAAE,uBAAuB;IAC/B,QAAQ,EAAE,wBAAwB;IAClC,EAAE,EAAE,4BAA4B;IAChC,IAAI,EAAE,kBAAkB;IACxB,GAAG,EAAE,kBAAkB;IACvB,IAAI,EAAE,sBAAsB;CAC7B,CAAA;AAED,wDAAwD;AAExD,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,EAAE,MAAM,EAAE,mBAAmB,EAAE,YAAY,EAAE,6BAA6B,EAAE;IAC5E,EAAE,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EAAE;IAC5D,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,wBAAwB,EAAE;IACtE,EAAE,MAAM,EAAE,iBAAiB,EAAE,YAAY,EAAE,kBAAkB,EAAE;IAC/D,EAAE,MAAM,EAAE,8BAA8B,EAAE,YAAY,EAAE,uBAAuB,EAAE;IACjF,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE;IACrD,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,kBAAkB,EAAE;IAC7D,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,sBAAsB,EAAE;CAC5D,CAAA;AAEV,gCAAgC;AAEhC,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,SAAS,EAAE,gCAAgC;IAC3C,MAAM,EAAE,sCAAsC;IAC9C,MAAM,EAAE,oCAAoC;IAC5C,GAAG,EAAE,uBAAuB;IAC5B,QAAQ,EAAE,wCAAwC;IAClD,OAAO,EAAE,6CAA6C;IACtD,KAAK,EAAE,6CAA6C;IACpD,UAAU,EAAE,+CAA+C;CAC5D,CAAA"}
@@ -0,0 +1,9 @@
1
+ /** Project-local config directory name */
2
+ export declare const XCODE_DIR = ".x-code";
3
+ /** Check if a file exists */
4
+ export declare function fileExists(filePath: string): Promise<boolean>;
5
+ /** Read a file safely, return empty string on error */
6
+ export declare function readFileSafe(filePath: string): Promise<string>;
7
+ /** Read and parse a JSON file, return null on error */
8
+ export declare function readJsonSafe(filePath: string): Promise<Record<string, unknown> | null>;
9
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAGA,0CAA0C;AAC1C,eAAO,MAAM,SAAS,YAAY,CAAA;AAElC,6BAA6B;AAC7B,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED,uDAAuD;AACvD,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMpE;AAED,uDAAuD;AACvD,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAO5F"}
package/dist/utils.js ADDED
@@ -0,0 +1,34 @@
1
+ // @x-code/core — Shared utilities and constants
2
+ import fs from 'node:fs/promises';
3
+ /** Project-local config directory name */
4
+ export const XCODE_DIR = '.x-code';
5
+ /** Check if a file exists */
6
+ export async function fileExists(filePath) {
7
+ try {
8
+ await fs.access(filePath);
9
+ return true;
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ /** Read a file safely, return empty string on error */
16
+ export async function readFileSafe(filePath) {
17
+ try {
18
+ return await fs.readFile(filePath, 'utf-8');
19
+ }
20
+ catch {
21
+ return '';
22
+ }
23
+ }
24
+ /** Read and parse a JSON file, return null on error */
25
+ export async function readJsonSafe(filePath) {
26
+ try {
27
+ const content = await fs.readFile(filePath, 'utf-8');
28
+ return JSON.parse(content);
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAEjC,0CAA0C;AAC1C,MAAM,CAAC,MAAM,SAAS,GAAG,SAAS,CAAA;AAElC,6BAA6B;AAC7B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACzB,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAA;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@x-code-cli/core",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": {
7
+ "import": "./dist/index.js",
8
+ "types": "./dist/index.d.ts"
9
+ }
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "engines": {
15
+ "node": ">=20.19.0"
16
+ },
17
+ "scripts": {
18
+ "build": "tsc -b",
19
+ "dev": "tsc -b --watch"
20
+ },
21
+ "dependencies": {
22
+ "ai": "^6.0.0",
23
+ "@ai-sdk/anthropic": "^3.0.0",
24
+ "@ai-sdk/openai": "^3.0.0",
25
+ "@ai-sdk/google": "^3.0.0",
26
+ "@ai-sdk/xai": "^3.0.0",
27
+ "@ai-sdk/deepseek": "^2.0.0",
28
+ "@ai-sdk/alibaba": "^1.0.0",
29
+ "@ai-sdk/moonshotai": "^2.0.0",
30
+ "@ai-sdk/openai-compatible": "^2.0.0",
31
+ "zhipu-ai-provider": "^0.2.0",
32
+ "zod": "^3.25.76",
33
+ "globby": "^14.0.0",
34
+ "execa": "^9.0.0",
35
+ "@tavily/core": "^0.7.0",
36
+ "@vscode/ripgrep": "^1.17.0",
37
+ "cheerio": "^1.0.0",
38
+ "turndown": "^7.2.0",
39
+ "diff": "^8.0.0",
40
+ "chalk": "^5.4.0"
41
+ }
42
+ }