diff --git a/landing/components/release-links.generated.ts b/landing/components/release-links.generated.ts index d989217e..f771a7b2 100644 --- a/landing/components/release-links.generated.ts +++ b/landing/components/release-links.generated.ts @@ -12,7 +12,7 @@ export type PlatformDownload = { assets: PlatformDownloadAsset[]; }; -export const releaseVersion = "0.4.156"; +export const releaseVersion = "0.4.162"; export const platformDownloads: PlatformDownload[] = [ { @@ -23,13 +23,13 @@ export const platformDownloads: PlatformDownload[] = [ { id: "macos-arm64-dmg", label: "Apple Silicon DMG", - href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/AgentCompany-0.4.156-arm64.dmg", + href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/AgentCompany-0.4.162-arm64.dmg", note: "arm64", }, { id: "macos-x64-dmg", label: "Intel Mac DMG", - href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/AgentCompany-0.4.156.dmg", + href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/AgentCompany-0.4.162.dmg", note: "x64", }, ], @@ -42,7 +42,7 @@ export const platformDownloads: PlatformDownload[] = [ { id: "windows-universal-installer", label: "Windows Universal Installer", - href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/AgentCompany.Setup.0.4.156.exe", + href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/AgentCompany.Setup.0.4.162.exe", note: "arm64 + x64 + ia32", }, ], @@ -55,37 +55,37 @@ export const platformDownloads: PlatformDownload[] = [ { id: "linux-x64-appimage", label: "Linux x64 AppImage", - href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/AgentCompany-0.4.156.AppImage", + href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/AgentCompany-0.4.162.AppImage", note: "x64", }, { id: "linux-x64-deb", label: "Linux x64 DEB", - href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/agent-company_0.4.156_amd64.deb", + href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/agent-company_0.4.162_amd64.deb", note: "x64", }, { id: "linux-x64-rpm", label: "Linux x64 RPM", - href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/agent-company-0.4.156.x86_64.rpm", + href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/agent-company-0.4.162.x86_64.rpm", note: "x64", }, { id: "linux-arm64-appimage", label: "Linux ARM64 AppImage", - href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/AgentCompany-0.4.156-arm64.AppImage", + href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/AgentCompany-0.4.162-arm64.AppImage", note: "arm64", }, { id: "linux-arm64-deb", label: "Linux ARM64 DEB", - href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/agent-company_0.4.156_arm64.deb", + href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/agent-company_0.4.162_arm64.deb", note: "arm64", }, { id: "linux-arm64-rpm", label: "Linux ARM64 RPM", - href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/agent-company-0.4.156.aarch64.rpm", + href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/agent-company-0.4.162.aarch64.rpm", note: "arm64", }, ], diff --git a/package.json b/package.json index 2200c8cf..573d6cf1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "agent-company", - "version": "0.4.156", + "version": "0.4.164", "private": true, "type": "module", "description": "Cross-platform Electron desktop control plane for local-first AI agent companies.", diff --git a/src/main/automation/automation-actions.ts b/src/main/automation/automation-actions.ts index 5dbd4d58..f6ac23e3 100644 --- a/src/main/automation/automation-actions.ts +++ b/src/main/automation/automation-actions.ts @@ -247,25 +247,9 @@ export function executeAutomationAction( } } else { // No manager found — agent is likely the CEO or top-level. - // Post as company-wide message so the board and other leaders see it. - const escalationResult = dispatchAgentMessage( - { db, emitEvent, publishDomainChanged, wakeAgentIfPossible }, - { - companyId: ctx.companyId, - fromAgentId: targetAgentId, - toAgentId: null, - channel: "company", - subject: `Escalation: ${taskTitle}`, - body: escalationBody, - priority: "urgent", - }, - wakeTrigger, - ); - if (!escalationResult.ok) { - logger.warn( - `[automation] Failed to escalate "${taskTitle}" to company channel: ${escalationResult.error.code} ${escalationResult.error.message}`, - ); - } + // Skip posting to company channel to avoid flooding it with system noise. + // The task status change is already visible in the task list and activity log. + logger.info(`[automation] Skipping escalation for top-level agent "${agentName}" — no manager to escalate to.`); } break; } diff --git a/src/main/database/connectors-crud.ts b/src/main/database/connectors-crud.ts index f27a4ad6..4ea501e2 100644 --- a/src/main/database/connectors-crud.ts +++ b/src/main/database/connectors-crud.ts @@ -90,6 +90,53 @@ export function buildConnectorMethods( const currentRows = readAll>( "select id, label, description, status, command, version, auth_state as authState, last_checked_at as lastCheckedAt, last_error as lastError, model, env_binding_text as envBindingText, notes from connectors", ); + // Migrate first compat slot if its definition defaults have changed (edition upgrade). + // When the definition ships with preset notes that differ from the DB, relocate the + // old user config to the next empty compat slot so definition defaults take effect. + const firstCompat = currentRows.find((r) => r.id === "claude_compatible"); + if (firstCompat?.envBindingText && firstCompat.notes) { + let firstDef: { notes: string } | undefined; + try { firstDef = getConnectorDefinition("claude_compatible"); } catch { /* skip */ } + if (firstDef?.notes && firstCompat.notes !== firstDef.notes) { + const migrationTargets: ConnectorId[] = [ + "claude_compat_2", "claude_compat_3", "claude_compat_4", "claude_compat_5", + "claude_compat_6", "claude_compat_7", "claude_compat_8", "claude_compat_9", "claude_compat_10", + ]; + const occupied = new Set( + currentRows + .filter((r) => r.id !== "claude_compatible" && r.id?.startsWith("claude_compat") && r.envBindingText) + .map((r) => r.id), + ); + const targetId = migrationTargets.find((id) => !occupied.has(id)); + if (targetId) { + const migrated = { + envBindingText: firstCompat.envBindingText, + notes: firstCompat.notes, + model: firstCompat.model, + status: firstCompat.status, + authState: firstCompat.authState, + version: firstCompat.version, + lastCheckedAt: firstCompat.lastCheckedAt, + lastError: firstCompat.lastError, + }; + const targetRow = currentRows.find((r) => r.id === targetId); + if (targetRow) { + Object.assign(targetRow, migrated); + } else { + currentRows.push({ id: targetId as ConnectorId, ...migrated }); + } + firstCompat.envBindingText = undefined; + firstCompat.notes = undefined; + firstCompat.model = undefined; + firstCompat.status = undefined; + firstCompat.authState = undefined; + firstCompat.version = undefined; + firstCompat.lastCheckedAt = undefined; + firstCompat.lastError = undefined; + } + } + } + const merged = buildDefaultConnectorRows(currentRows); const statement = getDb().prepare( "insert or replace into connectors (id, label, description, status, command, version, auth_state, last_checked_at, last_error, model, env_binding_text, notes, updated_at) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", diff --git a/src/main/orchestration/turn-context.ts b/src/main/orchestration/turn-context.ts index 2f690e6a..19650059 100644 --- a/src/main/orchestration/turn-context.ts +++ b/src/main/orchestration/turn-context.ts @@ -237,12 +237,15 @@ export function buildRunPayload(params: RunDispatchParams, deps: TurnContextDeps recentDocuments: snapshot.documents .filter((document) => document.companyId === companyId && (document.authorAgentId === agent.id || document.reviewerAgentId === agent.id || document.status === "in_review")) .slice(0, 5), - allConnectors: snapshot.connectors.map((c) => ({ - id: c.id, - label: c.label, - status: c.status, - enabledModels: resolveEnabledConnectorModels(db, c), - })), + allConnectors: snapshot.connectors + .filter((c) => c.status === "ready") + .map((c) => ({ + id: c.id, + label: c.label, + status: c.status, + enabledModels: resolveEnabledConnectorModels(db, c), + })) + .filter((c) => c.enabledModels.length > 0), sessionHandoff, skillNames, skillEntries: skills.map((s) => ({