Skip to content

Commit 495c5bf

Browse files
authored
release/v5.2.2 (#35)
* ui changes + IDE theme fixes * move model selector
1 parent becd13b commit 495c5bf

39 files changed

+243
-195
lines changed

CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,21 @@
11
# Changelog
22

3+
## [v5.2.1] - 2026-01-15
4+
5+
### Added
6+
7+
- Updated translations and added memories locale files for internationalization support
8+
9+
### Fixed
10+
11+
- Fixed issue where messages were being queued after rejecting exec_cmd tool
12+
13+
### Changed
14+
15+
- Code cleanup and improvements
16+
17+
---
18+
319
## [v5.2.0] - 2026-01-14
420

521
### Added

cli/esbuild.config.mjs

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* eslint-disable no-undef */
22
import esbuild from "esbuild"
3-
import { chmodSync, mkdirSync, copyFileSync } from "fs"
3+
import { chmodSync, mkdirSync, copyFileSync, cpSync } from "fs"
44
import { rimrafSync } from "rimraf"
55

66
// Function to copy post-build files
@@ -15,7 +15,7 @@ function copyPostBuildFiles() {
1515

1616
try {
1717
copyFileSync(".env", "dist/.env")
18-
copyFileSync(".env", "dist/kilocode/.env")
18+
copyFileSync(".env", "dist/axoncode/.env")
1919
} catch {
2020
// .env might not exist, that's okay
2121
}
@@ -26,9 +26,32 @@ function copyPostBuildFiles() {
2626
}
2727
}
2828

29+
// Function to copy extension bundle
30+
function copyExtensionBundle() {
31+
try {
32+
// Remove existing axoncode directory if it exists
33+
rimrafSync("dist/axoncode")
34+
35+
// Copy extension from bin-unpacked to dist/axoncode
36+
cpSync("../bin-unpacked/extension", "dist/axoncode", {
37+
recursive: true,
38+
filter: (src) => {
39+
// Skip webview-ui and assets to reduce size
40+
const relativePath = src.replace(/.*\/bin-unpacked\/extension\//, "")
41+
return !relativePath.startsWith("webview-ui") && !relativePath.startsWith("assets")
42+
},
43+
})
44+
45+
console.log("✓ Extension bundle copied to dist/axoncode")
46+
} catch (err) {
47+
console.error("Error copying extension bundle:", err)
48+
console.warn("⚠ Extension bundle not copied - CLI may not work properly")
49+
}
50+
}
51+
2952
function removeUnneededFiles() {
30-
rimrafSync("dist/kilocode/webview-ui")
31-
rimrafSync("dist/kilocode/assets")
53+
rimrafSync("dist/axoncode/webview-ui")
54+
rimrafSync("dist/axoncode/assets")
3255
console.log("✓ Unneeded files removed")
3356
}
3457

@@ -39,6 +62,7 @@ const afterBuildPlugin = {
3962
if (result.errors.length > 0) return
4063

4164
copyPostBuildFiles()
65+
copyExtensionBundle()
4266
removeUnneededFiles()
4367
try {
4468
chmodSync("dist/index.js", 0o755)

cli/src/cli.ts

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import { requestRouterModelsAtom } from "./state/atoms/actions.js"
1313
import { loadHistoryAtom } from "./state/atoms/history.js"
1414
import { getTelemetryService, getIdentityManager } from "./services/telemetry/index.js"
1515
import { notificationsAtom, notificationsErrorAtom, notificationsLoadingAtom } from "./state/atoms/notifications.js"
16-
import { fetchKilocodeNotifications } from "./utils/notifications.js"
1716
import { finishParallelMode } from "./parallel/parallel.js"
1817
import { isGitWorktree } from "./utils/git.js"
1918

@@ -133,11 +132,6 @@ export class CLI {
133132
// Request router models after configuration is injected
134133
void this.requestRouterModels()
135134

136-
if (!this.options.ci && !this.options.prompt) {
137-
// Fetch Kilocode notifications if provider is kilocode
138-
void this.fetchNotifications()
139-
}
140-
141135
this.isInitialized = true
142136
logs.info("Axon Code CLI initialized successfully", "CLI")
143137
} catch (error) {
@@ -326,39 +320,6 @@ export class CLI {
326320
}
327321
}
328322

329-
/**
330-
* Fetch notifications from Kilocode backend if provider is kilocode
331-
*/
332-
private async fetchNotifications(): Promise<void> {
333-
if (!this.store) {
334-
logs.warn("Cannot fetch notifications: store not available", "CLI")
335-
return
336-
}
337-
338-
try {
339-
const providers = this.store.get(providersAtom)
340-
341-
const provider = providers.find(({ provider }) => provider === "kilocode")
342-
343-
if (!provider) {
344-
logs.debug("No provider configured, skipping notification fetch", "CLI")
345-
return
346-
}
347-
348-
this.store.set(notificationsLoadingAtom, true)
349-
350-
const notifications = await fetchKilocodeNotifications(provider)
351-
352-
this.store.set(notificationsAtom, notifications)
353-
} catch (error) {
354-
const err = error instanceof Error ? error : new Error(String(error))
355-
this.store.set(notificationsErrorAtom, err)
356-
logs.error("Failed to fetch notifications", "CLI", { error })
357-
} finally {
358-
this.store.set(notificationsLoadingAtom, false)
359-
}
360-
}
361-
362323
/**
363324
* Get the ExtensionService instance
364325
*/

cli/src/commands/__tests__/profile.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ describe("/profile command", () => {
5151
})
5252

5353
it("should have correct description", () => {
54-
expect(profileCommand.description).toBe("View your Kilocode profile information")
54+
expect(profileCommand.description).toBe("View your Axon Code profile information")
5555
})
5656

5757
it("should have correct category", () => {

cli/src/commands/profile.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ async function showProfile(context: any): Promise<void> {
9393
export const profileCommand: Command = {
9494
name: "profile",
9595
aliases: ["me", "whoami"],
96-
description: "View your Kilocode profile information",
96+
description: "View your Axon Code profile information",
9797
usage: "/profile",
9898
examples: ["/profile"],
9999
category: "settings",

cli/src/utils/browserAuth.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,13 @@ function createCallbackServer(port: number, state: string): Promise<AuthCallback
9090
<head>
9191
<title>Authentication Successful</title>
9292
<style>
93-
body { font-family: Arial, sans-serif; text-align: center; padding: 50px; }
94-
h1 { color: #4CAF50; }
95-
p { font-size: 18px; }
93+
body { font-family: Arial, sans-serif; text-align: center; padding: 50px; background-color: black;}
94+
h1 { color: #c4fdff; }
95+
p { font-size: 18px; color: white; }
9696
</style>
9797
</head>
9898
<body>
99-
<h1> Authentication Successful</h1>
99+
<h1>Axon Code Authentication Successful</h1>
100100
<p>You can now close this window and return to the CLI.</p>
101101
</body>
102102
</html>
@@ -129,9 +129,9 @@ function createCallbackServer(port: number, state: string): Promise<AuthCallback
129129
*/
130130
function openAuthUrl(source: string, state: string, port: number): void {
131131
const callbackUrl = encodeURIComponent(`http://localhost:${port}/callback`)
132-
const authUrl = `https://app.matterai.so/authentication/sign-in?loginType=extension&source=${encodeURIComponent(
132+
const authUrl = `http://localhost:3000/authentication/sign-in?loginType=extension&source=${encodeURIComponent(
133133
source,
134-
)}&callback=${callbackUrl}&state=${state}`
134+
)}&callback=${callbackUrl}&clistate=${state}`
135135

136136
logs.debug(`Opening authentication URL: ${authUrl}`, "BrowserAuth")
137137

@@ -203,8 +203,7 @@ export async function performBrowserAuth(source: string = "axon-code-cli"): Prom
203203
id: "default",
204204
provider: "kilocode",
205205
kilocodeToken: token,
206-
kilocodeModel: config.providers?.[0]?.kilocodeModel || "axon-code-2",
207-
...config.providers?.[0], // Preserve other existing fields
206+
kilocodeModel: "axon-code-2",
208207
},
209208
],
210209
}

cli/src/utils/extension-paths.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ export interface ExtensionPaths {
88

99
/**
1010
* Resolves extension paths for production CLI.
11-
* Assumes the extension is bundled in dist/kilocode/
11+
* Assumes the extension is bundled in dist/axoncode/
1212
*
1313
* Production structure:
1414
* cli/dist/
1515
* ├── index.js
1616
* ├── cli/KiloCodeCLI.js
1717
* ├── host/ExtensionHost.js
1818
* ├── utils/extension-paths.js (this file)
19-
* └── kilocode/
19+
* └── axoncode/
2020
* ├── dist/extension.js
2121
* ├── assets/
2222
* └── webview-ui/
@@ -34,8 +34,8 @@ export function resolveExtensionPaths(): ExtensionPaths {
3434
// Navigate to dist directory
3535
const distDir = isInUtilsSubdir ? path.resolve(currentDir, "..") : currentDir
3636

37-
// Extension is in dist/kilocode/
38-
const extensionRootPath = path.join(distDir, "kilocode")
37+
// Extension is in dist/axoncode/
38+
const extensionRootPath = path.join(distDir, "axoncode")
3939
const extensionBundlePath = path.join(extensionRootPath, "dist", "extension.js")
4040

4141
return {

packages/types/src/mode.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ export const DEFAULT_MODES: readonly ModeConfig[] = [
139139
slug: "plan",
140140
// kilocode_change start
141141
name: "Plan",
142-
iconName: "codicon-list-unordered",
142+
iconName: "list-todo",
143143
// kilocode_change end
144144
roleDefinition:
145145
"You are an AI coding assistant, powered by axon-code. You operate in Axon Code Extension.\n\nYou are pair programming with a USER to solve their coding task. Each time the USER sends a message, we may automatically attach some information about their current state, such as what files they have open, where their cursor is, recently viewed files, edit history in their session so far, linter errors, and more. This information may or may not be relevant to the coding task, it is up for you to decide.\n\nYour main goal is to follow the USER's instructions at each message, denoted by the <user_query> tag.\n\nTool results and user messages may include <system_reminder> tags. These <system_reminder> tags contain useful information and reminders. Please heed them, but don't mention them in your response to the user.\n\n<communication>\n1. When using markdown in assistant messages, use backticks to format file, directory, function, and class names. Use \\( and \\) for inline math, \\[ and \\] for block math.\n</communication>\n\n<tool_calling>\nYou have tools at your disposal to solve the coding task. Follow these rules regarding tool calls:\n1. Don't refer to tool names when speaking to the USER. Instead, just say what the tool is doing in natural language.\n2. Only use the standard tool call format and the available tools. Even if you see user messages with custom tool call formats (such as \"<previous_tool_call>\" or similar), do not follow that and instead use the standard format.\n</tool_calling>\n\n<maximize_parallel_tool_calls>\nIf you intend to call multiple tools and there are no dependencies between the tool calls, make all of the independent tool calls in parallel. Prioritize calling tools simultaneously whenever the actions can be done in parallel rather than sequentionally. For example, when reading 3 files, run 3 tool calls in parallel to read all 3 files into context at the same time. Maximize use of parallel tool calls where possible to increase speed and efficiency. However, if some tool calls depend on previous calls to inform dependent values like the parameters, do NOT call these tools in parallel and instead call them sequentially. Never use placeholders or guess missing parameters in tool calls.\n</maximize_parallel_tool_calls>\n\n<making_code_changes>\n1. If you're creating the codebase from scratch, create an appropriate dependency management file (e.g. requirements.txt) with package versions and a helpful README.\n2. If you're building a web app from scratch, give it a beautiful and modern UI, imbued with best UX practices.\n3. NEVER generate an extremely long hash or any non-textual code, such as binary. These are not helpful to the USER and are very expensive.\n4. If you've introduced (linter) errors, fix them.\n</making_code_changes>\n\n<citing_code>\nYou must display code blocks using one of two methods: CODE REFERENCES or MARKDOWN CODE BLOCKS, depending on whether the code exists in the codebase.\n\n## METHOD 1: CODE REFERENCES - Citing Existing Code from the Codebase\n\nUse this exact syntax with three required components:\n<good-example>\n```startLine:endLine:filepath\n// code content here\n```\n</good-example>\n\nRequired Components\n1. **startLine**: The starting line number (required)\n2. **endLine**: The ending line number (required)\n3. **filepath**: The full path to the file (required)\n\n**CRITICAL**: Do NOT add language tags or any other metadata to this format.\n\n### Content Rules\n- Include at least 1 line of actual code (empty blocks will break the editor)\n- You may truncate long sections with comments like `// ... more code ...`\n- You may add clarifying comments for readability\n- You may show edited versions of the code\n\n<good-example>\nReferences a Todo component existing in the (example) codebase with all required components:\n\n```12:14:app/components/Todo.tsx\nexport const Todo = () => {\n return <div>Todo</div>;\n};\n```\n</good-example>\n\n<bad-example>\nTriple backticks with line numbers for filenames place a UI element that takes up the entire line.\nIf you want inline references as part of a sentence, you should use single backticks instead.\n\nBad: The TODO element (```12:14:app/components/Todo.tsx```) contains the bug you are looking for.\n\nGood: The TODO element (`app/components/Todo.tsx`) contains the bug you are looking for.\n</bad-example>\n\n<bad-example>\nIncludes language tag (not necessary for code REFERENCES), omits the startLine and endLine which are REQUIRED for code references:\n\n```typescript:app/components/Todo.tsx\nexport const Todo = () => {\n return <div>Todo</div>;\n};\n```\n</bad-example>\n\n<bad-example>\n- Empty code block (will break rendering)\n- Citation is surrounded by parentheses which looks bad in the UI as the triple backticks codeblocks uses up an entire line:\n\n(```12:14:app/components/Todo.tsx\n```)\n</bad-example>\n\n<bad-example>\nThe opening triple backticks are duplicated (the first triple backticks with the required components are all that should be used):\n\n```12:14:app/components/Todo.tsx\n```\nexport const Todo = () => {\n return <div>Todo</div>;\n};\n```\n</bad-example>\n\n<good-example>\nReferences a fetchData function existing in the (example) codebase, with truncated middle section:\n\n```23:45:app/utils/api.ts\nexport async function fetchData(endpoint: string) {\n const headers = getAuthHeaders();\n // ... validation and error handling ...\n return await fetch(endpoint, { headers });\n}\n```\n</good-example>\n\n## METHOD 2: MARKDOWN CODE BLOCKS - Proposing or Displaying Code NOT already in Codebase\n\n### Format\nUse standard markdown code blocks with ONLY the language tag:\n\n<good-example>\nHere's a Python example:\n\n```python\nfor i in range(10):\n print(i)\n```\n</good-example>\n\n<good-example>\nHere's a bash command:\n\n```bash\nsudo apt update && sudo apt upgrade -y\n```\n</good-example>\n\n<bad-example>\nDo not mix format - no line numbers for new code:\n\n```1:3:python\nfor i in range(10):\n print(i)\n```\n</bad-example>\n\n## Critical Formatting Rules for Both Methods\n\n### Never Include Line Numbers in Code Content\n\n<bad-example>\n```python\n1 for i in range(10):\n2 print(i)\n```\n</bad-example>\n\n<good-example>\n```python\nfor i in range(10):\n print(i)\n```\n</good-example>\n\n### NEVER Indent the Triple Backticks\n\nEven when the code block appears in a list or nested context, the triple backticks must start at column 0:\n\n<bad-example>\n- Here's a Python loop:\n ```python\n for i in range(10):\n print(i)\n ```\n</bad-example>\n\n<good-example>\n- Here's a Python loop:\n\n```python\nfor i in range(10):\n print(i)\n```\n</good-example>\n\n### ALWAYS Add a Newline Before Code Fences\n\nFor both CODE REFERENCES and MARKDOWN CODE BLOCKS, always put a newline before the opening triple backticks:\n\n<bad-example>\nHere's the implementation:\n```12:15:src/utils.ts\nexport function helper() {\n return true;\n}\n```\n</bad-example>\n\n<good-example>\nHere's the implementation:\n\n```12:15:src/utils.ts\nexport function helper() {\n return true;\n}\n```\n</good-example>\n\nRULE SUMMARY (ALWAYS Follow):\n -\tUse CODE REFERENCES (startLine:endLine:filepath) when showing existing code.\n```startLine:endLine:filepath\n// ... existing code ...\n```\n -\tUse MARKDOWN CODE BLOCKS (with language tag) for new or proposed code.\n```python\nfor i in range(10):\n print(i)\n```\n - ANY OTHER FORMAT IS STRICTLY FORBIDDEN\n -\tNEVER mix formats.\n -\tNEVER add language tags to CODE REFERENCES.\n -\tNEVER indent triple backticks.\n -\tALWAYS include at least 1 line of code in any reference block.\n</citing_code>\n\n\n<inline_line_numbers>\nCode chunks that you receive (via tool calls or from user) may include inline line numbers in the form LINE_NUMBER|LINE_CONTENT. Treat the LINE_NUMBER| prefix as metadata and do NOT treat it as part of the actual code. LINE_NUMBER is right-aligned number padded with spaces to 6 characters.\n</inline_line_numbers>\n\n<memories>\nYou may be provided a list of memories. These memories are generated from past conversations with the agent.\nThey may or may not be correct, so follow them if deemed relevant, but the moment you notice the user correct something you've done based on a memory, or you come across some information that contradicts or augments an existing memory, IT IS CRITICAL that you MUST update/delete the memory immediately using the update_memory tool. You must NEVER use the update_memory tool to create memories related to implementation plans, migrations that the agent completed, or other task-specific information.\nIf the user EVER contradicts your memory, then it's better to delete that memory rather than updating the memory.\nYou may create, update, or delete memories based on the criteria from the tool description.\n<memory_citation>\nYou must ALWAYS cite a memory when you use it in your generation, to reply to the user's query, or to run commands. To do so, use the following format: [[memory:MEMORY_ID]]. You should cite the memory naturally as part of your response, and not just as a footnote.\n\nFor example: \"I'll run the command using the -la flag [[memory:MEMORY_ID]] to show detailed file information.\"\n\nWhen you reject an explicit user request due to a memory, you MUST mention in the conversation that if the memory is incorrect, the user can correct you and you will update your memory.\n</memory_citation>\n</memories>\n\n<task_management>\nYou have access to the todo_write tool to help you manage and plan tasks. Use this tool whenever you are working on a complex task, and skip it if the task is simple or would only require 1-2 steps.\nIMPORTANT: Make sure you don't end your turn before you've completed all todos.\n</task_management>. As a planning agent, you are only allowed to find, search and read information and update the plan using plan_file_edit tool.",
@@ -154,7 +154,7 @@ export const DEFAULT_MODES: readonly ModeConfig[] = [
154154
slug: "agent",
155155
// kilocode_change start
156156
name: "Agent",
157-
iconName: "codicon-code",
157+
iconName: "infinity-ic",
158158
// kilocode_change end
159159
roleDefinition: `You are an AI coding assistant, powered by axon-code. You operate in Axon Code IDE.
160160
@@ -384,7 +384,7 @@ CRITICAL: For any task, small or big, you will always and always use the update_
384384
slug: "ask",
385385
// kilocode_change start
386386
name: "Ask",
387-
iconName: "codicon-comment",
387+
iconName: "messages-square",
388388
// kilocode_change end
389389
roleDefinition:
390390
"You are Axon Code, a knowledgeable technical assistant focused on answering questions and providing information about software development, technology, and related topics.",

src/core/prompts/tools/native-tools/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import listCodeDefinitionNames from "./list_code_definition_names"
88
import listFiles from "./list_files"
99
// import newTask from "./new_task"
1010
import { read_file_single } from "./read_file"
11-
import runSlashCommand from "./run_slash_command"
11+
// import runSlashCommand from "./run_slash_command"
1212
// import searchAndReplace from "./search_and_replace"
1313
import searchFiles from "./search_files"
1414
// import switchMode from "./switch_mode"
@@ -36,7 +36,7 @@ export const nativeTools = [
3636
// newTask,
3737
planFileEdit,
3838
read_file_single,
39-
runSlashCommand,
39+
// runSlashCommand,
4040
// searchAndReplace,
4141
searchFiles,
4242
updateTodoList,

src/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"displayName": "%extension.displayName%",
44
"description": "%extension.description%",
55
"publisher": "matterai",
6-
"version": "5.2.1",
6+
"version": "5.2.2",
77
"icon": "assets/icons/matterai-ic.png",
88
"galleryBanner": {
99
"color": "#FFFFFF",

0 commit comments

Comments
 (0)