diff --git a/build/electron-builder.runtime.json b/build/electron-builder.runtime.json index 01a90595..0c9656f2 100644 --- a/build/electron-builder.runtime.json +++ b/build/electron-builder.runtime.json @@ -1,15 +1,9 @@ { - "extends": "/Users/zacharyzhang/Documents/Github/AgentCompany/electron-builder.yml", + "extends": "C:\\Users\\zhang\\Documents\\GitHub\\AgentCompany\\electron-builder.yml", "directories": { - "output": "/Users/zacharyzhang/Documents/Github/AgentCompany/build/release" + "output": "C:\\Users\\zhang\\Documents\\GitHub\\AgentCompany\\build\\release" }, "extraMetadata": { - "version": "0.4.55" - }, - "mac": { - "hardenedRuntime": false, - "target": [ - "zip" - ] + "version": "0.4.59" } } diff --git a/build/release/builder-debug.yml b/build/release/builder-debug.yml index dc3635d4..5690603b 100644 --- a/build/release/builder-debug.yml +++ b/build/release/builder-debug.yml @@ -1,4 +1,4 @@ -arm64: +x64: firstOrDefaultFilePatterns: - '!**/node_modules/**' - '!assets{,/**/*}' @@ -16,3 +16,5 @@ arm64: - '**/*' - out/** - package.json +nsis: + script: "!include \"C:\\Users\\zhang\\Documents\\GitHub\\AgentCompany\\node_modules\\.pnpm\\app-builder-lib@26.8.1_dmg-_62d31da0b96a3ea7b7d51a6bbe3b3b6e\\node_modules\\app-builder-lib\\templates\\nsis\\include\\StdUtils.nsh\"\n!addincludedir \"C:\\Users\\zhang\\Documents\\GitHub\\AgentCompany\\node_modules\\.pnpm\\app-builder-lib@26.8.1_dmg-_62d31da0b96a3ea7b7d51a6bbe3b3b6e\\node_modules\\app-builder-lib\\templates\\nsis\\include\"\n!macro _isUpdated _a _b _t _f\n ${StdUtils.TestParameter} $R9 \"updated\"\n StrCmp \"$R9\" \"true\" `${_t}` `${_f}`\n!macroend\n!define isUpdated `\"\" isUpdated \"\"`\n\n!macro _isForceRun _a _b _t _f\n ${StdUtils.TestParameter} $R9 \"force-run\"\n StrCmp \"$R9\" \"true\" `${_t}` `${_f}`\n!macroend\n!define isForceRun `\"\" isForceRun \"\"`\n\n!macro _isKeepShortcuts _a _b _t _f\n ${StdUtils.TestParameter} $R9 \"keep-shortcuts\"\n StrCmp \"$R9\" \"true\" `${_t}` `${_f}`\n!macroend\n!define isKeepShortcuts `\"\" isKeepShortcuts \"\"`\n\n!macro _isNoDesktopShortcut _a _b _t _f\n ${StdUtils.TestParameter} $R9 \"no-desktop-shortcut\"\n StrCmp \"$R9\" \"true\" `${_t}` `${_f}`\n!macroend\n!define isNoDesktopShortcut `\"\" isNoDesktopShortcut \"\"`\n\n!macro _isDeleteAppData _a _b _t _f\n ${StdUtils.TestParameter} $R9 \"delete-app-data\"\n StrCmp \"$R9\" \"true\" `${_t}` `${_f}`\n!macroend\n!define isDeleteAppData `\"\" isDeleteAppData \"\"`\n\n!macro _isForAllUsers _a _b _t _f\n ${StdUtils.TestParameter} $R9 \"allusers\"\n StrCmp \"$R9\" \"true\" `${_t}` `${_f}`\n!macroend\n!define isForAllUsers `\"\" isForAllUsers \"\"`\n\n!macro _isForCurrentUser _a _b _t _f\n ${StdUtils.TestParameter} $R9 \"currentuser\"\n StrCmp \"$R9\" \"true\" `${_t}` `${_f}`\n!macroend\n!define isForCurrentUser `\"\" isForCurrentUser \"\"`\n\n!macro addLangs\n !insertmacro MUI_LANGUAGE \"English\"\n !insertmacro MUI_LANGUAGE \"German\"\n !insertmacro MUI_LANGUAGE \"French\"\n !insertmacro MUI_LANGUAGE \"SpanishInternational\"\n !insertmacro MUI_LANGUAGE \"SimpChinese\"\n !insertmacro MUI_LANGUAGE \"TradChinese\"\n !insertmacro MUI_LANGUAGE \"Japanese\"\n !insertmacro MUI_LANGUAGE \"Korean\"\n !insertmacro MUI_LANGUAGE \"Italian\"\n !insertmacro MUI_LANGUAGE \"Dutch\"\n !insertmacro MUI_LANGUAGE \"Danish\"\n !insertmacro MUI_LANGUAGE \"Swedish\"\n !insertmacro MUI_LANGUAGE \"Norwegian\"\n !insertmacro MUI_LANGUAGE \"Finnish\"\n !insertmacro MUI_LANGUAGE \"Russian\"\n !insertmacro MUI_LANGUAGE \"Portuguese\"\n !insertmacro MUI_LANGUAGE \"PortugueseBR\"\n !insertmacro MUI_LANGUAGE \"Polish\"\n !insertmacro MUI_LANGUAGE \"Ukrainian\"\n !insertmacro MUI_LANGUAGE \"Czech\"\n !insertmacro MUI_LANGUAGE \"Slovak\"\n !insertmacro MUI_LANGUAGE \"Hungarian\"\n !insertmacro MUI_LANGUAGE \"Arabic\"\n !insertmacro MUI_LANGUAGE \"Turkish\"\n !insertmacro MUI_LANGUAGE \"Thai\"\n !insertmacro MUI_LANGUAGE \"Vietnamese\"\n!macroend\n\n!addplugindir /x86-unicode \"C:\\Users\\zhang\\AppData\\Local\\electron-builder\\Cache\\nsis\\nsis-resources-3.4.1-nsis-resources-3.4.1\\plugins\\x86-unicode\"\n!include \"C:\\Users\\zhang\\AppData\\Local\\Temp\\t-5kGIBZ\\4-messages.nsh\"\n\n!include \"common.nsh\"\n!include \"extractAppPackage.nsh\"\n\n# https://github.com/electron-userland/electron-builder/issues/3972#issuecomment-505171582\nCRCCheck off\nWindowIcon Off\nAutoCloseWindow True\nRequestExecutionLevel ${REQUEST_EXECUTION_LEVEL}\n\nFunction .onInit\n !ifndef SPLASH_IMAGE\n SetSilent silent\n !endif\n\n !insertmacro check64BitAndSetRegView\nFunctionEnd\n\nFunction .onGUIInit\n InitPluginsDir\n\n !ifdef SPLASH_IMAGE\n File /oname=$PLUGINSDIR\\splash.bmp \"${SPLASH_IMAGE}\"\n BgImage::SetBg $PLUGINSDIR\\splash.bmp\n BgImage::Redraw\n !endif\nFunctionEnd\n\nSection\n !ifdef SPLASH_IMAGE\n HideWindow\n !endif\n\n StrCpy $INSTDIR \"$PLUGINSDIR\\app\"\n !ifdef UNPACK_DIR_NAME\n StrCpy $INSTDIR \"$TEMP\\${UNPACK_DIR_NAME}\"\n !endif\n\n RMDir /r $INSTDIR\n SetOutPath $INSTDIR\n\n !ifdef APP_DIR_64\n !ifdef APP_DIR_ARM64\n !ifdef APP_DIR_32\n ${if} ${IsNativeARM64}\n File /r \"${APP_DIR_ARM64}\\*.*\"\n ${elseif} ${RunningX64}\n File /r \"${APP_DIR_64}\\*.*\"\n ${else}\n File /r \"${APP_DIR_32}\\*.*\"\n ${endIf}\n !else\n ${if} ${IsNativeARM64}\n File /r \"${APP_DIR_ARM64}\\*.*\"\n ${else}\n File /r \"${APP_DIR_64}\\*.*\"\n {endIf}\n !endif\n !else\n !ifdef APP_DIR_32\n ${if} ${RunningX64}\n File /r \"${APP_DIR_64}\\*.*\"\n ${else}\n File /r \"${APP_DIR_32}\\*.*\"\n ${endIf}\n !else\n File /r \"${APP_DIR_64}\\*.*\"\n !endif\n !endif\n !else\n !ifdef APP_DIR_32\n File /r \"${APP_DIR_32}\\*.*\"\n !else\n !insertmacro extractEmbeddedAppPackage\n !endif\n !endif\n\n System::Call 'Kernel32::SetEnvironmentVariable(t, t)i (\"PORTABLE_EXECUTABLE_DIR\", \"$EXEDIR\").r0'\n System::Call 'Kernel32::SetEnvironmentVariable(t, t)i (\"PORTABLE_EXECUTABLE_FILE\", \"$EXEPATH\").r0'\n System::Call 'Kernel32::SetEnvironmentVariable(t, t)i (\"PORTABLE_EXECUTABLE_APP_FILENAME\", \"${APP_FILENAME}\").r0'\n ${StdUtils.GetAllParameters} $R0 0\n\n !ifdef SPLASH_IMAGE\n BgImage::Destroy\n !endif\n\n\tExecWait \"$INSTDIR\\${APP_EXECUTABLE_FILENAME} $R0\" $0\n SetErrorLevel $0\n\n SetOutPath $EXEDIR\n\tRMDir /r $INSTDIR\nSectionEnd\n" diff --git a/build/release/latest-mac.yml b/build/release/latest-mac.yml deleted file mode 100644 index be20e873..00000000 --- a/build/release/latest-mac.yml +++ /dev/null @@ -1,11 +0,0 @@ -version: 0.4.55 -files: - - url: AgentCompany-0.4.55-arm64-mac.zip - sha512: V5zGwFGYOaKO7+2DLPNXurPrfv6VcRerX7meMAzL5gTMwgf4fWDH3NAyPI9x4Nrz17e8hB9ZrpI9uwC5F1vXPQ== - size: 113651351 - - url: AgentCompany-0.4.55-arm64.dmg - sha512: iY7gmCoW8M5gZadJgCxjnTGyX3a8PyDjDheJ4+6JeHCXkmeX87StBBoJh4Bfet3cofmFKecJrkjAPCUA5bo3CA== - size: 118410424 -path: AgentCompany-0.4.55-arm64-mac.zip -sha512: V5zGwFGYOaKO7+2DLPNXurPrfv6VcRerX7meMAzL5gTMwgf4fWDH3NAyPI9x4Nrz17e8hB9ZrpI9uwC5F1vXPQ== -releaseDate: '2026-03-22T21:24:08.906Z' diff --git a/build/release/latest.yml b/build/release/latest.yml new file mode 100644 index 00000000..78b93562 --- /dev/null +++ b/build/release/latest.yml @@ -0,0 +1,8 @@ +version: 0.4.59 +files: + - url: AgentCompany-Setup-0.4.59.exe + sha512: RwvoCeaMxyA1BmEFzWNPijdg2D92+t0Cr/4AeIuii8Xm9UkJ5KJoBN7q4FhxM/TmJ1OGzXQMHmZPAhRNxtVESA== + size: 101724077 +path: AgentCompany-Setup-0.4.59.exe +sha512: RwvoCeaMxyA1BmEFzWNPijdg2D92+t0Cr/4AeIuii8Xm9UkJ5KJoBN7q4FhxM/TmJ1OGzXQMHmZPAhRNxtVESA== +releaseDate: '2026-03-23T00:38:06.163Z' diff --git a/package.json b/package.json index 86a4e53a..bb84d9a3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "agent-company", - "version": "0.4.55", + "version": "0.4.59", "private": true, "type": "module", "description": "Cross-platform Electron desktop control plane for local-first AI agent companies.", diff --git a/packages/adapter-claude-local/src/server/execute.ts b/packages/adapter-claude-local/src/server/execute.ts index dfd6fa69..5f89fb4b 100644 --- a/packages/adapter-claude-local/src/server/execute.ts +++ b/packages/adapter-claude-local/src/server/execute.ts @@ -16,6 +16,7 @@ import { ensureAbsoluteDirectory, ensureCommandResolvable, ensurePathInEnv, + filterConflictingArgs, renderTemplate, runChildProcess, } from "@agentcompany/adapter-utils/server-utils"; @@ -385,7 +386,22 @@ export async function execute(ctx: AdapterExecutionContext): Promise 0) args.push(...extraArgs); + if (extraArgs.length > 0) { + // Filter out flags the adapter already manages to prevent duplicates + // (e.g. user shell aliases that inject --dangerously-skip-permissions) + const managedFlags = [ + "--dangerously-skip-permissions", + "--output-format", + "--model", + "--effort", + "--max-turns", + "--add-dir", + "--append-system-prompt-file", + "--teammate-mode", + ]; + const cleaned = filterConflictingArgs(extraArgs, managedFlags); + if (cleaned.length > 0) args.push(...cleaned); + } return args; }; diff --git a/packages/adapter-codex-local/src/server/execute.ts b/packages/adapter-codex-local/src/server/execute.ts index a54a4a22..36e535a3 100644 --- a/packages/adapter-codex-local/src/server/execute.ts +++ b/packages/adapter-codex-local/src/server/execute.ts @@ -14,6 +14,7 @@ import { ensureAbsoluteDirectory, ensureCommandResolvable, ensurePathInEnv, + filterConflictingArgs, renderTemplate, runChildProcess, } from "@agentcompany/adapter-utils/server-utils"; @@ -318,7 +319,20 @@ export async function execute(ctx: AdapterExecutionContext): Promise 0) args.push(...extraArgs); + if (extraArgs.length > 0) { + // Filter out flags the adapter already manages to prevent duplicates + // (e.g. user shell aliases that inject --dangerously-bypass-approvals-and-sandbox) + const managedFlags = [ + "--dangerously-bypass-approvals-and-sandbox", + "--json", + "--model", + "--sandbox", + "--skip-git-repo-check", + "--ask-for-approval", + ]; + const cleaned = filterConflictingArgs(extraArgs, managedFlags); + if (cleaned.length > 0) args.push(...cleaned); + } if (resumeSessionId) args.push("resume", resumeSessionId, "-"); else args.push("-"); return args; diff --git a/packages/adapter-gemini-local/src/server/execute.ts b/packages/adapter-gemini-local/src/server/execute.ts index 7cd96d93..a30add9c 100644 --- a/packages/adapter-gemini-local/src/server/execute.ts +++ b/packages/adapter-gemini-local/src/server/execute.ts @@ -14,6 +14,7 @@ import { ensureCommandResolvable, ensurePathInEnv, parseObject, + filterConflictingArgs, redactEnvForLogs, renderTemplate, runChildProcess, @@ -301,7 +302,18 @@ export async function execute(ctx: AdapterExecutionContext): Promise 0) args.push(...extraArgs); + if (extraArgs.length > 0) { + // Filter out flags the adapter already manages to prevent duplicates + // (e.g. user shell aliases that inject --approval-mode or --sandbox) + const managedFlags = [ + "--approval-mode", + "--output-format", + "--model", + "--sandbox", + ]; + const cleaned = filterConflictingArgs(extraArgs, managedFlags); + if (cleaned.length > 0) args.push(...cleaned); + } args.push(prompt); return args; }; diff --git a/packages/adapter-utils/src/server-utils.ts b/packages/adapter-utils/src/server-utils.ts index d4d4ff69..3bc670a2 100644 --- a/packages/adapter-utils/src/server-utils.ts +++ b/packages/adapter-utils/src/server-utils.ts @@ -109,6 +109,30 @@ export function renderTemplate(template: string, data: Record) return template.replace(/{{\s*([a-zA-Z0-9_.-]+)\s*}}/g, (_, path) => resolvePathValue(data, path)); } +/** + * Remove flags from `extraArgs` that the adapter will already add itself. + * Handles both `--flag value` pairs and `--flag=value` forms. + * This prevents duplicate/conflicting CLI arguments when users have shell + * aliases or wrapper functions that inject the same flags. + */ +export function filterConflictingArgs(extraArgs: string[], adapterFlags: string[]): string[] { + const flagSet = new Set(adapterFlags.map((f) => f.replace(/=.*$/, ""))); + const filtered: string[] = []; + for (let i = 0; i < extraArgs.length; i++) { + const arg = extraArgs[i]; + const bareFlag = arg.replace(/=.*$/, ""); + if (flagSet.has(bareFlag)) { + // Skip this flag and its value if the value is a separate argument + if (!arg.includes("=") && i + 1 < extraArgs.length && !extraArgs[i + 1].startsWith("-")) { + i++; // skip the value argument too + } + continue; + } + filtered.push(arg); + } + return filtered; +} + export function redactEnvForLogs(env: Record): Record { const redacted: Record = {}; for (const [key, value] of Object.entries(env)) { diff --git a/src/main/orchestrator/worker.ts b/src/main/orchestrator/worker.ts index c244686e..9956f6b9 100644 --- a/src/main/orchestrator/worker.ts +++ b/src/main/orchestrator/worker.ts @@ -107,8 +107,6 @@ function buildConnectorExecutionConfig(job: RunJob, sanitizedEnv: Record