Move Composio, logo.dev and Antigravity keys into Settings

The three third-party keys were hardcoded or read from the environment.
Operators now enter them in Settings > Integrations; they are stored
encrypted in the app-wide integration_keys table (migration 058).
An agent holding connector grants fails loudly when no Composio key is
saved. The goal-review test no longer depends on absolute dates.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ZacharyZhang-NYandClaude Opus 5.5 committed 2026-10-08 01:34:14 -04:00
1 parent 1ea040c0f0
commit 56b0594f91
36 files changed
+430 -100

No files matched your search

+1
View File
@@ -8,3 +8,4 @@ export * from "./governance";
export * from "./collaboration";
export * from "./onboarding";
export * from "./composio";
export * from "./integration-keys";
+18
View File
@@ -0,0 +1,18 @@
export const INTEGRATION_KEY_NAMES = ["composio", "logo_dev", "google_antigravity_client_secret"] as const;
export type IntegrationKeyName = (typeof INTEGRATION_KEY_NAMES)[number];
export interface IntegrationKeyStatus {
name: IntegrationKeyName;
configured: boolean;
updatedAt: string | null;
}
export interface SetIntegrationKeyInput {
name: IntegrationKeyName;
value: string;
}
export interface ClearIntegrationKeyInput {
name: IntegrationKeyName;
}
+4
View File
@@ -7,6 +7,8 @@ import type {
CancelProviderResponseInput,
CreateAgentInput,
SetAutonomousPausedInput,
SetIntegrationKeyInput,
ClearIntegrationKeyInput,
UpdateAgentInput,
UpdateEmployeeProfileInput,
CreateApprovalInput,
@@ -111,6 +113,8 @@ export interface DesktopApi {
updateAgent(input: UpdateAgentInput): Promise<DesktopResult<AppSnapshot>>;
updateEmployeeProfile(input: UpdateEmployeeProfileInput): Promise<DesktopResult<AppSnapshot>>;
setAutonomousPaused(input: SetAutonomousPausedInput): Promise<DesktopResult<AppSnapshot>>;
setIntegrationKey(input: SetIntegrationKeyInput): Promise<DesktopResult<AppSnapshot>>;
clearIntegrationKey(input: ClearIntegrationKeyInput): Promise<DesktopResult<AppSnapshot>>;
createTask(input: CreateTaskInput): Promise<DesktopResult<AppSnapshot>>;
updateTask(input: UpdateTaskInput): Promise<DesktopResult<AppSnapshot>>;
deleteTask(input: DeleteTaskInput): Promise<DesktopResult<AppSnapshot>>;
+2
View File
@@ -9,6 +9,8 @@ export const IPC_CHANNELS = {
updateAgent: "agentcompany:update-agent",
updateEmployeeProfile: "agentcompany:update-employee-profile",
setAutonomousPaused: "agentcompany:set-autonomous-paused",
setIntegrationKey: "agentcompany:set-integration-key",
clearIntegrationKey: "agentcompany:clear-integration-key",
createTask: "agentcompany:create-task",
updateTask: "agentcompany:update-task",
deleteTask: "agentcompany:delete-task",
+2
View File
@@ -1,4 +1,5 @@
import type { AuditReplayRunRecord } from "./audit-domain";
import type { IntegrationKeyStatus } from "./commands/integration-keys";
import type { BoardInterventionRecord as BoardInterventionRecordModel } from "./board-domain";
import type {
ChatAttachmentRecord,
@@ -71,6 +72,7 @@ export interface AppSnapshot {
uiPreferences: UiPreferences;
/** True while the operator has paused the autonomous run engine. */
autonomousPaused: boolean;
integrationKeys: IntegrationKeyStatus[];
organizations: OrganizationRecord[];
employees: EmployeeRecord[];
agents: AgentRecord[];