From af15778b3899e155c9d7e7b76851999c7cfa410d Mon Sep 17 00:00:00 2001 From: John Trujillo Date: Fri, 31 Jul 2026 16:12:35 -0500 Subject: [PATCH 1/2] feat(ai-assistant): add edit_file tool for local LLM and Gemini backends Approval-gated find/replace with a before/after diff: a file open in the editor is changed through the buffer (Ctrl+Z-able), a closed one via atomic temp-then-rename. ai-core now turns native model-load failures into actionable user messages instead of a bare null-handle error. --- ai-assistant/ai-assistant.html | 11 +- ai-assistant/build.gradle.kts | 4 +- ai-assistant/src/main/assets/docs/index.html | 6 + .../plugins/aiassistant/AiAssistantPlugin.kt | 127 +++- .../fragments/ApprovalDialogFragment.kt | 207 +++++- .../fragments/ApprovalTextFormatter.kt | 91 +++ .../aiassistant/fragments/ChatFragment.kt | 82 ++- .../plugins/aiassistant/tool/AgentLoop.kt | 32 +- .../plugins/aiassistant/tool/Executor.kt | 129 +++- .../plugins/aiassistant/tool/RespondArgs.kt | 20 + .../aiassistant/tool/ToolApprovalManager.kt | 131 +++- .../aiassistant/tool/ToolCallExtractor.kt | 34 +- .../plugins/aiassistant/tool/ToolHandler.kt | 30 + .../plugins/aiassistant/tool/ToolRouter.kt | 7 + .../tool/handlers/EditFileHandler.kt | 440 ++++++++++++ .../aiassistant/tool/handlers/PathGuard.kt | 80 ++- .../tool/handlers/edit/AtomicFileWriter.kt | 110 +++ .../tool/handlers/edit/EditTargetResolver.kt | 82 +++ .../tool/handlers/edit/EditorBufferApplier.kt | 159 +++++ .../tool/handlers/edit/FileTextMatcher.kt | 92 +++ .../plugins/aiassistant/utils/AgentTrace.kt | 122 ++++ .../plugins/aiassistant/utils/ToolArgs.kt | 17 + .../viewmodel/AgentReplyRenderer.kt | 46 ++ .../aiassistant/viewmodel/ChatViewModel.kt | 213 ++++-- ai-assistant/src/main/res/values/strings.xml | 12 + .../fragments/ApprovalTextFormatterTest.kt | 144 ++++ .../plugins/aiassistant/tool/AgentLoopTest.kt | 25 +- .../plugins/aiassistant/tool/ExecutorTest.kt | 327 ++++++++- .../aiassistant/tool/RespondArgsTest.kt | 51 ++ .../tool/ToolApprovalManagerTest.kt | 154 ++++ .../aiassistant/tool/ToolCallExtractorTest.kt | 39 + .../aiassistant/tool/ToolRouterTest.kt | 57 ++ .../tool/handlers/EditFileHandlerTest.kt | 670 ++++++++++++++++++ .../handlers/edit/AtomicFileWriterTest.kt | 103 +++ .../handlers/edit/EditTargetResolverTest.kt | 157 ++++ .../tool/handlers/edit/FileTextMatcherTest.kt | 97 +++ .../aiassistant/utils/AgentTraceTest.kt | 69 ++ .../plugins/aiassistant/utils/ToolArgsTest.kt | 46 ++ .../viewmodel/AgentReplyRendererTest.kt | 127 ++++ ai-core/build.gradle.kts | 4 +- 40 files changed, 4131 insertions(+), 223 deletions(-) create mode 100644 ai-assistant/src/main/kotlin/com/itsaky/androidide/plugins/aiassistant/fragments/ApprovalTextFormatter.kt create mode 100644 ai-assistant/src/main/kotlin/com/itsaky/androidide/plugins/aiassistant/tool/RespondArgs.kt create mode 100644 ai-assistant/src/main/kotlin/com/itsaky/androidide/plugins/aiassistant/tool/handlers/EditFileHandler.kt create mode 100644 ai-assistant/src/main/kotlin/com/itsaky/androidide/plugins/aiassistant/tool/handlers/edit/AtomicFileWriter.kt create mode 100644 ai-assistant/src/main/kotlin/com/itsaky/androidide/plugins/aiassistant/tool/handlers/edit/EditTargetResolver.kt create mode 100644 ai-assistant/src/main/kotlin/com/itsaky/androidide/plugins/aiassistant/tool/handlers/edit/EditorBufferApplier.kt create mode 100644 ai-assistant/src/main/kotlin/com/itsaky/androidide/plugins/aiassistant/tool/handlers/edit/FileTextMatcher.kt create mode 100644 ai-assistant/src/main/kotlin/com/itsaky/androidide/plugins/aiassistant/utils/AgentTrace.kt create mode 100644 ai-assistant/src/main/kotlin/com/itsaky/androidide/plugins/aiassistant/utils/ToolArgs.kt create mode 100644 ai-assistant/src/main/kotlin/com/itsaky/androidide/plugins/aiassistant/viewmodel/AgentReplyRenderer.kt create mode 100644 ai-assistant/src/test/kotlin/com/itsaky/androidide/plugins/aiassistant/fragments/ApprovalTextFormatterTest.kt create mode 100644 ai-assistant/src/test/kotlin/com/itsaky/androidide/plugins/aiassistant/tool/RespondArgsTest.kt create mode 100644 ai-assistant/src/test/kotlin/com/itsaky/androidide/plugins/aiassistant/tool/ToolApprovalManagerTest.kt create mode 100644 ai-assistant/src/test/kotlin/com/itsaky/androidide/plugins/aiassistant/tool/ToolRouterTest.kt create mode 100644 ai-assistant/src/test/kotlin/com/itsaky/androidide/plugins/aiassistant/tool/handlers/EditFileHandlerTest.kt create mode 100644 ai-assistant/src/test/kotlin/com/itsaky/androidide/plugins/aiassistant/tool/handlers/edit/AtomicFileWriterTest.kt create mode 100644 ai-assistant/src/test/kotlin/com/itsaky/androidide/plugins/aiassistant/tool/handlers/edit/EditTargetResolverTest.kt create mode 100644 ai-assistant/src/test/kotlin/com/itsaky/androidide/plugins/aiassistant/tool/handlers/edit/FileTextMatcherTest.kt create mode 100644 ai-assistant/src/test/kotlin/com/itsaky/androidide/plugins/aiassistant/utils/AgentTraceTest.kt create mode 100644 ai-assistant/src/test/kotlin/com/itsaky/androidide/plugins/aiassistant/utils/ToolArgsTest.kt create mode 100644 ai-assistant/src/test/kotlin/com/itsaky/androidide/plugins/aiassistant/viewmodel/AgentReplyRendererTest.kt diff --git a/ai-assistant/ai-assistant.html b/ai-assistant/ai-assistant.html index 8589741c..0ff7d284 100644 --- a/ai-assistant/ai-assistant.html +++ b/ai-assistant/ai-assistant.html @@ -65,9 +65,14 @@

2. Core Functionality