diff --git a/src/command-gate.ts b/src/command-gate.ts index 7bd1b9f..a0c1979 100644 --- a/src/command-gate.ts +++ b/src/command-gate.ts @@ -9,10 +9,7 @@ */ import { getDb, hasTable } from './db/connection.js'; -export type GateResult = - | { action: 'pass' } - | { action: 'filter' } - | { action: 'deny'; command: string }; +export type GateResult = { action: 'pass' } | { action: 'filter' } | { action: 'deny'; command: string }; const FILTERED_COMMANDS = new Set(['/help', '/login', '/logout', '/doctor', '/config', '/remote-control']); const ADMIN_COMMANDS = new Set(['/clear', '/compact', '/context', '/cost', '/files']); @@ -23,11 +20,7 @@ const ADMIN_COMMANDS = new Set(['/clear', '/compact', '/context', '/cost', '/fil * 'filter' for silently-dropped commands, 'deny' for unauthorized * admin commands. */ -export function gateCommand( - content: string, - userId: string | null, - agentGroupId: string, -): GateResult { +export function gateCommand(content: string, userId: string | null, agentGroupId: string): GateResult { let text: string; try { const parsed = JSON.parse(content); diff --git a/src/container-runner.ts b/src/container-runner.ts index 6f7f1d1..7425299 100644 --- a/src/container-runner.ts +++ b/src/container-runner.ts @@ -110,7 +110,15 @@ async function spawnContainer(session: Session): Promise { // OneCLI agent identifier is always the agent group id — stable across // sessions and reversible via getAgentGroup() for approval routing. const agentIdentifier = agentGroup.id; - const args = await buildContainerArgs(mounts, containerName, agentGroup, containerConfig, provider, contribution, agentIdentifier); + const args = await buildContainerArgs( + mounts, + containerName, + agentGroup, + containerConfig, + provider, + contribution, + agentIdentifier, + ); log.info('Spawning container', { sessionId: session.id, agentGroup: agentGroup.name, containerName }); @@ -263,10 +271,7 @@ function buildMounts( * selection. Each symlink points to a container path (/app/skills/) * so it's dangling on the host but valid inside the container. */ -function syncSkillSymlinks( - claudeDir: string, - containerConfig: import('./container-config.js').ContainerConfig, -): void { +function syncSkillSymlinks(claudeDir: string, containerConfig: import('./container-config.js').ContainerConfig): void { const skillsDir = path.join(claudeDir, 'skills'); if (!fs.existsSync(skillsDir)) { fs.mkdirSync(skillsDir, { recursive: true }); diff --git a/src/db/migrations/010-engage-modes.ts b/src/db/migrations/010-engage-modes.ts index 4bf9798..e7bff99 100644 --- a/src/db/migrations/010-engage-modes.ts +++ b/src/db/migrations/010-engage-modes.ts @@ -75,7 +75,9 @@ export const migration010: Migration = { `); // Backfill existing rows in JS (parsing JSON per-row is painful in pure SQL). - const rows = db.prepare('SELECT id, trigger_rules, response_scope FROM messaging_group_agents').all() as LegacyRow[]; + const rows = db + .prepare('SELECT id, trigger_rules, response_scope FROM messaging_group_agents') + .all() as LegacyRow[]; const update = db.prepare( `UPDATE messaging_group_agents SET engage_mode = ?, diff --git a/src/modules/approvals/response-handler.ts b/src/modules/approvals/response-handler.ts index bd0c2c5..2bbdc9d 100644 --- a/src/modules/approvals/response-handler.ts +++ b/src/modules/approvals/response-handler.ts @@ -96,7 +96,9 @@ async function handleRegisteredApproval( log.info('Approval handled', { approvalId: approval.approval_id, action: approval.action, userId }); } catch (err) { log.error('Approval handler threw', { approvalId: approval.approval_id, action: approval.action, err }); - notify(`Your ${approval.action} was approved, but applying it failed: ${err instanceof Error ? err.message : String(err)}.`); + notify( + `Your ${approval.action} was approved, but applying it failed: ${err instanceof Error ? err.message : String(err)}.`, + ); } deletePendingApproval(approval.approval_id); diff --git a/src/modules/index.ts b/src/modules/index.ts index 2df4477..0228509 100644 --- a/src/modules/index.ts +++ b/src/modules/index.ts @@ -22,4 +22,3 @@ import './scheduling/index.js'; import './permissions/index.js'; import './agent-to-agent/index.js'; import './self-mod/index.js'; - diff --git a/src/modules/interactive/index.ts b/src/modules/interactive/index.ts index 5a3b8af..324adbe 100644 --- a/src/modules/interactive/index.ts +++ b/src/modules/interactive/index.ts @@ -46,7 +46,11 @@ async function handleInteractiveResponse(payload: ResponsePayload): Promise { await new Promise((r) => setTimeout(r, 10)); const { getDb } = await import('../../db/connection.js'); - const pending = getDb() - .prepare('SELECT messaging_group_id FROM pending_channel_approvals') - .get() as { messaging_group_id: string }; + const pending = getDb().prepare('SELECT messaging_group_id FROM pending_channel_approvals').get() as { + messaging_group_id: string; + }; expect(pending).toBeDefined(); // Owner clicks approve. @@ -240,9 +240,8 @@ describe('unknown-channel registration flow', () => { expect(member).toBeDefined(); // Pending row cleared and container woken via replay. - const stillPending = ( - getDb().prepare('SELECT COUNT(*) AS c FROM pending_channel_approvals').get() as { c: number } - ).c; + const stillPending = (getDb().prepare('SELECT COUNT(*) AS c FROM pending_channel_approvals').get() as { c: number }) + .c; expect(stillPending).toBe(0); expect(wakeContainer).toHaveBeenCalled(); }); @@ -255,9 +254,9 @@ describe('unknown-channel registration flow', () => { await new Promise((r) => setTimeout(r, 10)); const { getDb } = await import('../../db/connection.js'); - const pending = getDb() - .prepare('SELECT messaging_group_id FROM pending_channel_approvals') - .get() as { messaging_group_id: string }; + const pending = getDb().prepare('SELECT messaging_group_id FROM pending_channel_approvals').get() as { + messaging_group_id: string; + }; for (const handler of getResponseHandlers()) { const claimed = await handler({ @@ -285,9 +284,9 @@ describe('unknown-channel registration flow', () => { await routeInbound(groupMention('chat-deny')); await new Promise((r) => setTimeout(r, 10)); const { getDb } = await import('../../db/connection.js'); - const pending = getDb() - .prepare('SELECT messaging_group_id FROM pending_channel_approvals') - .get() as { messaging_group_id: string }; + const pending = getDb().prepare('SELECT messaging_group_id FROM pending_channel_approvals').get() as { + messaging_group_id: string; + }; for (const handler of getResponseHandlers()) { const claimed = await handler({ @@ -317,9 +316,8 @@ describe('unknown-channel registration flow', () => { await routeInbound(groupMention('chat-deny', '@bot please')); await new Promise((r) => setTimeout(r, 10)); expect(deliverMock).not.toHaveBeenCalled(); - const stillPending = ( - getDb().prepare('SELECT COUNT(*) AS c FROM pending_channel_approvals').get() as { c: number } - ).c; + const stillPending = (getDb().prepare('SELECT COUNT(*) AS c FROM pending_channel_approvals').get() as { c: number }) + .c; expect(stillPending).toBe(0); }); @@ -330,9 +328,9 @@ describe('unknown-channel registration flow', () => { await routeInbound(groupMention('chat-unauth')); await new Promise((r) => setTimeout(r, 10)); const { getDb } = await import('../../db/connection.js'); - const pending = getDb() - .prepare('SELECT messaging_group_id FROM pending_channel_approvals') - .get() as { messaging_group_id: string }; + const pending = getDb().prepare('SELECT messaging_group_id FROM pending_channel_approvals').get() as { + messaging_group_id: string; + }; for (const handler of getResponseHandlers()) { const claimed = await handler({ @@ -353,9 +351,8 @@ describe('unknown-channel registration flow', () => { .get(pending.messaging_group_id) as { c: number } ).c; expect(mgaCount).toBe(0); - const stillPending = ( - getDb().prepare('SELECT COUNT(*) AS c FROM pending_channel_approvals').get() as { c: number } - ).c; + const stillPending = (getDb().prepare('SELECT COUNT(*) AS c FROM pending_channel_approvals').get() as { c: number }) + .c; expect(stillPending).toBe(1); }); }); diff --git a/src/modules/permissions/db/pending-sender-approvals.ts b/src/modules/permissions/db/pending-sender-approvals.ts index 9f7e3a4..77a5699 100644 --- a/src/modules/permissions/db/pending-sender-approvals.ts +++ b/src/modules/permissions/db/pending-sender-approvals.ts @@ -37,19 +37,14 @@ export function createPendingSenderApproval(row: PendingSenderApproval): void { } export function getPendingSenderApproval(id: string): PendingSenderApproval | undefined { - return getDb() - .prepare('SELECT * FROM pending_sender_approvals WHERE id = ?') - .get(id) as PendingSenderApproval | undefined; + return getDb().prepare('SELECT * FROM pending_sender_approvals WHERE id = ?').get(id) as + | PendingSenderApproval + | undefined; } -export function hasInFlightSenderApproval( - messagingGroupId: string, - senderIdentity: string, -): boolean { +export function hasInFlightSenderApproval(messagingGroupId: string, senderIdentity: string): boolean { const row = getDb() - .prepare( - 'SELECT 1 AS x FROM pending_sender_approvals WHERE messaging_group_id = ? AND sender_identity = ?', - ) + .prepare('SELECT 1 AS x FROM pending_sender_approvals WHERE messaging_group_id = ? AND sender_identity = ?') .get(messagingGroupId, senderIdentity) as { x: number } | undefined; return row !== undefined; } diff --git a/src/modules/scheduling/recurrence.test.ts b/src/modules/scheduling/recurrence.test.ts index a70d6c8..358e6b4 100644 --- a/src/modules/scheduling/recurrence.test.ts +++ b/src/modules/scheduling/recurrence.test.ts @@ -59,9 +59,7 @@ describe('handleRecurrence', () => { await handleRecurrence(db, fakeSession()); const rows = db - .prepare( - `SELECT id, status, process_after, recurrence, series_id FROM messages_in ORDER BY seq`, - ) + .prepare(`SELECT id, status, process_after, recurrence, series_id FROM messages_in ORDER BY seq`) .all() as Array<{ id: string; status: string; diff --git a/src/modules/self-mod/apply.ts b/src/modules/self-mod/apply.ts index da33fd0..1a3daa8 100644 --- a/src/modules/self-mod/apply.ts +++ b/src/modules/self-mod/apply.ts @@ -24,7 +24,10 @@ export const applyInstallPackages: ApprovalHandler = async ({ session, payload, if (payload.npm) cfg.packages.npm.push(...(payload.npm as string[])); }); - const pkgs = [...((payload.apt as string[] | undefined) || []), ...((payload.npm as string[] | undefined) || [])].join(', '); + const pkgs = [ + ...((payload.apt as string[] | undefined) || []), + ...((payload.npm as string[] | undefined) || []), + ].join(', '); log.info('Package install approved', { agentGroupId: session.agent_group_id, userId }); try { await buildAgentGroupImage(session.agent_group_id);