Files
claude-code/packages/remote-control-server/src/services/environment.ts
2026-05-01 21:39:30 +08:00

106 lines
2.8 KiB
TypeScript

import { config } from '../config'
import {
storeCreateEnvironment,
storeCreateSession,
storeGetEnvironment,
storeUpdateEnvironment,
storeListActiveEnvironments,
storeListActiveEnvironmentsByUsername,
storeListSessionsByEnvironment,
} from '../store'
import type {
RegisterEnvironmentRequest,
EnvironmentResponse,
} from '../types/api'
import type { EnvironmentRecord } from '../store'
function toResponse(row: EnvironmentRecord): EnvironmentResponse {
return {
id: row.id,
machine_name: row.machineName,
directory: row.directory,
branch: row.branch,
status: row.status,
username: row.username,
last_poll_at: row.lastPollAt ? row.lastPollAt.getTime() / 1000 : null,
worker_type: row.workerType,
channel_group_id: row.bridgeId,
capabilities: row.capabilities,
}
}
export function registerEnvironment(
req: RegisterEnvironmentRequest & {
metadata?: { worker_type?: string }
username?: string
},
) {
const secret = config.apiKeys[0] || ''
const workerType = req.worker_type || req.metadata?.worker_type
const record = storeCreateEnvironment({
secret,
machineName: req.machine_name,
directory: req.directory,
branch: req.branch,
gitRepoUrl: req.git_repo_url,
maxSessions: req.max_sessions,
workerType,
bridgeId: req.bridge_id,
username: req.username,
capabilities: req.capabilities,
})
let sessionId: string | undefined
// ACP agents: reuse existing session or create one
if (workerType === 'acp') {
const existing = storeListSessionsByEnvironment(record.id)
if (existing.length > 0) {
sessionId = existing[0].id
} else {
const session = storeCreateSession({
environmentId: record.id,
title: req.machine_name || 'ACP Agent',
source: 'acp',
})
sessionId = session.id
}
}
return {
environment_id: record.id,
environment_secret: record.secret,
status: record.status as 'active',
session_id: sessionId,
}
}
export function deregisterEnvironment(envId: string) {
storeUpdateEnvironment(envId, { status: 'deregistered' })
}
export function getEnvironment(envId: string) {
return storeGetEnvironment(envId)
}
export function updatePollTime(envId: string) {
storeUpdateEnvironment(envId, { lastPollAt: new Date() })
}
export function listActiveEnvironments() {
return storeListActiveEnvironments()
}
export function listActiveEnvironmentsResponse(): EnvironmentResponse[] {
return storeListActiveEnvironments().map(toResponse)
}
export function listActiveEnvironmentsByUsername(
username: string,
): EnvironmentResponse[] {
return storeListActiveEnvironmentsByUsername(username).map(toResponse)
}
export function reconnectEnvironment(envId: string) {
storeUpdateEnvironment(envId, { status: 'active' })
}